📄 w2k_cv.c
字号:
}
}
printf (T("\r\n"));
}
DisplaySeparator ();
return;
}
// -----------------------------------------------------------------
VOID WINAPI DisplayCvData (PIMG_INFO pii)
{
if (pii->dCvData >= CV_HEADER_)
{
switch (pii->pCvData->Header.Signature.dVersion)
{
case CV_SIGNATURE_NB09:
{
DisplayNB09Data (pii, &pii->pCvData->NB09,
pii->dCvData);
break;
}
case CV_SIGNATURE_NB10:
{
DisplayNB10Data (pii, &pii->pCvData->NB10,
pii->dCvData);
break;
}
default:
{
DisplayNBXXData (pii, &pii->pCvData->Header,
pii->dCvData);
break;
}
}
}
else
{
DisplayTop (atCodeViewXX, -1, NULL);
DisplaySeparator ();
}
return;
}
// -----------------------------------------------------------------
VOID WINAPI DisplaySymbols (PIMG_INFO pii)
{
PIMG_PUBSYM pip, pip1;
IMG_SYMBOL is;
DWORD dCount, dSize, dVersion, dIndex;
if ((pip = imgInfoSymbols (pii, &dCount, &dSize, &dVersion))
!= NULL)
{
DisplayTop (atSymbols, dCount, NULL,
((PCV_SIGNATURE) &dVersion)->abText [0],
((PCV_SIGNATURE) &dVersion)->abText [1],
((PCV_SIGNATURE) &dVersion)->abText [2],
((PCV_SIGNATURE) &dVersion)->abText [3]);
dIndex = 0;
pip1 = pip;
while (dIndex < dCount)
{
if (imgSymbolTest (pip1))
{
imgSymbolInfo (pip1, pii, &is, TRUE);
printf (T("%6lu: "), dIndex+1);
if (is.dSection &&
(is.dSection <= pii->dSections))
{
DisplaySectionName (pii, is.dSection);
}
else
{
printf (T("[#%04hX] "), is.dSection);
}
printf (T(" %08lX %hs\r\n"),
is.pAddress, is.abName);
dIndex++;
}
pip1 = imgSymbolNext (pip1);
}
imgMemoryDestroy (pip);
}
else
{
DisplayTop (atSymbols, -1, NULL);
}
DisplaySeparator ();
return;
}
// -----------------------------------------------------------------
VOID WINAPI DisplaySymbolsEx (PIMG_INFO pii)
{
PIMG_PUBSYM pip, pip1;
IMG_SYMBOL is;
DWORD dCount, dSize, dVersion, dIndex;
if ((pip = imgInfoSymbols (pii, &dCount, &dSize, &dVersion))
!= NULL)
{
DisplayTop (atSymbolsEx, dCount, NULL,
((PCV_SIGNATURE) &dVersion)->abText [0],
((PCV_SIGNATURE) &dVersion)->abText [1],
((PCV_SIGNATURE) &dVersion)->abText [2],
((PCV_SIGNATURE) &dVersion)->abText [3]);
dIndex = 0;
pip1 = pip;
while (dIndex < dCount)
{
if (imgSymbolTest (pip1))
{
imgSymbolInfo (pip1, pii, &is, TRUE);
printf (T("%6lu: "), dIndex+1);
if (is.dSection &&
(is.dSection <= pii->dSections))
{
DisplaySectionName (pii, is.dSection);
}
else
{
printf (T("[#%04hX] "), is.dSection);
}
printf (T(" %08lX %08lX %08lX %08lX %8lX "),
is.dRaw, is.dSource, is.dTarget,
is.pAddress, is.dOffset);
if (is.dStack != -1)
{
printf (T("%8lX "), is.dStack);
}
else
{
printf (T(" "));
}
printf (T("%c %hs\r\n"),
(imgSymbolExported (pip1, pii) ? '*' : ' '),
is.abName);
dIndex++;
}
pip1 = imgSymbolNext (pip1);
}
imgMemoryDestroy (pip);
}
else
{
DisplayTop (atSymbols, -1, NULL);
}
DisplaySeparator ();
return;
}
// -----------------------------------------------------------------
VOID WINAPI DisplayFpoEntries (PIMG_INFO pii)
{
DWORD i;
if (pii->dFpoEntries)
{
DisplayTop (atFpoEntries, pii->dFpoEntries, NULL);
for (i = 0; i < pii->dFpoEntries; i++)
{
printf (T("%6lu: %08lX %08lX %08lX %04hX\r\n"),
i+1,
pii->pFpoEntries [i].ulOffStart,
pii->pFpoEntries [i].cbProcSize,
pii->pFpoEntries [i].cdwLocals,
pii->pFpoEntries [i].cdwParams);
}
}
else
{
DisplayTop (atFpoEntries, -1, NULL);
}
DisplaySeparator ();
return;
}
// -----------------------------------------------------------------
VOID WINAPI DisplayMiscEntries (PIMG_INFO pii)
{
DWORD i;
if (pii->dMiscEntries)
{
DisplayTop (atMiscEntries, pii->dMiscEntries, NULL);
for (i = 0; i < pii->dMiscEntries; i++)
{
printf ((pii->pMiscEntries [i].Unicode
? T("%6lu: %08lX %08lX %ls\r\n")
: T("%6lu: %08lX %08lX %hs\r\n")),
i+1,
pii->pMiscEntries [i].DataType,
pii->pMiscEntries [i].Length,
pii->pMiscEntries [i].Data);
}
}
else
{
DisplayTop (atMiscEntries, -1, NULL);
}
DisplaySeparator ();
return;
}
// -----------------------------------------------------------------
VOID WINAPI DisplayOmapFromSrc (PIMG_INFO pii)
{
DWORD i, j;
if (pii->dOmapFromSrc)
{
DisplayTop (atOmapFromSrc, pii->dOmapFromSrc, NULL);
for (i = j = 0; i < pii->dOmapFromSrc; i++)
{
printf (T("%6lu: %08lX %08lX\r\n"),
i+1,
pii->pOmapFromSrc [i].dSource,
pii->pOmapFromSrc [i].dTarget);
if (!pii->pOmapFromSrc [i].dTarget) j++;
}
DisplaySeparator ();
printf (T("%6lu entr%s mapped to zero\r\n"),
j, (j == 1 ? T("y") : T("ies")));
}
else
{
DisplayTop (atOmapFromSrc, -1, NULL);
DisplaySeparator ();
}
return;
}
// -----------------------------------------------------------------
VOID WINAPI DisplayOmapToSrc (PIMG_INFO pii)
{
DWORD i, j;
if (pii->dOmapToSrc)
{
DisplayTop (atOmapToSrc, pii->dOmapToSrc, NULL);
for (i = j = 0; i < pii->dOmapToSrc; i++)
{
printf (T("%6lu: %08lX %08lX\r\n"),
i+1,
pii->pOmapToSrc [i].dTarget,
pii->pOmapToSrc [i].dSource);
if (!pii->pOmapToSrc [i].dSource) j++;
}
DisplaySeparator ();
printf (T("%6lu entr%s mapped to zero\r\n"),
j, (j == 1 ? T("y") : T("ies")));
}
else
{
DisplayTop (atOmapToSrc, -1, NULL);
DisplaySeparator ();
}
return;
}
// =================================================================
// MODULE HANDLER
// =================================================================
void WINAPI DisplayModule (PTBYTE ptModule,
DWORD dOptions)
{
TBYTE atPath [MAX_PATH];
PVOID pBase;
PIMG_INFO pii;
pBase = imgModuleBase (ptModule);
if (imgPathDbg (ptModule, atPath, MAX_PATH) &&
((pii = imgInfoLoad (atPath, pBase)) != NULL))
{
printf (T("\r\nModule name: %s")
T("\r\nModule base: %08lX%s")
T("\r\nSymbol file: %s\r\n"),
ptModule, pii->pBase,
(pBase != NULL ? T("") : T(" (not resident)")),
pii->atPath);
if (dOptions & OPTION_SECTIONS ) DisplaySections (pii);
if (dOptions & OPTION_EXPORTS ) DisplayExports (pii);
if (dOptions & OPTION_DIRECTORIES) DisplayDirectories (pii);
if (dOptions & OPTION_CODEVIEW ) DisplayCvData (pii);
if (dOptions & OPTION_PUBSYM ) DisplaySymbols (pii);
if (dOptions & OPTION_PUBSYM_EX ) DisplaySymbolsEx (pii);
if (dOptions & OPTION_FPO ) DisplayFpoEntries (pii);
if (dOptions & OPTION_MISC ) DisplayMiscEntries (pii);
if (dOptions & OPTION_SOURCE ) DisplayOmapFromSrc (pii);
if (dOptions & OPTION_TARGET ) DisplayOmapToSrc (pii);
imgMemoryDestroy (pii);
}
else
{
printf (T("\r\nNo symbol file available for %s\r\n"),
ptModule);
}
return;
}
// =================================================================
// MAIN PROGRAM
// =================================================================
DWORD Main (DWORD argc, PTBYTE *argv, PTBYTE *argp)
{
DWORD dOption, dOptions, i, j;
BOOL fPlus;
printf (atAbout);
if (argc < 2)
{
printf (atUsage, atArguments);
printf (atMoreInfo);
}
else
{
dOptions = OPTION_DEFAULT;
for (i = 1; i < argc; i++)
{
switch (argv [i] [0])
{
default:
{
DisplayModule (argv [i], dOptions);
break;
}
case '+':
case '-':
{
for (j = 0; argv [i] [j]; j++)
{
dOption = 0;
switch (argv [i] [j])
{
case '+':
{
fPlus = TRUE;
break;
}
case '-':
{
fPlus = FALSE;
break;
}
case 'h':
case 'H':
{
dOption = OPTION_SECTIONS;
break;
}
case 'e':
case 'E':
{
dOption = OPTION_EXPORTS;
break;
}
case 'd':
case 'D':
{
dOption = OPTION_DIRECTORIES;
break;
}
case 'c':
case 'C':
{
dOption = OPTION_CODEVIEW;
break;
}
case 'p':
{
dOption = OPTION_PUBSYM;
break;
}
case 'P':
{
dOption = OPTION_PUBSYM_EX;
break;
}
case 'f':
case 'F':
{
dOption = OPTION_FPO;
break;
}
case 'm':
case 'M':
{
dOption = OPTION_MISC;
break;
}
case 's':
case 'S':
{
dOption = OPTION_SOURCE;
break;
}
case 't':
case 'T':
{
dOption = OPTION_TARGET;
break;
}
case 'x':
case 'X':
{
dOption = OPTION_ALL;
break;
}
}
if (dOption)
{
if (fPlus) dOptions |= dOption;
else dOptions &= ~dOption;
}
}
break;
}
}
}
}
return 0;
}
// =================================================================
// END OF PROGRAM
// =================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -