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

📄 w2k_cv.c

📁 Undocumented Windows 2000 Secrets简体中文版.+源码光盘
💻 C
📖 第 1 页 / 共 2 页
字号:
                }
            }
        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 + -