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