Changeset 3530 for trunk


Ignore:
Timestamp:
Aug 20, 2007, 5:42:03 AM (18 years ago)
Author:
bird
Message:

Made the generic pe module build too.

Location:
trunk/kDbg
Files:
4 edited
2 moved

Legend:

Unmodified
Added
Removed
  • trunk/kDbg/Makefile.kmk

    r3528 r3530  
    3737kDbg_SOURCES := \
    3838        kDbgModule.cpp \
    39         kDbgModPE-$(if $(eq $(BUILD_TARGET),win),win,generic).cpp \
     39        kDbgModPE.cpp \
    4040        \
    4141        kDbgLine.cpp \
     
    4444        \
    4545        kDbgHlpCrt.cpp
     46
     47kDbg_SOURCES += \
     48        kDbgModWinDbgHelp.cpp
     49
    4650
    4751#
  • trunk/kDbg/kDbg.h

    r3529 r3530  
    5959/** The specified file was not found. */
    6060#define KDBG_ERR_FILE_NOT_FOUND                         (KDBG_ERR_BASE + 5)
     61/** Hit some unimplemented functionality - feel free to implement it :-) . */
     62#define KDBG_ERR_NOT_IMPLEMENTED                        (KDBG_ERR_BASE + 6)
    6163/** Generic error. */
    6264#define KDBG_ERR_GENERAL_FAILURE                        (KDBG_ERR_BASE + 9)
  • trunk/kDbg/kDbgInternal.h

    r3528 r3530  
    112112
    113113int kdbgModPEOpen(PKDBGHLPFILE pFile, KDBGADDR offHdr, const char *pszModulePath, PKDBGMOD *ppDbgMod);
     114int kdbgModWinDbgHelpOpen(PKDBGHLPFILE pFile, KDBGADDR offHdr, const char *pszModulePath, PKDBGMOD *ppDbgMod);
    114115
    115116#ifdef __cplusplus
  • trunk/kDbg/kDbgModPE.cpp

    r3529 r3530  
    3131#include "kDbgInternal.h"
    3232#include <kLdrModPE.h>
     33#include <string.h>
    3334
    3435
     
    7273                        ("off=" PRI_KDBGADDR " VirtualSize=%x\n", off, pModPe->aSections[iSegment].Misc.VirtualSize),
    7374                        KDBG_ERR_INVALID_ADDRESS);
    74         *puRVA = pModPe->aSections[iSegment].VirtualAddress + off;
     75        *puRVA = pModPe->aSections[iSegment].VirtualAddress + (uint32_t)off;
    7576        return 0;
    7677    }
     
    8081        kDbgAssertMsgReturn(off < pModPe->cbImage, ("off=" PRI_KDBGADDR ", cbImage=%x\n", off, pModPe->cbImage),
    8182                            KDBG_ERR_INVALID_ADDRESS);
    82         *puRVA = off;
     83        *puRVA = (uint32_t)off;
    8384        return 0;
    8485    }
     
    119120 * @copydoc KDBGMODOPS::pfnQueryLine
    120121 */
    121 static int rtDbgModPEQueryLine(PKDBGMOD pMod, int32_t iSegment, KDBGADDR off, PKDBGLINE pLine)
     122static int kDbgModPeQueryLine(PKDBGMOD pMod, int32_t iSegment, KDBGADDR off, PKDBGLINE pLine)
    122123{
    123124    PKDBGMODPE pModPe = (PKDBGMODPE)pMod;
     
    150151        }
    151152#endif
    152         rc = VERR_NOT_IMPLEMENTED;
     153        rc = KDBG_ERR_NOT_IMPLEMENTED;
    153154    }
    154155    return rc;
     
    159160 * @copydoc KDBGMODOPS::pfnQuerySymbol
    160161 */
    161 static int rtDbgModPEQuerySymbol(PKDBGMOD pMod, int32_t iSegment, KDBGADDR off, PKDBGSYMBOL pSym)
     162static int kDbgModPeQuerySymbol(PKDBGMOD pMod, int32_t iSegment, KDBGADDR off, PKDBGSYMBOL pSym)
    162163{
    163164    PKDBGMODPE pModPe = (PKDBGMODPE)pMod;
     
    175176        {
    176177            SYMBOL_INFO Sym;
    177             char        achBuffer[sizeof(SYMBOL_INFO) + RTDBG_SYMBOL_MAX];
     178            char        achBuffer[sizeof(SYMBOL_INFO) + KDBG_SYMBOL_MAX];
    178179        } Buf;
    179180        Buf.Sym.SizeOfStruct = sizeof(SYMBOL_INFO);
    180         Buf.Sym.MaxNameLen = RTDBG_SYMBOL_MAX;
     181        Buf.Sym.MaxNameLen = KDBG_SYMBOL_MAX;
    181182        if (g_pfnSymFromAddr(pModPe->hSymInst, pModPe->ImageBase + uRVA, &off, &Buf.Sym))
    182183        {
     
    193194            if ((Buf.Sym.Flags & (SYMFLAG_VALUEPRESENT | SYMFLAG_CONSTANT)) == (SYMFLAG_VALUEPRESENT | SYMFLAG_CONSTANT))
    194195            {
    195                 pSym->iSegment   = RTDBGSEG_ABS;
     196                pSym->iSegment   = KDBGSEG_ABS;
    196197                pSym->offSegment = (KDBGADDR)Buf.Sym.Value;
    197198                pSym->RVA        = (KDBGADDR)Buf.Sym.Value;
     
    214215        }
    215216#endif
    216         rc = VERR_NOT_IMPLEMENTED;
     217        rc = KDBG_ERR_NOT_IMPLEMENTED;
    217218    }
    218219    return rc;
     
    223224 * @copydoc KDBGMODOPS::pfnClose
    224225 */
    225 static int rtDbgModPEClose(PKDBGMOD pMod)
     226static int kDbgModPeClose(PKDBGMOD pMod)
    226227{
    227228    PKDBGMODPE pModPe = (PKDBGMODPE)pMod;
     
    234235    //kDbgAssertMsgFailed(("SymInitialize failed: Err=%d rc=%Rrc\n", Err, rc));
    235236    //return rc;
    236     return VERR_NOT_IMPLEMENTED;
     237    return KDBG_ERR_NOT_IMPLEMENTED;
    237238}
    238239
     
    241242 * Methods for a PE module.
    242243 */
    243 static const KDBGMODOPS g_rtDbgModPEOps =
    244 {
    245     "PE (dbghelp)",
    246     rtDbgModPEClose,
    247     rtDbgModPEQuerySymbol,
    248     rtDbgModPEQueryLine
     244static const KDBGMODOPS g_kDbgModPeOps =
     245{
     246    "PE",
     247    kDbgModPeClose,
     248    kDbgModPeQuerySymbol,
     249    kDbgModPeQueryLine
    249250};
    250251
     
    267268     */
    268269    IMAGE_FILE_HEADER FHdr;
    269     int rc = kDbgHlpReadAt(File, offHdr + KDBG_OFFSETOF(IMAGE_NT_HEADERS32, FileHeader), &FHdr, sizeof(FHdr), NULL);
    270     AssertRCReturn(rc, rc);
     270    int rc = kDbgHlpReadAt(pFile, offHdr + KDBG_OFFSETOF(IMAGE_NT_HEADERS32, FileHeader), &FHdr, sizeof(FHdr));
     271    kDbgAssertRCReturn(rc, rc);
    271272
    272273    uint32_t cbImage;
    273274    if (FHdr.SizeOfOptionalHeader == sizeof(IMAGE_OPTIONAL_HEADER32))
    274         rc = kDbgHlpReadAt(File, offHdr + KDBG_OFFSETOF(IMAGE_NT_HEADERS32, OptionalHeader.SizeOfImage),
    275                           &cbImage, sizeof(cbImage), NULL);
     275        rc = kDbgHlpReadAt(pFile, offHdr + KDBG_OFFSETOF(IMAGE_NT_HEADERS32, OptionalHeader.SizeOfImage),
     276                           &cbImage, sizeof(cbImage));
    276277    else if (FHdr.SizeOfOptionalHeader == sizeof(IMAGE_OPTIONAL_HEADER64))
    277         rc = kDbgHlpReadAt(File, offHdr + KDBG_OFFSETOF(IMAGE_NT_HEADERS64, OptionalHeader.SizeOfImage),
    278                           &cbImage, sizeof(cbImage), NULL);
     278        rc = kDbgHlpReadAt(pFile, offHdr + KDBG_OFFSETOF(IMAGE_NT_HEADERS64, OptionalHeader.SizeOfImage),
     279                           &cbImage, sizeof(cbImage));
    279280    else
    280         AssertFailedReturn(VERR_BAD_EXE_FORMAT);
    281     AssertRCReturn(rc, rc);
     281        kDbgAssertFailedReturn(KDBG_ERR_BAD_EXE_FORMAT);
     282    kDbgAssertRCReturn(rc, rc);
    282283
    283284    /*
    284285     * Allocate the module and read/construct the section headers.
    285286     */
    286     PKDBGMODPE pModPe = (PKDBGMODPE)RTMemAlloc(KDBG_OFFSETOF(KDBGMODPE, aSections[FHdr.NumberOfSections + 2]));
    287     AssertReturn(pModPe, KDBG_ERR_NO_MEMORY);
     287    PKDBGMODPE pModPe = (PKDBGMODPE)kDbgHlpAlloc(KDBG_OFFSETOF(KDBGMODPE, aSections[FHdr.NumberOfSections + 2]));
     288    kDbgAssertReturn(pModPe, KDBG_ERR_NO_MEMORY);
    288289    pModPe->Core.u32Magic   = KDBGMOD_MAGIC;
    289     pModPe->Core.pOps       = &g_rtDbgModPEOps;
    290     pModPe->Core.File       = File;
     290    pModPe->Core.pOps       = &g_kDbgModPeOps;
     291    pModPe->Core.pFile      = pFile;
    291292    pModPe->cbImage         = cbImage;
    292293    pModPe->cSections       = 1 + FHdr.NumberOfSections;
    293     rc = kDbgHlpReadAt(File, offHdr + KDBG_OFFSETOF(IMAGE_NT_HEADERS32, OptionalHeader) + FHdr.SizeOfOptionalHeader,
    294                       &pModPe->aSections[1], sizeof(pModPe->aSections[0]) * FHdr.NumberOfSections, NULL);
     294    rc = kDbgHlpReadAt(pFile, offHdr + KDBG_OFFSETOF(IMAGE_NT_HEADERS32, OptionalHeader) + FHdr.SizeOfOptionalHeader,
     295                       &pModPe->aSections[1], sizeof(pModPe->aSections[0]) * FHdr.NumberOfSections);
    295296    if (!rc)
    296297    {
     
    345346            g_pfnSymSetOptions(SYMOPT_LOAD_LINES | SYMOPT_AUTO_PUBLICS | SYMOPT_ALLOW_ABSOLUTE_SYMBOLS);
    346347
    347             RTFileSeek(File, 0, RTFILE_SEEK_BEGIN, NULL); /* don't know if this is required or not... */
     348            kDbgHlpSeek(pFile, 0); /* don't know if this is required or not... */
    348349            DWORD64 ImageBase = g_pfnSymLoadModule64(hSymInst, (HANDLE)File, pszModulePath, NULL, 0x00400000, 0);
    349350            if (ImageBase)
     
    367368        }
    368369#endif
    369         rc = VERR_NOT_IMPLEMENTED;
     370        rc = KDBG_ERR_NOT_IMPLEMENTED;
    370371    }
    371372    else
    372         AssertRC(rc);
     373        kDbgAssertRC(rc);
    373374
    374375    kDbgHlpFree(pModPe);
  • trunk/kDbg/kDbgModWinDbgHelp.cpp

    r3529 r3530  
    6363 * A dbghelp based PE debug reader.
    6464 */
    65 typedef struct KDBGMODPE
     65typedef struct KDBGMODDBGHELP
    6666{
    6767    /** The common module core. */
    68     KDBGMOD    Core;
     68    KDBGMOD     Core;
    6969    /** The image base. */
    7070    DWORD64     ImageBase;
     
    7878     * implicit header section.*/
    7979    IMAGE_SECTION_HEADER    aSections[1];
    80 } KDBGMODPE, *PKDBGMODPE;
     80} KDBGMODDBGHELP, *PKDBGMODDBGHELP;
    8181
    8282
     
    102102 * @returns IPRT status code.
    103103 *
    104  * @param   pModPe      The PE debug module instance.
     104 * @param   pModDH      The PE debug module instance.
    105105 * @param   iSegment    The segment number. Special segments are dealt with as well.
    106106 * @param   off         The segment offset.
    107107 * @param   puRVA       Where to store the RVA on success.
    108108 */
    109 static int kDbgModPeSegOffToRVA(PKDBGMODPE pModPe, int32_t iSegment, KDBGADDR off, uint32_t *puRVA)
     109static int kDbgModPeSegOffToRVA(PKDBGMODDBGHELP pModDH, int32_t iSegment, KDBGADDR off, uint32_t *puRVA)
    110110{
    111111    if (iSegment >= 0)
    112112    {
    113         kDbgAssertMsgReturn(iSegment < pModPe->cSections, ("iSegment=%x cSections=%x\n", iSegment, pModPe->cSections),
     113        kDbgAssertMsgReturn(iSegment < pModDH->cSections, ("iSegment=%x cSections=%x\n", iSegment, pModDH->cSections),
    114114                            KDBG_ERR_INVALID_ADDRESS);
    115         kDbgAssertMsgReturn(off < pModPe->aSections[iSegment].Misc.VirtualSize,
    116                             ("off=" PRI_KDBGADDR " VirtualSize=%x\n", off, pModPe->aSections[iSegment].Misc.VirtualSize),
     115        kDbgAssertMsgReturn(off < pModDH->aSections[iSegment].Misc.VirtualSize,
     116                            ("off=" PRI_KDBGADDR " VirtualSize=%x\n", off, pModDH->aSections[iSegment].Misc.VirtualSize),
    117117                            KDBG_ERR_INVALID_ADDRESS);
    118         *puRVA = pModPe->aSections[iSegment].VirtualAddress + (uint32_t)off;
     118        *puRVA = pModDH->aSections[iSegment].VirtualAddress + (uint32_t)off;
    119119        return 0;
    120120    }
     
    122122    if (iSegment == KDBGSEG_RVA)
    123123    {
    124         kDbgAssertMsgReturn(off < pModPe->cbImage, ("off=" PRI_KDBGADDR ", cbImage=%x\n", off, pModPe->cbImage),
     124        kDbgAssertMsgReturn(off < pModDH->cbImage, ("off=" PRI_KDBGADDR ", cbImage=%x\n", off, pModDH->cbImage),
    125125                            KDBG_ERR_INVALID_ADDRESS);
    126126        *puRVA = (uint32_t)off;
     
    136136 * @returns IPRT status code.
    137137 *
    138  * @param   pModPe      The PE debug module instance.
     138 * @param   pModDH      The PE debug module instance.
    139139 * @param   uRVA        The RVA.
    140140 * @param   piSegment   Where to store the segment number.
    141141 * @param   poff        Where to store the segment offset.
    142142 */
    143 static int kDbgModPeRVAToSegOff(PKDBGMODPE pModPe, uint32_t uRVA, int32_t *piSegment, KDBGADDR *poff)
    144 {
    145     kDbgAssertMsgReturn(uRVA < pModPe->cbImage, ("uRVA=%x, cbImage=%x\n", uRVA, pModPe->cbImage),
    146                     KDBG_ERR_INVALID_ADDRESS);
    147     for (int32_t iSegment = 0; iSegment < pModPe->cSections; iSegment++)
     143static int kDbgModPeRVAToSegOff(PKDBGMODDBGHELP pModDH, uint32_t uRVA, int32_t *piSegment, KDBGADDR *poff)
     144{
     145    kDbgAssertMsgReturn(uRVA < pModDH->cbImage, ("uRVA=%x, cbImage=%x\n", uRVA, pModDH->cbImage),
     146                        KDBG_ERR_INVALID_ADDRESS);
     147    for (int32_t iSegment = 0; iSegment < pModDH->cSections; iSegment++)
    148148    {
    149149        /** @todo should probably be less strict about address in the alignment gaps. */
    150         uint32_t off = uRVA - pModPe->aSections[iSegment].VirtualAddress;
    151         if (off < pModPe->aSections[iSegment].Misc.VirtualSize)
     150        uint32_t off = uRVA - pModDH->aSections[iSegment].VirtualAddress;
     151        if (off < pModDH->aSections[iSegment].Misc.VirtualSize)
    152152        {
    153153            *poff = off;
     
    163163 * @copydoc KDBGMODOPS::pfnQueryLine
    164164 */
    165 static int rtDbgModPEQueryLine(PKDBGMOD pMod, int32_t iSegment, KDBGADDR off, PKDBGLINE pLine)
    166 {
    167     PKDBGMODPE pModPe = (PKDBGMODPE)pMod;
     165static int kdbgModDHQueryLine(PKDBGMOD pMod, int32_t iSegment, KDBGADDR off, PKDBGLINE pLine)
     166{
     167    PKDBGMODDBGHELP pModDH = (PKDBGMODDBGHELP)pMod;
    168168
    169169    /*
     
    171171     */
    172172    uint32_t uRVA;
    173     int rc = kDbgModPeSegOffToRVA(pModPe, iSegment, off, &uRVA);
     173    int rc = kDbgModPeSegOffToRVA(pModDH, iSegment, off, &uRVA);
    174174    if (!rc)
    175175    {
     
    177177        IMAGEHLP_LINE64 Line;
    178178        Line.SizeOfStruct = sizeof(Line);
    179         if (g_pfnSymGetLineFromAddr64(pModPe->hSymInst, pModPe->ImageBase + uRVA, &off, &Line))
    180         {
    181             pLine->RVA = (KDBGADDR)(Line.Address - pModPe->ImageBase);
    182             rc = kDbgModPeRVAToSegOff(pModPe, (uint32_t)pLine->RVA, &pLine->iSegment, &pLine->offSegment);
     179        if (g_pfnSymGetLineFromAddr64(pModDH->hSymInst, pModDH->ImageBase + uRVA, &off, &Line))
     180        {
     181            pLine->RVA = (KDBGADDR)(Line.Address - pModDH->ImageBase);
     182            rc = kDbgModPeRVAToSegOff(pModDH, (uint32_t)pLine->RVA, &pLine->iSegment, &pLine->offSegment);
    183183            pLine->iLine = Line.LineNumber;
    184184            size_t cchFile = strlen(Line.FileName);
     
    202202 * @copydoc KDBGMODOPS::pfnQuerySymbol
    203203 */
    204 static int rtDbgModPEQuerySymbol(PKDBGMOD pMod, int32_t iSegment, KDBGADDR off, PKDBGSYMBOL pSym)
    205 {
    206     PKDBGMODPE pModPe = (PKDBGMODPE)pMod;
     204static int kdbgModDHQuerySymbol(PKDBGMOD pMod, int32_t iSegment, KDBGADDR off, PKDBGSYMBOL pSym)
     205{
     206    PKDBGMODDBGHELP pModDH = (PKDBGMODDBGHELP)pMod;
    207207
    208208    /*
     
    210210     */
    211211    uint32_t uRVA;
    212     int rc = kDbgModPeSegOffToRVA(pModPe, iSegment, off, &uRVA);
     212    int rc = kDbgModPeSegOffToRVA(pModDH, iSegment, off, &uRVA);
    213213    if (!rc)
    214214    {
     
    221221        Buf.Sym.SizeOfStruct = sizeof(SYMBOL_INFO);
    222222        Buf.Sym.MaxNameLen = KDBG_SYMBOL_MAX;
    223         if (g_pfnSymFromAddr(pModPe->hSymInst, pModPe->ImageBase + uRVA, &off, &Buf.Sym))
     223        if (g_pfnSymFromAddr(pModDH->hSymInst, pModDH->ImageBase + uRVA, &off, &Buf.Sym))
    224224        {
    225225            pSym->cb     = Buf.Sym.Size;
     
    241241            else
    242242            {
    243                 pSym->RVA        = (KDBGADDR)(Buf.Sym.Address - pModPe->ImageBase);
    244                 rc = kDbgModPeRVAToSegOff(pModPe, (uint32_t)pSym->RVA, &pSym->iSegment, &pSym->offSegment);
     243                pSym->RVA        = (KDBGADDR)(Buf.Sym.Address - pModDH->ImageBase);
     244                rc = kDbgModPeRVAToSegOff(pModDH, (uint32_t)pSym->RVA, &pSym->iSegment, &pSym->offSegment);
    245245            }
    246246            pSym->cchName = (uint16_t)Buf.Sym.NameLen;
     
    263263 * @copydoc KDBGMODOPS::pfnClose
    264264 */
    265 static int rtDbgModPEClose(PKDBGMOD pMod)
    266 {
    267     PKDBGMODPE pModPe = (PKDBGMODPE)pMod;
    268 
    269     if (g_pfnSymCleanup(pModPe->hSymInst))
     265static int kdbgModDHClose(PKDBGMOD pMod)
     266{
     267    PKDBGMODDBGHELP pModDH = (PKDBGMODDBGHELP)pMod;
     268
     269    if (g_pfnSymCleanup(pModDH->hSymInst))
    270270        return 0;
    271271
     
    280280 * Methods for a PE module.
    281281 */
    282 static const KDBGMODOPS g_rtDbgModPEOps =
     282static const KDBGMODOPS g_kdbgModDHOps =
    283283{
    284284    "PE (dbghelp)",
    285     rtDbgModPEClose,
    286     rtDbgModPEQuerySymbol,
    287     rtDbgModPEQueryLine
     285    kdbgModDHClose,
     286    kdbgModDHQuerySymbol,
     287    kdbgModDHQueryLine
    288288};
    289289
     
    296296 * @param   pszPath     the path to the dbghelp.dll.
    297297 */
    298 static int rtDbgModPETryDbgHelp(const char *pszPath, uint32_t *pu32FileVersionMS, uint32_t *pu32FileVersionLS)
     298static int kdbgModDHTryDbgHelp(const char *pszPath, uint32_t *pu32FileVersionMS, uint32_t *pu32FileVersionLS)
    299299{
    300300    int rc;
     
    337337 * Find the dbghelp.dll
    338338 */
    339 static int rtDbgModPEFindDbgHelp(char *pszPath, size_t cchPath)
     339static int kdbgModDHFindDbgHelp(char *pszPath, size_t cchPath)
    340340{
    341341    /*
     
    349349    {
    350350        strcat(pszPath, s_szDbgHelp);
    351         int rc2 = rtDbgModPETryDbgHelp(pszPath, &FileVersionMS, &FileVersionLS);
     351        int rc2 = kdbgModDHTryDbgHelp(pszPath, &FileVersionMS, &FileVersionLS);
    352352        if (!rc2)
    353353            return rc2;
     
    362362    {
    363363        strcat(strrchr(pszPath, '\\'), s_szDbgHelp);
    364         int rc2 = rtDbgModPETryDbgHelp(pszPath, &FileVersionMS, &FileVersionLS);
     364        int rc2 = kdbgModDHTryDbgHelp(pszPath, &FileVersionMS, &FileVersionLS);
    365365        if (!rc)
    366366            return rc2;
     
    375375    {
    376376        strcat(pszPath, s_szDbgHelp);
    377         int rc2 = rtDbgModPETryDbgHelp(pszPath, &FileVersionMS, &FileVersionLS);
     377        int rc2 = kdbgModDHTryDbgHelp(pszPath, &FileVersionMS, &FileVersionLS);
    378378        if (!rc2)
    379379            return rc2;
     
    388388    {
    389389        strcat(pszPath, s_szDbgHelp);
    390         int rc2 = rtDbgModPETryDbgHelp(pszPath, &FileVersionMS, &FileVersionLS);
     390        int rc2 = kdbgModDHTryDbgHelp(pszPath, &FileVersionMS, &FileVersionLS);
    391391        if (!rc2)
    392392            return rc2;
     
    415415                memcpy(pszPath, psz, pszEnd - psz);
    416416                memcpy(&pszPath[pszEnd - psz], s_szDbgHelp, sizeof(s_szDbgHelp));
    417                 int rc2 = rtDbgModPETryDbgHelp(pszPath, &FileVersionMS, &FileVersionLS);
     417                int rc2 = kdbgModDHTryDbgHelp(pszPath, &FileVersionMS, &FileVersionLS);
    418418                if (!rc2)
    419419                    return rc2;
     
    447447 * @returns IPRT status code.
    448448 */
    449 static int rtDbgModPELoadDbgHelp(void)
     449static int kdbgModDHLoadDbgHelp(void)
    450450{
    451451    if (g_hDbgHelp)
     
    467467     */
    468468    char szPath[260];
    469     int rc = rtDbgModPEFindDbgHelp(szPath, sizeof(szPath));
     469    int rc = kdbgModDHFindDbgHelp(szPath, sizeof(szPath));
    470470    if (rc)
    471471    {
     
    566566 *
    567567 */
    568 int kdbgModPEOpen(PKDBGHLPFILE pFile, int64_t offHdr, const char *pszModulePath, PKDBGMOD *ppDbgMod)
     568int kdbgModWinDbgHelpOpen(PKDBGHLPFILE pFile, int64_t offHdr, const char *pszModulePath, PKDBGMOD *ppDbgMod)
    569569{
    570570    /*
     
    589589     * Load dbghelp.dll.
    590590     */
    591     rc = rtDbgModPELoadDbgHelp();
     591    rc = kdbgModDHLoadDbgHelp();
    592592    if (rc)
    593593        return rc;
     
    596596     * Allocate the module and read/construct the section headers.
    597597     */
    598     PKDBGMODPE pModPe = (PKDBGMODPE)kDbgHlpAlloc(KDBG_OFFSETOF(KDBGMODPE, aSections[FHdr.NumberOfSections + 2]));
    599     kDbgAssertReturn(pModPe, KDBG_ERR_NO_MEMORY);
    600     pModPe->Core.u32Magic   = KDBGMOD_MAGIC;
    601     pModPe->Core.pOps       = &g_rtDbgModPEOps;
    602     pModPe->Core.pFile      = pFile;
    603     pModPe->cbImage         = cbImage;
    604     pModPe->cSections       = 1 + FHdr.NumberOfSections;
     598    PKDBGMODDBGHELP pModDH = (PKDBGMODDBGHELP)kDbgHlpAlloc(KDBG_OFFSETOF(KDBGMODDBGHELP, aSections[FHdr.NumberOfSections + 2]));
     599    kDbgAssertReturn(pModDH, KDBG_ERR_NO_MEMORY);
     600    pModDH->Core.u32Magic   = KDBGMOD_MAGIC;
     601    pModDH->Core.pOps       = &g_kdbgModDHOps;
     602    pModDH->Core.pFile      = pFile;
     603    pModDH->cbImage         = cbImage;
     604    pModDH->cSections       = 1 + FHdr.NumberOfSections;
    605605    rc = kDbgHlpReadAt(pFile, offHdr + KDBG_OFFSETOF(IMAGE_NT_HEADERS32, OptionalHeader) + FHdr.SizeOfOptionalHeader,
    606                        &pModPe->aSections[1], sizeof(pModPe->aSections[0]) * FHdr.NumberOfSections);
     606                       &pModDH->aSections[1], sizeof(pModDH->aSections[0]) * FHdr.NumberOfSections);
    607607    if (!rc)
    608608    {
    609         PIMAGE_SECTION_HEADER pSH = &pModPe->aSections[0];
     609        PIMAGE_SECTION_HEADER pSH = &pModDH->aSections[0];
    610610        memcpy(pSH->Name, "headers", sizeof(pSH->Name));
    611         pSH->Misc.VirtualSize       = pModPe->aSections[1].VirtualAddress;
     611        pSH->Misc.VirtualSize       = pModDH->aSections[1].VirtualAddress;
    612612        pSH->VirtualAddress         = 0;
    613613        pSH->SizeOfRawData          = pSH->Misc.VirtualSize;
     
    619619        pSH->Characteristics        = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_MEM_READ;
    620620
    621         uint32_t uTheEnd = pModPe->aSections[FHdr.NumberOfSections].VirtualAddress
    622                          + pModPe->aSections[FHdr.NumberOfSections].Misc.VirtualSize;
     621        uint32_t uTheEnd = pModDH->aSections[FHdr.NumberOfSections].VirtualAddress
     622                         + pModDH->aSections[FHdr.NumberOfSections].Misc.VirtualSize;
    623623        if (uTheEnd < cbImage)
    624624        {
    625             pSH = &pModPe->aSections[pModPe->cSections++];
     625            pSH = &pModDH->aSections[pModDH->cSections++];
    626626            memcpy(pSH->Name, "tail\0\0\0", sizeof(pSH->Name));
    627627            pSH->Misc.VirtualSize       = cbImage - uTheEnd;
     
    661661            if (ImageBase)
    662662            {
    663                 pModPe->hSymInst    = hSymInst;
    664                 pModPe->ImageBase   = ImageBase;
    665                 *ppDbgMod = &pModPe->Core;
     663                pModDH->hSymInst    = hSymInst;
     664                pModDH->ImageBase   = ImageBase;
     665                *ppDbgMod = &pModDH->Core;
    666666                return rc;
    667667            }
     
    682682        kDbgAssertRC(rc);
    683683
    684     kDbgHlpFree(pModPe);
     684    kDbgHlpFree(pModDH);
    685685    return rc;
    686686}
  • trunk/kDbg/kDbgModule.cpp

    r3528 r3530  
    104104#ifdef IMAGE_NT_SIGNATURE
    105105        else if (Buf.au32[0] == IMAGE_NT_SIGNATURE)
     106        {
     107# ifdef KS_OS_WINDOWS
     108            rc = kdbgModWinDbgHelpOpen(pFile, offHdr, pszModulePath, ppDbgMod);
     109            if (    rc
     110                &&  !kdbgModPEOpen(pFile, offHdr, pszModulePath, ppDbgMod))
     111                rc = 0;
     112# endif
    106113            rc = kdbgModPEOpen(pFile, offHdr, pszModulePath, ppDbgMod);
     114        }
    107115#endif
    108116        /** @todo there are a number of text file formats too which I want to support. */
Note: See TracChangeset for help on using the changeset viewer.