Changeset 6432 for trunk/src


Ignore:
Timestamp:
Jul 31, 2001, 11:48:32 PM (24 years ago)
Author:
bird
Message:

Merged in Rafals pmdfvers.lst parsing.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/win32k/dev16/probkrnl.c

    r6279 r6432  
    1 /* $Id: probkrnl.c,v 1.36 2001-07-10 05:18:41 bird Exp $
     1/* $Id: probkrnl.c,v 1.37 2001-07-31 21:48:32 bird Exp $
    22 *
    33 * Description:   Autoprobes the os2krnl file and os2krnl[*].sym files.
     
    77 *
    88 *                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. Uninitiazlied
     9 *                and is to be linked with 32-bit C/C++ code. Uninitialized
    1010 *                data ends up in the BSS segment, and that segment can't
    1111 *                both be 32-bit and 16-bit. I have not found any other way
     
    2121 *                6. finished.
    2222 *
    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)
    2427 *
    2528 * Project Odin Software License can be found in LICENSE.TXT
     
    218221
    219222/*
    220  * privat data
    221  */
    222 static char *   DATA16_INIT apszSym[]        =
     223 * private data
     224 */
     225static char *   DATA16_INIT apszSym[]       =
    223226{
    224227    {"c:\\os2krnl.sym"},                              /* usual for debugkernel */
     
    232235    {"c:\\os2\\pdpsi\\pmdf\\warp45_s\\os2krnld.sym"}, /* warp 45 */
    233236    {"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 ?*/
    234240    {"c:\\os2\\system\\trace\\os2krnl.sym"},          /* warp 3 ?*/
    235     {"c:\\os2\\system\\pmdf\\os2krnlr.sym"},          /* warp 3 ?*/
    236241    {"c:\\os2krnlr.sym"},                             /* custom */
    237     {"c:\\os2krnlh.sym"},                             /* custom */
     242    {"c:\\os2krnlb.sym"},                             /* custom */
    238243    {"c:\\os2krnld.sym"},                             /* custom */
    239244    NULL
    240245};
     246
     247/* Location of PMDF list of custom directories */
     248static char DATA16_INIT szPmdfVers[]        =
     249    {"c:\\os2\\pdpsi\\pmdf\\pmdfvers.lst"};
     250
    241251
    242252/* Result from GetKernelInfo/ReadOS2Krnl. */
     
    324334int      fseek(HFILE hfile, signed long off, int iOrg);
    325335unsigned long fsize(HFILE hFile);
     336int      feof(HFILE hFile);
     337char *   fgets(char * psz, int num, HFILE hFile);
    326338
    327339/* C-library replacements and additions. */
    328 void     kmemcpy(char *psz1, const char *psz2, int cch);
     340void *   kmemcpy(char *psz1, const char *psz2, int cch);
    329341char *   kstrstr(const char *psz1, const char *psz2);
    330342int      kstrcmp(const char *psz1, const char *psz2);
     
    333345int      kstrlen(const char *psz);
    334346char *   kstrcpy(char * pszTarget, const char * pszSource);
     347char *   kstrncpy(char * pszTarget, const char * pszSource, int cch);
     348char *   kstrcat(char * pszTarget, const char * pszSource);
     349char *   kstrtok(char * pszTarget, const char * pszToken);
    335350int      kargncpy(char *pszTarget, const char *pszArg, unsigned cchMaxlen);
    336351
     
    379394
    380395    pszIgnored = pszIgnored;
     396    if (rc != NO_ERROR)
     397       hFile = 0;
    381398    return hFile;
    382399}
     
    407424
    408425/**
    409  * fseek emultation
     426 * fseek emulation
    410427 * @returns   Same as DosChgFilePtr
    411428 * @param     hFile   Filehandle
     
    429446{
    430447    USHORT rc;
    431     unsigned long cb;
     448    ULONG cb;
    432449
    433450    rc = DosChgFilePtr(hFile, 0, FILE_END, &cb);
     
    437454
    438455
     456/**
     457 * feof emulation
     458 * @returns   EOF (-1) if end-of-file reached, otherwise returns 0
     459 * @param     hFile   Filehandle
     460 */
     461int 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 */
     484char * 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 */
    439513/**
    440514 * kmemcpy - memory copy - slow!
     
    443517 * @param     cch length
    444518 */
    445 void     kmemcpy(char *psz1, const char *psz2, int cch)
     519void *   kmemcpy(char *psz1, const char *psz2, int cch)
    446520{
    447521    while (cch-- != 0)
    448522        *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.
    454531 * @returns   Pointer to occurence of psz2 in psz1.
    455532 * @param     psz1  String to be search.
     
    461538    while (*psz1 != '\0')
    462539    {
    463         register int i = 0;
     540        int i = 0;
    464541        while (psz2[i] != '\0' && psz1[i] == psz2[i])
    465542            i++;
     
    503580 * @param     len length
    504581 */
    505 int      kstrncmp(register const char *psz1, register const char *psz2, int cch)
     582int      kstrncmp(const char *psz1, const char *psz2, int cch)
    506583{
    507584    int i = 0;
     
    527604int      kstrnicmp(const char *psz1, const char *psz2, int cch)
    528605{
    529     register char ch1, ch2;
     606    char ch1, ch2;
    530607
    531608    do
     
    551628 * @author    knut st. osmundsen
    552629 */
    553 int kstrlen(register const char * psz)
    554 {
    555     register int cch = 0;
     630int kstrlen(const char * psz)
     631{
     632    int cch = 0;
    556633    while (*psz++ != '\0')
    557634        cch++;
     
    567644 * @author    knut st. osmundsen (knut.stange.osmundsen@mynd.no)
    568645 */
    569 char * kstrcpy(char * pszTarget, register const char * pszSource)
    570 {
    571     register char *psz = pszTarget;
     646char * kstrcpy(char * pszTarget, const char * pszSource)
     647{
     648    char *psz = pszTarget;
    572649
    573650    while (*pszSource != '\0')
     
    578655
    579656
     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 */
     664char * 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 */
     684char * 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 */
     703char * 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}
    580729
    581730
     
    11241273    if (!options.fQuiet || rc != NO_ERROR)
    11251274    {
    1126         printf16("Win32k - Odin32 support driver. (Built %s %s)\n",
     1275        printf16("\nWin32k - Odin32 support driver. (Built %s %s)\n",
    11271276                 (NPSZ)szBuildTime, (NPSZ)szBuildDate);
    11281277
     
    11721321            printf16("ProbeKernel failed with rc=%d. iProc=%x\n", rc, iProc);
    11731322            if (psz) printf16("%s\n", psz);
     1323            printf16("\n");
    11741324        }
    11751325    }
     
    11891339    int         i;
    11901340    int         n;
     1341    APIRET      rc2;
    11911342    SEL         selGIS;
    11921343    SEL         selLIS;
     
    11941345    PLINFOSEG   pLIS;
    11951346    USHORT      usBootDrive;
     1347    HFILE       hPmdfVers;
    11961348
    11971349    /*----------------*/
     
    13031455            {
    13041456                #if 1 /* ndef R3TST */
    1305                 APIRET rc2;
    13061457                /* search on disk */
    13071458                i = 0;
     
    13221473            }
    13231474        }
     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        }
    13241596    }
    13251597
Note: See TracChangeset for help on using the changeset viewer.