Changeset 46078 in vbox for trunk/src/VBox/Runtime/common
- Timestamp:
- May 14, 2013 6:22:53 PM (12 years ago)
- svn:sync-xref-src-repo-rev:
- 85754
- Location:
- trunk/src/VBox/Runtime/common
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/common/dbg/dbgcfg.cpp
r46074 r46078 1160 1160 if (RT_SUCCESS(rc)) 1161 1161 { 1162 if ( pThis->pfnLogCallback != NULL1163 && (pfnCallback == NULL1164 || pfnCallback == pThis->pfnLogCallback))1162 if ( pThis->pfnLogCallback == NULL 1163 || pfnCallback == NULL 1164 || pfnCallback == pThis->pfnLogCallback) 1165 1165 { 1166 1166 pThis->pfnLogCallback = NULL; -
trunk/src/VBox/Runtime/common/dbg/dbgmoddbghelp.cpp
r46048 r46078 345 345 static DECLCALLBACK(int) rtDbgModDbgHelpAddSegmentsCallback(RTLDRMOD hLdrMod, PCRTLDRSEG pSeg, void *pvUser) 346 346 { 347 RTDBGMOD hCnt = (RTDBGMOD)pvUser;347 RTDBGMODBGHELPARGS *pArgs = (RTDBGMODBGHELPARGS *)pvUser; 348 348 349 349 Log(("Segment %.*s: LinkAddress=%#llx RVA=%#llx cb=%#llx\n", 350 350 pSeg->cchName, pSeg->pchName, (uint64_t)pSeg->LinkAddress, (uint64_t)pSeg->RVA, pSeg->cb)); 351 352 if (!pSeg->RVA) 353 pArgs->uModAddr = pSeg->LinkAddress; 354 351 355 NOREF(hLdrMod); 352 356 char *pszName = (char *)pSeg->pchName; … … 359 363 360 364 RTLDRADDR cb = RT_MAX(pSeg->cb, pSeg->cbMapped); 361 return RTDbgModSegmentAdd( hCnt, pSeg->RVA, cb, pszName, 0 /*fFlags*/, NULL);365 return RTDbgModSegmentAdd(pArgs->hCnt, pSeg->RVA, cb, pszName, 0 /*fFlags*/, NULL); 362 366 } 363 367 … … 375 379 376 380 /* 377 * Try load the module into an empty address space. 381 * Create a container for copying the information into. We do this early 382 * so we can determine the image base address. 378 383 */ 379 static uint32_t volatile s_uFakeHandle = 0x3940000; 380 HANDLE hFake; 381 do 382 hFake = (HANDLE)(uintptr_t)ASMAtomicIncU32(&s_uFakeHandle); 383 while (hFake == NULL || hFake == INVALID_HANDLE_VALUE); 384 385 int rc; 386 if (SymInitialize(hFake, NULL /*SearchPath*/, FALSE /*fInvalidProcess*/)) 384 RTDBGMOD hCnt; 385 int rc = RTDbgModCreate(&hCnt, pMod->pszName, 0 /*cbSeg*/, 0 /*fFlags*/); 386 if (RT_SUCCESS(rc)) 387 387 { 388 SymSetOptions(SYMOPT_LOAD_LINES | SymGetOptions());389 390 PRTUTF16 pwszDbgFile;391 rc = RTStrToUtf16(pMod->pszDbgFile, &pwszDbgFile);388 RTDBGMODBGHELPARGS Args; 389 RT_ZERO(Args); 390 Args.hCnt = hCnt; 391 rc = pMod->pImgVt->pfnEnumSegments(pMod, rtDbgModDbgHelpAddSegmentsCallback, &Args); 392 392 if (RT_SUCCESS(rc)) 393 393 { 394 uint64_t uModAddr = SymLoadModuleExW(hFake, NULL /*hFile*/, pwszDbgFile, NULL /*pszModName*/, 395 0 /*uLoadAddr*/, 0 /*cbImage*/, NULL /*pModData*/, 0 /*fFlags*/); 396 if (uModAddr != 0) 394 uint32_t cbImage = pMod->pImgVt->pfnImageSize(pMod); 395 uint64_t uImageBase = Args.uModAddr ? Args.uModAddr : 0x4000000; 396 397 /* 398 * Try load the module into an empty address space. 399 */ 400 static uint32_t volatile s_uFakeHandle = 0x3940000; 401 HANDLE hFake; 402 do 403 hFake = (HANDLE)(uintptr_t)ASMAtomicIncU32(&s_uFakeHandle); 404 while (hFake == NULL || hFake == INVALID_HANDLE_VALUE); 405 406 if (SymInitialize(hFake, NULL /*SearchPath*/, FALSE /*fInvalidProcess*/)) 397 407 { 398 /* 399 * Create a container for copying the information into. 400 */ 401 RTDBGMOD hCnt; 402 rc = RTDbgModCreate(&hCnt, pMod->pszName, 0 /*cbSeg*/, 0 /*fFlags*/); 408 SymSetOptions(SYMOPT_LOAD_LINES | SymGetOptions()); 409 410 PRTUTF16 pwszDbgFile; 411 rc = RTStrToUtf16(pMod->pszDbgFile, &pwszDbgFile); 403 412 if (RT_SUCCESS(rc)) 404 413 { 405 rc = pMod->pImgVt->pfnEnumSegments(pMod, rtDbgModDbgHelpAddSegmentsCallback, hCnt); 406 if (RT_SUCCESS(rc)) 414 uint64_t uModAddr = SymLoadModuleExW(hFake, NULL /*hFile*/, pwszDbgFile, NULL /*pszModName*/, 415 uImageBase, cbImage, NULL /*pModData*/, 0 /*fFlags*/); 416 if (uModAddr != 0) 417 { 407 418 rc = rtDbgModDbgHelpCopySymbols(pMod, hCnt, hFake, uModAddr); 408 if (RT_SUCCESS(rc)) 409 rc = rtDbgModDbgHelpCopyLineNumbers(pMod, hCnt, hFake, uModAddr); 410 if (RT_SUCCESS(rc)) 411 { 412 pMod->pvDbgPriv = hCnt; 413 pMod->pDbgVt = &g_rtDbgModVtDbgDbgHelp; 414 hCnt = NIL_RTDBGMOD; 419 if (RT_SUCCESS(rc)) 420 rc = rtDbgModDbgHelpCopyLineNumbers(pMod, hCnt, hFake, uModAddr); 421 if (RT_SUCCESS(rc)) 422 { 423 pMod->pvDbgPriv = hCnt; 424 pMod->pDbgVt = &g_rtDbgModVtDbgDbgHelp; 425 hCnt = NIL_RTDBGMOD; 426 } 427 428 SymUnloadModule64(hFake, uModAddr); 415 429 } 416 RTDbgModRelease(hCnt); 430 else 431 rc = RTErrConvertFromWin32(GetLastError()); 432 RTUtf16Free(pwszDbgFile); 417 433 } 418 434 419 SymUnloadModule64(hFake, uModAddr);435 BOOL fRc2 = SymCleanup(hFake); Assert(fRc2); NOREF(fRc2); 420 436 } 421 437 else 422 438 rc = RTErrConvertFromWin32(GetLastError()); 423 RTUtf16Free(pwszDbgFile);424 439 } 425 426 BOOL fRc2 = SymCleanup(hFake); Assert(fRc2); NOREF(fRc2); 440 RTDbgModRelease(hCnt); 427 441 } 428 else429 rc = RTErrConvertFromWin32(GetLastError());430 442 return rc; 431 443 } -
trunk/src/VBox/Runtime/common/ldr/ldrPE.cpp
r46048 r46078 942 942 SegInfo.fProt = RTMEM_PROT_READ; 943 943 SegInfo.Alignment = 1; 944 SegInfo.LinkAddress = 0;945 SegInfo.RVA = SegInfo.LinkAddress;944 SegInfo.LinkAddress = pModPe->uImageBase; 945 SegInfo.RVA = 0; 946 946 SegInfo.offFile = 0; 947 947 SegInfo.cb = pModPe->cbHeaders; … … 981 981 else 982 982 { 983 SegInfo.LinkAddress = pSh->VirtualAddress ;984 SegInfo.RVA = SegInfo.LinkAddress;983 SegInfo.LinkAddress = pSh->VirtualAddress + pModPe->uImageBase ; 984 SegInfo.RVA = pSh->VirtualAddress; 985 985 SegInfo.cbMapped = RT_ALIGN(SegInfo.cb, SegInfo.Alignment); 986 986 if (i + 1 < pModPe->cSections && !(pSh[1].Characteristics & IMAGE_SCN_TYPE_NOLOAD)) … … 1012 1012 PRTLDRMODPE pModPe = (PRTLDRMODPE)pMod; 1013 1013 1014 /* Note! LinkAddress == RVA */1014 LinkAddress -= pModPe->uImageBase; 1015 1015 1016 1016 /* Special header segment. */ … … 1051 1051 PRTLDRMODPE pModPe = (PRTLDRMODPE)pMod; 1052 1052 1053 LinkAddress -= pModPe->uImageBase; 1053 1054 if (LinkAddress > pModPe->cbImage) 1054 1055 return VERR_LDR_INVALID_LINK_ADDRESS; 1055 1056 *pRva = LinkAddress; 1057 1056 1058 return VINF_SUCCESS; 1057 1059 } … … 1082 1084 uint32_t *piSeg, PRTLDRADDR poffSeg) 1083 1085 { 1084 int rc = rtldrPE_LinkAddressToSegOffset(pMod, Rva, piSeg, poffSeg); 1086 PRTLDRMODPE pModPe = (PRTLDRMODPE)pMod; 1087 int rc = rtldrPE_LinkAddressToSegOffset(pMod, Rva + pModPe->uImageBase, piSeg, poffSeg); 1085 1088 if (RT_FAILURE(rc)) 1086 1089 rc = VERR_LDR_INVALID_RVA;
Note:
See TracChangeset
for help on using the changeset viewer.