|
|
1.1 root 1:
2: /******************************************************************************\
3: * This is a part of the Microsoft Source Code Samples.
4: * Copyright (C) 1993 Microsoft Corporation.
5: * All rights reserved.
6: * This source code is only intended as a supplement to
7: * Microsoft Development Tools and/or WinHelp documentation.
8: * See these sources for detailed information regarding the
9: * Microsoft samples programs.
10: \******************************************************************************/
11:
12: #include <windows.h>
13: #include <string.h>
14: #include <stdlib.h>
15: #include "portpriv.h"
16: #include "port.h"
17:
18: /* globals for this module */
19: HANDLE hMMFile = 0;
20:
21: /* function prototypes for private module functions */
22: BOOL WINAPI InitPortData (HANDLE);
23: void WINAPI FreePortData ();
24: int WINAPI GetNextToken (LPPORT *);
25: void WINAPI IgnoreToken (char *, LPPORT);
26: BOOL WINAPI LoadSection (char *, char *, DWORD, int *, char *);
27: BOOL WINAPI GetIniFile (HANDLE, char *);
28:
29:
30: /* entry point for DLL loading and unloading */
31: #if 1
32: BOOL WINAPI DllMain (
33: #else
34: BOOL WINAPI DLLEntry (
35: #endif
36:
37: HANDLE hModule,
38: DWORD dwFunction,
39: LPVOID lpNot)
40: {
41: #ifdef DEBUG
42: DebugBreak ();
43: #endif
44:
45: switch (dwFunction)
46: {
47: case DLL_PROCESS_ATTACH:
48: if (!InitPortData (hModule))
49: {
50: /* display error loading DLL data and exit process */
51: MessageBox (NULL, "Error loading port information, check file PORT.INI",
52: "PORT.DLL", MB_OK);
53: return FALSE;
54: }
55: break;
56:
57: case DLL_PROCESS_DETACH:
58: FreePortData ();
59: default:
60: break;
61: }
62:
63: return TRUE;
64: }
65:
66:
67:
68: /* function initializes port structures */
69: BOOL WINAPI InitPortData (
70: HANDLE hDLL)
71: {
72: char szSection[MAX_PATH];
73: char szIniFilePath[MAX_PATH];
74: char szMapFileName[MAX_PATH];
75: OFSTRUCT of;
76: HANDLE hFile;
77: DWORD nFileSize;
78: int nOffset = 0;
79: char *lpMMFile;
80:
81: /* load name for global file mapping */
82: LoadString (hDLL, IDS_MAPFILENAME, szMapFileName, MAX_PATH);
83:
84: /* after first process initializes port data */
85: if ((hMMFile = OpenFileMapping (FILE_MAP_WRITE, FALSE, szMapFileName)))
86: /* exit now since initialization was already performed by another process */
87: return TRUE;
88:
89: /* retrive path and file for ini file */
90: if (!GetIniFile (hDLL, szIniFilePath))
91: return FALSE;
92:
93: /* test for ini file existance and get length of file */
94: if ((int)(hFile = (HANDLE)OpenFile (szIniFilePath, &of, OF_READ)) == -1)
95: return FALSE;
96: else
97: {
98: nFileSize = GetFileSize (hFile, NULL);
99: CloseHandle (hFile);
100: }
101:
102: /* allocate a segment of the swap file for shared memory 2*Size of ini file */
103: if (!(hMMFile = CreateFileMapping ((HANDLE)0xffffffff,
104: NULL,
105: PAGE_READWRITE,
106: 0,
107: nFileSize * 2,
108: szMapFileName)))
109: return FALSE;
110:
111: /* map a view of this file for writing */
112: lpMMFile = (char *)MapViewOfFile (hMMFile, FILE_MAP_WRITE, 0, 0, 0);
113:
114: /* load tokens for APIS section */
115: LoadString (hDLL, IDS_PORTAPIS, szSection, MAX_PATH);
116: if (!LoadSection (szIniFilePath, szSection, PT_APIS, &nOffset, lpMMFile))
117: {
118: /* clean up memory mapped file */
119: UnmapViewOfFile (lpMMFile);
120: CloseHandle (hMMFile);
121: return FALSE;
122: }
123:
124: /* load tokens for MESSAGES section */
125: LoadString (hDLL, IDS_PORTMESSAGES, szSection, MAX_PATH);
126: if (!LoadSection (szIniFilePath, szSection, PT_MESSAGES, &nOffset, lpMMFile))
127: {
128: /* clean up memory mapped file */
129: UnmapViewOfFile (lpMMFile);
130: CloseHandle (hMMFile);
131: return FALSE;
132: }
133:
134: /* load tokens for STRUCTURES section */
135: LoadString (hDLL, IDS_PORTSTRUCTURES, szSection, MAX_PATH);
136: if (!LoadSection (szIniFilePath, szSection, PT_STRUCTURES, &nOffset, lpMMFile))
137: {
138: /* clean up memory mapped file */
139: UnmapViewOfFile (lpMMFile);
140: CloseHandle (hMMFile);
141: return FALSE;
142: }
143:
144: /* load tokens for TYPES section */
145: LoadString (hDLL, IDS_PORTTYPES, szSection, MAX_PATH);
146: if (!LoadSection (szIniFilePath, szSection, PT_TYPES, &nOffset, lpMMFile))
147: {
148: /* clean up memory mapped file */
149: UnmapViewOfFile (lpMMFile);
150: CloseHandle (hMMFile);
151: return FALSE;
152: }
153:
154: /* load tokens for MACROS section */
155: LoadString (hDLL, IDS_PORTMACROS, szSection, MAX_PATH);
156: if (!LoadSection (szIniFilePath, szSection, PT_MACROS, &nOffset, lpMMFile))
157: {
158: /* clean up memory mapped file */
159: UnmapViewOfFile (lpMMFile);
160: CloseHandle (hMMFile);
161: return FALSE;
162: }
163:
164: /* load tokens for CONSTANTS section */
165: LoadString (hDLL, IDS_PORTCONSTANTS, szSection, MAX_PATH);
166: if (!LoadSection (szIniFilePath, szSection, PT_CONSTANTS, &nOffset, lpMMFile))
167: {
168: /* clean up memory mapped file */
169: UnmapViewOfFile (lpMMFile);
170: CloseHandle (hMMFile);
171: return FALSE;
172: }
173:
174: /* load tokens for CUSTOM section */
175: LoadString (hDLL, IDS_PORTCUSTOM, szSection, MAX_PATH);
176: if (!LoadSection (szIniFilePath, szSection, PT_CUSTOM, &nOffset, lpMMFile))
177: {
178: /* clean up memory mapped file */
179: UnmapViewOfFile (lpMMFile);
180: CloseHandle (hMMFile);
181: return FALSE;
182: }
183:
184: /* release WRITE view of memory mapped file */
185: UnmapViewOfFile (lpMMFile);
186:
187: /* success */
188: return TRUE;
189: }
190:
191:
192:
193: /* release memory mapped file view */
194: void WINAPI FreePortData ()
195: {
196: /* release memory mapped file */
197: CloseHandle (hMMFile);
198: }
199:
200:
201:
202: /* external function to check a string for porting issues */
203: BOOL WINAPI CheckString (
204: char *lpszSrc,
205: DWORD dwSearch,
206: LPRESULT lprIssue)
207: {
208: BOOL bRet = FALSE;
209: LPPORT lpToken;
210: char *lpStr = lpszSrc;
211: int nSrcLen = strlen (lpszSrc);
212: int nTokLen;
213: char *lpMMFile = (char *)MapViewOfFile (hMMFile, FILE_MAP_WRITE, 0, 0, 0);
214:
215:
216: /* if view of file failed */
217: if (!lpMMFile)
218: return FALSE;
219:
220: /* if ignore token */
221: if (dwSearch & PT_IGNORETOKEN)
222: /* flag token as ignored */
223: IgnoreToken (lpszSrc, (LPPORT)lpMMFile);
224:
225: else
226: /* loop through all characters in string */
227: while ((lpStr-lpszSrc) < nSrcLen)
228: {
229: /* initialize lpToken to beginning of list */
230: lpToken = (LPPORT)lpMMFile;
231:
232: /* loop thru all tokens */
233: while ((nTokLen = GetNextToken (&lpToken)))
234: {
235: /* filter tokens for search criteria */
236: if (!(lpToken->dwType & PT_IGNORED) &&
237: !(dwSearch & lpToken->dwType) &&
238: ((dwSearch & PT_IGNORECASE &&
239: !strnicmp ((char *)lpToken+lpToken->nPosToken, lpStr, nTokLen)) ||
240: !strncmp ((char *)lpToken+lpToken->nPosToken, lpStr, nTokLen)))
241: {
242: /* token found in line, return ISSUE struct */
243: strncpy (lprIssue->lpszToken,
244: (char *)lpToken+lpToken->nPosToken,
245: *(WORD *)lprIssue->lpszToken);
246: strncpy (lprIssue->lpszHelpStr,
247: (char *)lpToken+lpToken->nPosHelpStr,
248: *(WORD *)lprIssue->lpszHelpStr);
249: strncpy (lprIssue->lpszIssue,
250: (char *)lpToken+lpToken->nPosIssue,
251: *(WORD *)lprIssue->lpszIssue);
252: strncpy (lprIssue->lpszSuggest,
253: (char *)lpToken+lpToken->nPosSuggest,
254: *(WORD *)lprIssue->lpszSuggest);
255: lprIssue->nPosToken = (int)(lpStr - lpszSrc);
256:
257: bRet = TRUE;
258: goto DONE;
259: }
260: }
261:
262: lpStr++;
263: }
264:
265: DONE:
266:
267: /* unmap view of memory mapped file */
268: UnmapViewOfFile (lpMMFile);
269:
270: return bRet;
271: }
272:
273:
274:
275:
276: /* function get's the next token in the list */
277: int WINAPI GetNextToken (
278: LPPORT *lpToken)
279: {
280: /* increment to next non-ignored token in list */
281: do
282: (char *)*lpToken += ((LPPORT)*lpToken)->nSize;
283: while (((((LPPORT)*lpToken)->dwType) == PT_IGNORED) &&
284: ((((LPPORT)*lpToken)->nSize) != 0));
285:
286: /* if at end of list, reset list to null */
287: if ((((LPPORT)*lpToken)->nSize) == 0)
288: {
289: *lpToken = 0;
290: return 0;
291: }
292:
293: /* return length of token */
294: return (strlen ((char *)*lpToken + ((LPPORT)*lpToken)->nPosToken));
295: }
296:
297:
298:
299: /* function sets the ignore flag on the specified token */
300: void WINAPI IgnoreToken (
301: char *lpszToken,
302: LPPORT lpToken)
303: {
304: /* search for token in list */
305: while (lpToken->nSize != 0)
306: /* if same token */
307: if (!strcmp ((char *)((char *)lpToken + lpToken->nPosToken), lpszToken))
308: {
309: lpToken->dwType |= PT_IGNORED;
310: break;
311: }
312: /* increment to next token */
313: else
314: (char *)lpToken += lpToken->nSize;
315: }
316:
317:
318:
319:
320: /* load tokens from a section of ini file */
321: BOOL WINAPI LoadSection (
322: char *lpszIniFile,
323: char *lpszSection,
324: DWORD dwType,
325: int *nOffset,
326: char *lpMMFile)
327: {
328: char *lpszKeyNames;
329: char *lpKey;
330: char *lpszValue;
331: char *lpVal;
332: char *lpszToken;
333: char lpszDefault[] = "Default";
334: char *lpMem = lpMMFile + *nOffset;
335: int nList;
336:
337:
338: /* allocate lots of memory off heap to save calling applications' stack */
339: if (!(lpszKeyNames = (char *)LocalAlloc (LPTR, TEN_K_LINE)))
340: return FALSE;
341: if (!(lpszValue = (char *)LocalAlloc (LPTR, TWO_K_LINE)))
342: {
343: LocalFree ((HLOCAL)lpszKeyNames);
344: return FALSE;
345: }
346: if (!(lpszToken = (char *)LocalAlloc (LPTR, MAXTOKENLEN)))
347: {
348: LocalFree ((HLOCAL)lpszKeyNames);
349: LocalFree ((HLOCAL)lpszValue);
350: return FALSE;
351: }
352:
353: /* get all keynames in section */
354: if (((nList = GetPrivateProfileString (lpszSection,
355: NULL,
356: lpszDefault,
357: lpszKeyNames,
358: TEN_K_LINE,
359: lpszIniFile)) == (int)(strlen (lpszDefault))) &&
360: !strcmp (lpszDefault, lpszKeyNames))
361: {
362: LocalFree ((HLOCAL)lpszKeyNames);
363: LocalFree ((HLOCAL)lpszValue);
364: LocalFree ((HLOCAL)lpszToken);
365: return FALSE;
366: }
367:
368: /* initialize token pointer and first token */
369: lpKey = lpszKeyNames;
370:
371: /* loop through all keynames */
372: while (TRUE)
373: {
374: /* get next token */
375: strcpy (lpszToken, lpKey);
376:
377: /* get value for token */
378: if ((GetPrivateProfileString (lpszSection,
379: lpszToken,
380: lpszDefault,
381: lpszValue,
382: TWO_K_LINE,
383: lpszIniFile) == strlen (lpszDefault)) &&
384: !strcmp (lpszDefault, lpszValue))
385: {
386: LocalFree ((HLOCAL)lpszKeyNames);
387: LocalFree ((HLOCAL)lpszValue);
388: LocalFree ((HLOCAL)lpszToken);
389: return FALSE;
390: }
391: else
392: {
393: /* break line up into components */
394: ((LPPORT)lpMem)->nPosToken = sizeof (PORT);
395: strcpy ((char *)(lpMem + ((LPPORT)lpMem)->nPosToken), lpszToken);
396:
397: ((LPPORT)lpMem)->nPosHelpStr =
398: ((LPPORT)lpMem)->nPosToken + strlen ((char *)(lpMem + ((LPPORT)lpMem)->nPosToken)) + 1;
399: if (lpVal = strtok (lpszValue, ";"))
400: strcpy ((char *)(lpMem + ((LPPORT)lpMem)->nPosHelpStr), lpVal);
401: else
402: *(lpMem + ((LPPORT)lpMem)->nPosHelpStr) = 0;
403:
404: ((LPPORT)lpMem)->nPosIssue =
405: ((LPPORT)lpMem)->nPosHelpStr + strlen ((char *)(lpMem + ((LPPORT)lpMem)->nPosHelpStr)) + 1;
406: if (lpVal = strtok (NULL, ";"))
407: strcpy ((char *)(lpMem + ((LPPORT)lpMem)->nPosIssue), lpVal);
408: else
409: *(lpMem + ((LPPORT)lpMem)->nPosIssue) = 0;
410:
411: ((LPPORT)lpMem)->nPosSuggest =
412: ((LPPORT)lpMem)->nPosIssue + strlen ((char *)(lpMem + ((LPPORT)lpMem)->nPosIssue)) + 1;
413: if (lpVal = strtok (NULL, ";"))
414: strcpy ((char *)(lpMem + ((LPPORT)lpMem)->nPosSuggest), lpVal);
415: else
416: *(lpMem + ((LPPORT)lpMem)->nPosSuggest) = 0;
417:
418: /* set size of dynamic token structure */
419: ((LPPORT)lpMem)->nSize = (((LPPORT)lpMem)->nPosSuggest +
420: strlen ((char *)(lpMem + ((LPPORT)lpMem)->nPosSuggest)) + 1);
421:
422: /* adjust nSize for DWORD alignment */
423: ((LPPORT)lpMem)->nSize = ((((LPPORT)lpMem)->nSize) + 3) & ~3;
424:
425: /* set token type */
426: ((LPPORT)lpMem)->dwType = dwType;
427:
428: /* adjust list pointer to point beginning of next list element */
429: lpMem += ((LPPORT)lpMem)->nSize;
430: }
431:
432: /* increment token pointer and test for end of list */
433: if (((lpKey += strlen (lpszToken) + 1) - lpszKeyNames) >= (nList - 1))
434: {
435: /* indicate end of list by setting size of next element to 0 */
436: ((LPPORT)lpMem)->nSize = 0;
437: break;
438: }
439: }
440:
441: /* got to end of section, clean up and go away */
442: LocalFree ((HLOCAL)lpszKeyNames);
443: LocalFree ((HLOCAL)lpszValue);
444: LocalFree ((HLOCAL)lpszToken);
445:
446: /* recalculate offset */
447: *nOffset = lpMem - lpMMFile;
448:
449: /* return successful load */
450: return TRUE;
451: }
452:
453:
454:
455: /* retrieve ini file and path */
456: BOOL WINAPI GetIniFile (
457: HANDLE hDLL,
458: char *lpszFile)
459: {
460: char lpszPath[MAX_PATH];
461: char *lpPath;
462: char lpszFileName[MAX_PATH];
463: OFSTRUCT of;
464:
465: /* get module directory and path */
466: GetModuleFileName (hDLL, lpszPath, MAX_PATH);
467: lpPath = lpszPath + strlen (lpszPath);
468:
469: /* find end of path by searching backwards from end to first '\' or ':' */
470: while (lpPath > lpszPath)
471: {
472: if (*lpPath == '\\' ||
473: *lpPath == ':')
474: {
475: lpPath++;
476: break;
477: }
478: lpPath--;
479: }
480:
481: /* terminate at end of path */
482: *lpPath = 0;
483:
484: /* append ini filename to path */
485: LoadString (hDLL, IDS_INIFILE, lpszFileName, MAX_PATH);
486: strcat (lpPath, lpszFileName);
487:
488: /* test for existance */
489: if (!(OpenFile (lpszPath, &of, OF_EXIST)))
490: {
491: GetWindowsDirectory (lpszPath, MAX_PATH);
492: strcat (lpszPath, lpszFileName);
493: if (!(OpenFile (lpszPath, &of, OF_EXIST)))
494: return FALSE;
495: else
496: {
497: strcpy (lpszFile, lpszPath);
498: return TRUE;
499: }
500: }
501: else
502: {
503: strcpy (lpszFile, lpszPath);
504: return TRUE;
505: }
506: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.