Changeset 38581 in vbox for trunk/src/VBox/Runtime/common/ldr
- Timestamp:
- Aug 31, 2011 12:43:26 PM (13 years ago)
- svn:sync-xref-src-repo-rev:
- 73772
- Location:
- trunk/src/VBox/Runtime/common/ldr
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/common/ldr/ldrELFRelocatable.cpp.h
r38547 r38581 705 705 706 706 707 /** @copydoc RTLDROPS::pfnLinkAddressToSegOffset. */ 708 static DECLCALLBACK(int) RTLDRELF_NAME(LinkAddressToSegOffset)(PRTLDRMODINTERNAL pMod, RTLDRADDR LinkAddress, 709 uint32_t *piSeg, PRTLDRADDR poffSeg) 710 { 711 PRTLDRMODELF pModElf = (PRTLDRMODELF)pMod; 712 713 return VERR_NOT_IMPLEMENTED; 714 } 715 716 717 /** @copydoc RTLDROPS::pfnLinkAddressToRva. */ 718 static DECLCALLBACK(int) RTLDRELF_NAME(LinkAddressToRva)(PRTLDRMODINTERNAL pMod, RTLDRADDR LinkAddress, PRTLDRADDR pRva) 719 { 720 PRTLDRMODELF pModElf = (PRTLDRMODELF)pMod; 721 722 return VERR_NOT_IMPLEMENTED; 723 } 724 725 726 /** @copydoc RTLDROPS::pfnSegOffsetToRva. */ 727 static DECLCALLBACK(int) RTLDRELF_NAME(SegOffsetToRva)(PRTLDRMODINTERNAL pMod, uint32_t iSeg, RTLDRADDR offSeg, 728 PRTLDRADDR pRva) 729 { 730 PRTLDRMODELF pModElf = (PRTLDRMODELF)pMod; 731 732 return VERR_NOT_IMPLEMENTED; 733 } 734 735 736 /** @copydoc RTLDROPS::pfnRvaToSegOffset. */ 737 static DECLCALLBACK(int) RTLDRELF_NAME(RvaToSegOffset)(PRTLDRMODINTERNAL pMod, RTLDRADDR Rva, 738 uint32_t *piSeg, PRTLDRADDR poffSeg) 739 { 740 PRTLDRMODELF pModElf = (PRTLDRMODELF)pMod; 741 742 return VERR_NOT_IMPLEMENTED; 743 } 744 745 707 746 708 747 /** … … 727 766 RTLDRELF_NAME(EnumDbgInfo), 728 767 RTLDRELF_NAME(EnumSegments), 768 RTLDRELF_NAME(LinkAddressToSegOffset), 769 RTLDRELF_NAME(LinkAddressToRva), 770 RTLDRELF_NAME(SegOffsetToRva), 771 RTLDRELF_NAME(RvaToSegOffset), 729 772 42 730 773 }; -
trunk/src/VBox/Runtime/common/ldr/ldrEx.cpp
r38547 r38581 421 421 RT_EXPORT_SYMBOL(RTLdrEnumSegments); 422 422 423 424 RTDECL(int) RTLdrLinkAddressToSegOffset(RTLDRMOD hLdrMod, RTLDRADDR LinkAddress, uint32_t *piSeg, PRTLDRADDR poffSeg) 425 { 426 LogFlow(("RTLdrLinkAddressToSegOffset: hLdrMod=%RTldrm LinkAddress=%RTptr piSeg=%p poffSeg=%p\n", 427 hLdrMod, LinkAddress, piSeg, poffSeg)); 428 429 /* 430 * Validate input. 431 */ 432 AssertMsgReturn(rtldrIsValid(hLdrMod), ("hLdrMod=%p\n", hLdrMod), VERR_INVALID_HANDLE); 433 AssertPtrReturn(piSeg, VERR_INVALID_POINTER); 434 AssertPtrReturn(poffSeg, VERR_INVALID_POINTER); 435 436 PRTLDRMODINTERNAL pMod = (PRTLDRMODINTERNAL)hLdrMod; 437 //AssertMsgReturn(pMod->eState == LDR_STATE_OPENED, ("eState=%d\n", pMod->eState), VERR_WRONG_ORDER); 438 439 *piSeg = UINT32_MAX; 440 *poffSeg = ~(RTLDRADDR)0; 441 442 /* 443 * Do it. 444 */ 445 int rc; 446 if (pMod->pOps->pfnLinkAddressToSegOffset) 447 rc = pMod->pOps->pfnLinkAddressToSegOffset(pMod, LinkAddress, piSeg, poffSeg); 448 else 449 rc = VERR_NOT_SUPPORTED; 450 451 LogFlow(("RTLdrLinkAddressToSegOffset: returns %Rrc %#x:%RTptr\n", rc, *piSeg, *poffSeg)); 452 return rc; 453 } 454 RT_EXPORT_SYMBOL(RTLdrLinkAddressToSegOffset); 455 456 457 RTDECL(int) RTLdrLinkAddressToRva(RTLDRMOD hLdrMod, RTLDRADDR LinkAddress, PRTLDRADDR pRva) 458 { 459 LogFlow(("RTLdrLinkAddressToRva: hLdrMod=%RTldrm LinkAddress=%RTptr pRva=%p\n", 460 hLdrMod, LinkAddress, pRva)); 461 462 /* 463 * Validate input. 464 */ 465 AssertMsgReturn(rtldrIsValid(hLdrMod), ("hLdrMod=%p\n", hLdrMod), VERR_INVALID_HANDLE); 466 AssertPtrReturn(pRva, VERR_INVALID_POINTER); 467 468 PRTLDRMODINTERNAL pMod = (PRTLDRMODINTERNAL)hLdrMod; 469 //AssertMsgReturn(pMod->eState == LDR_STATE_OPENED, ("eState=%d\n", pMod->eState), VERR_WRONG_ORDER); 470 471 *pRva = ~(RTLDRADDR)0; 472 473 /* 474 * Do it. 475 */ 476 int rc; 477 if (pMod->pOps->pfnLinkAddressToRva) 478 rc = pMod->pOps->pfnLinkAddressToRva(pMod, LinkAddress, pRva); 479 else 480 rc = VERR_NOT_SUPPORTED; 481 482 LogFlow(("RTLdrLinkAddressToRva: returns %Rrc %RTptr\n", rc, *pRva)); 483 return rc; 484 } 485 RT_EXPORT_SYMBOL(RTLdrLinkAddressToRva); 486 487 488 RTDECL(int) RTLdrSegOffsetToRva(RTLDRMOD hLdrMod, uint32_t iSeg, RTLDRADDR offSeg, PRTLDRADDR pRva) 489 { 490 LogFlow(("RTLdrSegOffsetToRva: hLdrMod=%RTldrm LinkAddress=%RTptr iSeg=%#x offSeg=%RTptr pRva=%p\n", 491 hLdrMod, iSeg, offSeg, pRva)); 492 493 /* 494 * Validate input. 495 */ 496 AssertMsgReturn(rtldrIsValid(hLdrMod), ("hLdrMod=%p\n", hLdrMod), VERR_INVALID_HANDLE); 497 AssertPtrReturn(pRva, VERR_INVALID_POINTER); 498 499 PRTLDRMODINTERNAL pMod = (PRTLDRMODINTERNAL)hLdrMod; 500 //AssertMsgReturn(pMod->eState == LDR_STATE_OPENED, ("eState=%d\n", pMod->eState), VERR_WRONG_ORDER); 501 502 *pRva = ~(RTLDRADDR)0; 503 504 /* 505 * Do it. 506 */ 507 int rc; 508 if (pMod->pOps->pfnSegOffsetToRva) 509 rc = pMod->pOps->pfnSegOffsetToRva(pMod, iSeg, offSeg, pRva); 510 else 511 rc = VERR_NOT_SUPPORTED; 512 513 LogFlow(("RTLdrSegOffsetToRva: returns %Rrc %RTptr\n", rc, *pRva)); 514 return rc; 515 } 516 RT_EXPORT_SYMBOL(RTLdrSegOffsetToRva); 517 518 RTDECL(int) RTLdrRvaToSegOffset(RTLDRMOD hLdrMod, RTLDRADDR Rva, uint32_t *piSeg, PRTLDRADDR poffSeg) 519 { 520 LogFlow(("RTLdrRvaToSegOffset: hLdrMod=%RTldrm Rva=%RTptr piSeg=%p poffSeg=%p\n", 521 hLdrMod, Rva, piSeg, poffSeg)); 522 523 /* 524 * Validate input. 525 */ 526 AssertMsgReturn(rtldrIsValid(hLdrMod), ("hLdrMod=%p\n", hLdrMod), VERR_INVALID_HANDLE); 527 AssertPtrReturn(piSeg, VERR_INVALID_POINTER); 528 AssertPtrReturn(poffSeg, VERR_INVALID_POINTER); 529 530 PRTLDRMODINTERNAL pMod = (PRTLDRMODINTERNAL)hLdrMod; 531 //AssertMsgReturn(pMod->eState == LDR_STATE_OPENED, ("eState=%d\n", pMod->eState), VERR_WRONG_ORDER); 532 533 *piSeg = UINT32_MAX; 534 *poffSeg = ~(RTLDRADDR)0; 535 536 /* 537 * Do it. 538 */ 539 int rc; 540 if (pMod->pOps->pfnRvaToSegOffset) 541 rc = pMod->pOps->pfnRvaToSegOffset(pMod, Rva, piSeg, poffSeg); 542 else 543 rc = VERR_NOT_SUPPORTED; 544 545 LogFlow(("RTLdrRvaToSegOffset: returns %Rrc %#x:%RTptr\n", rc, *piSeg, *poffSeg)); 546 return rc; 547 } 548 RT_EXPORT_SYMBOL(RTLdrRvaToSegOffset); 549 550 -
trunk/src/VBox/Runtime/common/ldr/ldrNative.cpp
r38547 r38581 69 69 rtldrNativeEnumSymbols, 70 70 /* ext: */ 71 NULL, 72 NULL, 73 NULL, 74 NULL, 71 75 NULL, 72 76 NULL, -
trunk/src/VBox/Runtime/common/ldr/ldrPE.cpp
r38547 r38581 783 783 784 784 785 /** @copydoc RTLDROPS::pfnLinkAddressToSegOffset. */ 786 static DECLCALLBACK(int) rtldrPE_LinkAddressToSegOffset(PRTLDRMODINTERNAL pMod, RTLDRADDR LinkAddress, 787 uint32_t *piSeg, PRTLDRADDR poffSeg) 788 { 789 return VERR_NOT_IMPLEMENTED; 790 } 791 792 793 /** @copydoc RTLDROPS::pfnLinkAddressToRva. */ 794 static DECLCALLBACK(int) rtldrPE_LinkAddressToRva(PRTLDRMODINTERNAL pMod, RTLDRADDR LinkAddress, PRTLDRADDR pRva) 795 { 796 return VERR_NOT_IMPLEMENTED; 797 } 798 799 800 /** @copydoc RTLDROPS::pfnSegOffsetToRva. */ 801 static DECLCALLBACK(int) rtldrPE_SegOffsetToRva(PRTLDRMODINTERNAL pMod, uint32_t iSeg, RTLDRADDR offSeg, 802 PRTLDRADDR pRva) 803 { 804 return VERR_NOT_IMPLEMENTED; 805 } 806 807 808 /** @copydoc RTLDROPS::pfnRvaToSegOffset. */ 809 static DECLCALLBACK(int) rtldrPE_RvaToSegOffset(PRTLDRMODINTERNAL pMod, RTLDRADDR Rva, 810 uint32_t *piSeg, PRTLDRADDR poffSeg) 811 { 812 return VERR_NOT_IMPLEMENTED; 813 } 814 815 785 816 /** @copydoc RTLDROPS::pfnDone */ 786 817 static DECLCALLBACK(int) rtldrPEDone(PRTLDRMODINTERNAL pMod) … … 843 874 rtldrPE_EnumDbgInfo, 844 875 rtldrPE_EnumSegments, 876 rtldrPE_LinkAddressToSegOffset, 877 rtldrPE_LinkAddressToRva, 878 rtldrPE_SegOffsetToRva, 879 rtldrPE_RvaToSegOffset, 845 880 42 846 881 }, … … 868 903 rtldrPE_EnumDbgInfo, 869 904 rtldrPE_EnumSegments, 905 rtldrPE_LinkAddressToSegOffset, 906 rtldrPE_LinkAddressToRva, 907 rtldrPE_SegOffsetToRva, 908 rtldrPE_RvaToSegOffset, 870 909 42 871 910 }, -
trunk/src/VBox/Runtime/common/ldr/ldrkStuff.cpp
r38547 r38581 683 683 684 684 685 /** @copydoc RTLDROPS::pfnLinkAddressToSegOffset. */ 686 static DECLCALLBACK(int) rtkldr_LinkAddressToSegOffset(PRTLDRMODINTERNAL pMod, RTLDRADDR LinkAddress, 687 uint32_t *piSeg, PRTLDRADDR poffSeg) 688 { 689 PRTLDRMODKLDR pThis = (PRTLDRMODKLDR)pMod; 690 uint32_t const cSegments = pThis->pMod->cSegments; 691 PCKLDRSEG paSegments = &pThis->pMod->aSegments[0]; 692 693 for (uint32_t iSeg = 0; iSeg < cSegments; iSeg++) 694 { 695 KLDRADDR offSeg = LinkAddress - paSegments[iSeg].LinkAddress; 696 if ( offSeg < paSegments[iSeg].cbMapped 697 || offSeg < paSegments[iSeg].cb) 698 { 699 *piSeg = iSeg; 700 *poffSeg = offSeg; 701 return VINF_SUCCESS; 702 } 703 } 704 705 return VERR_LDR_INVALID_LINK_ADDRESS; 706 } 707 708 709 /** @copydoc RTLDROPS::pfnLinkAddressToRva. */ 710 static DECLCALLBACK(int) rtkldr_LinkAddressToRva(PRTLDRMODINTERNAL pMod, RTLDRADDR LinkAddress, PRTLDRADDR pRva) 711 { 712 PRTLDRMODKLDR pThis = (PRTLDRMODKLDR)pMod; 713 uint32_t const cSegments = pThis->pMod->cSegments; 714 PCKLDRSEG paSegments = &pThis->pMod->aSegments[0]; 715 716 for (uint32_t iSeg = 0; iSeg < cSegments; iSeg++) 717 { 718 KLDRADDR offSeg = LinkAddress - paSegments[iSeg].LinkAddress; 719 if ( offSeg < paSegments[iSeg].cbMapped 720 || offSeg < paSegments[iSeg].cb) 721 { 722 *pRva = paSegments[iSeg].RVA + offSeg; 723 return VINF_SUCCESS; 724 } 725 } 726 727 return VERR_LDR_INVALID_RVA; 728 } 729 730 731 /** @copydoc RTLDROPS::pfnSegOffsetToRva. */ 732 static DECLCALLBACK(int) rtkldr_SegOffsetToRva(PRTLDRMODINTERNAL pMod, uint32_t iSeg, RTLDRADDR offSeg, 733 PRTLDRADDR pRva) 734 { 735 PRTLDRMODKLDR pThis = (PRTLDRMODKLDR)pMod; 736 737 if (iSeg >= pThis->pMod->cSegments) 738 return VERR_LDR_INVALID_SEG_OFFSET; 739 PCKLDRSEG const pSegment = &pThis->pMod->aSegments[iSeg]; 740 741 if ( offSeg > pSegment->cbMapped 742 && offSeg > pSegment->cb 743 && ( pSegment->cbFile < 0 744 || offSeg > (uint64_t)pSegment->cbFile)) 745 return VERR_LDR_INVALID_SEG_OFFSET; 746 747 *pRva = pSegment->RVA + offSeg; 748 return VINF_SUCCESS; 749 } 750 751 752 /** @copydoc RTLDROPS::pfnRvaToSegOffset. */ 753 static DECLCALLBACK(int) rtkldr_RvaToSegOffset(PRTLDRMODINTERNAL pMod, RTLDRADDR Rva, 754 uint32_t *piSeg, PRTLDRADDR poffSeg) 755 { 756 PRTLDRMODKLDR pThis = (PRTLDRMODKLDR)pMod; 757 uint32_t const cSegments = pThis->pMod->cSegments; 758 PCKLDRSEG paSegments = &pThis->pMod->aSegments[0]; 759 760 for (uint32_t iSeg = 0; iSeg < cSegments; iSeg++) 761 { 762 KLDRADDR offSeg = Rva - paSegments[iSeg].RVA; 763 if ( offSeg < paSegments[iSeg].cbMapped 764 || offSeg < paSegments[iSeg].cb) 765 { 766 *piSeg = iSeg; 767 *poffSeg = offSeg; 768 return VINF_SUCCESS; 769 } 770 } 771 772 return VERR_LDR_INVALID_RVA; 773 } 774 775 685 776 /** 686 777 * Operations for a kLdr module. … … 700 791 rtkldr_EnumDbgInfo, 701 792 rtkldr_EnumSegments, 793 rtkldr_LinkAddressToSegOffset, 794 rtkldr_LinkAddressToRva, 795 rtkldr_SegOffsetToRva, 796 rtkldr_RvaToSegOffset, 702 797 42 703 798 };
Note:
See TracChangeset
for help on using the changeset viewer.