Changeset 2891 for trunk/kLdr/kLdrModPE.c
- Timestamp:
- Nov 21, 2006, 10:40:45 PM (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kLdr/kLdrModPE.c
r2883 r2891 685 685 /** @copydoc kLdrModQuerySymbol */ 686 686 static int kldrModPEQuerySymbol(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, uint32_t iSymbol, 687 const char *pszSymbol, PFNKLDRMODGETIMPORT pfnGetForwarder, void *pvUser, 688 PKLDRADDR puValue, uint32_t *pfKind) 687 const char *pchSymbol, size_t cchSymbol, const char *pszVersion, 688 PFNKLDRMODGETIMPORT pfnGetForwarder, void *pvUser, PKLDRADDR puValue, uint32_t *pfKind) 689 689 690 { 690 691 PKLDRMODPE pModPE = (PKLDRMODPE)pMod->pvData; … … 704 705 < sizeof(IMAGE_EXPORT_DIRECTORY)) 705 706 return KLDR_ERR_SYMBOL_NOT_FOUND; 707 if (pszVersion && *pszVersion) 708 return KLDR_ERR_SYMBOL_NOT_FOUND; 706 709 707 710 pExpDir = KLDRMODPE_RVA2TYPE(pvBits, 708 711 pModPE->Hdrs.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress, 709 712 PIMAGE_EXPORT_DIRECTORY); 710 if (!p szSymbol)713 if (!pchSymbol) 711 714 { 712 715 /* … … 742 745 { 743 746 pszName = KLDRMODPE_RVA2TYPE(pvBits, paRVANames[i], const char *); 744 KLDRMODPE_ASSERT(kLdrHlpStr Comp(pszName, pszSymbol));747 KLDRMODPE_ASSERT(kLdrHlpStrNComp(pszName, pchSymbol, cchSymbol) || pszName[cchSymbol]); 745 748 KLDRMODPE_ASSERT(i == 0 || kLdrHlpStrComp(pszName, KLDRMODPE_RVA2TYPE(pvBits, paRVANames[i - 1], const char *))); 746 749 } … … 751 754 i = (iEnd - iStart) / 2 + iStart; 752 755 pszName = KLDRMODPE_RVA2TYPE(pvBits, paRVANames[i - 1], const char *); 753 diff = kLdrHlpStrComp(pszName, pszSymbol); 756 diff = kLdrHlpStrNComp(pszName, pchSymbol, cchSymbol); 757 if (!diff) 758 diff = pszName[cchSymbol] - 0; 754 759 if (diff < 0) 755 760 iStart = i + 1; /* The symbol must be after the current name. */ … … 906 911 * Now the rest is up to the callback (almost). 907 912 */ 908 rc = pfnGetForwarder(pModPE->pMod, iImpModule, iSymbol, pszSymbol, puValue, pfKind, pvUser); 913 rc = pfnGetForwarder(pModPE->pMod, iImpModule, iSymbol, pszSymbol, 914 pszSymbol ? kLdrHlpStrLen(pszSymbol) : 0, NULL, puValue, pfKind, pvUser); 909 915 if (!rc && pfKind) 910 916 *pfKind |= KLDRSYMKIND_FORWARDER; … … 972 978 for (iName = 0; iName < cNames; iName++) 973 979 { 980 const char *pszName; 974 981 if (paOrdinals[iName] != iFunction) 975 982 continue; 976 983 fFoundName = 1; 977 rc = pfnCallback(pMod, iFunction + pExpDir->Base, KLDRMODPE_RVA2TYPE(pvBits, paRVANames[iName], const char *), 984 pszName = KLDRMODPE_RVA2TYPE(pvBits, paRVANames[iName], const char *); 985 rc = pfnCallback(pMod, iFunction + pExpDir->Base, pszName, kLdrHlpStrLen(pszName), NULL, 978 986 uValue, fKind, pvUser); 979 987 if (rc) … … 986 994 if (!fFoundName) 987 995 { 988 rc = pfnCallback(pMod, iFunction + pExpDir->Base, NULL, uValue, fKind, pvUser);996 rc = pfnCallback(pMod, iFunction + pExpDir->Base, NULL, 0, NULL, uValue, fKind, pvUser); 989 997 if (rc) 990 998 return rc; … … 1575 1583 /* Ordinal or name import? */ 1576 1584 if (IMAGE_SNAP_BY_ORDINAL32(pThunk->u1.Ordinal)) 1577 rc = pfnGetImport(pMod, iImp, IMAGE_ORDINAL32(pThunk->u1.Ordinal), NULL, &Value, &fKind, pvUser);1585 rc = pfnGetImport(pMod, iImp, IMAGE_ORDINAL32(pThunk->u1.Ordinal), NULL, 0, NULL, &Value, &fKind, pvUser); 1578 1586 else if (KLDRMODPE_VALID_RVA(pModPE, pThunk->u1.Ordinal)) 1579 1587 { 1580 1588 const IMAGE_IMPORT_BY_NAME *pName = KLDRMODPE_RVA2TYPE(pvMapping, pThunk->u1.Ordinal, const IMAGE_IMPORT_BY_NAME *); 1581 rc = pfnGetImport(pMod, iImp, NIL_KLDRMOD_SYM_ORDINAL, (const char *)pName->Name, &Value, &fKind, pvUser); 1589 rc = pfnGetImport(pMod, iImp, NIL_KLDRMOD_SYM_ORDINAL, (const char *)pName->Name, 1590 kLdrHlpStrLen((const char *)pName->Name), NULL, &Value, &fKind, pvUser); 1582 1591 } 1583 1592 else … … 1640 1649 /* Ordinal or name import? */ 1641 1650 if (IMAGE_SNAP_BY_ORDINAL64(pThunk->u1.Ordinal)) 1642 rc = pfnGetImport(pMod, iImp, (uint32_t)IMAGE_ORDINAL64(pThunk->u1.Ordinal), NULL, &Value, &fKind, pvUser);1651 rc = pfnGetImport(pMod, iImp, (uint32_t)IMAGE_ORDINAL64(pThunk->u1.Ordinal), NULL, 0, NULL, &Value, &fKind, pvUser); 1643 1652 else if (KLDRMODPE_VALID_RVA(pModPE, pThunk->u1.Ordinal)) 1644 rc = pfnGetImport(pMod, iImp, NIL_KLDRMOD_SYM_ORDINAL, 1645 KLDRMODPE_RVA2TYPE(pvMapping, pThunk->u1.Ordinal, const char *), 1646 &Value, &fKind, pvUser); 1653 { 1654 const IMAGE_IMPORT_BY_NAME *pName = KLDRMODPE_RVA2TYPE(pvMapping, pThunk->u1.Ordinal, const IMAGE_IMPORT_BY_NAME *); 1655 rc = pfnGetImport(pMod, iImp, NIL_KLDRMOD_SYM_ORDINAL, (const char *)pName->Name, 1656 kLdrHlpStrLen((const char *)pName->Name), NULL, &Value, &fKind, pvUser); 1657 } 1647 1658 else 1648 1659 { … … 1944 1955 kldrModPEGetStackInfo, 1945 1956 kldrModPEQueryMainEntrypoint, 1957 NULL, /** @todo resources */ 1958 NULL, /** @todo resources */ 1946 1959 kldrModPEEnumDbgInfo, 1947 1960 kldrModPEHasDbgInfo, … … 1958 1971 kldrModPEGetBits, 1959 1972 kldrModPERelocateBits, 1973 NULL, /** @todo mostly done */ 1960 1974 42 /* the end */ 1961 1975 };
Note:
See TracChangeset
for help on using the changeset viewer.