Changeset 2855 for trunk/kLdr/kLdrModPE.c
- Timestamp:
- Nov 4, 2006, 3:30:19 AM (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kLdr/kLdrModPE.c
r2854 r2855 99 99 static int kldrModPEQueryForwarder(PKLDRMODPE pModPE, const void *pvBits, const char *pszForwarder, 100 100 PFNKLDRMODGETIMPORT pfnGetImport, void *pvUser, PKLDRADDR puValue, uint32_t *pfKind); 101 static int32_t kldrModPENumberOfImports(PKLDRMOD pMod, const void *pvBits); 101 102 102 103 … … 643 644 { 644 645 const IMAGE_IMPORT_DESCRIPTOR *paImpDir; 645 uint32_t cImpModules;646 646 uint32_t iImpModule; 647 647 uint32_t cchImpModule; … … 718 718 * entry for the module... not sure if this is right though. 719 719 */ 720 cImpModules = pModPE->Hdrs.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size 721 / sizeof(IMAGE_IMPORT_DESCRIPTOR); 720 if ( !pModPE->Hdrs.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size 721 || !pModPE->Hdrs.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress) 722 return KLDR_ERR_PE_FORWARDER_IMPORT_NOT_FOUND; 722 723 paImpDir = KLDRMODPE_RVA2TYPE(pvBits, 723 724 pModPE->Hdrs.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress, 724 725 const IMAGE_IMPORT_DESCRIPTOR *); 725 for (iImpModule = 0; iImpModule < cImpModules; cImpModules++) 726 { 727 const char *pszName = KLDRMODPE_RVA2TYPE(pvBits, paImpDir[iImpModule].Name, const char *); 728 const size_t cchName = kLdrHlpStrLen(pszName); 726 727 kldrModPENumberOfImports(pModPE->pMod, pvBits); 728 for (iImpModule = 0; iImpModule < pModPE->cImportModules; iImpModule++) 729 { 730 const char *pszName = KLDRMODPE_RVA2TYPE(pvBits, paImpDir[iImpModule].Name, const char *); 731 size_t cchName = kLdrHlpStrLen(pszName); 729 732 if ( ( cchName == cchImpModule 730 733 || ( cchName > cchImpModule … … 736 739 && kLdrHlpMemIComp(pszName, pszForwarder, cchImpModule) 737 740 ) 738 break; 739 } 740 if (iImpModule >= cImpModules) 741 return KLDR_ERR_PE_FORWARDER_IMPORT_NOT_FOUND; 742 743 /* 744 * Now the rest is up to the callback (almost). 745 */ 746 rc = pfnGetForwarder(pModPE->pMod, iImpModule, uSymbol, pszSymbol, puValue, pfKind, pvUser); 747 if (!rc && pfKind) 748 *pfKind |= KLDRSYMKIND_FORWARDER; 749 return rc; 741 { 742 /* 743 * Now the rest is up to the callback (almost). 744 */ 745 rc = pfnGetForwarder(pModPE->pMod, iImpModule, uSymbol, pszSymbol, puValue, pfKind, pvUser); 746 if (!rc && pfKind) 747 *pfKind |= KLDRSYMKIND_FORWARDER; 748 return rc; 749 } 750 } 751 return KLDR_ERR_PE_FORWARDER_IMPORT_NOT_FOUND; 750 752 } 751 753 … … 831 833 832 834 /** @copydoc kLdrModGetImport */ 833 int (* pfnGetImport)(PKLDRMOD pMod, void *pvBits, uint32_t iImport, const char *pszName, size_t cchName); 835 static int kldrModPEGetImport(PKLDRMOD pMod, void *pvBits, uint32_t iImport, char *pszName, size_t cchName) 836 { 837 PKLDRMODPE pModPE = (PKLDRMODPE)pMod->pvData; 838 const IMAGE_IMPORT_DESCRIPTOR *pImpDesc; 839 const char *pszImportName; 840 size_t cchImportName; 841 int rc; 842 843 /* 844 * Make sure we've got mapped bits and resolve any base address aliases. 845 */ 846 rc = kldrModPEBitsAndBaseAddress(pModPE, &pvBits, NULL); 847 if (rc) 848 return rc; 849 850 /* 851 * Simple bounds check. 852 */ 853 if (iImport >= (uint32_t)kldrModPENumberOfImports(pMod, pvBits)) 854 return KLDR_ERR_IMPORT_ORDINAL_OUT_OF_BOUNDS; 855 856 /* 857 * Get the name. 858 */ 859 pImpDesc = KLDRMODPE_RVA2TYPE(pvBits, 860 pModPE->Hdrs.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress 861 + sizeof(IMAGE_IMPORT_DESCRIPTOR) * iImport, 862 const IMAGE_IMPORT_DESCRIPTOR *); 863 pszImportName = KLDRMODPE_RVA2TYPE(pvBits, pImpDesc->Name, const char *); 864 cchImportName = strlen(pszImportName); 865 if (cchImportName < cchName) 866 { 867 kLdrHlpMemCopy(pszName, pszImportName, cchImportName + 1); 868 rc = 0; 869 } 870 else 871 { 872 kLdrHlpMemCopy(pszName, pszImportName, cchName); 873 if (cchName) 874 pszName[cchName - 1] = '\0'; 875 rc = KLDR_ERR_BUFFER_OVERFLOW; 876 } 877 878 return rc; 879 } 880 881 834 882 /** @copydoc kLdrModNumberOfImports */ 835 int32_t (* pfnNumberOfImports)(PKLDRMOD pMod, void *pvBits); 836 /** @copydoc kLdrModCanExecuteOn */ 837 int (* pfnCanExecuteOn)(PKLDRMOD pMod, void *pvBits, KLDRARCH enmArch, KLDRCPU enmCpu); 883 static int32_t kldrModPENumberOfImports(PKLDRMOD pMod, const void *pvBits) 884 { 885 PKLDRMODPE pModPE = (PKLDRMODPE)pMod->pvData; 886 if (pModPE->cImportModules == ~(uint32_t)0) 887 { 888 /* 889 * We'll have to walk the import descriptors to figure out their number. 890 * First, make sure we've got mapped bits and resolve any base address aliases. 891 */ 892 if (kldrModPEBitsAndBaseAddress(pModPE, &pvBits, NULL)) 893 return -1; 894 pModPE->cImportModules = 0; 895 if ( pModPE->Hdrs.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size 896 && pModPE->Hdrs.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress) 897 { 898 const IMAGE_IMPORT_DESCRIPTOR *pImpDesc; 899 900 pImpDesc = KLDRMODPE_RVA2TYPE(pvBits, 901 pModPE->Hdrs.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress, 902 const IMAGE_IMPORT_DESCRIPTOR *); 903 while (pImpDesc->Name && pImpDesc->FirstThunk) 904 { 905 pModPE->cImportModules = 0; 906 pImpDesc++; 907 } 908 } 909 } 910 return pModPE->cImportModules; 911 } 912 913 838 914 /** @copydoc kLdrModGetStackInfo */ 839 int (* pfnGetStackInfo)(PKLDRMOD pMod, void *pvBits, KLDRADDR BaseAddress, PKLDRSTACKINFO pStackInfo); 915 static int kldrModPEGetStackInfo(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, PKLDRSTACKINFO pStackInfo) 916 { 917 PKLDRMODPE pModPE = (PKLDRMODPE)pMod->pvData; 918 919 pStackInfo->Address = NIL_KLDRADDR; 920 pStackInfo->LinkAddress = NIL_KLDRADDR; 921 pStackInfo->cbStack = pStackInfo->cbStackThread = pModPE->Hdrs.OptionalHeader.SizeOfStackReserve; 922 923 return 0; 924 } 925 926 840 927 /** @copydoc kLdrModQueryMainEntrypoint */ 841 int (* pfnQueryMainEntrypoint)(PKLDRMOD pMod, void *pvBits, KLDRADDR BaseAddress, PKLDRADDR pMainEPAddress); 928 static int kldrModPEQueryMainEntrypoint(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, PKLDRADDR pMainEPAddress) 929 { 930 PKLDRMODPE pModPE = (PKLDRMODPE)pMod->pvData; 931 int rc; 932 933 rc = kldrModPEBitsAndBaseAddress(pModPE, NULL, &BaseAddress); 934 if (rc) 935 return rc; 936 937 *pMainEPAddress = pModPE->Hdrs.OptionalHeader.AddressOfEntryPoint 938 ? BaseAddress + pModPE->Hdrs.OptionalHeader.AddressOfEntryPoint 939 : NIL_KLDRADDR; 940 return 0; 941 } 942 943 842 944 /** @copydoc kLdrModEnumDbgInfo */ 843 int (* pfnEnumDbgInfo)(PKLDRMOD pMod, void *pvBits, PFNKLDRENUMDBG pfnCallback, void *pvUser); 945 int (* pfnEnumDbgInfo)(PKLDRMOD pMod, const void *pvBits, PFNKLDRENUMDBG pfnCallback, void *pvUser); 946 844 947 /** @copydoc kLdrModHasDbgInfo */ 845 int (* pfnHasDbgInfo)(PKLDRMOD pMod, void *pvBits);948 int (* pfnHasDbgInfo)(PKLDRMOD pMod, const void *pvBits); 846 949 /** @copydoc kLdrModMap */ 847 950 int (* pfnMap)(PKLDRMOD pMod);
Note:
See TracChangeset
for help on using the changeset viewer.