- Timestamp:
- Jul 31, 2001, 11:48:32 PM (24 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/win32k/dev16/probkrnl.c
r6279 r6432 1 /* $Id: probkrnl.c,v 1.3 6 2001-07-10 05:18:41bird Exp $1 /* $Id: probkrnl.c,v 1.37 2001-07-31 21:48:32 bird Exp $ 2 2 * 3 3 * Description: Autoprobes the os2krnl file and os2krnl[*].sym files. … … 7 7 * 8 8 * All data has to be initiated because this is 16-bit C code 9 * and is to be linked with 32-bit C/C++ code. Uninitia zlied9 * and is to be linked with 32-bit C/C++ code. Uninitialized 10 10 * data ends up in the BSS segment, and that segment can't 11 11 * both be 32-bit and 16-bit. I have not found any other way … … 21 21 * 6. finished. 22 22 * 23 * Copyright (c) 1998-2000 knut st. osmundsen (knut.stange.osmundsen@mynd.no) 23 * Copyright (c) 1998-2001 knut st. osmundsen (knut.stange.osmundsen@mynd.no) 24 * 25 * Initial pmdfvers.lst parsing: 26 * Copyright (c) 2001 Rafal Szymczak (rafalszymczak@discoverfinancial.com) 24 27 * 25 28 * Project Odin Software License can be found in LICENSE.TXT … … 218 221 219 222 /* 220 * privat data221 */ 222 static char * DATA16_INIT apszSym[] 223 * private data 224 */ 225 static char * DATA16_INIT apszSym[] = 223 226 { 224 227 {"c:\\os2krnl.sym"}, /* usual for debugkernel */ … … 232 235 {"c:\\os2\\pdpsi\\pmdf\\warp45_s\\os2krnld.sym"}, /* warp 45 */ 233 236 {"c:\\os2\\pdpsi\\pmdf\\warp45_s\\os2krnlb.sym"}, /* warp 45 */ 237 {"c:\\os2\\system\\pmdf\\os2krnlr.sym"}, /* warp 3 ?*/ 238 {"c:\\os2\\system\\pmdf\\os2krnld.sym"}, /* warp 3 ?*/ 239 {"c:\\os2\\system\\pmdf\\os2krnlb.sym"}, /* warp 3 ?*/ 234 240 {"c:\\os2\\system\\trace\\os2krnl.sym"}, /* warp 3 ?*/ 235 {"c:\\os2\\system\\pmdf\\os2krnlr.sym"}, /* warp 3 ?*/236 241 {"c:\\os2krnlr.sym"}, /* custom */ 237 {"c:\\os2krnl h.sym"}, /* custom */242 {"c:\\os2krnlb.sym"}, /* custom */ 238 243 {"c:\\os2krnld.sym"}, /* custom */ 239 244 NULL 240 245 }; 246 247 /* Location of PMDF list of custom directories */ 248 static char DATA16_INIT szPmdfVers[] = 249 {"c:\\os2\\pdpsi\\pmdf\\pmdfvers.lst"}; 250 241 251 242 252 /* Result from GetKernelInfo/ReadOS2Krnl. */ … … 324 334 int fseek(HFILE hfile, signed long off, int iOrg); 325 335 unsigned long fsize(HFILE hFile); 336 int feof(HFILE hFile); 337 char * fgets(char * psz, int num, HFILE hFile); 326 338 327 339 /* C-library replacements and additions. */ 328 void 340 void * kmemcpy(char *psz1, const char *psz2, int cch); 329 341 char * kstrstr(const char *psz1, const char *psz2); 330 342 int kstrcmp(const char *psz1, const char *psz2); … … 333 345 int kstrlen(const char *psz); 334 346 char * kstrcpy(char * pszTarget, const char * pszSource); 347 char * kstrncpy(char * pszTarget, const char * pszSource, int cch); 348 char * kstrcat(char * pszTarget, const char * pszSource); 349 char * kstrtok(char * pszTarget, const char * pszToken); 335 350 int kargncpy(char *pszTarget, const char *pszArg, unsigned cchMaxlen); 336 351 … … 379 394 380 395 pszIgnored = pszIgnored; 396 if (rc != NO_ERROR) 397 hFile = 0; 381 398 return hFile; 382 399 } … … 407 424 408 425 /** 409 * fseek emul tation426 * fseek emulation 410 427 * @returns Same as DosChgFilePtr 411 428 * @param hFile Filehandle … … 429 446 { 430 447 USHORT rc; 431 unsigned longcb;448 ULONG cb; 432 449 433 450 rc = DosChgFilePtr(hFile, 0, FILE_END, &cb); … … 437 454 438 455 456 /** 457 * feof emulation 458 * @returns EOF (-1) if end-of-file reached, otherwise returns 0 459 * @param hFile Filehandle 460 */ 461 int feof(HFILE hFile) 462 { 463 char achBuffer[1]; 464 ULONG ulActual = 0; 465 USHORT usActual = 0; 466 USHORT rc; 467 468 rc = DosRead(hFile, (PVOID)&achBuffer[0], 1, &usActual); 469 if (rc == ERROR_NO_DATA || usActual == 0) 470 return -1; 471 472 rc = DosChgFilePtr(hFile, -1, FILE_CURRENT, &ulActual); 473 return 0; 474 } 475 476 477 /** 478 * fgets emulation - slow! 479 * @returns pointer to the read string, or NULL if failed 480 * @param pszBuf Pointer to the string buffer to read line into. 481 * @param cchBuf String buffer size. 482 * @param hFile Filehandle. 483 */ 484 char * fgets(char * pszBuf, int cchBuf, HFILE hFile) 485 { 486 char * psz = pszBuf; 487 USHORT usActual; 488 489 if (cchBuf <= 1 || feof(hFile)) 490 return NULL; 491 492 cchBuf--; /* terminator */ 493 do 494 { 495 if (DosRead(hFile, psz, 1, &usActual)) 496 { 497 if (psz == pszBuf) 498 return NULL; 499 *psz = '\0'; 500 break; 501 } 502 } while (--cchBuf && *psz != '\n' && ++psz); 503 504 /* "\r\n" -> "\n" */ 505 if (pszBuf < psz && *psz == '\n' && psz[-1] == '\r') 506 *(--psz) = '\n'; 507 psz[1] = '\0'; 508 509 return pszBuf; 510 } 511 512 #if 0 /* not in use */ 439 513 /** 440 514 * kmemcpy - memory copy - slow! … … 443 517 * @param cch length 444 518 */ 445 void 519 void * kmemcpy(char *psz1, const char *psz2, int cch) 446 520 { 447 521 while (cch-- != 0) 448 522 *psz1++ = *psz2++; 449 } 450 451 452 /** 453 * Finds psz2 in psz2. 523 524 return psz1; 525 } 526 #endif 527 528 529 /** 530 * Finds psz2 in psz1. 454 531 * @returns Pointer to occurence of psz2 in psz1. 455 532 * @param psz1 String to be search. … … 461 538 while (*psz1 != '\0') 462 539 { 463 registerint i = 0;540 int i = 0; 464 541 while (psz2[i] != '\0' && psz1[i] == psz2[i]) 465 542 i++; … … 503 580 * @param len length 504 581 */ 505 int kstrncmp( register const char *psz1, registerconst char *psz2, int cch)582 int kstrncmp(const char *psz1, const char *psz2, int cch) 506 583 { 507 584 int i = 0; … … 527 604 int kstrnicmp(const char *psz1, const char *psz2, int cch) 528 605 { 529 registerchar ch1, ch2;606 char ch1, ch2; 530 607 531 608 do … … 551 628 * @author knut st. osmundsen 552 629 */ 553 int kstrlen( registerconst char * psz)554 { 555 registerint cch = 0;630 int kstrlen(const char * psz) 631 { 632 int cch = 0; 556 633 while (*psz++ != '\0') 557 634 cch++; … … 567 644 * @author knut st. osmundsen (knut.stange.osmundsen@mynd.no) 568 645 */ 569 char * kstrcpy(char * pszTarget, registerconst char * pszSource)570 { 571 registerchar *psz = pszTarget;646 char * kstrcpy(char * pszTarget, const char * pszSource) 647 { 648 char *psz = pszTarget; 572 649 573 650 while (*pszSource != '\0') … … 578 655 579 656 657 /** 658 * String 'n' copy 659 * @returns Pointer to target string. 660 * @param pszTarget Target string. 661 * @param pszSource Source string. 662 * @param cch Number of bytes to copy. 663 */ 664 char * kstrncpy(char * pszTarget, const char * pszSource, int cch) 665 { 666 char * psz = pszTarget; 667 668 while (cch-- && *pszSource != '\0') 669 *psz++ = *pszSource++; 670 671 if (cch) 672 *psz++ = '\0'; 673 674 return pszTarget; 675 } 676 677 678 /** 679 * String concatenation 680 * @returns Pointer to target string. 681 * @param pszTarget Target string. 682 * @param pszSource String to be appended. 683 */ 684 char * kstrcat(char * pszTarget, const char * pszSource) 685 { 686 char * psz = pszTarget; 687 688 while (*psz != '\0') 689 psz++; 690 while (*pszSource != '\0') 691 *psz++ = *pszSource++; 692 *psz = '\0'; 693 return pszTarget; 694 } 695 696 697 /** 698 * String tokenizer 699 * @returns Pointer to found token or NULL if failed. 700 * @param pszTarget String to be tokenized. 701 * @param pszToken Token delimiters string. 702 */ 703 char * kstrtok(char * pszTarget, const char * pszToken) 704 { 705 static char * pszPos = NULL; 706 char * pszRet = pszTarget; 707 708 if (pszTarget) 709 pszPos = pszTarget; 710 else if (!pszPos || *pszPos == '\0') 711 return NULL; 712 pszRet = pszPos; 713 714 while (*pszPos != '\0') 715 { 716 const char *pszTokenI; 717 for (pszTokenI = pszToken; *pszTokenI; pszTokenI++) 718 if (*pszPos == *pszTokenI) 719 { 720 *pszPos++ = '\0'; 721 return pszRet; 722 } 723 724 pszPos++; 725 } 726 pszPos = NULL; 727 return pszRet; 728 } 580 729 581 730 … … 1124 1273 if (!options.fQuiet || rc != NO_ERROR) 1125 1274 { 1126 printf16(" Win32k - Odin32 support driver. (Built %s %s)\n",1275 printf16("\nWin32k - Odin32 support driver. (Built %s %s)\n", 1127 1276 (NPSZ)szBuildTime, (NPSZ)szBuildDate); 1128 1277 … … 1172 1321 printf16("ProbeKernel failed with rc=%d. iProc=%x\n", rc, iProc); 1173 1322 if (psz) printf16("%s\n", psz); 1323 printf16("\n"); 1174 1324 } 1175 1325 } … … 1189 1339 int i; 1190 1340 int n; 1341 APIRET rc2; 1191 1342 SEL selGIS; 1192 1343 SEL selLIS; … … 1194 1345 PLINFOSEG pLIS; 1195 1346 USHORT usBootDrive; 1347 HFILE hPmdfVers; 1196 1348 1197 1349 /*----------------*/ … … 1303 1455 { 1304 1456 #if 1 /* ndef R3TST */ 1305 APIRET rc2;1306 1457 /* search on disk */ 1307 1458 i = 0; … … 1322 1473 } 1323 1474 } 1475 1476 if (rc != NO_ERROR) /* if symbol file still not found. */ 1477 { 1478 /* 1479 * Search pmdfvers.lst for custom directories. 1480 */ 1481 szPmdfVers[0] = (char)usBootDrive; 1482 hPmdfVers = fopen(szPmdfVers, "r"); 1483 if (hPmdfVers) 1484 { 1485 if (!feof(hPmdfVers)) 1486 { 1487 char achBuf[CCHMAXPATH]; 1488 while (fgets(achBuf, sizeof(achBuf), hPmdfVers)) 1489 { 1490 char * pszDirTk = kstrtok(achBuf, ":;,"); 1491 char * pszBuild = kstrtok(NULL, ":;,"); 1492 ULONG ulBuild = 0; 1493 ULONG fKernel = 0; 1494 1495 /* 1496 * Parse build number. 1497 * (Note, not all kernel flags are set.) 1498 */ 1499 if (pszBuild) 1500 { 1501 for (; (*pszBuild >= '0' && *pszBuild <= '9') || *pszBuild == '.'; pszBuild++) 1502 if (*pszBuild != '.') 1503 ulBuild = (ulBuild * 10) + *pszBuild - '0'; 1504 1505 if ((*pszBuild >= 'A' && *pszBuild <= 'Z') || (*pszBuild >= 'a' && *pszBuild <= 'z')) 1506 { 1507 fKernel |= (USHORT)((*pszBuild - (*pszBuild >= 'a' ? 'a'-1 : 'A'-1)) << KF_REV_SHIFT); 1508 pszBuild++; 1509 } 1510 if (*pszBuild == ',') /* This is ignored! */ 1511 *pszBuild++; 1512 1513 if (pszBuild[0] == '_' && (pszBuild[1] == 'S' || pszBuild[1] == 's')) /* _SMP */ 1514 fKernel |= KF_SMP; 1515 else 1516 if (*pszBuild != ',' 1517 && ( (pszBuild[0] == '_' && pszBuild[1] == 'W' && pszBuild[2] == '4') /* _W4 */ 1518 || (pszBuild[0] == '_' && pszBuild[1] == 'U' && pszBuild[2] == 'N' && pszBuild[3] == 'I' && pszBuild[4] == '4') /* _UNI4 */ 1519 ) 1520 ) 1521 fKernel |= KF_W4 | KF_UNI; 1522 else 1523 fKernel |= KF_UNI; 1524 } 1525 else 1526 { 1527 ulBuild = options.ulBuild; 1528 fKernel = options.fKernel; 1529 } 1530 1531 /* 1532 * Consider this entry? 1533 */ 1534 if ( pszDirTk 1535 && *pszDirTk 1536 && ulBuild == options.ulBuild 1537 && (fKernel & (KF_REV_MASK | KF_UNI | KF_SMP | KF_W4)) == (options.fKernel & (KF_REV_MASK | KF_UNI | KF_SMP | KF_W4)) 1538 && (kstrlen(pszDirTk) + 1 + sizeof(szPmdfVers)) < CCHMAXPATH /* no -13 because of os2krnl.sym is appended. */ 1539 ) 1540 { 1541 char szName[CCHMAXPATH]; 1542 char *pszName; 1543 kstrcpy(szName, szPmdfVers); 1544 kstrcpy(&szName[sizeof(szPmdfVers) - 13], pszDirTk); /* 13 = strlen("pmdfvers.lst")+1 */ 1545 pszName = &szName[kstrlen(szName)]; 1546 *pszName++ = '\\'; 1547 1548 /* search custom kernel first */ 1549 kstrcpy(pszName, "os2krnl.sym"); 1550 rc2 = ProbeSymFile(szName); 1551 if (rc2 >= ERROR_PROB_SYM_D32_FIRST) 1552 rc = rc2; 1553 if (rc2 == NO_ERROR) 1554 { 1555 kstrcpy(szSymbolFile, szName); 1556 rc = NO_ERROR; 1557 break; 1558 } 1559 1560 /* search retail kernel */ 1561 if (!(options.fKernel & KF_DEBUG)) 1562 { 1563 kstrcpy(pszName, "os2krnlr.sym"); 1564 rc2 = ProbeSymFile(szName); 1565 if (rc2 >= ERROR_PROB_SYM_D32_FIRST) 1566 rc = rc2; 1567 if (rc2 == NO_ERROR) 1568 { 1569 kstrcpy(szSymbolFile, szName); 1570 rc = NO_ERROR; 1571 break; 1572 } 1573 } 1574 1575 /* search allstrict kernel */ 1576 if (options.fKernel & KF_DEBUG) 1577 { 1578 kstrcpy(pszName, "os2krnld.sym"); 1579 rc2 = ProbeSymFile(szName); 1580 if (rc2 >= ERROR_PROB_SYM_D32_FIRST) 1581 rc = rc2; 1582 if (rc2 == NO_ERROR) 1583 { 1584 kstrcpy(szSymbolFile, szName); 1585 rc = NO_ERROR; 1586 break; 1587 } 1588 } 1589 1590 } 1591 } /* while */ 1592 } 1593 fclose(hPmdfVers); 1594 } 1595 } 1324 1596 } 1325 1597
Note:
See TracChangeset
for help on using the changeset viewer.