Changeset 38547 in vbox for trunk/src/VBox/Runtime/common
- Timestamp:
- Aug 26, 2011 12:58:47 PM (14 years ago)
- svn:sync-xref-src-repo-rev:
- 73701
- Location:
- trunk/src/VBox/Runtime/common
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/common/dbg/dbgmoddwarf.cpp
r38531 r38547 75 75 PRTDBGMODINT pMod; 76 76 77 /** Total line number count. */78 uint32_t cLines;79 /** Total symbol count. */80 uint32_t cSymbols;81 82 77 /** DWARF debug info sections. */ 83 78 struct … … 151 146 return VINF_SUCCESS; 152 147 153 return pThis->pMod->pImgVt->pfnUnmapPart(pThis->pMod, pThis->aSections[enmSect].cb, &pThis->aSections[enmSect].pv); 148 int rc = pThis->pMod->pImgVt->pfnUnmapPart(pThis->pMod, pThis->aSections[enmSect].cb, &pThis->aSections[enmSect].pv); 149 AssertRC(rc); 150 return rc; 154 151 } 155 152 … … 192 189 /** @interface_method_impl{RTDBGMODVTDBG,pfnSymbolByAddr} */ 193 190 static DECLCALLBACK(int) rtDbgModDwarf_SymbolByAddr(PRTDBGMODINT pMod, RTDBGSEGIDX iSeg, RTUINTPTR off, 194 PRTINTPTR poffDisp, PRTDBGSYMBOL pSymInfo)195 { 196 PRTDBGMODDWARF pThis = (PRTDBGMODDWARF)pMod->pvDbgPriv; 197 return VERR_DBG_NO_SYMBOLS;191 PRTINTPTR poffDisp, PRTDBGSYMBOL pSymInfo) 192 { 193 PRTDBGMODDWARF pThis = (PRTDBGMODDWARF)pMod->pvDbgPriv; 194 return RTDbgModSymbolByAddr(pThis->hCnt, iSeg, off, poffDisp, pSymInfo); 198 195 } 199 196 … … 204 201 { 205 202 PRTDBGMODDWARF pThis = (PRTDBGMODDWARF)pMod->pvDbgPriv; 206 return VERR_DBG_NO_SYMBOLS; 203 Assert(!pszSymbol[cchSymbol]); 204 return RTDbgModSymbolByName(pThis->hCnt, pszSymbol/*, cchSymbol*/, pSymInfo); 207 205 } 208 206 … … 212 210 { 213 211 PRTDBGMODDWARF pThis = (PRTDBGMODDWARF)pMod->pvDbgPriv; 214 return VERR_DBG_NO_SYMBOLS;212 return RTDbgModSymbolByOrdinal(pThis->hCnt, iOrdinal, pSymInfo); 215 213 } 216 214 … … 220 218 { 221 219 PRTDBGMODDWARF pThis = (PRTDBGMODDWARF)pMod->pvDbgPriv; 222 return pThis->cSymbols;220 return RTDbgModSymbolCount(pThis->hCnt); 223 221 } 224 222 … … 226 224 /** @interface_method_impl{RTDBGMODVTDBG,pfnSymbolAdd} */ 227 225 static DECLCALLBACK(int) rtDbgModDwarf_SymbolAdd(PRTDBGMODINT pMod, const char *pszSymbol, size_t cchSymbol, 228 RTDBGSEGIDX iSeg, RTUINTPTR off, RTUINTPTR cb, uint32_t fFlags, 229 uint32_t *piOrdinal) 230 { 231 return VERR_NOT_SUPPORTED; 226 RTDBGSEGIDX iSeg, RTUINTPTR off, RTUINTPTR cb, uint32_t fFlags, 227 uint32_t *piOrdinal) 228 { 229 PRTDBGMODDWARF pThis = (PRTDBGMODDWARF)pMod->pvDbgPriv; 230 return RTDbgModSymbolAdd(pThis->hCnt, pszSymbol, iSeg, off, cb, fFlags, piOrdinal); 232 231 } 233 232 … … 237 236 { 238 237 PRTDBGMODDWARF pThis = (PRTDBGMODDWARF)pMod->pvDbgPriv; 239 return VERR_DBG_INVALID_SEGMENT_INDEX;238 return RTDbgModSegmentByIndex(pThis->hCnt, iSeg, pSegInfo); 240 239 } 241 240 … … 245 244 { 246 245 PRTDBGMODDWARF pThis = (PRTDBGMODDWARF)pMod->pvDbgPriv; 247 return 0; /** @todo defer to image reader if present? */246 return RTDbgModSegmentCount(pThis->hCnt); 248 247 } 249 248 … … 251 250 /** @interface_method_impl{RTDBGMODVTDBG,pfnSegmentAdd} */ 252 251 static DECLCALLBACK(int) rtDbgModDwarf_SegmentAdd(PRTDBGMODINT pMod, RTUINTPTR uRva, RTUINTPTR cb, const char *pszName, size_t cchName, 253 uint32_t fFlags, PRTDBGSEGIDX piSeg) 254 { 255 return VERR_NOT_SUPPORTED; 252 uint32_t fFlags, PRTDBGSEGIDX piSeg) 253 { 254 PRTDBGMODDWARF pThis = (PRTDBGMODDWARF)pMod->pvDbgPriv; 255 return RTDbgModSegmentAdd(pThis->hCnt, uRva, cb, pszName, fFlags, piSeg); 256 256 } 257 257 … … 261 261 { 262 262 PRTDBGMODDWARF pThis = (PRTDBGMODDWARF)pMod->pvDbgPriv; 263 return 0; /** @todo defer to image reader if present? */ 263 RTUINTPTR cb1 = RTDbgModImageSize(pThis->hCnt); 264 RTUINTPTR cb2 = pMod->pImgVt->pfnImageSize(pMod); 265 return RT_MAX(cb1, cb2); 264 266 } 265 267 … … 269 271 { 270 272 PRTDBGMODDWARF pThis = (PRTDBGMODDWARF)pMod->pvDbgPriv; 271 /** @todo defer to image reader if present? */ 272 *poffSeg = uRva; 273 return 0; 273 return RTDbgModRvaToSegOff(pThis->hCnt, uRva, poffSeg); 274 274 } 275 275 … … 291 291 292 292 293 /** 294 * Explodes the line number table. 295 * 296 * The line numbers are insered into the debug info container. 297 * 298 * @returns IPRT status code 299 * @param pThis The DWARF instance. 300 */ 293 301 static int rtDbgModDwarfExplodeLineNumbers(PRTDBGMODDWARF pThis) 294 302 { 295 if (!pThis->aSections[krtDbgModDwarfSect_line].fPresent)296 return VINF_SUCCESS;297 303 int rc = rtDbgModDwarfLoadSection(pThis, krtDbgModDwarfSect_line); 298 304 if (RT_FAILURE(rc)) 299 305 return rc; 300 306 301 302 int rc2 = rtDbgModDwarfUnloadSection(pThis, krtDbgModDwarfSect_line); 303 return RT_SUCCESS(rc2) || RT_FAILURE(rc) ? rc : rc2; 304 } 305 306 307 #if 0 /** @todo */ 308 size_t cbLeft = pThis->aSections[krtDbgModDwarfSect_line].cb; 309 uint8_t const *pb = (uint8_t const *)pThis->aSections[krtDbgModDwarfSect_line].pv; 310 while (cbLeft > 0) 311 { 312 313 } 314 #endif 315 316 rtDbgModDwarfUnloadSection(pThis, krtDbgModDwarfSect_line); 317 return rc; 318 } 319 320 321 /** 322 * Extracts the symbols. 323 * 324 * The symbols are insered into the debug info container. 325 * 326 * @returns IPRT status code 327 * @param pThis The DWARF instance. 328 */ 307 329 static int rtDbgModDwarfExtractSymbols(PRTDBGMODDWARF pThis) 308 330 { … … 311 333 return rc; 312 334 313 314 return VERR_NOT_IMPLEMENTED; 335 /** @todo */ 336 337 rtDbgModDwarfUnloadSection(pThis, krtDbgModDwarfSect_info); 338 return rc; 339 } 340 341 342 /** 343 * Loads the abbreviations used to parse the info section. 344 * 345 * @returns IPRT status code 346 * @param pThis The DWARF instance. 347 */ 348 static int rtDbgModDwarfLoadAbbreviations(PRTDBGMODDWARF pThis) 349 { 350 int rc = rtDbgModDwarfLoadSection(pThis, krtDbgModDwarfSect_abbrev); 351 if (RT_FAILURE(rc)) 352 return rc; 353 354 #if 0 /** @todo */ 355 size_t cbLeft = pThis->aSections[krtDbgModDwarfSect_abbrev].cb; 356 uint8_t const *pb = (uint8_t const *)pThis->aSections[krtDbgModDwarfSect_abbrev].pv; 357 while (cbLeft > 0) 358 { 359 360 } 361 #endif 362 363 rtDbgModDwarfUnloadSection(pThis, krtDbgModDwarfSect_abbrev); 364 return rc; 365 } 366 367 368 /** @callback_method_impl{FNRTLDRENUMSEGS} */ 369 static DECLCALLBACK(int) rtDbgModHlpAddSegmentCallback(RTLDRMOD hLdrMod, PCRTLDRSEG pSeg, void *pvUser) 370 { 371 PRTDBGMODINT pMod = (PRTDBGMODINT)pvUser; 372 return pMod->pDbgVt->pfnSegmentAdd(pMod, pSeg->RVA, pSeg->cb, pSeg->pchName, pSeg->cchName, 0 /*fFlags*/, NULL); 373 } 374 375 376 /** 377 * Calls pfnSegmentAdd for each segment in the executable image. 378 * 379 * @returns IPRT status code. 380 * @param pMod The debug module. 381 */ 382 DECLHIDDEN(int) rtDbgModHlpAddSegmentsFromImage(PRTDBGMODINT pMod) 383 { 384 AssertReturn(pMod->pImgVt, VERR_INTERNAL_ERROR_2); 385 return pMod->pImgVt->pfnEnumSegments(pMod, rtDbgModHlpAddSegmentCallback, pMod); 315 386 } 316 387 … … 319 390 static DECLCALLBACK(int) rtDbgModDwarfEnumCallback(RTLDRMOD hLdrMod, uint32_t iDbgInfo, RTLDRDBGINFOTYPE enmType, 320 391 uint16_t iMajorVer, uint16_t iMinorVer, const char *pszPartNm, 321 RTFOFF offFile, RT UINTPTR LinkAddress, RTUINTPTR cb,392 RTFOFF offFile, RTLDRADDR LinkAddress, RTLDRADDR cb, 322 393 const char *pszExtFile, void *pvUser) 323 394 { … … 334 405 * or underscores. 335 406 */ 336 if (!strncmp(pszPartNm, ".debug_", sizeof(".debug_") - 1)) 407 if (!strncmp(pszPartNm, ".debug_", sizeof(".debug_") - 1)) /* ELF */ 337 408 pszPartNm += sizeof(".debug_") - 1; 338 else if (!strncmp(pszPartNm, "__debug_", sizeof("__debug_") - 1)) 409 else if (!strncmp(pszPartNm, "__debug_", sizeof("__debug_") - 1)) /* Mach-O */ 339 410 pszPartNm += sizeof("__debug_") - 1; 340 411 else … … 413 484 if (RT_SUCCESS(rc)) 414 485 { 415 rc = rtDbgModDwarfExtractSymbols(pThis); 486 pMod->pvDbgPriv = pThis; 487 488 rc = rtDbgModHlpAddSegmentsFromImage(pMod); 489 if (RT_SUCCESS(rc)) 490 rc = rtDbgModDwarfLoadAbbreviations(pThis); 491 if (RT_SUCCESS(rc)) 492 rc = rtDbgModDwarfExtractSymbols(pThis); 416 493 if (RT_SUCCESS(rc)) 417 494 rc = rtDbgModDwarfExplodeLineNumbers(pThis); 418 495 if (RT_SUCCESS(rc)) 419 496 { 420 pMod->pvDbgPriv = pThis;421 497 return VINF_SUCCESS; 422 498 } … … 424 500 /* bail out. */ 425 501 RTDbgModRelease(pThis->hCnt); 502 pMod->pvDbgPriv = NULL; 426 503 } 427 504 } -
trunk/src/VBox/Runtime/common/dbg/dbgmodldr.cpp
r38531 r38547 34 34 #include <iprt/assert.h> 35 35 #include <iprt/err.h> 36 #include <iprt/file.h> 36 37 #include <iprt/ldr.h> 37 38 #include <iprt/mem.h> … … 53 54 /** The loader handle. */ 54 55 RTLDRMOD hLdrMod; 56 /** File handle for the image. */ 57 RTFILE hFile; 55 58 } RTDBGMODLDR; 56 59 /** Pointer to instance data NM map reader. */ 57 60 typedef RTDBGMODLDR *PRTDBGMODLDR; 61 62 63 /** @interface_method_impl{RTDBGMODVTIMG,pfnUnmapPart} */ 64 static DECLCALLBACK(int) rtDbgModLdr_UnmapPart(PRTDBGMODINT pMod, size_t cb, void const **ppvMap) 65 { 66 RTMemFree((void *)*ppvMap); 67 *ppvMap = NULL; 68 return VINF_SUCCESS; 69 } 70 71 72 /** @interface_method_impl{RTDBGMODVTIMG,pfnMapPart} */ 73 static DECLCALLBACK(int) rtDbgModLdr_MapPart(PRTDBGMODINT pMod, RTFOFF off, size_t cb, void const **ppvMap) 74 { 75 PRTDBGMODLDR pThis = (PRTDBGMODLDR)pMod->pvImgPriv; 76 77 void *pvMap = RTMemAlloc(cb); 78 if (!pvMap) 79 return VERR_NO_MEMORY; 80 81 int rc = RTFileReadAt(pThis->hFile, off, pvMap, cb, NULL); 82 if (RT_SUCCESS(rc)) 83 *ppvMap = pvMap; 84 else 85 { 86 RTMemFree(pvMap); 87 *ppvMap = NULL; 88 } 89 return rc; 90 } 91 92 93 /** @interface_method_impl{RTDBGMODVTIMG,pfnGetLoadedSize} */ 94 static DECLCALLBACK(RTUINTPTR) rtDbgModLdr_GetLoadedSize(PRTDBGMODINT pMod) 95 { 96 PRTDBGMODLDR pThis = (PRTDBGMODLDR)pMod->pvImgPriv; 97 return RTLdrSize(pThis->hLdrMod); 98 } 99 100 101 /** @interface_method_impl{RTDBGMODVTIMG,pfnEnumSegments} */ 102 static DECLCALLBACK(int) rtDbgModLdr_EnumSegments(PRTDBGMODINT pMod, PFNRTLDRENUMSEGS pfnCallback, void *pvUser) 103 { 104 PRTDBGMODLDR pThis = (PRTDBGMODLDR)pMod->pvImgPriv; 105 return RTLdrEnumSegments(pThis->hLdrMod, pfnCallback, pvUser); 106 } 58 107 59 108 … … 74 123 int rc = RTLdrClose(pThis->hLdrMod); AssertRC(rc); 75 124 pThis->hLdrMod = NIL_RTLDRMOD; 125 126 rc = RTFileClose(pThis->hFile); AssertRC(rc); 127 pThis->hFile = NIL_RTFILE; 128 76 129 RTMemFree(pThis); 77 130 … … 83 136 static DECLCALLBACK(int) rtDbgModLdr_TryOpen(PRTDBGMODINT pMod) 84 137 { 85 RTLDRMOD hLdrMod; 86 int rc = RTLdrOpen(pMod->pszImgFile, 0 /*fFlags*/, RTLDRARCH_WHATEVER, &hLdrMod); 87 if (RT_FAILURE(rc)) 88 return rc; 138 RTFILE hFile; 139 int rc = RTFileOpen(&hFile, pMod->pszImgFile, RTFILE_O_READ | RTFILE_O_DENY_WRITE | RTFILE_O_OPEN); 140 if (RT_SUCCESS(rc)) 141 { 142 RTLDRMOD hLdrMod; 143 rc = RTLdrOpen(pMod->pszImgFile, 0 /*fFlags*/, RTLDRARCH_WHATEVER, &hLdrMod); 144 if (RT_SUCCESS(rc)) 145 { 146 PRTDBGMODLDR pThis = (PRTDBGMODLDR)RTMemAllocZ(sizeof(RTDBGMODLDR)); 147 if (pThis) 148 { 149 pThis->hLdrMod = hLdrMod; 150 pThis->hFile = hFile; 151 pMod->pvImgPriv = pThis; 152 return VINF_SUCCESS; 153 } 89 154 90 PRTDBGMODLDR pThis = (PRTDBGMODLDR)RTMemAllocZ(sizeof(RTDBGMODLDR));91 if (!pThis)92 {93 RTLdrClose(hLdrMod); 94 return VERR_NO_MEMORY;155 rc = VERR_NO_MEMORY; 156 RTLdrClose(hLdrMod); 157 } 158 159 RTFileClose(hFile); 95 160 } 96 97 pThis->hLdrMod = hLdrMod; 98 pMod->pvImgPriv = pThis; 99 return VINF_SUCCESS; 161 return rc; 100 162 } 101 163 … … 110 172 /*.pfnClose = */ rtDbgModLdr_Close, 111 173 /*.pfnEnumDbgInfo = */ rtDbgModLdr_EnumDbgInfo, 112 /*.pfnMapPart = */ NULL /** @todo*/, 113 /*.pfnUnmapPart = */ NULL /** @todo*/, 174 /*.pfnEnumSegments = */ rtDbgModLdr_EnumSegments, 175 /*.pfnGetLoadedSize = */ rtDbgModLdr_GetLoadedSize, 176 /*.pfnMapPart = */ rtDbgModLdr_MapPart, 177 /*.pfnUnmapPart = */ rtDbgModLdr_UnmapPart, 114 178 115 179 /*.u32EndMagic = */ RTDBGMODVTIMG_MAGIC -
trunk/src/VBox/Runtime/common/ldr/ldrELFRelocatable.cpp.h
r38515 r38547 696 696 697 697 698 /** @copydoc RTLDROPS::pfnEnumSegments. */ 699 static DECLCALLBACK(int) RTLDRELF_NAME(EnumSegments)(PRTLDRMODINTERNAL pMod, PFNRTLDRENUMSEGS pfnCallback, void *pvUser) 700 { 701 PRTLDRMODELF pModElf = (PRTLDRMODELF)pMod; 702 703 return VERR_NOT_IMPLEMENTED; 704 } 705 706 707 698 708 /** 699 709 * The ELF module operations. … … 716 726 RTLDRELF_NAME(GetSymbolEx), 717 727 RTLDRELF_NAME(EnumDbgInfo), 728 RTLDRELF_NAME(EnumSegments), 718 729 42 719 730 }; -
trunk/src/VBox/Runtime/common/ldr/ldrEx.cpp
r38515 r38547 209 209 * @remark Not supported for RTLdrLoad() images. 210 210 */ 211 RTDECL(int) RTLdrGetBits(RTLDRMOD hLdrMod, void *pvBits, RT UINTPTR BaseAddress, PFNRTLDRIMPORT pfnGetImport, void *pvUser)211 RTDECL(int) RTLdrGetBits(RTLDRMOD hLdrMod, void *pvBits, RTLDRADDR BaseAddress, PFNRTLDRIMPORT pfnGetImport, void *pvUser) 212 212 { 213 213 LogFlow(("RTLdrGetBits: hLdrMod=%RTldrm pvBits=%p BaseAddress=%RTptr pfnGetImport=%p pvUser=%p\n", … … 247 247 * @remark Not supported for RTLdrLoad() images. 248 248 */ 249 RTDECL(int) RTLdrRelocate(RTLDRMOD hLdrMod, void *pvBits, RT UINTPTR NewBaseAddress, RTUINTPTR OldBaseAddress,249 RTDECL(int) RTLdrRelocate(RTLDRMOD hLdrMod, void *pvBits, RTLDRADDR NewBaseAddress, RTLDRADDR OldBaseAddress, 250 250 PFNRTLDRIMPORT pfnGetImport, void *pvUser) 251 251 { … … 289 289 * @param pValue Where to store the symbol value. 290 290 */ 291 RTDECL(int) RTLdrGetSymbolEx(RTLDRMOD hLdrMod, const void *pvBits, RTUINTPTR BaseAddress, const char *pszSymbol, RTUINTPTR *pValue) 291 RTDECL(int) RTLdrGetSymbolEx(RTLDRMOD hLdrMod, const void *pvBits, RTLDRADDR BaseAddress, const char *pszSymbol, 292 PRTLDRADDR pValue) 292 293 { 293 294 LogFlow(("RTLdrGetSymbolEx: hLdrMod=%RTldrm pvBits=%p BaseAddress=%RTptr pszSymbol=%p:{%s} pValue\n", … … 338 339 * @remark Not supported for RTLdrLoad() images. 339 340 */ 340 RTDECL(int) RTLdrEnumSymbols(RTLDRMOD hLdrMod, unsigned fFlags, const void *pvBits, RTUINTPTR BaseAddress, PFNRTLDRENUMSYMS pfnCallback, void *pvUser) 341 RTDECL(int) RTLdrEnumSymbols(RTLDRMOD hLdrMod, unsigned fFlags, const void *pvBits, RTLDRADDR BaseAddress, 342 PFNRTLDRENUMSYMS pfnCallback, void *pvUser) 341 343 { 342 344 LogFlow(("RTLdrEnumSymbols: hLdrMod=%RTldrm fFlags=%#x pvBits=%p BaseAddress=%RTptr pfnCallback=%p pvUser=%p\n", … … 390 392 RT_EXPORT_SYMBOL(RTLdrEnumDbgInfo); 391 393 394 395 RTDECL(int) RTLdrEnumSegments(RTLDRMOD hLdrMod, PFNRTLDRENUMSEGS pfnCallback, void *pvUser) 396 { 397 LogFlow(("RTLdrEnumSegments: hLdrMod=%RTldrm pfnCallback=%p pvUser=%p\n", 398 hLdrMod, pfnCallback, pvUser)); 399 400 /* 401 * Validate input. 402 */ 403 AssertMsgReturn(rtldrIsValid(hLdrMod), ("hLdrMod=%p\n", hLdrMod), VERR_INVALID_HANDLE); 404 AssertMsgReturn(RT_VALID_PTR(pfnCallback), ("pfnCallback=%p\n", pfnCallback), VERR_INVALID_PARAMETER); 405 PRTLDRMODINTERNAL pMod = (PRTLDRMODINTERNAL)hLdrMod; 406 //AssertMsgReturn(pMod->eState == LDR_STATE_OPENED, ("eState=%d\n", pMod->eState), VERR_WRONG_ORDER); 407 408 /* 409 * Do it. 410 */ 411 int rc; 412 if (pMod->pOps->pfnEnumSegments) 413 rc = pMod->pOps->pfnEnumSegments(pMod, pfnCallback, pvUser); 414 else 415 rc = VERR_NOT_SUPPORTED; 416 417 LogFlow(("RTLdrEnumSegments: returns %Rrc\n", rc)); 418 return rc; 419 420 } 421 RT_EXPORT_SYMBOL(RTLdrEnumSegments); 422 -
trunk/src/VBox/Runtime/common/ldr/ldrNative.cpp
r38515 r38547 69 69 rtldrNativeEnumSymbols, 70 70 /* ext: */ 71 NULL, 71 72 NULL, 72 73 NULL, -
trunk/src/VBox/Runtime/common/ldr/ldrPE.cpp
r38515 r38547 776 776 777 777 778 /** @copydoc RTLDROPS::pfnEnumSegments. */ 779 static DECLCALLBACK(int) rtldrPE_EnumSegments(PRTLDRMODINTERNAL pMod, PFNRTLDRENUMSEGS pfnCallback, void *pvUser) 780 { 781 return VINF_NOT_SUPPORTED; 782 } 783 784 778 785 /** @copydoc RTLDROPS::pfnDone */ 779 786 static DECLCALLBACK(int) rtldrPEDone(PRTLDRMODINTERNAL pMod) … … 835 842 rtldrPEGetSymbolEx, 836 843 rtldrPE_EnumDbgInfo, 844 rtldrPE_EnumSegments, 837 845 42 838 846 }, … … 859 867 rtldrPEGetSymbolEx, 860 868 rtldrPE_EnumDbgInfo, 869 rtldrPE_EnumSegments, 861 870 42 862 871 }, -
trunk/src/VBox/Runtime/common/ldr/ldrkStuff.cpp
r38531 r38547 629 629 630 630 631 /** @copydoc RTLDROPS::pfnEnumSegments. */ 632 static DECLCALLBACK(int) rtkldr_EnumSegments(PRTLDRMODINTERNAL pMod, PFNRTLDRENUMSEGS pfnCallback, void *pvUser) 633 { 634 PRTLDRMODKLDR pThis = (PRTLDRMODKLDR)pMod; 635 uint32_t const cSegments = pThis->pMod->cSegments; 636 PCKLDRSEG paSegments = &pThis->pMod->aSegments[0]; 637 638 for (uint32_t iSeg = 0; iSeg < cSegments; iSeg++) 639 { 640 RTLDRSEG Seg; 641 642 Seg.pchName = paSegments[iSeg].pchName; 643 Seg.cchName = paSegments[iSeg].cchName; 644 Seg.SelFlat = paSegments[iSeg].SelFlat; 645 Seg.Sel16bit = paSegments[iSeg].Sel16bit; 646 Seg.fFlags = paSegments[iSeg].fFlags; 647 AssertCompile(KLDRSEG_FLAG_16BIT == RTLDRSEG_FLAG_16BIT ); 648 AssertCompile(KLDRSEG_FLAG_OS2_ALIAS16 == RTLDRSEG_FLAG_OS2_ALIAS16); 649 AssertCompile(KLDRSEG_FLAG_OS2_CONFORM == RTLDRSEG_FLAG_OS2_CONFORM); 650 AssertCompile(KLDRSEG_FLAG_OS2_IOPL == RTLDRSEG_FLAG_OS2_IOPL ); 651 652 switch (paSegments[iSeg].enmProt) 653 { 654 default: 655 AssertMsgFailed(("%d\n", paSegments[iSeg].enmProt)); 656 case KPROT_NOACCESS: 657 Seg.fProt = 0; 658 break; 659 660 case KPROT_READONLY: Seg.fProt = RTMEM_PROT_READ; break; 661 case KPROT_READWRITE: Seg.fProt = RTMEM_PROT_READ | RTMEM_PROT_WRITE; break; 662 case KPROT_WRITECOPY: Seg.fProt = RTMEM_PROT_WRITE; break; 663 case KPROT_EXECUTE: Seg.fProt = RTMEM_PROT_EXEC; break; 664 case KPROT_EXECUTE_READ: Seg.fProt = RTMEM_PROT_EXEC | RTMEM_PROT_READ; break; 665 case KPROT_EXECUTE_READWRITE: Seg.fProt = RTMEM_PROT_EXEC | RTMEM_PROT_READ | RTMEM_PROT_WRITE; break; 666 case KPROT_EXECUTE_WRITECOPY: Seg.fProt = RTMEM_PROT_EXEC | RTMEM_PROT_WRITE; break; 667 } 668 Seg.cb = paSegments[iSeg].cb; 669 Seg.Alignment = paSegments[iSeg].Alignment; 670 Seg.LinkAddress = paSegments[iSeg].LinkAddress; 671 Seg.offFile = paSegments[iSeg].offFile; 672 Seg.cbFile = paSegments[iSeg].cbFile; 673 Seg.RVA = paSegments[iSeg].RVA; 674 Seg.cbMapped = paSegments[iSeg].cbMapped; 675 676 int rc = pfnCallback(pMod, &Seg, pvUser); 677 if (rc != VINF_SUCCESS) 678 return rc; 679 } 680 681 return VINF_SUCCESS; 682 } 683 684 631 685 /** 632 686 * Operations for a kLdr module. … … 645 699 rtkldr_GetSymbolEx, 646 700 rtkldr_EnumDbgInfo, 701 rtkldr_EnumSegments, 647 702 42 648 703 };
Note:
See TracChangeset
for help on using the changeset viewer.