Changeset 3550
- Timestamp:
- Aug 26, 2007, 3:13:35 AM (18 years ago)
- Location:
- trunk/kStuff
- Files:
-
- 2 added
- 19 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kStuff/include/k/kDbg.h
r3541 r3550 23 23 */ 24 24 25 #ifndef ___kDbg_h___ 26 #define ___kDbg_h___ 27 28 #include "kDbgBase.h" 25 #ifndef ___k_kDbg_h___ 26 #define ___k_kDbg_h___ 27 28 #include <k/kDefs.h> 29 #include <k/kTypes.h> 30 #include <k/kRdr.h> 29 31 30 32 #ifdef __cplusplus … … 36 38 */ 37 39 38 /** The max filename path length used by the debug reader. */ 39 #define KDBG_PATH_MAX 260 40 41 /** The max symbol name length used by the debug reader. */ 42 #define KDBG_SYMBOL_MAX 384 40 /** @def KDBG_DECL 41 * Declares a kDbg function according to build context. 42 * @param type The return type. 43 */ 44 #if defined(KDBG_BUILDING_DYNAMIC) 45 # define KDBG_DECL(type) K_DECL_EXPORT(type) 46 #elif defined(KDBG_BUILT_DYNAMIC) 47 # define KDBG_DECL(type) K_DECL_IMPORT(type) 48 #else 49 # define KDBG_DECL(type) type 50 #endif 51 52 53 /** The kDbg address type. */ 54 typedef KU64 KDBGADDR; 55 /** Pointer to a kDbg address. */ 56 typedef KDBGADDR *PKDBGADDR; 57 /** Pointer to a const kDbg address. */ 58 typedef const KDBGADDR *PCKDBGADDR; 59 /** @def KDBGADDR_PRI 60 * printf format type. */ 61 #define KDBGADDR_PRI KX64_PRI 62 /** @def KDBGADDR_MAX 63 * Max kDbg address value. */ 64 #define KDBGADDR_MAX KU64_C(0xfffffffffffffffe) 65 /** @def KDBGADDR_C 66 * kDbg address constant. 67 * @param c The constant value. */ 68 #define KDBGADDR_C(c) KU64_C(c) 69 /** NIL address. */ 70 #define NIL_KDBGADDR KU64_MAX 71 43 72 44 73 /** @name Special Segments … … 47 76 * The specified offset is relative to the image base. The image base is the lowest memory 48 77 * address used by the image when loaded with the address assignments indicated in the image. */ 49 #define KDBGSEG_RVA (-1)78 #define KDBGSEG_RVA (-1) 50 79 /** Absolute segment. The offset isn't relative to anything. */ 51 #define KDBGSEG_ABS (-2)80 #define KDBGSEG_ABS (-2) 52 81 /** @} */ 53 82 83 84 /** The max filename path length used by the debug reader. */ 85 #define KDBG_PATH_MAX 260 54 86 55 87 /** … … 63 95 KDBGADDR offSegment; 64 96 /** The segment number. */ 65 int32_tiSegment;97 KI32 iSegment; 66 98 /** The Line number. */ 67 uint32_t iLine; 99 KU32 iLine; 100 /** The actual size of this structure. */ 101 KU16 cbSelf; 68 102 /** The length of the filename. */ 69 uint16_tcchFile;103 KU16 cchFile; 70 104 /** The name of the file this line number relates to. */ 71 105 char szFile[KDBG_PATH_MAX]; … … 105 139 * @{ */ 106 140 /** The symbol is weak. */ 107 #define KDBGSYM_FLAGS_WEAK UINT32_C(0x00000000)141 #define KDBGSYM_FLAGS_WEAK KU32_C(0x00000000) 108 142 /** The symbol is absolute. 109 143 * (This also indicated by the segment number.) */ 110 #define KDBGSYM_FLAGS_ABS UINT32_C(0x00000001)144 #define KDBGSYM_FLAGS_ABS KU32_C(0x00000001) 111 145 /** The symbol is exported. */ 112 #define KDBGSYM_FLAGS_EXPORTED UINT32_C(0x00000002)146 #define KDBGSYM_FLAGS_EXPORTED KU32_C(0x00000002) 113 147 /** The symbol is a function/method/procedure/whatever-executable-code. */ 114 #define KDBGSYM_FLAGS_CODE UINT32_C(0x00000004)148 #define KDBGSYM_FLAGS_CODE KU32_C(0x00000004) 115 149 /** The symbol is some kind of data. */ 116 #define KDBGSYM_FLAGS_DATA UINT32_C(0x00000008)150 #define KDBGSYM_FLAGS_DATA KU32_C(0x00000008) 117 151 /** @} */ 152 153 /** The max symbol name length used by the debug reader. */ 154 #define KDBG_SYMBOL_MAX 384 118 155 119 156 /** … … 130 167 KDBGADDR offSegment; 131 168 /** The segment number. */ 132 int32_tiSegment;169 KI32 iSegment; 133 170 /** The symbol flags. */ 134 uint32_tfFlags;171 KU32 fFlags; 135 172 /** @todo type info? */ 173 /** The actual size of this structure. */ 174 KU16 cbSelf; 136 175 /** The length of the symbol name. */ 137 uint16_tcchName;176 KU16 cchName; 138 177 /** The symbol name. */ 139 178 char szName[KDBG_SYMBOL_MAX]; … … 170 209 171 210 172 /** Pointer to a kDbgHlp file structure (abstract). */ 173 typedef struct KDBGHLPFILE *PKDBGHLPFILE; 174 175 /** A debug module handle. */ 211 /** Pointer to a debug module. */ 176 212 typedef struct KDBGMOD *PKDBGMOD; 177 178 /** 179 * The debug module method table. 180 */ 181 typedef struct KDBGMODOPS 182 { 183 /** The name of the reader. */ 184 const char *pszName; 185 186 /** Pointer to the next debug module readers. 187 * This is only used for dynamically registered readers. */ 188 struct KDBGMODOPS *pNext; 189 190 /** 191 * Tries to open the module. 192 * 193 * @returns 0 on success, KDBG_ERR on failure. 194 * @param pFile The file 195 * @param ppMod Where to store the module that's been opened. 196 * @param off The file offset of the debug info. This is 0 if there isn't 197 * any specfic debug info section and the reader should start 198 * looking for debug info at the start of the file. 199 * @param cb The size of the debug info in the file. INT64_MAX if we don't 200 * know or there isn't any particular debug info section in the file. 201 * @param pLdrMod The associated loader module. This can be NULL. 202 * 203 * @remark This is NULL for the builtin readers. 204 */ 205 int (*pfnOpen)(PKDBGMOD *ppMod, PKDBGHLPFILE pFile, KFOFF off, KFOFF cb, struct KLDRMOD *pLdrMod); 206 207 /** 208 * Closes the module. 209 * 210 * This should free all resources associated with the module 211 * except the pMod which is freed by the caller. 212 * 213 * @returns IPRT status code. 214 * @param pMod The module. 215 */ 216 int (*pfnClose)(PKDBGMOD pMod); 217 218 /** 219 * Gets a symbol by segment:offset. 220 * This will be approximated to the nearest symbol if there is no exact match. 221 * 222 * @returns 0 on success. KLDR_ERR_* on failure. 223 * @param pMod The module. 224 * @param iSegment The segment this offset is relative to. 225 * The -1 segment is special, it means that the addres is relative to 226 * the image base. The image base is where the first bit of the image 227 * is mapped during load. 228 * @param off The offset into the segment. 229 * @param pSym Where to store the symbol details. 230 */ 231 int (*pfnQuerySymbol)(PKDBGMOD pMod, KI32 iSegment, KDBGADDR off, PKDBGSYMBOL pSym); 232 233 /** 234 * Gets a line number entry by segment:offset. 235 * This will be approximated to the nearest line number there is no exact match. 236 * 237 * @returns 0 on success. KLDR_ERR_* on failure. 238 * @param pMod The module. 239 * @param iSegment The segment this offset is relative to. 240 * The -1 segment is special, it means that the addres is relative to 241 * the image base. The image base is where the first bit of the image 242 * is mapped during load. 243 * @param off The offset into the segment. 244 * @param pLine Where to store the line number details. 245 */ 246 int (*pfnQueryLine)(PKDBGMOD pMod, KI32 iSegment, KDBGADDR uOffset, PKDBGLINE pLine); 247 248 /** This is just to make sure you've initialized all the fields. 249 * Must be identical to pszName. */ 250 const char *pszName2; 251 } KDBGMODOPS; 252 /** Pointer to a module method table. */ 253 typedef KDBGMODOPS *PKDBGMODOPS; 254 /** Pointer to a const module method table. */ 255 typedef const KDBGMODOPS *PCKDBGMODOPS; 256 257 /** 258 * Register a debug module reader with the kDbgModule component. 259 * 260 * Dynamically registered readers are kept in FIFO order, and external 261 * readers will be tried after the builtin ones. 262 * 263 * @returns 0 on success. 264 * @returns KERR_INVALID_POINTER if pOps is missing bits. 265 * @returns KERR_INVALID_PARAMETER if pOps is already in the list. 266 * @param pOps The reader method table, kDbg takes owner ship of 267 * this. This must be writeable as the pNext pointer 268 * will be update. It must also stick around for as 269 * long as kDbg is in use. 270 */ 271 KDBG_DECL(int) kDbgModuleRegisterReader(PKDBGMODOPS pOps) 272 ; 273 274 275 276 /** 277 * Internal representation of a debug module. 278 */ 279 typedef struct KDBGMOD 280 { 281 /** Magic value (KDBGMOD_MAGIC). */ 282 KI32 u32Magic; 283 /** The handle to the module. (If closed, this is NIL_RTFILE.) */ 284 PKDBGHLPFILE pFile; 285 /** Pointer to the method table. */ 286 PCKDBGMODOPS pOps; 287 } KDBGMOD; 288 289 290 /** The magic value for the debug module structure. (Some dead english writer) */ 291 #define KDBGMOD_MAGIC 0x19200501 292 /** The magic value of a dead module structure. */ 293 #define KDBGMOD_MAGIC_DEAD 0x19991231 294 295 296 /** 297 * Opens the debug info for a specified executable module. 298 * 299 * @returns IPRT status code. 300 * @param pszModulePath The path to the executable module. 301 * @param ppDbgMod Where to store the debug module handle. 302 */ 303 KDBG_DECL(int) kDbgModuleOpen(const char *pszModulePath, PKDBGMOD *ppDbgMod); 304 305 /** 306 * Closes the module. 307 * 308 * @returns IPRT status code. 309 * @param pMod The module handle. 310 */ 213 /** Pointer to a debug module pointer. */ 214 typedef PKDBGMOD *PPKDBGMOD; 215 216 217 KDBG_DECL(int) kDbgModuleOpen(PPKDBGMOD ppDbgMod, const char *pszFilename, struct KLDRMOD *pLdrMod); 218 KDBG_DECL(int) kDbgModuleOpenFile(PPKDBGMOD ppDbgMod, PKRDR pRdr, struct KLDRMOD *pLdrMod); 219 KDBG_DECL(int) kDbgModuleOpenFilePart(PPKDBGMOD ppDbgMod, PKRDR pRdr, KFOFF off, KFOFF cb, struct KLDRMOD *pLdrMod); 311 220 KDBG_DECL(int) kDbgModuleClose(PKDBGMOD pMod); 312 313 /**314 * Gets a symbol by segment:offset.315 * This will be approximated to the nearest symbol if there is no exact match.316 *317 * @returns IPRT status code.318 * @param pMod The module.319 * @param iSegment The segment this offset is relative to.320 * The -1 segment is special, it means that the addres is relative to321 * the image base. The image base is where the first bit of the image322 * is mapped during load.323 * @param off The offset into the segment.324 * @param pSym Where to store the symbol details.325 */326 221 KDBG_DECL(int) kDbgModuleQuerySymbol(PKDBGMOD pMod, KI32 iSegment, KDBGADDR off, PKDBGSYMBOL pSym); 327 328 /**329 * Gets & allocates a symbol by segment:offset.330 * This will be approximated to the nearest symbol if there is no exact match.331 *332 * @returns IPRT status code.333 * @param pMod The module.334 * @param iSegment The segment this offset is relative to.335 * The -1 segment is special, it means that the addres is relative to336 * the image base. The image base is where the first bit of the image337 * is mapped during load.338 * @param off The offset into the segment.339 * @param ppSym Where to store the pointer to the symbol info.340 * Free the returned symbol using kDbgSymbolFree().341 */342 222 KDBG_DECL(int) kDbgModuleQuerySymbolA(PKDBGMOD pMod, KI32 iSegment, KDBGADDR off, PPKDBGSYMBOL ppSym); 343 344 /**345 * Gets a line number entry by segment:offset.346 * This will be approximated to the nearest line number there is no exact match.347 *348 * @returns IPRT status code.349 * @param pMod The module.350 * @param iSegment The segment this offset is relative to.351 * The -1 segment is special, it means that the addres is relative to352 * the image base. The image base is where the first bit of the image353 * is mapped during load.354 * @param off The offset into the segment.355 * @param pLine Where to store the line number details.356 */357 223 KDBG_DECL(int) kDbgModuleQueryLine(PKDBGMOD pMod, KI32 iSegment, KDBGADDR off, PKDBGLINE pLine); 358 359 /**360 * Gets & allocates a line number entry by segment:offset.361 * This will be approximated to the nearest line number there is no exact match.362 *363 * @returns IPRT status code.364 * @param pMod The module.365 * @param iSegment The segment this offset is relative to.366 * The -1 segment is special, it means that the addres is relative to367 * the image base. The image base is where the first bit of the image368 * is mapped during load.369 * @param off The offset into the segment.370 * @param ppLine Where to store the pointer to the line number info.371 * Free the returned line number using kDbgLineFree().372 */373 224 KDBG_DECL(int) kDbgModuleQueryLineA(PKDBGMOD pMod, KI32 iSegment, KDBGADDR off, PPKDBGLINE ppLine); 374 225 -
trunk/kStuff/include/k/kDefs.h
r3545 r3550 450 450 /** @} */ 451 451 452 /** @} */ 453 454 #endif 455 452 /** @def NULL 453 * The nil pointer value. */ 454 #ifndef NULL 455 # ifdef __cplusplus 456 # define NULL 0 457 # else 458 # define NULL ((void *)0) 459 # endif 460 #endif 461 462 /** @} */ 463 464 #endif 465 -
trunk/kStuff/include/k/kErrors.h
r3548 r3550 87 87 /** The (module) format isn't supported by this kDbg build. */ 88 88 #define KDBG_ERR_FORMAT_NOT_SUPPORTED (KDBG_ERR_BASE + 1) 89 /** The (module) format isn't supported by this kDbg build. */ 90 #define KDBG_ERR_BAD_EXE_FORMAT (KDBG_ERR_BASE + 2) 89 91 /** A specified address or an address found in the debug info is invalid. */ 90 #define KDBG_ERR_INVALID_ADDRESS (KDBG_ERR_BASE + 2)92 #define KDBG_ERR_INVALID_ADDRESS (KDBG_ERR_BASE + 3) 91 93 /** The dbghelp.dll is too old or something like that. */ 92 #define KDBG_ERR_DBGHLP_VERSION_MISMATCH (KDBG_ERR_BASE + 3)94 #define KDBG_ERR_DBGHLP_VERSION_MISMATCH (KDBG_ERR_BASE + 4) 93 95 /** @} */ 94 96 … … 96 98 * @{ */ 97 99 /** the base of the kRdr specific status codes. */ 98 #define KRDR_ERR_BASE (KDBG_ERR_BASE + 4)100 #define KRDR_ERR_BASE (KDBG_ERR_BASE + 5) 99 101 /** The file reader can't take more concurrent mappings. */ 100 102 #define KRDR_ERR_TOO_MANY_MAPPINGS (KRDR_ERR_BASE + 0) -
trunk/kStuff/include/k/kHlpAlloc.h
r3545 r3550 52 52 void * kHlpAlloc(KSIZE cb); 53 53 void * kHlpAllocZ(KSIZE cb); 54 void * kHlpDup( void *pv, KSIZE cb);55 void *kHlpStrDup(const char *psz);54 void * kHlpDup(const void *pv, KSIZE cb); 55 const char *kHlpStrDup(const char *psz); 56 56 void * kHlpRealloc(void *pv, KSIZE cb); 57 57 void kHlpFree(void *pv); -
trunk/kStuff/include/k/kHlpAssert.h
r3543 r3550 73 73 } while (0) 74 74 75 # define kHlpAssertReturnVoid(expr) \ 76 do { \ 77 if (!(expr)) \ 78 { \ 79 kHlpAssertMsg1(#expr, __FILE__, __LINE__, __FUNCTION__); \ 80 kHlpAssertBreakpoint(); \ 81 return; \ 82 } 83 } while (0) 84 75 85 # define kHlpAssertMsg(expr, msg) \ 76 86 do { \ … … 94 104 } while (0) 95 105 106 # define kHlpAssertMsgReturnVoid(expr, msg) \ 107 do { \ 108 if (!(expr)) \ 109 { \ 110 kHlpAssertMsg1(#expr, __FILE__, __LINE__, __FUNCTION__); \ 111 kHlpAssertMsg2 msg; \ 112 kHlpAssertBreakpoint(); \ 113 return; \ 114 } 115 } while (0) 116 96 117 #else /* !K_STRICT */ 97 118 # define kHlpAssert(expr) do { } while (0) 98 119 # define kHlpAssertReturn(expr, rcRet) do { if (!(expr)) return (rcRet); } while (0) 120 # define kHlpAssertReturnVoid(expr) do { if (!(expr)) return; } while (0) 99 121 # define kHlpAssertMsg(expr, msg) do { } while (0) 100 122 # define kHlpAssertMsgReturn(expr, msg, rcRet) do { if (!(expr)) return (rcRet); } while (0) 123 # define kHlpAssertMsgReturnVoid(expr, msg) do { if (!(expr)) return; } while (0) 101 124 #endif /* !K_STRICT */ 102 125 103 126 #define kHlpAssertPtr(ptr) kHlpAssertMsg(K_VALID_PTR(ptr), ("%s = %p\n", #ptr, (ptr))) 104 127 #define kHlpAssertPtrReturn(ptr, rcRet) kHlpAssertMsgReturn(K_VALID_PTR(ptr), ("%s = %p -> %d\n", #ptr, (ptr), (rcRet)), (rcRet)) 128 #define kHlpAssertPtrReturnVoid(ptr) kHlpAssertMsgReturnVoid(K_VALID_PTR(ptr), ("%s = %p -> %d\n", #ptr, (ptr), (rcRet))) 105 129 #define kHlpAssertPtrNull(ptr) kHlpAssertMsg(!(ptr) || K_VALID_PTR(ptr), ("%s = %p\n", #ptr, (ptr))) 106 130 #define kHlpAssertPtrNullReturn(ptr, rcRet) kHlpAssertMsgReturn(!(ptr) || K_VALID_PTR(ptr), ("%s = %p -> %d\n", #ptr, (ptr), (rcRet)), (rcRet)) 131 #define kHlpAssertPtrNullReturnVoid(ptr) kHlpAssertMsgReturnVoid(!(ptr) || K_VALID_PTR(ptr), ("%s = %p -> %d\n", #ptr, (ptr), (rcRet))) 107 132 #define kHlpAssertRC(rc) kHlpAssertMsg((rc) == 0, ("%s = %d\n", #rc, (rc))) 108 133 #define kHlpAssertRCReturn(rc, rcRet) kHlpAssertMsgReturn((rc) == 0, ("%s = %d -> %d\n", #rc, (rc), (rcRet)), (rcRet)) 134 #define kHlpAssertRCReturnVoid(rc) kHlpAssertMsgReturnVoid((rc) == 0, ("%s = %d -> %d\n", #rc, (rc), (rcRet))) 109 135 #define kHlpAssertFailed() kHlpAssert(0) 110 136 #define kHlpAssertFailedReturn(rcRet) kHlpAssertReturn(0, (rcRet)) 137 #define kHlpAssertFailedReturnVoid() kHlpAssertReturnVoid(0) 111 138 #define kHlpAssertMsgFailed(msg) kHlpAssertMsg(0, msg) 112 139 #define kHlpAssertMsgFailedReturn(msg, rcRet) kHlpAssertMsgReturn(0, msg, (rcRet)) 140 #define kHlpAssertMsgFailedReturnVoid(msg) kHlpAssertMsgReturnVoid(0, msg)) 113 141 114 142 /** -
trunk/kStuff/include/k/kHlpString.h
r3546 r3550 85 85 int kHlpMemIComp(const void *pv1, const void *pv2, KSIZE cb); 86 86 87 #ifndef kHlpStrCat 88 char *kHlpStrCat(char *psz1, const char *psz2); 89 #endif 90 #ifndef kHlpStrNCat 91 char *kHlpStrNCat(char *psz1, const char *psz2, KSIZE cb); 92 #endif 87 93 #ifndef kHlpStrChr 88 94 char *kHlpStrChr(const char *psz, int ch); 95 #endif 96 #ifndef kHlpStrRChr 97 char *kHlpStrRChr(const char *psz, int ch); 89 98 #endif 90 99 #ifndef kHlpStrComp … … 93 102 #ifndef kHlpStrNComp 94 103 int kHlpStrNComp(const char *psz1, const char *psz2, KSIZE cch); 104 #endif 105 #ifndef kHlpStrCopy 106 char *kHlpStrCopy(char *psz1, const char *psz2); 107 #endif 108 #ifndef kHlpStrNCopy 109 char *kHlpStrNCopy(char *psz1, const char *psz2, KSIZE cb); 95 110 #endif 96 111 #ifndef kHlpStrLen -
trunk/kStuff/include/k/kMagics.h
r3543 r3550 30 30 31 31 /** The magic for KRDR::u32Magic. (Katsu Aki (Katsuaki Nakamura)) 32 * @ingroup grp_kRdrAll */ 33 #define KRDR_MAGIC 0x19610919 34 /** The magic value for the debug module structure. (Some manga artist) 32 35 * @ingroup grp_kDbgAll */ 33 #define KRDR_MAGIC 0x19610919 34 36 #define KDBGMOD_MAGIC 0x19200501 35 37 36 38 #endif -
trunk/kStuff/include/k/kRdr.h
r3548 r3550 65 65 KRDR_DECL(KIPTR) kRdrNativeFH( PKRDR pRdr); 66 66 KRDR_DECL(KSIZE) kRdrPageSize( PKRDR pRdr); 67 #if ndef ___k_kLdr___67 #ifdef ___k_kLdr___ 68 68 KRDR_DECL(int) kRdrMap( PKRDR pRdr, void **ppvBase, KU32 cSegments, PCKLDRSEG paSegments, KBOOL fFixed); 69 69 KRDR_DECL(int) kRdrRefresh( PKRDR pRdr, void *pvBase, KU32 cSegments, PCKLDRSEG paSegments); … … 71 71 KRDR_DECL(int) kRdrUnmap( PKRDR pRdr, void *pvBase, KU32 cSegments, PCKLDRSEG paSegments); 72 72 #endif /* !___k_kLdr___ */ 73 KRDR_DECL(void) kRdrDone( PKRDR pRdr);73 KRDR_DECL(void) kRdrDone( PKRDR pRdr); 74 74 75 75 KRDR_DECL(int) kRdrBufOpen(PPKRDR ppRdr, const char *pszFilename); 76 KRDR_DECL(int) kRdrBufWrap(PPKRDR ppRdr, PKRDR pRdr); 77 KRDR_DECL(int) kRdrBufLine( PKRDR pRdr, char *pszLine, KSIZE cbLine); 76 KRDR_DECL(int) kRdrBufWrap(PPKRDR ppRdr, PKRDR pRdr, KBOOL fCloseIt); 77 KRDR_DECL(KBOOL) kRdrBufIsBuffered(PKRDR pRdr); 78 KRDR_DECL(int) kRdrBufLine(PKRDR pRdr, char *pszLine, KSIZE cbLine); 78 79 KRDR_DECL(int) kRdrBufLineEx(PKRDR pRdr, char *pszLine, KSIZE *pcbLine); 79 80 KRDR_DECL(const char *) kRdrBufLineQ(PKRDR pRdr); -
trunk/kStuff/include/k/kRdrAll.h
r3546 r3550 1 1 /* $Id$ */ 2 2 /** @file 3 * kRdr - The File Provider, All De pendencies Included.3 * kRdr - The File Provider, All Details and Dependencies Included. 4 4 */ 5 5 … … 25 25 */ 26 26 27 #ifndef ___k RdrAll_h___28 #define ___k RdrAll_h___27 #ifndef ___k_kRdrAll_h___ 28 #define ___k_kRdrAll_h___ 29 29 30 30 #include <k/kDefs.h> -
trunk/kStuff/include/k/kTypes.h
r3545 r3550 166 166 typedef signed char KI8; 167 167 typedef unsigned char KU8; 168 #define KI64_C(c) (c ## ULL)169 #define KU64_C(c) (c ## LL)168 #define KI64_C(c) (c ## LL) 169 #define KU64_C(c) (c ## ULL) 170 170 #define KI32_C(c) (c) 171 171 #define KU32_C(c) (c) … … 224 224 # define KX64_PRI "llx" 225 225 # endif 226 # define KI64_C(c) (c ## ULL)227 # define KU64_C(c) (c ## LL)226 # define KI64_C(c) (c ## LL) 227 # define KU64_C(c) (c ## ULL) 228 228 # else 229 229 typedef signed long int KI64; 230 230 typedef unsigned long int KU64; 231 # define KI64_C(c) (c ## UL)232 # define KU64_C(c) (c ## L)231 # define KI64_C(c) (c ## L) 232 # define KU64_C(c) (c ## UL) 233 233 # define KI64_PRI "ld" 234 234 # define KU64_PRI "lu" -
trunk/kStuff/kDbg/Makefile.kmk
r3537 r3550 31 31 # kDbg - The profiler module. 32 32 # 33 DLLS += kDbg 33 #DLLS += kDbg - disabled for now. 34 34 kDbg_TEMPLATE = kStuffDLL 35 35 kDbg_DEFS = KDBG_BUILDING KDBG_RESIDES_IN_DLL … … 37 37 kDbg_SOURCES := \ 38 38 kDbgModule.cpp \ 39 kDbgModPE.cpp \40 \41 39 kDbgLine.cpp \ 42 \ 43 kDbgSymbol.cpp \ 44 \ 45 kDbgHlpCrt.cpp 40 kDbgSymbol.cpp 46 41 47 42 kDbg_SOURCES += \ … … 66 61 kDbgDump_LIBS = \ 67 62 $(TARGET_kDbgStatic) \ 68 $(TARGET_kDbgStatic:kDbgStatic=kLdrStatic) 63 $(subst kDbg,kLdr,$(TARGET_kDbgStatic)) \ 64 $(subst kDbg,kRdr,$(TARGET_kDbgStatic)) 69 65 70 66 # Generate the rules -
trunk/kStuff/kDbg/kDbgDump.cpp
r3537 r3550 28 28 * Header Files * 29 29 *******************************************************************************/ 30 #include "kDbg.h"30 #include <k/kDbg.h> 31 31 #include <string.h> 32 32 #include <stdio.h> … … 53 53 { 54 54 PKDBGMOD pDbgMod; 55 int rc = kDbgModuleOpen( pszFile, &pDbgMod);55 int rc = kDbgModuleOpen(&pDbgMod, pszFile, NULL); 56 56 if (rc) 57 57 { -
trunk/kStuff/kDbg/kDbgInternal.h
r3541 r3550 26 26 #define ___kDbgInternal_h___ 27 27 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 30 104 31 105 #ifdef __cplusplus … … 52 126 #endif 53 127 128 /** @} */ 129 54 130 #endif 55 131 -
trunk/kStuff/kDbg/kDbgLine.cpp
r3541 r3550 7 7 * Copyright (c) 2006-2007 knut st. osmundsen <bird-src-spam@anduin.net> 8 8 * 9 * This file is part of k LIBC.9 * This file is part of kStuff. 10 10 * 11 * k LIBC is free software; you can redistribute it and/or modify12 * it under the terms of the GNU General Public License as published by13 * the Free Software Foundation; either version 2 of the License, or14 * (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. 15 15 * 16 * k LIBCis distributed in the hope that it will be useful,16 * kStuff is distributed in the hope that it will be useful, 17 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 * GNUGeneral Public License for more details.18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 19 * Lesser General Public License for more details. 20 20 * 21 * You should have received a copy of the GNU General Public License22 * along with kLIBC; if not, write to the Free Software23 * Foundation, Inc., 5 9 Temple Place, Suite 330, Boston, MA 02111-1307USA21 * 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 24 * 25 25 */ 26 27 26 28 27 /******************************************************************************* 29 28 * Header Files * 30 29 *******************************************************************************/ 31 #include "kDbg.h"32 30 #include "kDbgInternal.h" 33 31 #include <k/kHlpAlloc.h> 34 32 35 33 … … 47 45 KDBG_DECL(PKDBGLINE) kDbgLineDup(PCKDBGLINE pLine) 48 46 { 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; 52 53 } 53 54 54 55 55 56 /** 56 * Frees a line number obtained from the RTDbg API.57 * Frees a line number obtained from the kDbg API. 57 58 * 58 59 * @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. 60 61 * 61 * @param pLine The line number to be freed. 62 * @param pLine The line number to be freed. The null pointer is ignored. 62 63 */ 63 64 KDBG_DECL(int) kDbgLineFree(PKDBGLINE pLine) 64 65 { 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 } 70 72 return 0; 71 73 } -
trunk/kStuff/kDbg/kDbgModWinDbgHelp.cpp
r3541 r3550 32 32 #define _IMAGEHLP64 33 33 #include <DbgHelp.h> 34 #include <malloc.h> /* alloca */35 34 36 35 #include "kDbgInternal.h" 36 #include <k/kHlpAlloc.h> 37 #include <k/kHlpString.h> 37 38 38 39 … … 72 73 HANDLE hSymInst; 73 74 /** The image size. */ 74 uint32_tcbImage;75 KU32 cbImage; 75 76 /** The number of sections. (We've added the implicit header section.) */ 76 int32_tcSections;77 KI32 cSections; 77 78 /** The section headers (variable size). The first section is the 78 79 * implicit header section.*/ … … 107 108 * @param puRVA Where to store the RVA on success. 108 109 */ 109 static int kdbgModDHSegOffToRVA(PKDBGMODDBGHELP pModDH, int32_t iSegment, KDBGADDR off, uint32_t*puRVA)110 static int kdbgModDHSegOffToRVA(PKDBGMODDBGHELP pModDH, KI32 iSegment, KDBGADDR off, KU32 *puRVA) 110 111 { 111 112 if (iSegment >= 0) … … 116 117 ("off=" PRI_KDBGADDR " VirtualSize=%x\n", off, pModDH->aSections[iSegment].Misc.VirtualSize), 117 118 KDBG_ERR_INVALID_ADDRESS); 118 *puRVA = pModDH->aSections[iSegment].VirtualAddress + ( uint32_t)off;119 *puRVA = pModDH->aSections[iSegment].VirtualAddress + (KU32)off; 119 120 return 0; 120 121 } … … 124 125 kDbgAssertMsgReturn(off < pModDH->cbImage, ("off=" PRI_KDBGADDR ", cbImage=%x\n", off, pModDH->cbImage), 125 126 KDBG_ERR_INVALID_ADDRESS); 126 *puRVA = ( uint32_t)off;127 *puRVA = (KU32)off; 127 128 return 0; 128 129 } … … 141 142 * @param poff Where to store the segment offset. 142 143 */ 143 static int kdbgModDHRVAToSegOff(PKDBGMODDBGHELP pModDH, uint32_t uRVA, int32_t*piSegment, KDBGADDR *poff)144 static int kdbgModDHRVAToSegOff(PKDBGMODDBGHELP pModDH, KU32 uRVA, KI32 *piSegment, KDBGADDR *poff) 144 145 { 145 146 kDbgAssertMsgReturn(uRVA < pModDH->cbImage, ("uRVA=%x, cbImage=%x\n", uRVA, pModDH->cbImage), 146 147 KDBG_ERR_INVALID_ADDRESS); 147 for ( int32_tiSegment = 0; iSegment < pModDH->cSections; iSegment++)148 for (KI32 iSegment = 0; iSegment < pModDH->cSections; iSegment++) 148 149 { 149 150 /** @todo should probably be less strict about address in the alignment gaps. */ 150 uint32_toff = uRVA - pModDH->aSections[iSegment].VirtualAddress;151 KU32 off = uRVA - pModDH->aSections[iSegment].VirtualAddress; 151 152 if (off < pModDH->aSections[iSegment].Misc.VirtualSize) 152 153 { … … 163 164 * @copydoc KDBGMODOPS::pfnQueryLine 164 165 */ 165 static int kdbgModDHQueryLine(PKDBGMOD pMod, int32_tiSegment, KDBGADDR off, PKDBGLINE pLine)166 static int kdbgModDHQueryLine(PKDBGMOD pMod, KI32 iSegment, KDBGADDR off, PKDBGLINE pLine) 166 167 { 167 168 PKDBGMODDBGHELP pModDH = (PKDBGMODDBGHELP)pMod; … … 170 171 * Translate the address to an RVA. 171 172 */ 172 uint32_tuRVA;173 KU32 uRVA; 173 174 int rc = kdbgModDHSegOffToRVA(pModDH, iSegment, off, &uRVA); 174 175 if (!rc) … … 180 181 { 181 182 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); 183 184 pLine->iLine = Line.LineNumber; 184 size_t cchFile = strlen(Line.FileName);185 KSIZE cchFile = kHlpStrLen(Line.FileName); 185 186 pLine->cchFile = cchFile < sizeof(pLine->szFile) 186 ? ( uint16_t)cchFile187 : ( 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); 189 190 pLine->szFile[pLine->cchFile] = '\0'; 190 191 } … … 202 203 * @copydoc KDBGMODOPS::pfnQuerySymbol 203 204 */ 204 static int kdbgModDHQuerySymbol(PKDBGMOD pMod, int32_tiSegment, KDBGADDR off, PKDBGSYMBOL pSym)205 static int kdbgModDHQuerySymbol(PKDBGMOD pMod, KI32 iSegment, KDBGADDR off, PKDBGSYMBOL pSym) 205 206 { 206 207 PKDBGMODDBGHELP pModDH = (PKDBGMODDBGHELP)pMod; … … 209 210 * Translate the address to an RVA. 210 211 */ 211 uint32_tuRVA;212 KU32 uRVA; 212 213 int rc = kdbgModDHSegOffToRVA(pModDH, iSegment, off, &uRVA); 213 214 if (!rc) … … 242 243 { 243 244 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); 245 246 } 246 pSym->cchName = ( uint16_t)Buf.Sym.NameLen;247 pSym->cchName = (KU16)Buf.Sym.NameLen; 247 248 if (pSym->cchName >= sizeof(pSym->szName)) 248 249 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); 250 251 pSym->szName[Buf.Sym.NameLen] = '\0'; 251 252 } … … 272 273 DWORD Err = GetLastError(); 273 274 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)); 275 276 return rc; 276 277 } … … 278 279 279 280 /** 280 * Methods for a PE module.281 */282 static const KDBGMODOPS g_kdbgModDHOps =283 {284 "PE (dbghelp)",285 kdbgModDHClose,286 kdbgModDHQuerySymbol,287 kdbgModDHQueryLine288 };289 290 291 /**292 281 * Checks if the specified dbghelp.dll is usable. 293 282 * … … 296 285 * @param pszPath the path to the dbghelp.dll. 297 286 */ 298 static int kdbgModDHTryDbgHelp(const char *pszPath, uint32_t *pu32FileVersionMS, uint32_t*pu32FileVersionLS)287 static int kdbgModDHTryDbgHelp(const char *pszPath, KU32 *pu32FileVersionMS, KU32 *pu32FileVersionLS) 299 288 { 300 289 int rc; … … 337 326 * Find the dbghelp.dll 338 327 */ 339 static int kdbgModDHFindDbgHelp(char *pszPath, size_tcchPath)328 static int kdbgModDHFindDbgHelp(char *pszPath, KSIZE cchPath) 340 329 { 341 330 /* 342 331 * Try the current directory. 343 332 */ 344 uint32_tFileVersionMS = 0;345 uint32_tFileVersionLS = 0;333 KU32 FileVersionMS = 0; 334 KU32 FileVersionLS = 0; 346 335 int rc = KERR_GENERAL_FAILURE; 347 336 static char s_szDbgHelp[] = "\\dbghelp.dll"; … … 361 350 if (GetModuleFileName(NULL, pszPath, (DWORD)(cchPath - sizeof(s_szDbgHelp) + 1))) 362 351 { 363 strcat(strrchr(pszPath, '\\'), s_szDbgHelp);352 kHlpStrCat(kHlpStrRChr(pszPath, '\\'), s_szDbgHelp); 364 353 int rc2 = kdbgModDHTryDbgHelp(pszPath, &FileVersionMS, &FileVersionLS); 365 354 if (!rc) … … 374 363 if (GetSystemDirectory(pszPath, (DWORD)(cchPath - sizeof(s_szDbgHelp) + 1))) 375 364 { 376 strcat(pszPath, s_szDbgHelp);365 kHlpStrCat(pszPath, s_szDbgHelp); 377 366 int rc2 = kdbgModDHTryDbgHelp(pszPath, &FileVersionMS, &FileVersionLS); 378 367 if (!rc2) … … 387 376 if (GetWindowsDirectory(pszPath, (DWORD)(cchPath - sizeof(s_szDbgHelp) + 1))) 388 377 { 389 strcat(pszPath, s_szDbgHelp);378 kHlpStrCat(pszPath, s_szDbgHelp); 390 379 int rc2 = kdbgModDHTryDbgHelp(pszPath, &FileVersionMS, &FileVersionLS); 391 380 if (!rc2) … … 407 396 { 408 397 /* find the end of the path. */ 409 char *pszEnd = strchr(psz, ';');398 char *pszEnd = kHlpStrChr(psz, ';'); 410 399 if (!pszEnd) 411 pszEnd = strchr(psz, '\0');400 pszEnd = kHlpStrChr(psz, '\0'); 412 401 if (pszEnd != psz) 413 402 { 414 403 /* 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)); 417 406 int rc2 = kdbgModDHTryDbgHelp(pszPath, &FileVersionMS, &FileVersionLS); 418 407 if (!rc2) … … 453 442 454 443 /* 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) 458 447 Sleep(1); 459 448 if (g_hDbgHelp) 460 449 { 461 InterlockedExchange( (long volatile *)&s_u32Lock, 0);450 InterlockedExchange(&s_lLock, 0); 462 451 return 0; 463 452 } … … 470 459 if (rc) 471 460 { 472 InterlockedExchange( (volatile long *)&s_u32Lock, 0);461 InterlockedExchange(&s_lLock, 0); 473 462 return rc; 474 463 } … … 479 468 DWORD Err = GetLastError(); 480 469 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); 482 471 } 483 472 … … 515 504 { "SymGetLineFromAddr64", (FARPROC *)&g_pfnSymGetLineFromAddr64 }, 516 505 }; 517 for (unsigned i = 0; i < K DBG_ELEMENTS(s_aFunctions); i++)506 for (unsigned i = 0; i < K_ELEMENTS(s_aFunctions); i++) 518 507 { 519 508 FARPROC pfn = GetProcAddress(hmod, s_aFunctions[i].pszName); … … 522 511 DWORD Err = GetLastError(); 523 512 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)); 526 515 break; 527 516 } … … 533 522 g_hDbgHelp = hmod; 534 523 Sleep(1); 535 InterlockedExchange( (volatile long *)&s_u32Lock, 0);524 InterlockedExchange(&s_lLock, 0); 536 525 return 0; 537 526 } … … 547 536 DWORD Err = GetLastError(); 548 537 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)); 550 539 } 551 540 FreeLibrary(hmod); 552 InterlockedExchange( (long volatile *)&s_u32Lock, 0);541 InterlockedExchange(&s_lLock, 0); 553 542 return rc; 554 543 } … … 556 545 557 546 /** 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 */ 549 static 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 570 562 /* 571 563 * We need to read the section headers and get the image size. 572 564 */ 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.. */ 573 587 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)); 575 589 kDbgAssertRCReturn(rc, rc); 576 590 577 uint32_tcbImage;591 KU32 cbImage; 578 592 if (FHdr.SizeOfOptionalHeader == sizeof(IMAGE_OPTIONAL_HEADER32)) 579 rc = k DbgHlpReadAt(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)); 581 595 else if (FHdr.SizeOfOptionalHeader == sizeof(IMAGE_OPTIONAL_HEADER64)) 582 rc = k DbgHlpReadAt(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)); 584 598 else 585 599 kDbgAssertFailedReturn(KDBG_ERR_BAD_EXE_FORMAT); … … 596 610 * Allocate the module and read/construct the section headers. 597 611 */ 598 PKDBGMODDBGHELP pModDH = (PKDBGMODDBGHELP)k DbgHlpAlloc(KDBG_OFFSETOF(KDBGMODDBGHELP, aSections[FHdr.NumberOfSections + 2]));612 PKDBGMODDBGHELP pModDH = (PKDBGMODDBGHELP)kHlpAlloc(K_OFFSETOF(KDBGMODDBGHELP, aSections[FHdr.NumberOfSections + 2])); 599 613 kDbgAssertReturn(pModDH, KERR_NO_MEMORY); 600 614 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; 603 619 pModDH->cbImage = cbImage; 604 620 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); 607 624 if (!rc) 608 625 { 609 626 PIMAGE_SECTION_HEADER pSH = &pModDH->aSections[0]; 610 memcpy(pSH->Name, "headers", sizeof(pSH->Name));627 kHlpMemCopy(pSH->Name, "headers", sizeof(pSH->Name)); 611 628 pSH->Misc.VirtualSize = pModDH->aSections[1].VirtualAddress; 612 629 pSH->VirtualAddress = 0; … … 619 636 pSH->Characteristics = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_ALIGN_4BYTES | IMAGE_SCN_MEM_READ; 620 637 621 uint32_tuTheEnd = pModDH->aSections[FHdr.NumberOfSections].VirtualAddress622 638 KU32 uTheEnd = pModDH->aSections[FHdr.NumberOfSections].VirtualAddress 639 + pModDH->aSections[FHdr.NumberOfSections].Misc.VirtualSize; 623 640 if (uTheEnd < cbImage) 624 641 { 625 642 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)); 627 644 pSH->Misc.VirtualSize = cbImage - uTheEnd; 628 645 pSH->VirtualAddress = uTheEnd; … … 642 659 * when we start reusing handles they are no longer in use. :-) 643 660 */ 644 static volatile uint32_ts_u32LastHandle = 1;645 HANDLE hSymInst = (HANDLE)InterlockedIncrement( (long *)&s_u32LastHandle);661 static volatile long s_u32LastHandle = 1; 662 HANDLE hSymInst = (HANDLE)InterlockedIncrement(&s_u32LastHandle); 646 663 while ( hSymInst == INVALID_HANDLE_VALUE 647 664 || hSymInst == (HANDLE)0 648 665 || hSymInst == GetCurrentProcess()) 649 hSymInst = (HANDLE)InterlockedIncrement( (long *)&s_u32LastHandle);666 hSymInst = (HANDLE)InterlockedIncrement(&s_u32LastHandle); 650 667 651 668 /* … … 656 673 g_pfnSymSetOptions(SYMOPT_LOAD_LINES | SYMOPT_AUTO_PUBLICS | SYMOPT_ALLOW_ABSOLUTE_SYMBOLS); 657 674 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); 661 678 if (ImageBase) 662 679 { 663 pModDH->hSymInst = hSymInst;664 pModDH->ImageBase = ImageBase;665 *pp DbgMod = &pModDH->Core;680 pModDH->hSymInst = hSymInst; 681 pModDH->ImageBase = ImageBase; 682 *ppMod = &pModDH->Core; 666 683 return rc; 667 684 } … … 669 686 DWORD Err = GetLastError(); 670 687 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)); 672 689 g_pfnSymCleanup(hSymInst); 673 690 } … … 676 693 DWORD Err = GetLastError(); 677 694 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)); 679 696 } 680 697 } … … 682 699 kDbgAssertRC(rc); 683 700 684 k DbgHlpFree(pModDH);701 kHlpFree(pModDH); 685 702 return rc; 686 703 } 687 704 705 706 /** 707 * Methods for a PE module. 708 */ 709 const 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 9 9 * This file is part of kStuff. 10 10 * 11 * kStuff is free software; you can redistribute it and/or modify12 * it under the terms of the GNU Lesser General Public License as published13 * by the Free Software Foundation; either version 2 of the License, or14 * (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. 15 15 * 16 16 * kStuff is distributed in the hope that it will be useful, 17 17 * 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 */ 28 26 29 27 /******************************************************************************* 30 28 * Header Files * 31 29 *******************************************************************************/ 32 #include <k/kDbgAll.h>33 #include <k/kErrors.h>34 #include <string.h>35 30 #include "kDbgInternal.h" 31 #include <k/kHlpString.h> 32 #include <k/kHlpAlloc.h> 36 33 37 34 … … 47 44 &g_kDbgModWinDbgHelpOpen, 48 45 #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_kDbgModMapWLink46 // &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 59 56 }; 60 57 … … 93 90 kDbgAssertPtrReturn(pOps->pfnQueryLine, KERR_INVALID_POINTER); 94 91 kDbgAssertPtrReturn(pOps->pszName2, KERR_INVALID_POINTER); 95 if ( strcmp(pOps->pszName, pOps->pszName2))92 if (kHlpStrComp(pOps->pszName, pOps->pszName2)) 96 93 return KERR_INVALID_PARAMETER; 97 94 kDbgAssertReturn(pOps->pNext == NULL, KERR_INVALID_PARAMETER); … … 153 150 154 151 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 */ 172 static 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 155 225 /** 156 226 * Opens a debug module reader for the specified file or file section … … 158 228 * @returns kStuff status code. 159 229 * @param ppDbgMod Where to store the debug module reader handle. 160 * @param p FileThe file reader.230 * @param pRdr The file reader. 161 231 * @param off The offset of the file section. If the entire file, pass 0. 162 232 * @param cb The size of the file section. If the entire file, pass KFOFF_MAX. … … 167 237 * This is an optional parameter, pass NULL if no kLdr module at hand. 168 238 */ 169 KDBG_DECL(int) kDbgModuleOpenFilePart(P KDBGMOD *ppDbgMod, PKDBGHLPFILE pFile, KFOFF off, KFOFF cb, struct KLDRMOD *pLdrMod)239 KDBG_DECL(int) kDbgModuleOpenFilePart(PPKDBGMOD ppDbgMod, PKRDR pRdr, KFOFF off, KFOFF cb, struct KLDRMOD *pLdrMod) 170 240 { 171 241 /* … … 173 243 */ 174 244 kDbgAssertPtrReturn(ppDbgMod, KERR_INVALID_POINTER); 175 kDbgAssertPtrReturn(p File, KERR_INVALID_POINTER);245 kDbgAssertPtrReturn(pRdr, KERR_INVALID_POINTER); 176 246 kDbgAssertPtrNullReturn(pLdrMod, KERR_INVALID_POINTER); 177 247 kDbgAssertMsgReturn(off >= 0 && off < KFOFF_MAX, (KFOFF_PRI "\n", off), KERR_INVALID_OFFSET); … … 181 251 182 252 /* 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); 208 256 } 209 257 … … 214 262 * @returns kStuff status code. 215 263 * @param ppDbgMod Where to store the debug module reader handle. 216 * @param p FileThe file reader.264 * @param pRdr The file reader. 217 265 * @param pLdrMod Associated kLdr module that the kDbg component can use to 218 266 * verify and suplement the debug info found in the file specified … … 221 269 * This is an optional parameter, pass NULL if no kLdr module at hand. 222 270 */ 223 KDBG_DECL(int) kDbgModuleOpenFile(P KDBGMOD *ppDbgMod, PKDBGHLPFILE pFile, struct KLDRMOD *pLdrMod)224 { 225 return kDbgModuleOpenFilePart(ppDbgMod, p File, 0, KFOFF_MAX, pLdrMod);271 KDBG_DECL(int) kDbgModuleOpenFile(PPKDBGMOD ppDbgMod, PKRDR pRdr, struct KLDRMOD *pLdrMod) 272 { 273 return kDbgModuleOpenFilePart(ppDbgMod, pRdr, 0, KFOFF_MAX, pLdrMod); 226 274 } 227 275 … … 240 288 * This is an optional parameter, pass NULL if no kLdr module at hand. 241 289 */ 242 KDBG_DECL(int) kDbgModuleOpen(P KDBGMOD *ppDbgMod, const char *pszFilename, struct KLDRMOD *pLdrMod)290 KDBG_DECL(int) kDbgModuleOpen(PPKDBGMOD ppDbgMod, const char *pszFilename, struct KLDRMOD *pLdrMod) 243 291 { 244 292 /* … … 254 302 * Open the file and see if we can read it. 255 303 */ 256 PK DBGHLPFILE pFile;257 int rc = k DbgHlpOpenRO(pszFilename, &pFile);304 PKRDR pRdr; 305 int rc = kRdrBufOpen(&pRdr, pszFilename); 258 306 if (rc) 259 307 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); 263 309 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;280 310 } 281 311 … … 289 319 KDBG_DECL(int) kDbgModuleClose(PKDBGMOD pMod) 290 320 { 291 if (!kdbgModIsValid(pMod)) 292 return KERR_INVALID_PARAMETER; 293 321 KDBGMOD_VALIDATE(pMod); 294 322 int rc = pMod->pOps->pfnClose(pMod); 295 323 if (!rc) 296 kDbgHlpFree(pMod); 324 { 325 pMod->u32Magic++; 326 kHlpFree(pMod); 327 } 297 328 return rc; 298 329 } … … 314 345 KDBG_DECL(int) kDbgModuleQuerySymbol(PKDBGMOD pMod, int32_t iSegment, KDBGADDR off, PKDBGSYMBOL pSym) 315 346 { 316 if (!kdbgModIsValid(pMod)) 317 return KERR_INVALID_PARAMETER; 347 KDBGMOD_VALIDATE(pMod); 318 348 kDbgAssertPtrReturn(pSym, KERR_INVALID_POINTER); 319 320 349 return pMod->pOps->pfnQuerySymbol(pMod, iSegment, off, pSym); 321 350 } … … 369 398 KDBG_DECL(int) kDbgModuleQueryLine(PKDBGMOD pMod, int32_t iSegment, KDBGADDR off, PKDBGLINE pLine) 370 399 { 371 if (!kdbgModIsValid(pMod)) 372 return KERR_INVALID_PARAMETER; 400 KDBGMOD_VALIDATE(pMod); 373 401 kDbgAssertPtrReturn(pLine, KERR_INVALID_POINTER); 374 375 402 return pMod->pOps->pfnQueryLine(pMod, iSegment, off, pLine); 376 403 } -
trunk/kStuff/kDbg/kDbgSymbol.cpp
r3541 r3550 7 7 * Copyright (c) 2006-2007 knut st. osmundsen <bird-src-spam@anduin.net> 8 8 * 9 * This file is part of k LIBC.9 * This file is part of kStuff. 10 10 * 11 * k LIBC is free software; you can redistribute it and/or modify12 * it under the terms of the GNU General Public License as published by13 * the Free Software Foundation; either version 2 of the License, or14 * (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. 15 15 * 16 * k LIBCis distributed in the hope that it will be useful,16 * kStuff is distributed in the hope that it will be useful, 17 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 * GNUGeneral Public License for more details.18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 19 * Lesser General Public License for more details. 20 20 * 21 * You should have received a copy of the GNU General Public License22 * along with kLIBC; if not, write to the Free Software23 * Foundation, Inc., 5 9 Temple Place, Suite 330, Boston, MA 02111-1307USA21 * 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 24 * 25 25 */ 26 27 26 28 27 /******************************************************************************* 29 28 * Header Files * 30 29 *******************************************************************************/ 31 #include "kDbg.h"32 30 #include "kDbgInternal.h" 31 #include <k/kHlpAlloc.h> 33 32 34 33 … … 47 46 { 48 47 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; 51 53 } 52 54 53 55 54 56 /** 55 * Frees a symbol obtained from the RTDbg API.57 * Frees a symbol obtained from the kDbg API. 56 58 * 57 59 * @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. 59 61 * 60 * @param pSymbol The symbol to be freed. 62 * @param pSymbol The symbol to be freed. The null pointer is ignored. 61 63 */ 62 64 KDBG_DECL(int) kDbgSymbolFree(PKDBGSYMBOL pSymbol) 63 65 { 64 66 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 } 69 72 return 0; 70 73 } -
trunk/kStuff/kRdr/kRdrBuffered.cpp
r3548 r3550 60 60 /** The buffer. */ 61 61 KU8 *pbBuf; 62 /** Did we open the pRdr instance or was it handed to us?*/63 KBOOL f OpenedRdr;62 /** Whether the pRdr instance should be closed together with us or not. */ 63 KBOOL fCloseIt; 64 64 /** Set if the buffer has been messed up by kRdrBufLineQ. */ 65 65 KBOOL fTainedByLineQ; … … 354 354 355 355 /* Close the kRdr instance that we're wrapping. */ 356 if (pThis->f OpenedRdr)356 if (pThis->fCloseIt) 357 357 { 358 358 int rc = pThis->pRdr->pOps->pfnDestroy(pThis->pRdr); 359 359 if (rc) 360 360 return rc; 361 pThis->f OpenedRdr= K_FALSE;361 pThis->fCloseIt = K_FALSE; 362 362 pThis->pRdr = NULL; 363 363 } … … 380 380 * Worker for kRdrBufOpen and kRdrBufWrap. 381 381 * 382 * It's essentially kRdrBufWrap without some error checking and an extra argument.382 * It's essentially kRdrBufWrap without error checking. 383 383 * 384 384 * @returns 0 on success, one of the kErrors status code on failure. 385 385 * @param ppRdr Where to store the new file provider instance. 386 386 * @param pRdrWrapped The file provider instance to buffer. 387 * @param f OpenedIt Whether it was opened or not. If set we'll close388 * pRdrWrapped on failure.389 */ 390 static int krdrBufWrapIt(PPKRDR ppRdr, PKRDR pRdrWrapped, KBOOL f OpenedIt)387 * @param fCloseIt Whether it the pRdrWrapped instance should be closed 388 * when the new instance is closed. 389 */ 390 static int krdrBufWrapIt(PPKRDR ppRdr, PKRDR pRdrWrapped, KBOOL fCloseIt) 391 391 { 392 392 PKRDRBUF pThis = (PKRDRBUF)kHlpAlloc(sizeof(*pThis)); … … 400 400 pThis->offBuf = pThis->offBufEnd = 0; 401 401 pThis->cbBufValid = 0; 402 pThis->f OpenedRdr = fOpenedIt;402 pThis->fCloseIt = fCloseIt; 403 403 pThis->fTainedByLineQ = K_FALSE; 404 404 if (pThis->cbFile < 128*1024) … … 416 416 kHlpFree(pThis); 417 417 } 418 if (fOpenedIt)419 kRdrClose(pRdrWrapped);420 418 return KERR_NO_MEMORY; 421 419 } … … 436 434 PKRDR pRdrWrapped; 437 435 int rc = kRdrOpen(&pRdrWrapped, pszFilename); 438 if (rc) 439 return rc; 440 441 return krdrBufWrapIt(ppRdr, pRdrWrapped, K_TRUE); 436 if (!rc) 437 { 438 rc = krdrBufWrapIt(ppRdr, pRdrWrapped, K_TRUE); 439 if (rc) 440 kRdrClose(pRdrWrapped); 441 } 442 return rc; 442 443 } 443 444 … … 447 448 * 448 449 * @returns 0 on success, KERR_* on failure. 449 * @param ppRdr 450 * @param pRdr 451 */ 452 KRDR_DECL(int) kRdrBufWrap(PPKRDR ppRdr, PKRDR pRdr) 450 * @param ppRdr Where to store the new file provider pointer. 451 * @param pRdr The file provider instance to wrap. 452 * @param fCLoseIt Whether it the wrapped reader should be automatically 453 * closed when the wrapper closes. 454 */ 455 KRDR_DECL(int) kRdrBufWrap(PPKRDR ppRdr, PKRDR pRdr, KBOOL fCloseIt) 453 456 { 454 457 KRDR_VALIDATE(pRdr); 455 return krdrBufWrapIt(ppRdr, pRdr, K_FALSE); 458 return krdrBufWrapIt(ppRdr, pRdr, fCloseIt); 459 } 460 461 462 /** 463 * Checks whether the file provider instance is of the buffered type or not. 464 * 465 * @returns K_TRUE if it is, otherwise K_FALSE. 466 * @param pRdr The file provider instance to check. 467 */ 468 KRDR_DECL(KBOOL) kRdrBufIsBuffered(PKRDR pRdr) 469 { 470 KRDR_VALIDATE_EX(pRdr, K_FALSE); 471 return pRdr->pOps == &g_krdrBufOps; 456 472 } 457 473 -
trunk/kStuff/kRdr/kRdrInternal.h
r3548 r3550 38 38 39 39 /** @defgroup grp_kRdrInternal - Internals 40 * @internal 40 41 * @addtogroup grp_kRdr 41 * @ internal42 * @{ */42 * @{ 43 */ 43 44 44 45 /** @def KRDR_STRICT
Note:
See TracChangeset
for help on using the changeset viewer.