📄 w2k_img.c
字号:
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 + -