Changeset 3550 for trunk/kStuff/kDbg


Ignore:
Timestamp:
Aug 26, 2007, 3:13:35 AM (18 years ago)
Author:
bird
Message:

made kDbg compile again (not linking yet though).

Location:
trunk/kStuff/kDbg
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/kStuff/kDbg/Makefile.kmk

    r3537 r3550  
    3131# kDbg - The profiler module.
    3232#
    33 DLLS += kDbg
     33#DLLS += kDbg - disabled for now.
    3434kDbg_TEMPLATE = kStuffDLL
    3535kDbg_DEFS = KDBG_BUILDING KDBG_RESIDES_IN_DLL
     
    3737kDbg_SOURCES := \
    3838        kDbgModule.cpp \
    39         kDbgModPE.cpp \
    40         \
    4139        kDbgLine.cpp \
    42         \
    43         kDbgSymbol.cpp \
    44         \
    45         kDbgHlpCrt.cpp
     40        kDbgSymbol.cpp
    4641
    4742kDbg_SOURCES += \
     
    6661kDbgDump_LIBS = \
    6762        $(TARGET_kDbgStatic) \
    68         $(TARGET_kDbgStatic:kDbgStatic=kLdrStatic)
     63        $(subst kDbg,kLdr,$(TARGET_kDbgStatic)) \
     64        $(subst kDbg,kRdr,$(TARGET_kDbgStatic))
    6965
    7066# Generate the rules
  • trunk/kStuff/kDbg/kDbgDump.cpp

    r3537 r3550  
    2828*   Header Files                                                               *
    2929*******************************************************************************/
    30 #include "kDbg.h"
     30#include <k/kDbg.h>
    3131#include <string.h>
    3232#include <stdio.h>
     
    5353{
    5454    PKDBGMOD pDbgMod;
    55     int rc = kDbgModuleOpen(pszFile, &pDbgMod);
     55    int rc = kDbgModuleOpen(&pDbgMod, pszFile, NULL);
    5656    if (rc)
    5757    {
  • trunk/kStuff/kDbg/kDbgInternal.h

    r3541 r3550  
    2626#define ___kDbgInternal_h___
    2727
    28 #include <k/kDbg.h>
    29 #include "kDbgHlp.h"
     28#include <k/kHlpAssert.h>
     29#include <k/kMagics.h>
     30#include <k/kErrors.h>
     31#include <k/kDbgAll.h>
     32
     33
     34/** @defgroup grp_kDbgInternal  Internal
     35 * @internal
     36 * @addtogroup grp_kDbg
     37 * @{
     38 */
     39
     40/** @def KDBG_STRICT
     41 * If defined the kDbg assertions and other runtime checks will be enabled. */
     42#ifdef K_ALL_STRICT
     43# undef KDBG_STRICT
     44# define KDBG_STRICT
     45#endif
     46
     47/** @name Our Assert macros
     48 * @{ */
     49#ifdef KDBG_STRICT
     50# define kDbgAssert(expr)                       kHlpAssert(expr)
     51# define kDbgAssertReturn(expr, rcRet)          kHlpAssertReturn(expr, rcRet)
     52# define kDbgAssertReturnVoid(expr)             kHlpAssertReturnVoid(expr)
     53# define kDbgAssertMsg(expr, msg)               kHlpAssertMsg(expr, msg)
     54# define kDbgAssertMsgReturn(expr, msg, rcRet)  kHlpAssertMsgReturn(expr, msg, rcRet)
     55# define kDbgAssertMsgReturnVoid(expr, msg)     kHlpAssertMsgReturnVoid(expr, msg)
     56#else   /* !KDBG_STRICT */
     57# define kDbgAssert(expr)                       do { } while (0)
     58# define kDbgAssertReturn(expr, rcRet)          do { if (!(expr)) return (rcRet); } while (0)
     59# define kDbgAssertMsg(expr, msg)               do { } while (0)
     60# define kDbgAssertMsgReturn(expr, msg, rcRet)  do { if (!(expr)) return (rcRet); } while (0)
     61#endif  /* !KDBG_STRICT */
     62
     63#define kDbgAssertPtr(ptr)                      kDbgAssertMsg(K_VALID_PTR(ptr), ("%s = %p\n", #ptr, (ptr)))
     64#define kDbgAssertPtrReturn(ptr, rcRet)         kDbgAssertMsgReturn(K_VALID_PTR(ptr), ("%s = %p -> %d\n", #ptr, (ptr), (rcRet)), (rcRet))
     65#define kDbgAssertPtrReturnVoid(ptr)            kDbgAssertMsgReturnVoid(K_VALID_PTR(ptr), ("%s = %p -> %d\n", #ptr, (ptr), (rcRet)))
     66#define kDbgAssertPtrNull(ptr)                  kDbgAssertMsg(!(ptr) || K_VALID_PTR(ptr), ("%s = %p\n", #ptr, (ptr)))
     67#define kDbgAssertPtrNullReturn(ptr, rcRet)     kDbgAssertMsgReturn(!(ptr) || K_VALID_PTR(ptr), ("%s = %p -> %d\n", #ptr, (ptr), (rcRet)), (rcRet))
     68#define kDbgAssertPtrNullReturnVoid(ptr)        kDbgAssertMsgReturnVoid(!(ptr) || K_VALID_PTR(ptr), ("%s = %p -> %d\n", #ptr, (ptr), (rcRet)))
     69#define kDbgAssertRC(rc)                        kDbgAssertMsg((rc) == 0, ("%s = %d\n", #rc, (rc)))
     70#define kDbgAssertRCReturn(rc, rcRet)           kDbgAssertMsgReturn((rc) == 0, ("%s = %d -> %d\n", #rc, (rc), (rcRet)), (rcRet))
     71#define kDbgAssertRCReturnVoid(rc)              kDbgAssertMsgReturnVoid((rc) == 0, ("%s = %d -> %d\n", #rc, (rc), (rcRet)))
     72#define kDbgAssertFailed()                      kDbgAssert(0)
     73#define kDbgAssertFailedReturn(rcRet)           kDbgAssertReturn(0, (rcRet))
     74#define kDbgAssertFailedReturnVoid()            kDbgAssertReturnVoid(0)
     75#define kDbgAssertMsgFailed(msg)                kDbgAssertMsg(0, msg)
     76#define kDbgAssertMsgFailedReturn(msg, rcRet)   kDbgAssertMsgReturn(0, msg, (rcRet))
     77#define kDbgAssertMsgFailedReturnVoid(msg)      kDbgAssertMsgReturnVoid(0, msg)
     78/** @} */
     79
     80/** Return / crash validation of a reader argument. */
     81#define KDBGMOD_VALIDATE_EX(pDbgMod, rc) \
     82    do  { \
     83        kDbgAssertPtrReturn((pDbgMod), (rc)); \
     84        kDbgAssertReturn((pDbgMod)->u32Magic == KDBGMOD_MAGIC, (rc)); \
     85        kDbgAssertReturn((pDbgMod)->pOps != NULL, (rc)); \
     86    } while (0)
     87
     88/** Return / crash validation of a reader argument. */
     89#define KDBGMOD_VALIDATE(pDbgMod) \
     90    do  { \
     91        kDbgAssertPtrReturn((pDbgMod), KERR_INVALID_POINTER); \
     92        kDbgAssertReturn((pDbgMod)->u32Magic == KDBGMOD_MAGIC, KERR_INVALID_HANDLE); \
     93        kDbgAssertReturn((pDbgMod)->pOps != NULL, KERR_INVALID_HANDLE); \
     94    } while (0)
     95
     96/** Return / crash validation of a reader argument. */
     97#define KDBGMOD_VALIDATE_VOID(pDbgMod) \
     98    do  { \
     99        kDbgAssertPtrReturnVoid((pDbgMod)); \
     100        kDbgAssertReturnVoid((pDbgMod)->u32Magic == KDBGMOD_MAGIC); \
     101        kDbgAssertReturnVoid((pDbgMod)->pOps != NULL); \
     102    } while (0)
     103
    30104
    31105#ifdef __cplusplus
     
    52126#endif
    53127
     128/** @} */
     129
    54130#endif
    55131
  • trunk/kStuff/kDbg/kDbgLine.cpp

    r3541 r3550  
    77 * Copyright (c) 2006-2007 knut st. osmundsen <bird-src-spam@anduin.net>
    88 *
    9  * This file is part of kLIBC.
     9 * This file is part of kStuff.
    1010 *
    11  * kLIBC is free software; you can redistribute it and/or modify
    12  * it under the terms of the GNU General Public License as published by
    13  * the Free Software Foundation; either version 2 of the License, or
    14  * (at your option) any later version.
     11 * kStuff is free software; you can redistribute it and/or
     12 * modify it under the terms of the GNU Lesser General Public
     13 * License as published by the Free Software Foundation; either
     14 * version 2.1 of the License, or (at your option) any later version.
    1515 *
    16  * kLIBC is distributed in the hope that it will be useful,
     16 * kStuff is distributed in the hope that it will be useful,
    1717 * but WITHOUT ANY WARRANTY; without even the implied warranty of
    18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    19  * GNU General Public License for more details.
     18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     19 * Lesser General Public License for more details.
    2020 *
    21  * You should have received a copy of the GNU General Public License
    22  * along with kLIBC; if not, write to the Free Software
    23  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
     21 * You should have received a copy of the GNU Lesser General Public
     22 * License along with kStuff; if not, write to the Free Software
     23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
    2424 *
    2525 */
    26 
    2726
    2827/*******************************************************************************
    2928*   Header Files                                                               *
    3029*******************************************************************************/
    31 #include "kDbg.h"
    3230#include "kDbgInternal.h"
    33 
     31#include <k/kHlpAlloc.h>
    3432
    3533
     
    4745KDBG_DECL(PKDBGLINE) kDbgLineDup(PCKDBGLINE pLine)
    4846{
    49     kDbgAssertMsgReturn(KDBG_VALID_PTR(pLine), ("%p\n", pLine), NULL);
    50     size_t cb = KDBG_OFFSETOF(KDBGLINE, szFile[pLine->cchFile + 1]);
    51     return (PKDBGLINE)kDbgHlpAllocDup(pLine, cb);
     47    kDbgAssertPtrReturn(pLine, NULL);
     48    KSIZE cb = K_OFFSETOF(KDBGLINE, szFile[pLine->cchFile + 1]);
     49    PKDBGLINE pNewLine = (PKDBGLINE)kHlpDup(pLine, cb);
     50    if (pNewLine)
     51        pNewLine->cbSelf = cb;
     52    return pNewLine;
    5253}
    5354
    5455
    5556/**
    56  * Frees a line number obtained from the RTDbg API.
     57 * Frees a line number obtained from the kDbg API.
    5758 *
    5859 * @returns 0 on success.
    59  * @returns KERR_INVALID_POINTER if a NULL pointer or an !KDBG_VALID_PTR() is passed in.
     60 * @returns KERR_INVALID_POINTER if pLine isn't a valid pointer.
    6061 *
    61  * @param   pLine       The line number to be freed.
     62 * @param   pLine       The line number to be freed. The null pointer is ignored.
    6263 */
    6364KDBG_DECL(int) kDbgLineFree(PKDBGLINE pLine)
    6465{
    65     if (!pLine)
    66         return KERR_INVALID_POINTER;
    67     kDbgAssertMsgReturn(KDBG_VALID_PTR(pLine), ("%p\n", pLine), KERR_INVALID_POINTER);
    68 
    69     kDbgHlpFree(pLine);
     66    if (pLine)
     67    {
     68        kDbgAssertPtrReturn(pLine, KERR_INVALID_POINTER);
     69        pLine->cbSelf = 0;
     70        kHlpFree(pLine);
     71    }
    7072    return 0;
    7173}
  • trunk/kStuff/kDbg/kDbgModWinDbgHelp.cpp

    r3541 r3550  
    3232#define _IMAGEHLP64
    3333#include <DbgHelp.h>
    34 #include <malloc.h> /* alloca */
    3534
    3635#include "kDbgInternal.h"
     36#include <k/kHlpAlloc.h>
     37#include <k/kHlpString.h>
    3738
    3839
     
    7273    HANDLE      hSymInst;
    7374    /** The image size. */
    74     uint32_t    cbImage;
     75    KU32        cbImage;
    7576    /** The number of sections. (We've added the implicit header section.) */
    76     int32_t     cSections;
     77    KI32        cSections;
    7778    /** The section headers (variable size). The first section is the
    7879     * implicit header section.*/
     
    107108 * @param   puRVA       Where to store the RVA on success.
    108109 */
    109 static int kdbgModDHSegOffToRVA(PKDBGMODDBGHELP pModDH, int32_t iSegment, KDBGADDR off, uint32_t *puRVA)
     110static int kdbgModDHSegOffToRVA(PKDBGMODDBGHELP pModDH, KI32 iSegment, KDBGADDR off, KU32 *puRVA)
    110111{
    111112    if (iSegment >= 0)
     
    116117                            ("off=" PRI_KDBGADDR " VirtualSize=%x\n", off, pModDH->aSections[iSegment].Misc.VirtualSize),
    117118                            KDBG_ERR_INVALID_ADDRESS);
    118         *puRVA = pModDH->aSections[iSegment].VirtualAddress + (uint32_t)off;
     119        *puRVA = pModDH->aSections[iSegment].VirtualAddress + (KU32)off;
    119120        return 0;
    120121    }
     
    124125        kDbgAssertMsgReturn(off < pModDH->cbImage, ("off=" PRI_KDBGADDR ", cbImage=%x\n", off, pModDH->cbImage),
    125126                            KDBG_ERR_INVALID_ADDRESS);
    126         *puRVA = (uint32_t)off;
     127        *puRVA = (KU32)off;
    127128        return 0;
    128129    }
     
    141142 * @param   poff        Where to store the segment offset.
    142143 */
    143 static int kdbgModDHRVAToSegOff(PKDBGMODDBGHELP pModDH, uint32_t uRVA, int32_t *piSegment, KDBGADDR *poff)
     144static int kdbgModDHRVAToSegOff(PKDBGMODDBGHELP pModDH, KU32 uRVA, KI32 *piSegment, KDBGADDR *poff)
    144145{
    145146    kDbgAssertMsgReturn(uRVA < pModDH->cbImage, ("uRVA=%x, cbImage=%x\n", uRVA, pModDH->cbImage),
    146147                        KDBG_ERR_INVALID_ADDRESS);
    147     for (int32_t iSegment = 0; iSegment < pModDH->cSections; iSegment++)
     148    for (KI32 iSegment = 0; iSegment < pModDH->cSections; iSegment++)
    148149    {
    149150        /** @todo should probably be less strict about address in the alignment gaps. */
    150         uint32_t off = uRVA - pModDH->aSections[iSegment].VirtualAddress;
     151        KU32 off = uRVA - pModDH->aSections[iSegment].VirtualAddress;
    151152        if (off < pModDH->aSections[iSegment].Misc.VirtualSize)
    152153        {
     
    163164 * @copydoc KDBGMODOPS::pfnQueryLine
    164165 */
    165 static int kdbgModDHQueryLine(PKDBGMOD pMod, int32_t iSegment, KDBGADDR off, PKDBGLINE pLine)
     166static int kdbgModDHQueryLine(PKDBGMOD pMod, KI32 iSegment, KDBGADDR off, PKDBGLINE pLine)
    166167{
    167168    PKDBGMODDBGHELP pModDH = (PKDBGMODDBGHELP)pMod;
     
    170171     * Translate the address to an RVA.
    171172     */
    172     uint32_t uRVA;
     173    KU32 uRVA;
    173174    int rc = kdbgModDHSegOffToRVA(pModDH, iSegment, off, &uRVA);
    174175    if (!rc)
     
    180181        {
    181182            pLine->RVA = (KDBGADDR)(Line.Address - pModDH->ImageBase);
    182             rc = kdbgModDHRVAToSegOff(pModDH, (uint32_t)pLine->RVA, &pLine->iSegment, &pLine->offSegment);
     183            rc = kdbgModDHRVAToSegOff(pModDH, (KU32)pLine->RVA, &pLine->iSegment, &pLine->offSegment);
    183184            pLine->iLine = Line.LineNumber;
    184             size_t cchFile = strlen(Line.FileName);
     185            KSIZE cchFile = kHlpStrLen(Line.FileName);
    185186            pLine->cchFile = cchFile < sizeof(pLine->szFile)
    186                            ? (uint16_t)cchFile
    187                            : (uint16_t)sizeof(pLine->szFile) - 1;
    188             memcpy(pLine->szFile, Line.FileName, pLine->cchFile);
     187                           ? (KU16)cchFile
     188                           : (KU16)sizeof(pLine->szFile) - 1;
     189            kHlpMemCopy(pLine->szFile, Line.FileName, pLine->cchFile);
    189190            pLine->szFile[pLine->cchFile] = '\0';
    190191        }
     
    202203 * @copydoc KDBGMODOPS::pfnQuerySymbol
    203204 */
    204 static int kdbgModDHQuerySymbol(PKDBGMOD pMod, int32_t iSegment, KDBGADDR off, PKDBGSYMBOL pSym)
     205static int kdbgModDHQuerySymbol(PKDBGMOD pMod, KI32 iSegment, KDBGADDR off, PKDBGSYMBOL pSym)
    205206{
    206207    PKDBGMODDBGHELP pModDH = (PKDBGMODDBGHELP)pMod;
     
    209210     * Translate the address to an RVA.
    210211     */
    211     uint32_t uRVA;
     212    KU32 uRVA;
    212213    int rc = kdbgModDHSegOffToRVA(pModDH, iSegment, off, &uRVA);
    213214    if (!rc)
     
    242243            {
    243244                pSym->RVA        = (KDBGADDR)(Buf.Sym.Address - pModDH->ImageBase);
    244                 rc = kdbgModDHRVAToSegOff(pModDH, (uint32_t)pSym->RVA, &pSym->iSegment, &pSym->offSegment);
     245                rc = kdbgModDHRVAToSegOff(pModDH, (KU32)pSym->RVA, &pSym->iSegment, &pSym->offSegment);
    245246            }
    246             pSym->cchName = (uint16_t)Buf.Sym.NameLen;
     247            pSym->cchName = (KU16)Buf.Sym.NameLen;
    247248            if (pSym->cchName >= sizeof(pSym->szName))
    248249                pSym->cchName = sizeof(pSym->szName) - 1;
    249             memcpy(pSym->szName, Buf.Sym.Name, Buf.Sym.NameLen);
     250            kHlpMemCopy(pSym->szName, Buf.Sym.Name, Buf.Sym.NameLen);
    250251            pSym->szName[Buf.Sym.NameLen] = '\0';
    251252        }
     
    272273    DWORD Err = GetLastError();
    273274    int rc = kdbgModDHConvWinError(Err);
    274     kDbgAssertMsgFailed(("SymInitialize failed: Err=%d rc=%Rrc\n", Err, rc));
     275    kDbgAssertMsgFailed(("SymInitialize failed: Err=%d rc=%d\n", Err, rc));
    275276    return rc;
    276277}
     
    278279
    279280/**
    280  * Methods for a PE module.
    281  */
    282 static const KDBGMODOPS g_kdbgModDHOps =
    283 {
    284     "PE (dbghelp)",
    285     kdbgModDHClose,
    286     kdbgModDHQuerySymbol,
    287     kdbgModDHQueryLine
    288 };
    289 
    290 
    291 /**
    292281 * Checks if the specified dbghelp.dll is usable.
    293282 *
     
    296285 * @param   pszPath     the path to the dbghelp.dll.
    297286 */
    298 static int kdbgModDHTryDbgHelp(const char *pszPath, uint32_t *pu32FileVersionMS, uint32_t *pu32FileVersionLS)
     287static int kdbgModDHTryDbgHelp(const char *pszPath, KU32 *pu32FileVersionMS, KU32 *pu32FileVersionLS)
    299288{
    300289    int rc;
     
    337326 * Find the dbghelp.dll
    338327 */
    339 static int kdbgModDHFindDbgHelp(char *pszPath, size_t cchPath)
     328static int kdbgModDHFindDbgHelp(char *pszPath, KSIZE cchPath)
    340329{
    341330    /*
    342331     * Try the current directory.
    343332     */
    344     uint32_t FileVersionMS = 0;
    345     uint32_t FileVersionLS = 0;
     333    KU32 FileVersionMS = 0;
     334    KU32 FileVersionLS = 0;
    346335    int rc = KERR_GENERAL_FAILURE;
    347336    static char s_szDbgHelp[] = "\\dbghelp.dll";
     
    361350    if (GetModuleFileName(NULL, pszPath, (DWORD)(cchPath - sizeof(s_szDbgHelp) + 1)))
    362351    {
    363         strcat(strrchr(pszPath, '\\'), s_szDbgHelp);
     352        kHlpStrCat(kHlpStrRChr(pszPath, '\\'), s_szDbgHelp);
    364353        int rc2 = kdbgModDHTryDbgHelp(pszPath, &FileVersionMS, &FileVersionLS);
    365354        if (!rc)
     
    374363    if (GetSystemDirectory(pszPath, (DWORD)(cchPath - sizeof(s_szDbgHelp) + 1)))
    375364    {
    376         strcat(pszPath, s_szDbgHelp);
     365        kHlpStrCat(pszPath, s_szDbgHelp);
    377366        int rc2 = kdbgModDHTryDbgHelp(pszPath, &FileVersionMS, &FileVersionLS);
    378367        if (!rc2)
     
    387376    if (GetWindowsDirectory(pszPath, (DWORD)(cchPath - sizeof(s_szDbgHelp) + 1)))
    388377    {
    389         strcat(pszPath, s_szDbgHelp);
     378        kHlpStrCat(pszPath, s_szDbgHelp);
    390379        int rc2 = kdbgModDHTryDbgHelp(pszPath, &FileVersionMS, &FileVersionLS);
    391380        if (!rc2)
     
    407396        {
    408397            /* find the end of the path. */
    409             char *pszEnd = strchr(psz, ';');
     398            char *pszEnd = kHlpStrChr(psz, ';');
    410399            if (!pszEnd)
    411                 pszEnd = strchr(psz, '\0');
     400                pszEnd = kHlpStrChr(psz, '\0');
    412401            if (pszEnd != psz)
    413402            {
    414403                /* construct filename and try it out */
    415                 memcpy(pszPath, psz, pszEnd - psz);
    416                 memcpy(&pszPath[pszEnd - psz], s_szDbgHelp, sizeof(s_szDbgHelp));
     404                kHlpMemCopy(pszPath, psz, pszEnd - psz);
     405                kHlpMemCopy(&pszPath[pszEnd - psz], s_szDbgHelp, sizeof(s_szDbgHelp));
    417406                int rc2 = kdbgModDHTryDbgHelp(pszPath, &FileVersionMS, &FileVersionLS);
    418407                if (!rc2)
     
    453442
    454443    /* primitive locking - make some useful API for this kind of spinning! */
    455     static volatile uint32_t s_u32Lock = 0;
    456     while (!InterlockedCompareExchange((long volatile *)&s_u32Lock, 1, 0))
    457         while (s_u32Lock)
     444    static volatile long s_lLock = 0;
     445    while (!InterlockedCompareExchange(&s_lLock, 1, 0))
     446        while (s_lLock)
    458447            Sleep(1);
    459448    if (g_hDbgHelp)
    460449    {
    461         InterlockedExchange((long volatile *)&s_u32Lock, 0);
     450        InterlockedExchange(&s_lLock, 0);
    462451        return 0;
    463452    }
     
    470459    if (rc)
    471460    {
    472         InterlockedExchange((volatile long *)&s_u32Lock, 0);
     461        InterlockedExchange(&s_lLock, 0);
    473462        return rc;
    474463    }
     
    479468        DWORD Err = GetLastError();
    480469        int rc = kdbgModDHConvWinError(Err);
    481         kDbgAssertMsgFailedReturn(("Failed to load '%s', Err=%d rc=%Rrc\n", szPath, Err, rc), rc);
     470        kDbgAssertMsgFailedReturn(("Failed to load '%s', Err=%d rc=%d\n", szPath, Err, rc), rc);
    482471    }
    483472
     
    515504                { "SymGetLineFromAddr64", (FARPROC *)&g_pfnSymGetLineFromAddr64 },
    516505            };
    517             for (unsigned i = 0; i < KDBG_ELEMENTS(s_aFunctions); i++)
     506            for (unsigned i = 0; i < K_ELEMENTS(s_aFunctions); i++)
    518507            {
    519508                FARPROC pfn = GetProcAddress(hmod, s_aFunctions[i].pszName);
     
    522511                    DWORD Err = GetLastError();
    523512                    rc = kdbgModDHConvWinError(Err);
    524                     kDbgAssertMsgFailed(("Failed to resolve %s in dbghelp, Err=%d rc=%Rrc\n",
    525                                      s_aFunctions[i].pszName, Err, rc));
     513                    kDbgAssertMsgFailed(("Failed to resolve %s in dbghelp, Err=%d rc=%d\n",
     514                                         s_aFunctions[i].pszName, Err, rc));
    526515                    break;
    527516                }
     
    533522                g_hDbgHelp = hmod;
    534523                Sleep(1);
    535                 InterlockedExchange((volatile long *)&s_u32Lock, 0);
     524                InterlockedExchange(&s_lLock, 0);
    536525                return 0;
    537526            }
     
    547536        DWORD Err = GetLastError();
    548537        rc = kdbgModDHConvWinError(Err);
    549         kDbgAssertMsgFailed(("Failed to resolve ImagehlpApiVersionEx in dbghelp, Err=%d rc=%Rrc\n", Err, rc));
     538        kDbgAssertMsgFailed(("Failed to resolve ImagehlpApiVersionEx in dbghelp, Err=%d rc=%d\n", Err, rc));
    550539    }
    551540    FreeLibrary(hmod);
    552     InterlockedExchange((long volatile *)&s_u32Lock, 0);
     541    InterlockedExchange(&s_lLock, 0);
    553542    return rc;
    554543}
     
    556545
    557546/**
    558  * Opens the debug info for a PE image using the windows dbghelp library.
    559  *
    560  * @returns IPRT status code.
    561  *
    562  * @param   pFile               The handle to the module.
    563  * @param   offHdr              The offset of the PE header.
    564  * @param   pszModulePath       The path to the module.
    565  * @param   ppDbgMod            Where to store the module handle.
    566  *
    567  */
    568 int kdbgModWinDbgHelpOpen(PKDBGHLPFILE pFile, PKDBGMOD *ppDbgMod)
    569 {
     547 * @copydoc KDBGMODOPS::pfnOpen
     548 */
     549static int kdbgModDHOpen(PKDBGMOD *ppMod, PKRDR pRdr, KBOOL fCloseRdr, KFOFF off, KFOFF cb, struct KLDRMOD *pLdrMod)
     550{
     551    /*
     552     * This reader doesn't support partial files.
     553     * Also weed out small files early on as they cannot be
     554     * PE images and will only cause read errors
     555     */
     556    if (    off != 0
     557        ||  cb != KFOFF_MAX)
     558        return KDBG_ERR_UNKOWN_FORMAT;
     559    if (kRdrSize(pRdr) < sizeof(IMAGE_NT_HEADERS32) + sizeof(IMAGE_SECTION_HEADER))
     560        return KDBG_ERR_UNKOWN_FORMAT;
     561
    570562    /*
    571563     * We need to read the section headers and get the image size.
    572564     */
     565    /* Find the PE header magic. */
     566    KU32 offHdr = 0;
     567    KU32 u32Magic;
     568    int rc = kRdrRead(pRdr, &u32Magic, sizeof(u32Magic), 0);
     569    kDbgAssertRCReturn(rc, rc);
     570    if ((KU16)u32Magic == IMAGE_DOS_SIGNATURE)
     571    {
     572        rc = kRdrRead(pRdr, &offHdr, sizeof(offHdr), K_OFFSETOF(IMAGE_DOS_HEADER, e_lfanew));
     573        kDbgAssertRCReturn(rc, rc);
     574        if (!offHdr)
     575            return KDBG_ERR_FORMAT_NOT_SUPPORTED;
     576        if (    offHdr < sizeof(IMAGE_DOS_SIGNATURE)
     577            ||  offHdr >= kRdrSize(pRdr) - 4)
     578            return KDBG_ERR_BAD_EXE_FORMAT;
     579
     580        rc = kRdrRead(pRdr, &u32Magic, sizeof(u32Magic), offHdr);
     581        kDbgAssertRCReturn(rc, rc);
     582    }
     583    if (u32Magic != IMAGE_NT_SIGNATURE)
     584        return KDBG_ERR_FORMAT_NOT_SUPPORTED;
     585
     586    /* read the file header and the image size in the optional header.. */
    573587    IMAGE_FILE_HEADER FHdr;
    574     int rc = kDbgHlpReadAt(pFile, offHdr + KDBG_OFFSETOF(IMAGE_NT_HEADERS32, FileHeader), &FHdr, sizeof(FHdr));
     588    rc = kRdrRead(pRdr, &FHdr, sizeof(FHdr), K_OFFSETOF(IMAGE_NT_HEADERS32, FileHeader));
    575589    kDbgAssertRCReturn(rc, rc);
    576590
    577     uint32_t cbImage;
     591    KU32 cbImage;
    578592    if (FHdr.SizeOfOptionalHeader == sizeof(IMAGE_OPTIONAL_HEADER32))
    579         rc = kDbgHlpReadAt(pFile, offHdr + KDBG_OFFSETOF(IMAGE_NT_HEADERS32, OptionalHeader.SizeOfImage),
    580                            &cbImage, sizeof(cbImage));
     593        rc = kRdrRead(pRdr, &cbImage, sizeof(cbImage),
     594                      offHdr + K_OFFSETOF(IMAGE_NT_HEADERS32, OptionalHeader.SizeOfImage));
    581595    else if (FHdr.SizeOfOptionalHeader == sizeof(IMAGE_OPTIONAL_HEADER64))
    582         rc = kDbgHlpReadAt(pFile, offHdr + KDBG_OFFSETOF(IMAGE_NT_HEADERS64, OptionalHeader.SizeOfImage),
    583                            &cbImage, sizeof(cbImage));
     596        rc = kRdrRead(pRdr, &cbImage, sizeof(cbImage),
     597                      offHdr + K_OFFSETOF(IMAGE_NT_HEADERS64, OptionalHeader.SizeOfImage));
    584598    else
    585599        kDbgAssertFailedReturn(KDBG_ERR_BAD_EXE_FORMAT);
     
    596610     * Allocate the module and read/construct the section headers.
    597611     */
    598     PKDBGMODDBGHELP pModDH = (PKDBGMODDBGHELP)kDbgHlpAlloc(KDBG_OFFSETOF(KDBGMODDBGHELP, aSections[FHdr.NumberOfSections + 2]));
     612    PKDBGMODDBGHELP pModDH = (PKDBGMODDBGHELP)kHlpAlloc(K_OFFSETOF(KDBGMODDBGHELP, aSections[FHdr.NumberOfSections + 2]));
    599613    kDbgAssertReturn(pModDH, KERR_NO_MEMORY);
    600614    pModDH->Core.u32Magic   = KDBGMOD_MAGIC;
    601     pModDH->Core.pOps       = &g_kdbgModDHOps;
    602     pModDH->Core.pFile      = pFile;
     615    pModDH->Core.pOps       = &g_kDbgModWinDbgHelpOpen;
     616    pModDH->Core.pRdr       = pRdr;
     617    pModDH->Core.fCloseRdr  = fCloseRdr;
     618    pModDH->Core.pLdrMod    = pLdrMod;
    603619    pModDH->cbImage         = cbImage;
    604620    pModDH->cSections       = 1 + FHdr.NumberOfSections;
    605     rc = kDbgHlpReadAt(pFile, offHdr + KDBG_OFFSETOF(IMAGE_NT_HEADERS32, OptionalHeader) + FHdr.SizeOfOptionalHeader,
    606                        &pModDH->aSections[1], sizeof(pModDH->aSections[0]) * FHdr.NumberOfSections);
     621
     622    rc = kRdrRead(pRdr, &pModDH->aSections[1], sizeof(pModDH->aSections[0]) * FHdr.NumberOfSections,
     623                  offHdr + K_OFFSETOF(IMAGE_NT_HEADERS32, OptionalHeader) + FHdr.SizeOfOptionalHeader);
    607624    if (!rc)
    608625    {
    609626        PIMAGE_SECTION_HEADER pSH = &pModDH->aSections[0];
    610         memcpy(pSH->Name, "headers", sizeof(pSH->Name));
     627        kHlpMemCopy(pSH->Name, "headers", sizeof(pSH->Name));
    611628        pSH->Misc.VirtualSize       = pModDH->aSections[1].VirtualAddress;
    612629        pSH->VirtualAddress         = 0;
     
    619636        pSH->Characteristics        = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_MEM_READ;
    620637
    621         uint32_t uTheEnd = pModDH->aSections[FHdr.NumberOfSections].VirtualAddress
    622                          + pModDH->aSections[FHdr.NumberOfSections].Misc.VirtualSize;
     638        KU32 uTheEnd = pModDH->aSections[FHdr.NumberOfSections].VirtualAddress
     639                     + pModDH->aSections[FHdr.NumberOfSections].Misc.VirtualSize;
    623640        if (uTheEnd < cbImage)
    624641        {
    625642            pSH = &pModDH->aSections[pModDH->cSections++];
    626             memcpy(pSH->Name, "tail\0\0\0", sizeof(pSH->Name));
     643            kHlpMemCopy(pSH->Name, "tail\0\0\0", sizeof(pSH->Name));
    627644            pSH->Misc.VirtualSize       = cbImage - uTheEnd;
    628645            pSH->VirtualAddress         = uTheEnd;
     
    642659         * when we start reusing handles they are no longer in use. :-)
    643660         */
    644         static volatile uint32_t s_u32LastHandle = 1;
    645         HANDLE hSymInst = (HANDLE)InterlockedIncrement((long *)&s_u32LastHandle);
     661        static volatile long s_u32LastHandle = 1;
     662        HANDLE hSymInst = (HANDLE)InterlockedIncrement(&s_u32LastHandle);
    646663        while (     hSymInst == INVALID_HANDLE_VALUE
    647664               ||   hSymInst == (HANDLE)0
    648665               ||   hSymInst == GetCurrentProcess())
    649             hSymInst = (HANDLE)InterlockedIncrement((long *)&s_u32LastHandle);
     666            hSymInst = (HANDLE)InterlockedIncrement(&s_u32LastHandle);
    650667
    651668        /*
     
    656673            g_pfnSymSetOptions(SYMOPT_LOAD_LINES | SYMOPT_AUTO_PUBLICS | SYMOPT_ALLOW_ABSOLUTE_SYMBOLS);
    657674
    658             kDbgHlpSeek(pFile, 0); /* don't know if this is required or not... */
    659             DWORD64 ImageBase = g_pfnSymLoadModule64(hSymInst, (HANDLE)kDbgHlpNativeFileHandle(pFile),
    660                                                      pszModulePath, NULL, 0x00400000, 0);
     675            KIPTR NativeFH = kRdrNativeFH(pRdr);
     676            DWORD64 ImageBase = g_pfnSymLoadModule64(hSymInst, NativeFH == -1 ? NULL : (HANDLE)NativeFH,
     677                                                     kRdrName(pRdr), NULL, 0x00400000, 0);
    661678            if (ImageBase)
    662679            {
    663                 pModDH->hSymInst    = hSymInst;
    664                 pModDH->ImageBase   = ImageBase;
    665                 *ppDbgMod = &pModDH->Core;
     680                pModDH->hSymInst        = hSymInst;
     681                pModDH->ImageBase       = ImageBase;
     682                *ppMod = &pModDH->Core;
    666683                return rc;
    667684            }
     
    669686            DWORD Err = GetLastError();
    670687            rc = kdbgModDHConvWinError(Err);
    671             kDbgAssertMsgFailed(("SymLoadModule64 failed: Err=%d rc=%Rrc\n", Err, rc));
     688            kDbgAssertMsgFailed(("SymLoadModule64 failed: Err=%d rc=%d\n", Err, rc));
    672689            g_pfnSymCleanup(hSymInst);
    673690        }
     
    676693            DWORD Err = GetLastError();
    677694            rc = kdbgModDHConvWinError(Err);
    678             kDbgAssertMsgFailed(("SymInitialize failed: Err=%d rc=%Rrc\n", Err, rc));
     695            kDbgAssertMsgFailed(("SymInitialize failed: Err=%d rc=%d\n", Err, rc));
    679696        }
    680697    }
     
    682699        kDbgAssertRC(rc);
    683700
    684     kDbgHlpFree(pModDH);
     701    kHlpFree(pModDH);
    685702    return rc;
    686703}
    687704
     705
     706/**
     707 * Methods for a PE module.
     708 */
     709const KDBGMODOPS g_kDbgModWinDbgHelpOpen =
     710{
     711    "Windows DbgHelp",
     712    NULL,
     713    kdbgModDHOpen,
     714    kdbgModDHClose,
     715    kdbgModDHQuerySymbol,
     716    kdbgModDHQueryLine,
     717    "Windows DbgHelp"
     718};
     719
  • trunk/kStuff/kDbg/kDbgModule.cpp

    r3543 r3550  
    99 * This file is part of kStuff.
    1010 *
    11  * kStuff is free software; you can redistribute it and/or modify
    12  * it under the terms of the GNU Lesser General Public License as published
    13  * by the Free Software Foundation; either version 2 of the License, or
    14  * (at your option) any later version.
     11 * kStuff is free software; you can redistribute it and/or
     12 * modify it under the terms of the GNU Lesser General Public
     13 * License as published by the Free Software Foundation; either
     14 * version 2.1 of the License, or (at your option) any later version.
    1515 *
    1616 * kStuff is distributed in the hope that it will be useful,
    1717 * but WITHOUT ANY WARRANTY; without even the implied warranty of
    18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    19  * GNU Lesser General Public License for more details.
    20  *
    21  * You should have received a copy of the GNU Lesser General Public License
    22  * along with kStuff; if not, write to the Free Software
    23  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    24  *
    25  */
    26 
    27 
     18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     19 * Lesser General Public License for more details.
     20 *
     21 * You should have received a copy of the GNU Lesser General Public
     22 * License along with kStuff; if not, write to the Free Software
     23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
     24 *
     25 */
    2826
    2927/*******************************************************************************
    3028*   Header Files                                                               *
    3129*******************************************************************************/
    32 #include <k/kDbgAll.h>
    33 #include <k/kErrors.h>
    34 #include <string.h>
    3530#include "kDbgInternal.h"
     31#include <k/kHlpString.h>
     32#include <k/kHlpAlloc.h>
    3633
    3734
     
    4744    &g_kDbgModWinDbgHelpOpen,
    4845#endif
    49     &g_kDbgModLdr,
    50     &g_kDbgModCv8,
    51     &g_kDbgModDwarf,
    52     &g_kDbgModHll,
    53     &g_kDbgModStabs,
    54     &g_kDbgModSym,
    55     &g_kDbgModMapILink,
    56     &g_kDbgModMapMSLink,
    57     &g_kDbgModMapNm,
    58     &g_kDbgModMapWLink
     46//    &g_kDbgModLdr,
     47//    &g_kDbgModCv8,
     48//    &g_kDbgModDwarf,
     49//    &g_kDbgModHll,
     50//    &g_kDbgModStabs,
     51//    &g_kDbgModSym,
     52//    &g_kDbgModMapILink,
     53//    &g_kDbgModMapMSLink,
     54//    &g_kDbgModMapNm,
     55//    &g_kDbgModMapWLink
    5956};
    6057
     
    9390    kDbgAssertPtrReturn(pOps->pfnQueryLine, KERR_INVALID_POINTER);
    9491    kDbgAssertPtrReturn(pOps->pszName2, KERR_INVALID_POINTER);
    95     if (strcmp(pOps->pszName, pOps->pszName2))
     92    if (kHlpStrComp(pOps->pszName, pOps->pszName2))
    9693        return KERR_INVALID_PARAMETER;
    9794    kDbgAssertReturn(pOps->pNext == NULL, KERR_INVALID_PARAMETER);
     
    153150
    154151
     152
     153/**
     154 * Worker for the kDbgModuleOpen* APIs.
     155 *
     156 * This will make sure the reader is buffered. I will also take care of
     157 * closing the reader opened by kDbgModuleOpen on failure.
     158 *
     159 * @returns 0 on success. An appropriate kErrors status code on failure.
     160 * @param   ppDbgMod        Where to store the new debug module reader instance.
     161 * @param   pRdr            The file provider.
     162 * @param   fCloseRdr       Whether pRdr should be close or not. This applies both
     163 *                          to the failure path and to the success path, where it'll
     164 *                          be close when the module is closed by kDbgModuleClose().
     165 * @param   off             The offset into the file where the debug info is supposed
     166 *                          to be found.
     167 *                          This is 0 if the entire file is the subject.
     168 * @param   cb              The size of the debug info part of the file.
     169 *                          This is KFOFF_MAX if the entire file is the subject.
     170 * @param   pLdrMod         An optional kLdrMod association.
     171 */
     172static int kdbgModuleOpenWorker(PPKDBGMOD ppDbgMod, PKRDR pRdr, KBOOL fCloseRdr, KFOFF off, KFOFF cb, struct KLDRMOD *pLdrMod)
     173{
     174    /*
     175     * If the reader isn't buffered create a buffered wrapper for it.
     176     */
     177    int rc;
     178    PKRDR pRdrWrapped = NULL;
     179    if (!kRdrBufIsBuffered(pRdr))
     180    {
     181        rc = kRdrBufWrap(&pRdrWrapped, pRdr, fCloseRdr);
     182        if (rc)
     183        {
     184            if (fCloseRdr)
     185                kRdrClose(pRdr);
     186            return rc;
     187        }
     188        pRdr = pRdrWrapped;
     189    }
     190
     191    /*
     192     * Walk the built-in table and the list of registered readers
     193     * and let each of them have a go at the file. Stop and return
     194     * on the first one returning successfully.
     195     */
     196    rc = KDBG_ERR_UNKOWN_FORMAT;
     197    for (KSIZE i = 0; i < K_ELEMENTS(g_aBuiltIns); i++)
     198        if (g_aBuiltIns[i]->pfnOpen)
     199        {
     200            int rc2 = g_aBuiltIns[i]->pfnOpen(ppDbgMod, pRdr, fCloseRdr, off, cb, pLdrMod);
     201            if (!rc)
     202                return 0;
     203            if (rc2 != KDBG_ERR_UNKOWN_FORMAT && rc == KDBG_ERR_UNKOWN_FORMAT)
     204                rc = rc2;
     205        }
     206
     207    for (PKDBGMODOPS pCur = g_pHead; pCur; pCur = pCur->pNext)
     208        if (g_aBuiltIns[i]->pfnOpen)
     209        {
     210            int rc2 = g_aBuiltIns[i]->pfnOpen(ppDbgMod, pRdr, fCloseRdr, off, cb, pLdrMod);
     211            if (!rc)
     212                return 0;
     213            if (rc2 != KDBG_ERR_UNKOWN_FORMAT && rc == KDBG_ERR_UNKOWN_FORMAT)
     214                rc = rc2;
     215        }
     216
     217    if (pRdrWrapped)
     218        kRdrClose(pRdrWrapped);
     219    else if (fCloseRdr)
     220        kRdrClose(pRdr);
     221    return rc;
     222}
     223
     224
    155225/**
    156226 * Opens a debug module reader for the specified file or file section
     
    158228 * @returns kStuff status code.
    159229 * @param   ppDbgMod            Where to store the debug module reader handle.
    160  * @param   pFile               The file reader.
     230 * @param   pRdr                The file reader.
    161231 * @param   off                 The offset of the file section. If the entire file, pass 0.
    162232 * @param   cb                  The size of the file section. If the entire file, pass KFOFF_MAX.
     
    167237 *                              This is an optional parameter, pass NULL if no kLdr module at hand.
    168238 */
    169 KDBG_DECL(int) kDbgModuleOpenFilePart(PKDBGMOD *ppDbgMod, PKDBGHLPFILE pFile, KFOFF off, KFOFF cb, struct KLDRMOD *pLdrMod)
     239KDBG_DECL(int) kDbgModuleOpenFilePart(PPKDBGMOD ppDbgMod, PKRDR pRdr, KFOFF off, KFOFF cb, struct KLDRMOD *pLdrMod)
    170240{
    171241    /*
     
    173243     */
    174244    kDbgAssertPtrReturn(ppDbgMod, KERR_INVALID_POINTER);
    175     kDbgAssertPtrReturn(pFile, KERR_INVALID_POINTER);
     245    kDbgAssertPtrReturn(pRdr, KERR_INVALID_POINTER);
    176246    kDbgAssertPtrNullReturn(pLdrMod, KERR_INVALID_POINTER);
    177247    kDbgAssertMsgReturn(off >= 0 && off < KFOFF_MAX, (KFOFF_PRI "\n", off), KERR_INVALID_OFFSET);
     
    181251
    182252    /*
    183      * Walk the built-in table and the list of registered readers
    184      * and let each of them have a go at the file. Stop and return
    185      * on the first one returning successfully.
    186      */
    187     int rc = KDBG_ERR_UNKOWN_FORMAT;
    188     for (KSIZE i = 0; i < K_ELEMENTS(g_aBuiltIns); i++)
    189         if (g_aBuiltIns[i]->pfnOpen)
    190         {
    191             int rc2 = g_aBuiltIns[i]->pfnOpen(ppDbgMod, pFile, off, cb, pLdrMod);
    192             if (!rc)
    193                 return 0;
    194             if (rc2 != KDBG_ERR_UNKOWN_FORMAT && rc == KDBG_ERR_UNKOWN_FORMAT)
    195                 rc = rc2;
    196         }
    197 
    198     for (PKDBGMODOPS pCur = g_pHead; pCur; pCur = pCur->pNext)
    199         if (g_aBuiltIns[i]->pfnOpen)
    200         {
    201             int rc2 = g_aBuiltIns[i]->pfnOpen(ppDbgMod, pFile, off, cb, pLdrMod);
    202             if (!rc)
    203                 return 0;
    204             if (rc2 != KDBG_ERR_UNKOWN_FORMAT && rc == KDBG_ERR_UNKOWN_FORMAT)
    205                 rc = rc2;
    206         }
    207     return rc;
     253     * Hand it over to the internal worker.
     254     */
     255    return kdbgModuleOpenWorker(ppDbgMod, pRdr, K_FALSE /* fCloseRdr */, off, cb, pLdrMod);
    208256}
    209257
     
    214262 * @returns kStuff status code.
    215263 * @param   ppDbgMod            Where to store the debug module reader handle.
    216  * @param   pFile               The file reader.
     264 * @param   pRdr                The file reader.
    217265 * @param   pLdrMod             Associated kLdr module that the kDbg component can use to
    218266 *                              verify and suplement the debug info found in the file specified
     
    221269 *                              This is an optional parameter, pass NULL if no kLdr module at hand.
    222270 */
    223 KDBG_DECL(int) kDbgModuleOpenFile(PKDBGMOD *ppDbgMod, PKDBGHLPFILE pFile, struct KLDRMOD *pLdrMod)
    224 {
    225     return kDbgModuleOpenFilePart(ppDbgMod, pFile, 0, KFOFF_MAX, pLdrMod);
     271KDBG_DECL(int) kDbgModuleOpenFile(PPKDBGMOD ppDbgMod, PKRDR pRdr, struct KLDRMOD *pLdrMod)
     272{
     273    return kDbgModuleOpenFilePart(ppDbgMod, pRdr, 0, KFOFF_MAX, pLdrMod);
    226274}
    227275
     
    240288 *                              This is an optional parameter, pass NULL if no kLdr module at hand.
    241289 */
    242 KDBG_DECL(int) kDbgModuleOpen(PKDBGMOD *ppDbgMod, const char *pszFilename, struct KLDRMOD *pLdrMod)
     290KDBG_DECL(int) kDbgModuleOpen(PPKDBGMOD ppDbgMod, const char *pszFilename, struct KLDRMOD *pLdrMod)
    243291{
    244292    /*
     
    254302     * Open the file and see if we can read it.
    255303     */
    256     PKDBGHLPFILE pFile;
    257     int rc = kDbgHlpOpenRO(pszFilename, &pFile);
     304    PKRDR pRdr;
     305    int rc = kRdrBufOpen(&pRdr, pszFilename);
    258306    if (rc)
    259307        return rc;
    260     rc = kDbgModuleOpenFilePart(ppDbgMod, pFile, 0, KFOFF_MAX, pLdrMod);
    261     if (rc)
    262         kDbgHlpClose(pFile);
     308    rc = kdbgModuleOpenWorker(ppDbgMod, pRdr, K_TRUE /* fCloseRdr */, 0, KFOFF_MAX, pLdrMod);
    263309    return rc;
    264 }
    265 
    266 
    267 /**
    268  * Validates a debug module handle.
    269  * All necessary asserting will be taken care of here.
    270  *
    271  * @returns True / false.
    272  * @param   pMod        The debug module handle.
    273  */
    274 KDBG_INLINE(bool) kdbgModIsValid(PKDBGMOD pMod)
    275 {
    276     kDbgAssertPtrReturn(pMod, false);
    277     kDbgAssertMsgReturn(pMod->u32Magic == KDBGMOD_MAGIC, ("%#x", pMod->u32Magic), false);
    278     kDbgAssertPtrReturn(pMod->pOps, false);
    279     return true;
    280310}
    281311
     
    289319KDBG_DECL(int) kDbgModuleClose(PKDBGMOD pMod)
    290320{
    291     if (!kdbgModIsValid(pMod))
    292         return KERR_INVALID_PARAMETER;
    293 
     321    KDBGMOD_VALIDATE(pMod);
    294322    int rc = pMod->pOps->pfnClose(pMod);
    295323    if (!rc)
    296         kDbgHlpFree(pMod);
     324    {
     325        pMod->u32Magic++;
     326        kHlpFree(pMod);
     327    }
    297328    return rc;
    298329}
     
    314345KDBG_DECL(int) kDbgModuleQuerySymbol(PKDBGMOD pMod, int32_t iSegment, KDBGADDR off, PKDBGSYMBOL pSym)
    315346{
    316     if (!kdbgModIsValid(pMod))
    317         return KERR_INVALID_PARAMETER;
     347    KDBGMOD_VALIDATE(pMod);
    318348    kDbgAssertPtrReturn(pSym, KERR_INVALID_POINTER);
    319 
    320349    return pMod->pOps->pfnQuerySymbol(pMod, iSegment, off, pSym);
    321350}
     
    369398KDBG_DECL(int) kDbgModuleQueryLine(PKDBGMOD pMod, int32_t iSegment, KDBGADDR off, PKDBGLINE pLine)
    370399{
    371     if (!kdbgModIsValid(pMod))
    372         return KERR_INVALID_PARAMETER;
     400    KDBGMOD_VALIDATE(pMod);
    373401    kDbgAssertPtrReturn(pLine, KERR_INVALID_POINTER);
    374 
    375402    return pMod->pOps->pfnQueryLine(pMod, iSegment, off, pLine);
    376403}
  • trunk/kStuff/kDbg/kDbgSymbol.cpp

    r3541 r3550  
    77 * Copyright (c) 2006-2007 knut st. osmundsen <bird-src-spam@anduin.net>
    88 *
    9  * This file is part of kLIBC.
     9 * This file is part of kStuff.
    1010 *
    11  * kLIBC is free software; you can redistribute it and/or modify
    12  * it under the terms of the GNU General Public License as published by
    13  * the Free Software Foundation; either version 2 of the License, or
    14  * (at your option) any later version.
     11 * kStuff is free software; you can redistribute it and/or
     12 * modify it under the terms of the GNU Lesser General Public
     13 * License as published by the Free Software Foundation; either
     14 * version 2.1 of the License, or (at your option) any later version.
    1515 *
    16  * kLIBC is distributed in the hope that it will be useful,
     16 * kStuff is distributed in the hope that it will be useful,
    1717 * but WITHOUT ANY WARRANTY; without even the implied warranty of
    18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    19  * GNU General Public License for more details.
     18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     19 * Lesser General Public License for more details.
    2020 *
    21  * You should have received a copy of the GNU General Public License
    22  * along with kLIBC; if not, write to the Free Software
    23  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
     21 * You should have received a copy of the GNU Lesser General Public
     22 * License along with kStuff; if not, write to the Free Software
     23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
    2424 *
    2525 */
    26 
    2726
    2827/*******************************************************************************
    2928*   Header Files                                                               *
    3029*******************************************************************************/
    31 #include "kDbg.h"
    3230#include "kDbgInternal.h"
     31#include <k/kHlpAlloc.h>
    3332
    3433
     
    4746{
    4847    kDbgAssertPtrReturn(pSymbol, NULL);
    49     size_t cb = KDBG_OFFSETOF(KDBGSYMBOL, szName[pSymbol->cchName + 1]);
    50     return (PKDBGSYMBOL)kDbgHlpAllocDup(pSymbol, cb);
     48    KSIZE cb = K_OFFSETOF(KDBGSYMBOL, szName[pSymbol->cchName + 1]);
     49    PKDBGSYMBOL pNewSymbol = (PKDBGSYMBOL)kHlpDup(pSymbol, cb);
     50    if (pNewSymbol)
     51        pNewSymbol->cbSelf = cb;
     52    return pNewSymbol;
    5153}
    5254
    5355
    5456/**
    55  * Frees a symbol obtained from the RTDbg API.
     57 * Frees a symbol obtained from the kDbg API.
    5658 *
    5759 * @returns 0 on success.
    58  * @returns KERR_INVALID_POINTER if a NULL pointer or an !KDBG_VALID_PTR() is passed in.
     60 * @returns KERR_INVALID_POINTER if pSymbol isn't a valid pointer.
    5961 *
    60  * @param   pSymbol     The symbol to be freed.
     62 * @param   pSymbol     The symbol to be freed. The null pointer is ignored.
    6163 */
    6264KDBG_DECL(int) kDbgSymbolFree(PKDBGSYMBOL pSymbol)
    6365{
    6466    if (!pSymbol)
    65         return KERR_INVALID_POINTER;
    66     kDbgAssertPtrReturn(pSymbol, KERR_INVALID_POINTER);
    67 
    68     kDbgHlpFree(pSymbol);
     67    {
     68        kDbgAssertPtrReturn(pSymbol, KERR_INVALID_POINTER);
     69        pSymbol->cbSelf = 0;
     70        kHlpFree(pSymbol);
     71    }
    6972    return 0;
    7073}
Note: See TracChangeset for help on using the changeset viewer.