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

📄 w2k_dbg.c

📁 Undocumented Windows 2000 Secrets简体中文版.+源码光盘
💻 C
📖 第 1 页 / 共 5 页
字号:
                                             dControl1);
                        }
                    if (i > 0)
                        {
                        pdi->apbData [dBase]          = pbData2;
                        pdi->apbData [dBase + dDelta] = pbData1;

                        dTrans++;
                        }
                    }
                }
            }
        }
    return;
    }

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

PDBG_LIST WINAPI dbgIndexList (PDBG_INDEX pdi)
    {
    DWORD     dNext, i;
    PDBG_LIST pdl = NULL;

    if ((pdi != NULL)
        &&
        ((pdl = dbgListCreateEx (pdi->dData,    pdi->dEntries,
                                 pdi->dContext, pdi->pContext,
                                &pdi->pdl->st))
         != NULL))
        {
        for (i = 0; i < pdi->dEntries; i++)
            {
            dNext = *(PDWORD) (pdi->apbData [i] +
                               pdi->dMemberNext);

            CopyMemory (pdl->abData + pdl->dOffset,
                        pdi->apbData [i], dNext);

            pdl->dOffset += dNext;
            }
        }
    return dbgListFinish (pdl);
    }

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

PDBG_LIST WINAPI dbgIndexListEx (PDBG_INDEX pdi)
    {
    DWORD      dNext, i, j;
    PDBG_INDEX pdi1;
    PDBG_LIST  pdl = NULL;

    if ((pdi != NULL)
        &&
        ((pdl = dbgListCreateEx (pdi->dData,    pdi->dEntries,
                                 pdi->dContext, pdi->pContext,
                                &pdi->pdl->st))
         != NULL))
        {
        for (i = 0; i < pdi->dEntries; i++)
            {
            pdi1 = pdi->ppdi [i];

            CopyMemory (pdl->abData + pdl->dOffset,
                        pdi1->pContext, pdi1->dContext);

            pdl->dOffset += pdi1->dContext;

            for (j = 0; j < pdi1->dEntries; j++)
                {
                dNext = *(PDWORD) (pdi1->apbData [j] +
                                   pdi1->dMemberNext);

                CopyMemory (pdl->abData + pdl->dOffset,
                            pdi1->apbData [j], dNext);

                pdl->dOffset += dNext;
                }
            }
        }
    return dbgListFinish (pdl);
    }

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

BOOL WINAPI dbgIndexSave (PWORD      pwPath,
                          PDBG_INDEX pdi)
    {
    PDBG_LIST pdl;
    BOOL      fOk = FALSE;

    if ((pdl = dbgIndexList (pdi)) != NULL)
        {
        fOk = dbgListSave (pwPath, pdl);
        dbgListDestroy (pdl);
        }
    return fOk;
    }

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

BOOL WINAPI dbgIndexSaveEx (PWORD      pwPath,
                            PDBG_INDEX pdi)
    {
    PDBG_LIST pdl;
    BOOL      fOk = FALSE;

    if ((pdl = dbgIndexListEx (pdi)) != NULL)
        {
        fOk = dbgListSave (pwPath, pdl);
        dbgListDestroy (pdl);
        }
    return fOk;
    }

// =================================================================
// PROCESS MANAGEMENT
// =================================================================

PDWORD WINAPI dbgProcessIds (PDWORD pdCount)
    {
    DWORD  dSize;
    DWORD  dCount = 0;
    PDWORD pdList = NULL;

    dSize = SIZE_MINIMUM * sizeof (DWORD);

    while ((pdList = dbgMemoryCreate (dSize)) != NULL)
        {
        if (EnumProcesses (pdList, dSize, &dCount) &&
            (dCount < dSize))
            {
            dCount /= sizeof (DWORD);
            break;
            }
        dCount = 0;
        pdList = dbgMemoryDestroy (pdList);
        if ((dSize <<= 1) > (SIZE_MAXIMUM * sizeof (DWORD))) break;
        }
    if (pdCount != NULL) *pdCount = dCount;
    return pdList;
    }

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

PHMODULE WINAPI dbgProcessModules (HANDLE hProcess,
                                   PDWORD pdCount)
    {
    DWORD    dSize;
    DWORD    dCount = 0;
    PHMODULE phList = NULL;

    if (hProcess != NULL)
        {
        dSize = SIZE_MINIMUM * sizeof (HMODULE);

        while ((phList = dbgMemoryCreate (dSize)) != NULL)
            {
            if (EnumProcessModules (hProcess, phList, dSize,
                                    &dCount))
                {
                if (dCount <= dSize)
                    {
                    dCount /= sizeof (HMODULE);
                    break;
                    }
                }
            else
                {
                dCount = 0;
                }
            phList = dbgMemoryDestroy (phList);
            if (!(dSize = dCount)) break;
            }
        }
    if (pdCount != NULL) *pdCount = dCount;
    return phList;
    }

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

PDBG_LIST WINAPI dbgProcessAdd (PDBG_LIST pdl,
                                DWORD     dId)
    {
    PDBG_PROCESS pdp;
    PDBG_MODULE  pdm;
    MODULEINFO   mi;
    WORD         awPath [MAX_PATH];
    HANDLE       hProcess;
    PHMODULE     phModules;
    DWORD        dModules, dPath, dFile, dData, dOffset, i;
    PDBG_LIST    pdl1  = pdl;

    if (pdl1 != NULL)
        {
        dOffset = pdl1->dOffset;

        if ((hProcess = OpenProcess (PROCESS_ALL_ACCESS,
                                     FALSE, dId))
            != NULL)
            {
            if ((phModules = dbgProcessModules (hProcess,
                                                &dModules))
                != NULL)
                {
                for (i = 0; (pdl1 != NULL) && (i < dModules); i++)
                    {
                    if (!GetModuleInformation (hProcess,
                                               phModules [i],
                                               &mi, sizeof (mi)))
                        {
                        mi.SizeOfImage = 0;
                        mi.lpBaseOfDll = NULL;
                        mi.EntryPoint  = NULL;
                        }
                    dPath = GetModuleFileNameEx (hProcess,
                                                 phModules [i],
                                                 awPath, MAX_PATH);
                    awPath [dPath++] = 0;
                    dFile = dbgPathFile (awPath);

                    if (!i)
                        {
                        dData = dbgMemoryAlignEx (DBG_PROCESS_,
                                                  dPath);

                        if ((pdl1 = dbgListResize (pdl1, dData))
                            != NULL)
                            {
                            pdp = (PDBG_PROCESS) (pdl1->abData +
                                                  pdl1->dOffset);
                            pdp->dNext    = 0;
                            pdp->dSize    = mi.SizeOfImage;
                            pdp->pBase    = mi.lpBaseOfDll;
                            pdp->pStart   = mi.EntryPoint;
                            pdp->dDown    = dData;
                            pdp->dId      = dId;
                            pdp->dModules = dModules;
                            pdp->dFile    = dFile;

                            lstrcpy (pdp->awPath, awPath);

                            dbgListNext (pdl1, dData, TRUE);
                            }
                        }
                    dData = dbgMemoryAlignEx (DBG_MODULE_, dPath);

                    if ((pdl1 = dbgListResize (pdl1, dData))
                        != NULL)
                        {
                        pdm = (PDBG_MODULE) (pdl1->abData +
                                             pdl1->dOffset);
                        pdm->dNext  = dData;
                        pdm->dSize  = mi.SizeOfImage;
                        pdm->pBase  = mi.lpBaseOfDll;
                        pdm->pStart = mi.EntryPoint;
                        pdm->dFile  = dFile;

                        lstrcpy (pdm->awPath, awPath);

                        dbgListNext (pdl1, dData, FALSE);
                        }
                    }
                dbgMemoryDestroy (phModules);
                }
            CloseHandle (hProcess);
            }
        if (pdl1 != NULL)
            {
            if (dOffset != pdl1->dOffset)
                {
                pdp = (PDBG_PROCESS) (pdl1->abData + dOffset);

                pdp->dNext = pdl1->dOffset - dOffset;
                }
            else
                {
                dData = dbgMemoryAlignEx (DBG_PROCESS_, 1);

                if ((pdl1 = dbgListResize (pdl1, dData)) != NULL)
                    {
                    pdp = (PDBG_PROCESS) (pdl1->abData + dOffset);

                    pdp->dNext      = dData;
                    pdp->dSize      = 0;
                    pdp->pBase      = NULL;
                    pdp->pStart     = NULL;
                    pdp->dDown      = dData;
                    pdp->dId        = dId;
                    pdp->dModules   = 0;
                    pdp->dFile      = 0;
                    pdp->awPath [0] = 0;

                    dbgListNext (pdl1, dData, TRUE);
                    }
                }
            }
        }
    return pdl1;
    }

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

PDBG_LIST WINAPI dbgProcessList (void)
    {
    PDWORD    pdProcesses;
    DWORD     dProcesses, i;
    PDBG_LIST pdl = NULL;

    if ((pdProcesses = dbgProcessIds (&dProcesses)) != NULL)
        {
        pdl = dbgListCreate ();

        for (i = 0; (pdl != NULL) && (i < dProcesses); i++)
            {
            pdl = dbgProcessAdd (pdl, pdProcesses [i]);
            }
        dbgMemoryDestroy (pdProcesses);
        }
    return dbgListFinish (pdl);
    }

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

PDBG_INDEX WINAPI dbgProcessIndex (PWORD pwImage,
                                   DWORD dSort,
                                   BOOL  fReverse)
    {
    return dbgIndexCreateEx ((pwImage != NULL
                              ? dbgListLoad (pwImage)
                              : dbgProcessList ()),
                             OFFSET (DBG_PROCESS, dNext ),
                             OFFSET (DBG_PROCESS, pBase ),
                             OFFSET (DBG_PROCESS, dSize ),
                             OFFSET (DBG_PROCESS, dId   ),
                             OFFSET (DBG_PROCESS, awPath),
                             OFFSET (DBG_PROCESS, dFile ),
                             dSort, fReverse);
    }

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

PDBG_INDEX WINAPI dbgProcessIndexEx (PWORD pwImage,
                                     DWORD dSort,
                                     BOOL  fReverse)
    {
    DWORD      i, n;
    PDBG_INDEX pdi = dbgProcessIndex (pwImage, dSort, fReverse);

    if (pdi != NULL)
        {
        for (i = n = 0; i < pdi->dEntries; i++)
            {
            if ((pdi->ppdi [i] = dbgModuleIndex (pdi->ppdp [i],
                                                 dSort, fReverse))
                != NULL) n++;
            }
        if (n < pdi->dEntries) pdi = dbgIndexDestroyEx (pdi);
        }
    return pdi;
    }

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

PWORD WINAPI dbgProcessGuess (DWORD dIndex)
    {
    PWORD pwName = L"<unknown>";

    switch (dIndex)
        {
        case 0: pwName = L"<Idle>";   break;
        case 1: pwName = L"<System>"; break;
        }
    return pwName;
    }

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

PDBG_LIST WINAPI dbgModuleList (PDBG_PROCESS pdp)
    {
    DWORD     dData;
    PDBG_LIST pdl = NULL;

    if (pdp != NULL)
        {
        dData = pdp->dNext - pdp->dDown;

        if ((pdl = dbgListCreateEx (dData, pdp->dModules,
                                    pdp->dDown, pdp, NULL))
            != NULL)
            {
            CopyMemory (pdl->abData + pdl->dOffset,
                        (PBYTE) pdp + pdp->dDown, dData);

            pdl->dOffset += dData;
            }
        }
    return dbgListFinish (pdl);
    }

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

⌨️ 快捷键说明

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