⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 w2k_img.c

📁 Undocumented Windows 2000 Secrets简体中文版.+源码光盘
💻 C
📖 第 1 页 / 共 5 页
字号:
    if (pdCount != NULL) *pdCount = dCount;
    return pidd;
    }

// -----------------------------------------------------------------

PIMAGE_DEBUG_DIRECTORY WINAPI imgDbgDirectory (PIMG_DBG pid,
                                               DWORD    dType)
    {
    DWORD                  dCount, i;
    PIMAGE_DEBUG_DIRECTORY pidd = NULL;

    if ((pidd = imgDbgDirectories (pid, &dCount)) != NULL)
        {
        for (i = 0; i < dCount; i++, pidd++)
            {
            if (pidd->Type == dType) break;
            }
        if (i == dCount) pidd = NULL;
        }
    return pidd;
    }

// -----------------------------------------------------------------

PCV_DATA WINAPI imgDbgCv (PIMG_DBG pid,
                          PDWORD   pdSize)
    {
    PIMAGE_DEBUG_DIRECTORY pidd;
    DWORD                  dSize = 0;
    PCV_DATA               pcd   = NULL;

    if ((pidd = imgDbgDirectory (pid, IMAGE_DEBUG_TYPE_CODEVIEW))
        != NULL)
        {
        pcd   = IMG_DBG_DATA (pid, pidd);
        dSize = pidd->SizeOfData;
        }
    if (pdSize != NULL) *pdSize = dSize;
    return pcd;
    }

// -----------------------------------------------------------------

PFPO_DATA WINAPI imgDbgFpo (PIMG_DBG pid,
                            PDWORD   pdCount)
    {
    PIMAGE_DEBUG_DIRECTORY pidd;
    DWORD                  dCount = 0;
    PFPO_DATA              pfd    = NULL;

    if ((pidd = imgDbgDirectory (pid, IMAGE_DEBUG_TYPE_FPO))
        != NULL)
        {
        pfd    = IMG_DBG_DATA (pid, pidd);
        dCount = pidd->SizeOfData / FPO_DATA_;
        }
    if (pdCount != NULL) *pdCount = dCount;
    return pfd;
    }

// -----------------------------------------------------------------

PIMAGE_DEBUG_MISC WINAPI imgDbgMisc (PIMG_DBG pid,
                                     PDWORD   pdCount)
    {
    PIMAGE_DEBUG_DIRECTORY pidd;
    PIMAGE_DEBUG_MISC      pidm1;
    DWORD                  i;
    DWORD                  dCount = 0;
    PIMAGE_DEBUG_MISC      pidm   = NULL;

    if ((pidd = imgDbgDirectory (pid, IMAGE_DEBUG_TYPE_MISC))
        != NULL)
        {
        pidm = IMG_DBG_DATA (pid, pidd);

        for (i = 0; i < pidd->SizeOfData; i += pidm1->Length)
            {
            pidm1 = (PIMAGE_DEBUG_MISC) ((PBYTE) pidm + i);

            if ((pidd->SizeOfData - i < IMAGE_DEBUG_MISC_) ||
                (pidd->SizeOfData - i < pidm1->Length    )) break;

            dCount++;
            }
        }
    if (pdCount != NULL) *pdCount = dCount;
    return pidm;
    }

// -----------------------------------------------------------------

POMAP_TO_SRC WINAPI imgDbgOmapToSrc (PIMG_DBG pid,
                                     PDWORD   pdCount)
    {
    PIMAGE_DEBUG_DIRECTORY pidd;
    DWORD                  dCount = 0;
    POMAP_TO_SRC           pots   = NULL;

    if ((pidd = imgDbgDirectory (pid,
                                 IMAGE_DEBUG_TYPE_OMAP_TO_SRC))
        != NULL)
        {
        pots   = IMG_DBG_DATA (pid, pidd);
        dCount = pidd->SizeOfData / OMAP_TO_SRC_;
        }
    if (pdCount != NULL) *pdCount = dCount;
    return pots;
    }

// -----------------------------------------------------------------

POMAP_FROM_SRC WINAPI imgDbgOmapFromSrc (PIMG_DBG pid,
                                         PDWORD   pdCount)
    {
    PIMAGE_DEBUG_DIRECTORY pidd;
    DWORD                  dCount = 0;
    POMAP_FROM_SRC         pofs   = NULL;

    if ((pidd = imgDbgDirectory (pid,
                                 IMAGE_DEBUG_TYPE_OMAP_FROM_SRC))
        != NULL)
        {
        pofs   = IMG_DBG_DATA (pid, pidd);
        dCount = pidd->SizeOfData / OMAP_FROM_SRC_;
        }
    if (pdCount != NULL) *pdCount = dCount;
    return pofs;
    }

