Changeset 52405 in vbox for trunk/src/VBox/Runtime/common/ldr
- Timestamp:
- Aug 19, 2014 1:50:00 AM (11 years ago)
- svn:sync-xref-src-repo-rev:
- 95567
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/common/ldr/ldrPE.cpp
r52403 r52405 108 108 /** The image timestamp. */ 109 109 uint32_t uTimestamp; 110 /** The number of imports. UINT32_MAX if not determined. */ 111 uint32_t cImports; 110 112 /** Set if the image is 64-bit, clear if 32-bit. */ 111 113 bool f64Bit; … … 619 621 pImps++) 620 622 { 623 AssertReturn(pImps->Name < pModPe->cbImage, VERR_BAD_EXE_FORMAT); 621 624 const char *pszModName = PE_RVA2TYPE(pvBitsR, pImps->Name, const char *); 622 PIMAGE_THUNK_DATA32 pFirstThunk; /* update this. */ 623 PIMAGE_THUNK_DATA32 pThunk; /* read from this. */ 625 AssertReturn(pImps->FirstThunk < pModPe->cbImage, VERR_BAD_EXE_FORMAT); 626 AssertReturn(pImps->u.OriginalFirstThunk < pModPe->cbImage, VERR_BAD_EXE_FORMAT); 627 624 628 Log3(("RTLdrPE: Import descriptor: %s\n", pszModName)); 625 629 Log4(("RTLdrPE: OriginalFirstThunk = %#RX32\n" … … 634 638 * Walk the thunks table(s). 635 639 */ 636 pFirstThunk = PE_RVA2TYPE(pvBitsW, pImps->FirstThunk, PIMAGE_THUNK_DATA32);637 pThunk = pImps->u.OriginalFirstThunk == 0638 ? PE_RVA2TYPE(pvBitsR, pImps->FirstThunk, PIMAGE_THUNK_DATA32)639 : PE_RVA2TYPE(pvBitsR, pImps->u.OriginalFirstThunk, PIMAGE_THUNK_DATA32);640 PIMAGE_THUNK_DATA32 pFirstThunk = PE_RVA2TYPE(pvBitsW, pImps->FirstThunk, PIMAGE_THUNK_DATA32); /* update this. */ 641 PIMAGE_THUNK_DATA32 pThunk = pImps->u.OriginalFirstThunk == 0 /* read from this. */ 642 ? PE_RVA2TYPE(pvBitsR, pImps->FirstThunk, PIMAGE_THUNK_DATA32) 643 : PE_RVA2TYPE(pvBitsR, pImps->u.OriginalFirstThunk, PIMAGE_THUNK_DATA32); 640 644 while (!rc && pThunk->u1.Ordinal != 0) 641 645 { … … 694 698 pImps++) 695 699 { 696 const char * pszModName = PE_RVA2TYPE(pvBitsR, pImps->Name, const char *); 697 PIMAGE_THUNK_DATA64 pFirstThunk; /* update this. */ 698 PIMAGE_THUNK_DATA64 pThunk; /* read from this. */ 700 AssertReturn(pImps->Name < pModPe->cbImage, VERR_BAD_EXE_FORMAT); 701 const char *pszModName = PE_RVA2TYPE(pvBitsR, pImps->Name, const char *); 702 AssertReturn(pImps->FirstThunk < pModPe->cbImage, VERR_BAD_EXE_FORMAT); 703 AssertReturn(pImps->u.OriginalFirstThunk < pModPe->cbImage, VERR_BAD_EXE_FORMAT); 704 699 705 Log3(("RTLdrPE: Import descriptor: %s\n", pszModName)); 700 706 Log4(("RTLdrPE: OriginalFirstThunk = %#RX32\n" … … 709 715 * Walk the thunks table(s). 710 716 */ 711 pFirstThunk = PE_RVA2TYPE(pvBitsW, pImps->FirstThunk, PIMAGE_THUNK_DATA64);712 pThunk = pImps->u.OriginalFirstThunk == 0713 ? PE_RVA2TYPE(pvBitsR, pImps->FirstThunk, PIMAGE_THUNK_DATA64)714 : PE_RVA2TYPE(pvBitsR, pImps->u.OriginalFirstThunk, PIMAGE_THUNK_DATA64);717 PIMAGE_THUNK_DATA64 pFirstThunk = PE_RVA2TYPE(pvBitsW, pImps->FirstThunk, PIMAGE_THUNK_DATA64); /* update this. */ 718 PIMAGE_THUNK_DATA64 pThunk = pImps->u.OriginalFirstThunk == 0 /* read from this. */ 719 ? PE_RVA2TYPE(pvBitsR, pImps->FirstThunk, PIMAGE_THUNK_DATA64) 720 : PE_RVA2TYPE(pvBitsR, pImps->u.OriginalFirstThunk, PIMAGE_THUNK_DATA64); 715 721 while (!rc && pThunk->u1.Ordinal != 0) 716 722 { … … 1729 1735 } 1730 1736 1737 1738 /** 1739 * Worker for rtLdrPE_QueryProp and rtLdrPE_QueryImportModule that counts the 1740 * number of imports, storing the result in RTLDRMODPE::cImports. 1741 * 1742 * @returns IPRT status code. 1743 * @param pThis The PE module instance. 1744 * @param pvBits Image bits if the caller had them available, NULL if 1745 * not. Saves a couple of file accesses. 1746 */ 1747 static int rtLdrPE_CountImports(PRTLDRMODPE pThis, void const *pvBits) 1748 { 1749 PCIMAGE_IMPORT_DESCRIPTOR paImpDescs; 1750 int rc = rtldrPEReadPartByRva(pThis, pvBits, pThis->ImportDir.VirtualAddress, pThis->ImportDir.Size, 1751 (void const **)&paImpDescs); 1752 if (RT_SUCCESS(rc)) 1753 { 1754 uint32_t const cMax = pThis->ImportDir.Size / sizeof(IMAGE_IMPORT_DESCRIPTOR); 1755 uint32_t i = 0; 1756 while ( i < cMax 1757 && paImpDescs[i].Name > pThis->offNtHdrs 1758 && paImpDescs[i].Name < pThis->cbImage 1759 && paImpDescs[i].FirstThunk > pThis->offNtHdrs 1760 && paImpDescs[i].FirstThunk < pThis->cbImage) 1761 i++; 1762 pThis->cImports = i; 1763 1764 rtldrPEFreePart(pThis, pvBits, paImpDescs); 1765 } 1766 return rc; 1767 } 1768 1769 1731 1770 /** 1732 1771 * Worker for rtLdrPE_QueryProp that retrievs the name of an import DLL. … … 1747 1786 { 1748 1787 /* 1788 * Make sure we got the import count. 1789 */ 1790 int rc; 1791 if (pThis->cImports == UINT32_MAX) 1792 { 1793 rc = rtLdrPE_CountImports(pThis, pvBits); 1794 if (RT_FAILURE(rc)) 1795 return rc; 1796 } 1797 1798 /* 1749 1799 * Check the index first, converting it to an RVA. 1750 1800 */ 1751 int rc; 1752 if (iImport < pThis->ImportDir.Size / sizeof(IMAGE_IMPORT_DESCRIPTOR)) 1801 if (iImport < pThis->cImports) 1753 1802 { 1754 1803 uint32_t offEntry = iImport * sizeof(IMAGE_IMPORT_DESCRIPTOR) + pThis->ImportDir.VirtualAddress; … … 1866 1915 Assert(cbBuf == sizeof(uint32_t)); 1867 1916 Assert(*pcbRet == cbBuf); 1868 *(uint32_t *)pvBuf = pModPe->ImportDir.Size / sizeof(IMAGE_IMPORT_DESCRIPTOR); 1869 if (*(uint32_t *)pvBuf > 0) 1870 *(uint32_t *)pvBuf -= 1; /* The last entry is a NULL entry. */ 1871 /** @todo Is there some linkers out there that doesn't generiate a 1872 * terminator entry? */ 1917 if (pModPe->cImports == UINT32_MAX) 1918 { 1919 int rc = rtLdrPE_CountImports(pModPe, pvBits); 1920 if (RT_FAILURE(rc)) 1921 return rc; 1922 } 1923 *(uint32_t *)pvBuf = pModPe->cImports; 1873 1924 break; 1925 1874 1926 1875 1927 case RTLDRPROP_IMPORT_MODULE: … … 3629 3681 pModPe->cbHeaders = OptHdr.SizeOfHeaders; 3630 3682 pModPe->uTimestamp = FileHdr.TimeDateStamp; 3683 pModPe->cImports = UINT32_MAX; 3631 3684 pModPe->f64Bit = FileHdr.SizeOfOptionalHeader == sizeof(OptHdr); 3632 3685 pModPe->ImportDir = OptHdr.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT];
Note:
See TracChangeset
for help on using the changeset viewer.