VirtualBox

Changeset 398 in kBuild for trunk/src/kDepIDB


Ignore:
Timestamp:
Jan 13, 2006 4:00:35 AM (19 years ago)
Author:
bird
Message:

Bugfixing.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kDepIDB/kDepIDB.c

    r393 r398  
    4545#define OFFSETOF(type, member)  ( (int)(void *)&( ((type *)(void *)0)->member) )
    4646
     47/*#define DEBUG*/
     48#ifdef DEBUG
     49#define dprintf(a)              printf a
     50#define dump(pb, cb, offBase)   hexdump(pb,cb,offBase)
     51#else
     52#define dprintf(a)              do {} while (0)
     53#define dump(pb, cb, offBase)   do {} while (0)
     54#endif
    4755
    4856
     
    5361static const char *argv0 = "";
    5462
     63#ifdef DEBUG
     64/**
     65 * Performs a hexdump.
     66 */
     67static void hexdump(const uint8_t *pb, size_t cb, size_t offBase)
     68{
     69    static const char   szHex[16] = "0123456789abcdef";
     70
     71    const unsigned      cchWidth = 16;
     72    size_t              off = 0;
     73    while (off < cb)
     74    {
     75        unsigned i;
     76        printf("%s%0*x %04x:", off ? "\n" : "", sizeof(pb) * 2, offBase + off, off);
     77        for (i = 0; i < cchWidth && off + i < cb ; i++)
     78            printf(off + i < cb ? !(i & 7) && i ? "-%02x" : " %02x" : "   ", pb[i]);
     79
     80        while (i++ < cchWidth)
     81                printf("   ");
     82        printf(" ");
     83
     84        for (i = 0; i < cchWidth && off + i < cb; i++)
     85        {
     86            const uint8_t u8 = pb[i];
     87            printf("%c", u8 < 127 && u8 >= 32 ? u8 : '.', 1);
     88        }
     89        off += cchWidth;
     90        pb  += cchWidth;
     91    }
     92    printf("\n");
     93}
     94#endif
    5595
    5696/**
     
    66106static int ScanStream(uint8_t *pbStream, size_t cbStream, const char *pszPrefix, size_t cchPrefix)
    67107{
    68     register char chFirst = *pszPrefix;
    69     while (cbStream > cchPrefix + 2)
    70     {
    71         if (    *pbStream != chFirst
    72             ||  memcmp(pbStream, pszPrefix, cchPrefix))
    73         {
    74             pbStream++;
    75             cbStream--;
     108    const uint8_t  *pbCur = pbStream;
     109    size_t          cbLeft = cbStream;
     110    register char   chFirst = *pszPrefix;
     111    while (cbLeft > cchPrefix + 2)
     112    {
     113        if (    *pbCur != chFirst
     114            ||  memcmp(pbCur, pszPrefix, cchPrefix))
     115        {
     116            pbCur++;
     117            cbLeft--;
    76118        }
    77119        else
    78120        {
    79121            size_t cchDep;
    80             pbStream += cchPrefix;
    81             cchDep = strlen(pbStream);
    82             depAdd(pbStream, cchDep);
    83 
    84             pbStream += cchDep;
    85             cbStream -= cchDep + cchPrefix;
     122            pbCur += cchPrefix;
     123            cchDep = strlen(pbCur);
     124            depAdd(pbCur, cchDep);
     125            dprintf(("%05x: '%s'\n", pbCur - pbStream, pbCur));
     126
     127            pbCur += cchDep;
     128            cbLeft -= cchDep + cchPrefix;
    86129        }
    87130    }
     
    206249    if (pHdr->iStartPage >= pHdr->cPages && pHdr->iStartPage <= 0)
    207250    {
    208         fprintf(stderr, "%s: error: Bad PDB 2.0 header - cbPage * cPages != cbFile.\n", argv0);
     251        fprintf(stderr, "%s: error: Bad PDB 2.0 header - iStartPage=%u cPages=%u.\n", argv0,
     252                pHdr->iStartPage, pHdr->cPages);
     253        return 1;
     254    }
     255    if (pHdr->iRootPages >= pHdr->cPages && pHdr->iRootPages <= 0)
     256    {
     257        fprintf(stderr, "%s: error: Bad PDB 2.0 header - iRootPages=%u cPage=%u.\n", argv0,
     258                pHdr->iStartPage, pHdr->cPages);
    209259        return 1;
    210260    }
    211261    return 0;
     262}
     263
     264static size_t Pdb70Align(PPDB70HDR pHdr, size_t cb)
     265{
     266    if (cb == ~(uint32_t)0 || !cb)
     267        return 0;
     268    return ((cb + pHdr->cbPage - 1) / pHdr->cbPage) * pHdr->cbPage;
    212269}
    213270
     
    221278static void *Pdb70AllocAndRead(PPDB70HDR pHdr, size_t cb, PPDB70PAGE paiPageMap)
    222279{
    223     size_t cPages = Pdb70Pages(pHdr, cb);
    224     uint8_t *pbBuf = malloc(cPages * pHdr->cbPage + 1);
     280    const size_t    cbPage = pHdr->cbPage;
     281    size_t          cPages = Pdb70Pages(pHdr, cb);
     282    uint8_t *pbBuf = malloc(cPages * cbPage + 1);
    225283    if (pbBuf)
    226284    {
     
    229287        {
    230288            size_t off = paiPageMap[iPage];
    231             off *= pHdr->cbPage;
    232             memcpy(pbBuf + iPage * pHdr->cbPage, (uint8_t *)pHdr + off, pHdr->cbPage);
     289            if (off < pHdr->cPages)
     290            {
     291                off *= cbPage;
     292                memcpy(pbBuf + iPage * cbPage, (uint8_t *)pHdr + off, cbPage);
     293                dump(pbBuf + iPage * cbPage, cbPage, off);
     294            }
     295            else
     296            {
     297                fprintf(stderr, "%s: warning: Invalid page index %u (max %u)!\n", argv0,
     298                        (unsigned)off, pHdr->cPages);
     299                memset(pbBuf + iPage * cbPage, 0, cbPage);
     300            }
     301
    233302            iPage++;
    234303        }
    235         pbBuf[cPages * pHdr->cbPage] = '\0';
     304        pbBuf[cPages * cbPage] = '\0';
    236305    }
    237306    else
    238         fprintf(stderr, "%s: error: failed to allocate %d bytes\n", argv0, cPages * pHdr->cbPage + 1);
     307        fprintf(stderr, "%s: error: failed to allocate %u bytes\n", argv0, cPages * cbPage + 1);
    239308    return pbBuf;
    240309}
     
    288357    while (iStream-- > 0)
    289358        if (pRoot->aStreams[iStream].cbStream != ~(uint32_t)0)
    290             paiPageMap += Pdb70Pages(pHdr, pRoot->aStreams[iStream].cbStream) / pHdr->cbPage;
     359            paiPageMap += Pdb70Pages(pHdr, pRoot->aStreams[iStream].cbStream);
    291360
    292361    if (pcbStream)
     
    301370    unsigned    iStream;
    302371    int         rc = 0;
     372    dprintf(("pdb70\n"));
    303373
    304374    /*
     
    318388    for (iStream = 0; iStream < pRoot->cStreams && !rc; iStream++)
    319389    {
    320         uint8_t *pbStream;
     390        const size_t cbStream = Pdb70Align(pHdr, pRoot->aStreams[iStream].cbStream);
     391        uint8_t     *pbStream;
    321392        if (    pRoot->aStreams[iStream].cbStream == ~(uint32_t)0
    322393            ||  !pRoot->aStreams[iStream].cbStream)
    323394            continue;
     395        dprintf(("Stream #%d: %#x bytes (%#x aligned)\n", iStream, pRoot->aStreams[iStream].cbStream, cbStream));
    324396        pbStream = (uint8_t *)Pdb70AllocAndReadStream(pHdr, pRoot, iStream, NULL);
    325397        if (pbStream)
    326398        {
    327             rc = ScanStream(pbStream, pRoot->aStreams[iStream].cbStream, "/mr/inversedeps/", sizeof("/mr/inversedeps/") - 1);
     399            rc = ScanStream(pbStream, cbStream, "/mr/inversedeps/", sizeof("/mr/inversedeps/") - 1);
    328400            free(pbStream);
    329401        }
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette