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

📄 w2k_img.c

📁 Undocumented Windows 2000 Secrets简体中文版.+源码光盘
💻 C
📖 第 1 页 / 共 5 页
字号:
        }
    return fOk;
    }

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

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

    if ((hf = imgFileOpenA (pbPath)) != INVALID_HANDLE_VALUE)
        {
        if ((dSize = GetFileSize (hf, NULL)) != INVALID_FILE_SIZE)
            {
            if ((dOffset + dSize + 1 > dSize)
                &&
                ((pbData = imgMemoryCreate (dOffset + dSize + 1))
                 != NULL))
                {
                n = 0;

                if ((!dSize)
                    ||
                    (ReadFile (hf, pbData + dOffset, dSize,
                               &n, NULL) &&
                     (dSize == n)))
                    {
                    if (dOffset) ZeroMemory (pbData, dOffset);
                    pbData [dOffset + dSize] = 0;
                    }
                else
                    {
                    pbData = imgMemoryDestroy (pbData);
                    }
                }
            }
        else
            {
            dSize = 0;
            }
        imgFileClose (hf);
        }
    if (pdSize != NULL) *pdSize = dSize;
    return pbData;
    }

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

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

    if ((hf = imgFileOpenW (pwPath)) != INVALID_HANDLE_VALUE)
        {
        if ((dSize = GetFileSize (hf, NULL)) != INVALID_FILE_SIZE)
            {
            if ((dOffset + dSize + 1 > dSize)
                &&
                ((pbData = imgMemoryCreate (dOffset + dSize + 1))
                 != NULL))
                {
                n = 0;

                if ((!dSize)
                    ||
                    (ReadFile (hf, pbData + dOffset, dSize,
                               &n, NULL) &&
                     (dSize == n)))
                    {
                    if (dOffset) ZeroMemory (pbData, dOffset);
                    pbData [dOffset + dSize] = 0;
                    }
                else
                    {
                    pbData = imgMemoryDestroy (pbData);
                    }
                }
            }
        else
            {
            dSize = 0;
            }
        imgFileClose (hf);
        }
    if (pdSize != NULL) *pdSize = dSize;
    return pbData;
    }

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

BOOL WINAPI imgFileSaveA (PBYTE pbPath,
                          PVOID pData,
                          DWORD dData)
    {
    HANDLE hf;
    DWORD  n;
    BOOL   fOk = FALSE;

    if ((hf = imgFileNewA (pbPath)) != INVALID_HANDLE_VALUE)
        {
        n = 0;
        if ((pData != NULL) && dData)
            {
            if (!WriteFile (hf, pData, dData, &n, NULL)) n = 0;
            }
        fOk = (n == dData) && SetEndOfFile (hf);
        imgFileClose (hf);

        if (!fOk) DeleteFileA (pbPath);
        }
    return fOk;
    }

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

BOOL WINAPI imgFileSaveW (PWORD pwPath,
                          PVOID pData,
                          DWORD dData)
    {
    HANDLE hf;
    DWORD  n;
    BOOL   fOk = FALSE;

    if ((hf = imgFileNewW (pwPath)) != INVALID_HANDLE_VALUE)
        {
        n = 0;
        if ((pData != NULL) && dData)
            {
            if (!WriteFile (hf, pData, dData, &n, NULL)) n = 0;
            }
        fOk = (n == dData) && SetEndOfFile (hf);
        imgFileClose (hf);

        if (!fOk) DeleteFileW (pwPath);
        }
    return fOk;
    }

// =================================================================
// CodeView DATA MANAGEMENT
// =================================================================

PCV_ENTRY WINAPI imgCvEntry (PCV_NB09 pc09,
                             DWORD    dType,
                             DWORD    dIndex)
    {
    DWORD     i, j;
    PCV_ENTRY pce = NULL;

    if ((pc09 != NULL) &&
        (pc09->Header.Signature.dVersion == CV_SIGNATURE_NB09))
        {
        for (i = j = 0; i < pc09->Directory.dEntries; i++)
            {
            if ((pc09->Entries [i].wSubSectionType == dType) &&
                (j++ == dIndex))
                {
                pce = pc09->Entries + i;
                break;
                }
            }
        }
    return pce;
    }

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

PCV_MODULE WINAPI imgCvModule (PCV_NB09 pc09,
                               DWORD    dIndex,
                               PDWORD   pdSize)
    {
    PCV_ENTRY  pce;
    DWORD      dSize = 0;
    PCV_MODULE pcm   = NULL;

    if ((pce = imgCvEntry (pc09, sstModule, dIndex)) != NULL)
        {
        pcm = (PCV_MODULE)
              ((PBYTE) pc09 + pce->lSubSectionOffset);

        dSize = pce->dSubSectionSize;
        }
    if (pdSize != NULL) *pdSize = dSize;
    return pcm;
    }

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

PCV_PUBSYM WINAPI imgCvSymbols (PCV_NB09 pc09,
                                PDWORD   pdCount,
                                PDWORD   pdSize)
    {
    PCV_ENTRY  pce;
    PCV_PUBSYM pcp1;
    DWORD      i;
    DWORD      dCount = 0;
    DWORD      dSize  = 0;
    PCV_PUBSYM pcp    = NULL;

    if ((pce = imgCvEntry (pc09, sstGlobalPub, 0)) != NULL)
        {
        pcp = CV_PUBSYM_DATA ((PBYTE) pc09
                              + pce->lSubSectionOffset);

        dSize = pce->dSubSectionSize;

        for (i  = 0; dSize - i >= CV_PUBSYM_;
             i += CV_PUBSYM_SIZE (pcp1))
            {
            pcp1 = (PCV_PUBSYM) ((PBYTE) pcp + i);
            if (dSize - i < CV_PUBSYM_SIZE (pcp1)) break;
            if (pcp1->Header.wRecordType == CV_PUB32) dCount++;
            }
        }
    if (pdCount != NULL) *pdCount = dCount;
    if (pdSize  != NULL) *pdSize  = dSize;
    return pcp;
    }

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