// =================================================================
// PDB FILE MANAGEMENT
// =================================================================

BOOL WINAPI imgPdbVerify (PIMG_PDB pip,
                          DWORD    dSize)
    {
    DWORD i, n;
    BOOL  fOk = FALSE;

    if ((pip != NULL) && (dSize >= IMG_PDB_)
        &&
        (!lstrcmpA (pip->Header.Signature.abSignature,
                    PDB_SIGNATURE_200))
        &&
        pip->Header.dPageSize
        &&
        (dSize >= pip->Header.wFilePages * pip->Header.dPageSize))
        {
        fOk = TRUE;

        n = imgPdbPages (pip, pip->Header.RootStream.dStreamSize);

        for (i = 0; i < n; i++)
            {
            if (pip->Header.awRootPages [i] >=
                pip->Header.wFilePages)
                {
                fOk = FALSE;
                break;
                }
            }
        if (fOk)
            {
            pip->Header.RootStream.pwStreamPages =
                pip->Header.awRootPages;
            }
        }
    return fOk;
    }

// -----------------------------------------------------------------

PVOID WINAPI imgPdbLoadA (PBYTE  pbPath,
                          PDWORD pdSize)
    {
    DWORD dOffset = (pdSize != NULL ? *pdSize : 0);
    DWORD dSize   = dOffset;
    PBYTE pbData  = imgFileLoadA (pbPath, &dSize);

    if ((pbData != NULL) &&
        (!imgPdbVerify ((PIMG_PDB) (pbData + dOffset), dSize)))
        {
        pbData = imgMemoryDestroy (pbData);
        }
    if (pdSize != NULL) *pdSize = dSize;
    return pbData;
    }

// -----------------------------------------------------------------

PVOID WINAPI imgPdbLoadW (PWORD  pwPath,
                          PDWORD pdSize)
    {
    DWORD dOffset = (pdSize != NULL ? *pdSize : 0);
    DWORD dSize   = dOffset;
    PBYTE pbData  = imgFileLoadW (pwPath, &dSize);

    if ((pbData != NULL) &&
        (!imgPdbVerify ((PIMG_PDB) (pbData + dOffset), dSize)))
        {
        pbData = imgMemoryDestroy (pbData);
        }
    if (pdSize != NULL) *pdSize = dSize;
    return pbData;
    }

// -----------------------------------------------------------------

PVOID WINAPI imgPdbPage (PIMG_PDB pip,
                         DWORD    dPage)
    {
    PVOID pPage = NULL;

    if ((pip != NULL) && (dPage < pip->Header.wFilePages))
        {
        pPage = (PBYTE) pip + (dPage * pip->Header.dPageSize);
        }
    return pPage;
    }

// -----------------------------------------------------------------

DWORD WINAPI imgPdbPages (PIMG_PDB pip,
                          DWORD    dBytes)
    {
    DWORD dPages = 0;

    if ((pip != NULL) && dBytes)
        {
        dPages = ((dBytes - 1) / pip->Header.dPageSize) + 1;
        }
    return dPages;
    }

// -----------------------------------------------------------------

PVOID WINAPI imgPdbRead (PIMG_PDB    pip,
                         PPDB_STREAM pps)
    {
    DWORD i, j, n;
    PVOID pPage;
    PBYTE pbData = NULL;

    if ((pip != NULL) && (pps != NULL) &&
        ((pbData = imgMemoryCreate (pps->dStreamSize)) != NULL))
        {
        for (i = j = 0; i < pps->dStreamSize; i += n)
            {
            if ((pPage = imgPdbPage (pip, pps->pwStreamPages [j++]))
                == NULL)
                {
                pbData = imgMemoryDestroy (pbData);
                break;
                }
            n = min (pps->dStreamSize - i, pip->Header.dPageSize);
            CopyMemory (pbData + i, pPage, n);
            }
        }
    return pbData;
    }

// -----------------------------------------------------------------

PPDB_ROOT WINAPI imgPdbRoot (PIMG_PDB pip)
    {
    DWORD     i;
    PWORD     pwPages;
    PPDB_ROOT ppr = NULL;

    if ((pip != NULL) &&
        ((ppr = imgPdbRead (pip, &pip->Header.RootStream)) != NULL))
        {
        pwPages = PDB_PAGES (ppr);

        for (i = 0; i < ppr->wCount; i++)
            {
            if (ppr->aStreams [i].dStreamSize != PDB_STREAM_FREE)
                {
                ppr->aStreams [i].pwStreamPages = pwPages;

                pwPages +=
                   imgPdbPages (pip, ppr->aStreams [i].dStreamSize);
                }
            else
                {
                ppr->aStreams [i].pwStreamPages = NULL;
                }
            }
        }
    return ppr;
    }