PCV_SEGMAP WINAPI imgCvSegments (PCV_NB09 pc09,
                                 PDWORD   pdCount)
    {
    PCV_ENTRY  pce;
    DWORD      dCount = 0;
    PCV_SEGMAP pcs    = NULL;

    if ((pce = imgCvEntry (pc09, sstSegMap, 0)) != NULL)
        {
        pcs = (PCV_SEGMAP)
              ((PBYTE) pc09 + pce->lSubSectionOffset);

        dCount = pcs->wTotal;
        }
    if (pdCount != NULL) *pdCount = dCount;
    return pcs;
    }

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

PVOID WINAPI imgCvPdbA (PCV_NB10 pc10,
                        PBYTE    pbPath,
                        PDWORD   pdSize)
    {
    BYTE  abPath [MAX_PATH];
    DWORD dName, i, n;
    DWORD dSize = 0;
    PVOID pData = NULL;

    if ((pc10 != NULL) &&
        (pc10->Header.Signature.dVersion == CV_SIGNATURE_NB10))
        {
        dName = imgPathNameA (pbPath, NULL);

        if (dName + lstrlenA (pc10->abPdbName) < MAX_PATH)
            {
            for (i = n = 0; i < dName; i++)
                {
                abPath [n++] = pbPath [i];
                }
            for (i = 0; pc10->abPdbName [i]; i++)
                {
                abPath [n++] = pc10->abPdbName [i];
                }
            abPath [n] = 0;

            dSize = (pdSize != NULL ? *pdSize : 0);
            pData = imgPdbLoadA (abPath, &dSize);
            }
        }
    if (pdSize != NULL) *pdSize = dSize;
    return pData;
    }

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

PVOID WINAPI imgCvPdbW (PCV_NB10 pc10,
                        PWORD    pwPath,
                        PDWORD   pdSize)
    {
    WORD  awPath [MAX_PATH];
    DWORD dName, i, n;
    DWORD dSize = 0;
    PVOID pData = NULL;

    if ((pc10 != NULL) &&
        (pc10->Header.Signature.dVersion == CV_SIGNATURE_NB10))
        {
        dName = imgPathNameW (pwPath, NULL);

        if (dName + lstrlenA (pc10->abPdbName) < MAX_PATH)
            {
            for (i = n = 0; i < dName; i++)
                {
                awPath [n++] = pwPath [i];
                }
            for (i = 0; pc10->abPdbName [i]; i++)
                {
                awPath [n++] = pc10->abPdbName [i];
                }
            awPath [n] = 0;

            dSize = (pdSize != NULL ? *pdSize : 0);
            pData = imgPdbLoadW (awPath, &dSize);
            }
        }
    if (pdSize != NULL) *pdSize = dSize;
    return pData;
    }

// =================================================================
// DBG FILE MANAGEMENT
// =================================================================

BOOL WINAPI imgDbgVerify (PIMG_DBG pid,
                          DWORD    dSize)
    {
    PIMAGE_DEBUG_DIRECTORY pidd;
    DWORD                  i, n, n1, n2;
    BOOL                   fOk = FALSE;

    if ((pid != NULL) && (dSize >= IMG_DBG_)
        &&
        (pid->Header.Signature == IMAGE_SEPARATE_DEBUG_SIGNATURE)
        &&
        (dSize >= IMG_DBG__ (pid->Header.NumberOfSections) +
                  pid->Header.ExportedNamesSize +
                  pid->Header.DebugDirectorySize)
        &&
        (!(pid->Header.DebugDirectorySize % IMAGE_DEBUG_DIRECTORY_))
        &&
        ((pidd = imgDbgDirectories (pid, &n)) != NULL))
        {
        fOk = TRUE;

        for (i = 0; i < n; i++)
            {
            n1 = pidd [i].PointerToRawData;
            n2 = pidd [i].SizeOfData;

            if ((n1 + n2 < n1) || (n1 + n2 > dSize))
                {
                fOk = FALSE;
                break;
                }
            }
        }
    return fOk;
    }

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

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

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

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

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

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

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

PBYTE WINAPI imgDbgExports (PIMG_DBG pid,
                            PDWORD   pdCount)
    {
    DWORD i, j;
    DWORD dCount    = 0;
    PBYTE pbExports = NULL;

    if (pid != NULL)
        {
        pbExports = (PBYTE) pid->aSections
                    + (pid->Header.NumberOfSections
                       * IMAGE_SECTION_HEADER_);

        for (i = 0; i < pid->Header.ExportedNamesSize; i = j)
            {
            if (!pbExports [j = i]) break;

            while ((j < pid->Header.ExportedNamesSize) &&
                   pbExports [j++]);

            if ((j > i) && (!pbExports [j-1])) dCount++;
            }
        }
    if (pdCount != NULL) *pdCount = dCount;
    return pbExports;
    }

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

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

    if (pid != NULL)
        {
        pidd   = (PIMAGE_DEBUG_DIRECTORY)
                 ((PBYTE) pid
                  + IMG_DBG__ (pid->Header.NumberOfSections)
                  + pid->Header.ExportedNamesSize);

        dCount = pid->Header.DebugDirectorySize
                 / IMAGE_DEBUG_DIRECTORY_;
        }

⌨️ 快捷键说明

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