// -----------------------------------------------------------------

PVOID WINAPI imgPdbStream (PIMG_PDB pip,
                           DWORD    dStream,
                           PDWORD   pdSize)
    {
    PPDB_ROOT ppr;
    DWORD     dSize = 0;
    PVOID     pData = NULL;

    if ((ppr = imgPdbRoot (pip)) != NULL)
        {
        if (dStream < ppr->wCount)
            {
            pData = imgPdbRead (pip, ppr->aStreams + dStream);
            dSize = ppr->aStreams [dStream].dStreamSize;
            }
        imgMemoryDestroy (ppr);
        }
    if (pdSize != NULL) *pdSize = dSize;
    return pData;
    }

// -----------------------------------------------------------------

PVOID WINAPI imgPdbStreamExA (PBYTE  pbPath,
                              DWORD  dStream,
                              PDWORD pdSize)
    {
    PIMG_PDB pip;
    DWORD    dSize = 0;
    PVOID    pData = NULL;

    if ((pip = imgPdbLoadA (pbPath, NULL)) != NULL)
        {
        pData = imgPdbStream (pip, dStream, &dSize);
        imgMemoryDestroy (pip);
        }
    if (pdSize != NULL) *pdSize = dSize;
    return pData;
    }

// -----------------------------------------------------------------

PVOID WINAPI imgPdbStreamExW (PWORD  pwPath,
                              DWORD  dStream,
                              PDWORD pdSize)
    {
    PIMG_PDB pip;
    DWORD    dSize = 0;
    PVOID    pData = NULL;

    if ((pip = imgPdbLoadW (pwPath, NULL)) != NULL)
        {
        pData = imgPdbStream (pip, dStream, &dSize);
        imgMemoryDestroy (pip);
        }
    if (pdSize != NULL) *pdSize = dSize;
    return pData;
    }

// -----------------------------------------------------------------

PPDB_PUBSYM WINAPI imgPdbSymbols (PIMG_PDB pip,
                                  PDWORD   pdCount,
                                  PDWORD   pdSize)
    {
    PPDB_PUBSYM ppp1;
    DWORD       i;
    DWORD       dCount = 0;
    DWORD       dSize  = 0;
    PPDB_PUBSYM ppp    = NULL;

    if ((ppp = imgPdbStream (pip, PDB_STREAM_PUBSYM, &dSize))
        != NULL)
        {
        for (i  = 0; dSize - i >= PDB_PUBSYM_;
             i += PDB_PUBSYM_SIZE (ppp1))
            {
            ppp1 = (PPDB_PUBSYM) ((PBYTE) ppp + i);
            if (dSize - i < PDB_PUBSYM_SIZE (ppp1)) break;
            if (ppp1->Header.wRecordType == PDB_PUB32) dCount++;
            }
        }
    if (pdCount != NULL) *pdCount = dCount;
    if (pdSize  != NULL) *pdSize  = dSize;
    return ppp;
    }

// =================================================================
// MODULE INFO MANAGEMENT
// =================================================================

BOOL WINAPI imgInfoInitialize (PIMG_INFO pii,
                               PVOID     pBase,
                               DWORD     dSize)
    {
    PIMG_DBG pid;
    DWORD    i;
    BOOL     fOk = FALSE;

    if (pii != NULL)
        {
        pid = &pii->DbgFile;

        pii->pBase        =  (pBase != NULL
                              ? pBase
                              : (PVOID) pid->Header.ImageBase);

        pii->pHeader      = &pid->Header;
        pii->pSections    =  pid->aSections;

        pii->pbExports    = imgDbgExports
                                (pid, &pii->dExports);

        pii->pDirectories = imgDbgDirectories
                                (pid, &pii->dDirectories);

        pii->pCvData      = imgDbgCv
                                (pid, &pii->dCvData);

        pii->pFpoEntries  = imgDbgFpo
                                (pid, &pii->dFpoEntries);

        pii->pMiscEntries = imgDbgMisc
                                (pid, &pii->dMiscEntries);

        pii->pOmapToSrc   = imgDbgOmapToSrc
                                (pid, &pii->dOmapToSrc);

        pii->pOmapFromSrc = imgDbgOmapFromSrc
                                (pid, &pii->dOmapFromSrc);

        pii->dSize        = dSize;
        pii->dSections    = pii->pHeader->NumberOfSections;

        for (i = 0; i < pii->dSections; i++)
            {
            pii->pSections [i].PointerToRawData =
                imgInfoOmapSection (pii, i+1);
            }
        fOk = TRUE;
        }
    return fOk;
    }

// -----------------------------------------------------------------

PIMG_INFO WINAPI imgInfoLoadA (PBYTE pbPath,
            

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -