Changeset 2891
- Timestamp:
- Nov 21, 2006, 10:40:45 PM (19 years ago)
- Location:
- trunk/kLdr
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kLdr/kLdr.h
r2889 r2891 603 603 /** Forwarder symbol. */ 604 604 #define KLDRSYMKIND_FORWARDER 0x00000200 605 /** Request a flat symbol address. */ 606 #define KLDRSYMKIND_REQ_FLAT 0x00000000 607 /** Request a segmented symbol address. */ 608 #define KLDRSYMKIND_REQ_SEGMENTED 0x40000000 605 609 /** @} */ 606 610 … … 621 625 * @param iImport The import module ordinal number or NIL_KLDRMOD_IMPORT. 622 626 * @param iSymbol The symbol ordinal number or NIL_KLDRMOD_SYM_ORDINAL. 623 * @param pszSymbol The symbol name. Can be NULL if iSymbol isn't nil. 627 * @param pchSymbol The symbol name. Can be NULL if iSymbol isn't nil. Doesn't have to be null-terminated. 628 * @param cchSymbol The length of the symbol. 629 * @param pszVersion The symbol version. NULL if not versioned. 624 630 * @param puValue Where to store the symbol value. 625 631 * @param pfKind Where to store the symbol kind flags. 626 632 * @param pvUser The user parameter specified to the relocation function. 627 633 */ 628 typedef int FNKLDRMODGETIMPORT(PKLDRMOD pMod, uint32_t iImport, uint32_t iSymbol, const char *p szSymbol,629 PKLDRADDR puValue, uint32_t *pfKind, void *pvUser);634 typedef int FNKLDRMODGETIMPORT(PKLDRMOD pMod, uint32_t iImport, uint32_t iSymbol, const char *pchSymbol, size_t cchSymbol, 635 const char *pszVersion, PKLDRADDR puValue, uint32_t *pfKind, void *pvUser); 630 636 /** Pointer to a import callback. */ 631 637 typedef FNKLDRMODGETIMPORT *PFNKLDRMODGETIMPORT; … … 639 645 * @param pMod The module which symbols are being enumerated.s 640 646 * @param iSymbol The symbol ordinal number or NIL_KLDRMOD_SYM_ORDINAL. 641 * @param p szSymbol The symbol name. This can be NULL if there is a symbol ordinal.647 * @param pchSymbol The symbol name. This can be NULL if there is a symbol ordinal. 642 648 * This can also be an empty string if the symbol doesn't have a name 643 649 * or it's name has been stripped. 650 * Important, this doesn't have to be a null-terminated string. 651 * @param cchSymbol The length of the symbol. 652 * @param pszVersion The symbol version. NULL if not versioned. 644 653 * @param uValue The symbol value. 645 654 * @param fKind The symbol kind flags. 646 655 * @param pvUser The user parameter specified to kLdrModEnumSymbols(). 647 656 */ 648 typedef int FNKLDRMODENUMSYMS(PKLDRMOD pMod, uint32_t iSymbol, const char *p szSymbol,657 typedef int FNKLDRMODENUMSYMS(PKLDRMOD pMod, uint32_t iSymbol, const char *pchSymbol, size_t cchSymbol, const char *pszVersion, 649 658 KLDRADDR uValue, uint32_t fKind, void *pvUser); 650 659 /** Pointer to a symbol enumerator callback. */ … … 672 681 typedef int FNKLDRENUMDBG(PKLDRMOD pMod, uint32_t iDbgInfo, KLDRDBGINFOTYPE enmType, int16_t iMajorVer, int16_t iMinorVer, 673 682 off_t offFile, KLDRADDR LinkAddress, KLDRSIZE cb, const char *pszExtFile, void *pvUser); 674 /** Pointer to a debug info enum berator callback. */683 /** Pointer to a debug info enumerator callback. */ 675 684 typedef FNKLDRENUMDBG *PFNKLDRENUMDBG; 685 686 /** 687 * Resource enumerator callback. 688 * 689 * @returns 0 to continue the enumeration. 690 * @returns non-zero if the enumeration should stop. This status code will then be returned by kLdrModEnumResources(). 691 * 692 * @param pMod The module. 693 * @param idType The resource type id. NIL_KLDRMOD_RSRC_TYPE_ID if no type id. 694 * @param pszType The resource type name. NULL if no type name. 695 * @param idName The resource id. NIL_KLDRMOD_RSRC_NAME_ID if no id. 696 * @param pszName The resource name. NULL if no name. 697 * @param idLang The language id. 698 * @param AddrRsrc The address value for the resource. 699 * @param cbRsrc The size of the resource. 700 * @param pvUser The user parameter specified to kLdrModEnumDbgInfo. 701 */ 702 typedef int FNKLDRENUMRSRC(PKLDRMOD pMod, uint32_t idType, const char *pszType, uint32_t idName, const char *pszName, 703 uint32_t idLang, KLDRADDR AddrRsrc, KLDRSIZE cbRsrc, void *pvUser); 704 /** Pointer to a resource enumerator callback. */ 705 typedef FNKLDRENUMRSRC *PFNKLDRENUMRSRC; 706 707 /** NIL resource name ID. */ 708 #define NIL_KLDRMOD_RSRC_NAME_ID ( ~(uint32_t)0 ) 709 /** NIL resource type ID. */ 710 #define NIL_KLDRMOD_RSRC_TYPE_ID ( ~(uint32_t)0 ) 711 /** @name Language ID 712 * 713 * Except for the special IDs #defined here, the values are considered 714 * format specific for now since it's only used by the PE resources. 715 * 716 * @{ */ 717 /** NIL language ID. */ 718 #define NIL_KLDR_LANG_ID ( ~(uint32_t)0 ) 719 /** Special language id value for matching any language. */ 720 #define KLDR_LANG_ID_ANY ( ~(uint32_t)1 ) 721 /** Special language id value indicating language neutral. */ 722 #define KLDR_LANG_ID_NEUTRAL ( ~(uint32_t)2 ) 723 /** Special language id value indicating user default language. */ 724 #define KLDR_LANG_ID_USER_DEFAULT ( ~(uint32_t)3 ) 725 /** Special language id value indicating system default language. */ 726 #define KLDR_LANG_ID_SYS_DEFAULT ( ~(uint32_t)4 ) 727 /** Special language id value indicating default custom locale. */ 728 #define KLDR_LANG_ID_CUSTOM_DEFAULT ( ~(uint32_t)5 ) 729 /** Special language id value indicating unspecified custom locale. */ 730 #define KLDR_LANG_ID_CUSTOM_UNSPECIFIED ( ~(uint32_t)6 ) 731 /** Special language id value indicating default custom MUI locale. */ 732 #define KLDR_LANG_ID_UI_CUSTOM_DEFAULT ( ~(uint32_t)7 ) 733 /** @} */ 734 676 735 677 736 int kLdrModOpen(const char *pszFilename, PPKLDRMOD ppMod); … … 682 741 683 742 int kLdrModQuerySymbol(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, uint32_t iSymbol, 684 const char *p szSymbol, PFNKLDRMODGETIMPORT pfnGetForwarder, void *pvUser,685 P KLDRADDR puValue, uint32_t *pfKind);743 const char *pchSymbol, size_t cchSymbol, const char *pszVersion, 744 PFNKLDRMODGETIMPORT pfnGetForwarder, void *pvUser, PKLDRADDR puValue, uint32_t *pfKind); 686 745 int kLdrModEnumSymbols(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, 687 746 uint32_t fFlags, PFNKLDRMODENUMSYMS pfnCallback, void *pvUser); … … 691 750 int kLdrModGetStackInfo(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, PKLDRSTACKINFO pStackInfo); 692 751 int kLdrModQueryMainEntrypoint(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, PKLDRADDR pMainEPAddress); 752 int kLdrModQueryResource(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, uint32_t idType, const char *pszType, 753 uint32_t idName, const char *pszName, uint32_t idLang, PKLDRADDR pAddrRsrc, size_t *pcbRsrc); 754 int kLdrModEnumResources(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, uint32_t idType, const char *pszType, 755 uint32_t idName, const char *pszName, uint32_t idLang, PFNKLDRENUMRSRC pfnCallback, void *pvUser); 693 756 int kLdrModEnumDbgInfo(PKLDRMOD pMod, const void *pvBits, PFNKLDRENUMDBG pfnCallback, void *pvUser); 694 757 int kLdrModHasDbgInfo(PKLDRMOD pMod, const void *pvBits); 758 int kLdrModMostlyDone(PKLDRMOD pMod); 759 695 760 696 761 /** @name Operations On The Internally Managed Mapping … … 751 816 /** @copydoc kLdrModQuerySymbol */ 752 817 int (* pfnQuerySymbol)(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, uint32_t iSymbol, 753 const char *p szSymbol, PFNKLDRMODGETIMPORT pfnGetForwarder, void *pvUser,754 P KLDRADDR puValue, uint32_t *pfKind);818 const char *pchSymbol, size_t cchSymbol, const char *pszVersion, 819 PFNKLDRMODGETIMPORT pfnGetForwarder, void *pvUser, PKLDRADDR puValue, uint32_t *pfKind); 755 820 /** @copydoc kLdrModEnumSymbols */ 756 821 int (* pfnEnumSymbols)(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, uint32_t fFlags, … … 766 831 /** @copydoc kLdrModQueryMainEntrypoint */ 767 832 int (* pfnQueryMainEntrypoint)(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, PKLDRADDR pMainEPAddress); 833 /** @copydoc kLdrModQueryResource */ 834 int (* pfnQueryResource)(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, uint32_t idType, const char *pszType, 835 uint32_t idName, const char *pszName, uint32_t idLang, PKLDRADDR pAddrRsrc, size_t *pcbRsrc); 836 /** @copydoc kLdrModEnumResources */ 837 int (* pfnEnumResources)(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, uint32_t idType, const char *pszType, 838 uint32_t idName, const char *pszName, uint32_t idLang, PFNKLDRENUMRSRC pfnCallback, void *pvUser); 768 839 /** @copydoc kLdrModEnumDbgInfo */ 769 840 int (* pfnEnumDbgInfo)(PKLDRMOD pMod, const void *pvBits, PFNKLDRENUMDBG pfnCallback, void *pvUser); … … 795 866 int (* pfnRelocateBits)(PKLDRMOD pMod, void *pvBits, KLDRADDR NewBaseAddress, KLDRADDR OldBaseAddress, 796 867 PFNKLDRMODGETIMPORT pfnGetImport, void *pvUser); 868 /** @copydoc kLdrModMostlyDone */ 869 int (* pfnMostlyDone)(PKLDRMOD pMod); 797 870 /** Dummy which should be assigned a non-zero value. */ 798 871 uint32_t uEndOfStructure; … … 876 949 int kLdrDyldGetName(HKLDRMOD hMod, char *pszName, size_t cchName); 877 950 int kLdrDyldGetFilename(HKLDRMOD hMod, char *pszFilename, size_t cchFilename); 878 int kLdrDyldQuerySymbol(HKLDRMOD hMod, uint32_t uSymbolOrdinal, const char *pszSymbolName, uintptr_t *pValue, uint32_t *pfKind); 951 int kLdrDyldQuerySymbol(HKLDRMOD hMod, uint32_t uSymbolOrdinal, const char *pszSymbolName, 952 const char *pszSymbolVersion, uintptr_t *pValue, uint32_t *pfKind); 953 int kLdrDyldQueryResource(HKLDRMOD hMod, uint32_t idType, const char *pszType, uint32_t idName, 954 const char *pszName, uint32_t idLang, void **pvRsrc, size_t *pcbRsrc); 955 int kLdrDyldEnumResources(HKLDRMOD hMod, uint32_t idType, const char *pszType, uint32_t idName, 956 const char *pszName, uint32_t idLang, PFNKLDRENUMRSRC pfnCallback, void *pvUser); 879 957 880 958 /** @name OS/2 like API 881 959 * @{ */ 960 #if defined(__OS2__) 961 # define KLDROS2API _System 962 #else 963 # define KLDROS2API 964 #endif 882 965 int kLdrDosLoadModule(char *pszObject, size_t cbObject, const char *pszModule, PHKLDRMOD phMod); 883 966 int kLdrDosFreeModule(HKLDRMOD hMod); … … 889 972 int kLdrDosReplaceModule(const char *pszOldModule, const char *pszNewModule, const char *pszBackupModule); 890 973 int kLdrDosGetResource(HKLDRMOD hMod, uint32_t idType, uint32_t idName, void **pvResAddr); 891 int kLdrDosQueryResourceSize(HKLDRMOD hMod, uint32_t idType ID, uint32_t idName, uint32_t *pcb);974 int kLdrDosQueryResourceSize(HKLDRMOD hMod, uint32_t idType, uint32_t idName, uint32_t *pcb); 892 975 int kLdrDosFreeResource(void *pvResAddr); 893 976 /** @} */ … … 899 982 void * kLdrDlSym(HKLDRMOD hMod, const char *pszSymbol); 900 983 int kLdrDlClose(HKLDRMOD hMod); 984 /** @todo GNU extensions */ 901 985 /** @} */ 902 986 903 987 /** @name Win32 like API 904 988 * @{ */ 905 HKLDRMOD kLdrWLoadLibrary(const char *pszFilename); 906 HKLDRMOD kLdrWLoadLibraryEx(const char *pszFilename, void *hFileReserved, uint32_t fFlags); 907 uint32_t kLdrWGetModuleFileName(HKLDRMOD hMod, char *pszModName, size_t cchModName); 908 HKLDRMOD kLdrWGetModuleHandle(const char *pszFilename); 909 int kLdrWGetModuleHandleEx(uint32_t fFlags, const char *pszFilename, HKLDRMOD hMod); 910 void * kLdrWGetProcAddress(HKLDRMOD hMod, const char *pszProcName); 911 uint32_t kLdrWGetDllDirectory(size_t cchDir, char *pszDir); 912 int kLdrWSetDllDirectory(const char *pszDir); 913 int kLdrWFreeLibrary(HKLDRMOD hMod); 914 int kLdrWDisableThreadLibraryCalls(HKLDRMOD hMod); 915 989 #if defined(_MSC_VER) 990 # define KLDRWINAPI __stdcall 991 #else 992 # define KLDRWINAPI 993 #endif 994 HKLDRMOD KLDRWINAPI kLdrWLoadLibrary(const char *pszFilename); 995 HKLDRMOD KLDRWINAPI kLdrWLoadLibraryEx(const char *pszFilename, void *hFileReserved, uint32_t fFlags); 996 uint32_t KLDRWINAPI kLdrWGetModuleFileName(HKLDRMOD hMod, char *pszModName, size_t cchModName); 997 HKLDRMOD KLDRWINAPI kLdrWGetModuleHandle(const char *pszFilename); 998 int KLDRWINAPI kLdrWGetModuleHandleEx(uint32_t fFlags, const char *pszFilename, HKLDRMOD hMod); 999 void * KLDRWINAPI kLdrWGetProcAddress(HKLDRMOD hMod, const char *pszProcName); 1000 uint32_t KLDRWINAPI kLdrWGetDllDirectory(size_t cchDir, char *pszDir); 1001 int KLDRWINAPI kLdrWSetDllDirectory(const char *pszDir); 1002 int KLDRWINAPI kLdrWFreeLibrary(HKLDRMOD hMod); 1003 int KLDRWINAPI kLdrWDisableThreadLibraryCalls(HKLDRMOD hMod); 1004 1005 /** The handle to a resource that's been found. */ 1006 typedef struct KLDRWRSRCFOUND *HKLDRWRSRCFOUND; 1007 /** The handle to a loaded resource. */ 1008 typedef struct KLDRWRSRCLOADED *HKLDRWRSRCLOADED; 1009 HKLDRWRSRCFOUND KLDRWINAPI kLdrWFindResource(HKLDRMOD hMod, const char *pszType, const char *pszName); 1010 HKLDRWRSRCFOUND KLDRWINAPI kLdrWFindResourceEx(HKLDRMOD hMod, const char *pszType, const char *pszName, uint16_t idLang); 1011 uint32_t KLDRWINAPI kLdrWSizeofResource(HKLDRMOD hMod, HKLDRWRSRCFOUND hFoundRsrc); 1012 HKLDRWRSRCLOADED KLDRWINAPI kLdrWLoadResource(HKLDRMOD hMod, HKLDRWRSRCFOUND hFoundRsrc); 1013 void *KLDRWINAPI kLdrWLockResource(HKLDRMOD hMod, HKLDRWRSRCLOADED hLoadedRsrc); 1014 int KLDRWINAPI kLdrWFreeResource(HKLDRMOD hMod, HKLDRWRSRCLOADED hLoadedRsrc); 1015 1016 typedef int (KLDRWINAPI *PFNKLDRWENUMRESTYPE)(HKLDRMOD hMod, const char *pszType, uintptr_t uUser); 1017 int KLDRWINAPI kLdrWEnumResourceTypes(HKLDRMOD hMod, PFNKLDRWENUMRESTYPE pfnEnum, uintptr_t uUser); 1018 int KLDRWINAPI kLdrWEnumResourceTypesEx(HKLDRMOD hMod, PFNKLDRWENUMRESTYPE pfnEnum, uintptr_t uUser, uint32_t fFlags, uint16_t idLang); 1019 1020 typedef int (KLDRWINAPI *PFNKLDRWENUMRESNAME)(HKLDRMOD hMod, const char *pszType, char *pszName, uintptr_t uUser); 1021 int KLDRWINAPI kLdrWEnumResourceNames(HKLDRMOD hMod, const char *pszType, PFNKLDRWENUMRESNAME pfnEnum, uintptr_t uUser); 1022 int KLDRWINAPI kLdrWEnumResourceNamesEx(HKLDRMOD hMod, const char *pszType, PFNKLDRWENUMRESNAME pfnEnum, uintptr_t uUser, uint32_t fFlags, uint16_t idLang); 1023 1024 typedef int (KLDRWINAPI *PFNKLDRWENUMRESLANG)(HKLDRMOD hMod, const char *pszType, const char *pszName, uint16_t idLang, uintptr_t uUser); 1025 int KLDRWINAPI kLdrWEnumResourceLanguages(HKLDRMOD hMod, const char *pszType, const char *pszName, PFNKLDRWENUMRESLANG pfnEnum, uintptr_t uUser); 1026 int KLDRWINAPI kLdrWEnumResourceLanguagesEx(HKLDRMOD hMod, const char *pszType, const char *pszName, 1027 PFNKLDRWENUMRESLANG pfnEnum, uintptr_t uUser, uint32_t fFlags, uint16_t idLang); 916 1028 /** @} */ 917 1029 -
trunk/kLdr/kLdrHlp.h
r2883 r2891 82 82 /** strcmp */ 83 83 # define kLdrHlpStrComp(a, b) __builtin_strcmp(a, b) 84 /** strncmp */ 85 # define kLdrHlpStrNComp(a,b,c) __builtin_strncmp(a, b, c) 84 86 /** strlen */ 85 87 # define kLdrHlpStrLen(a) __builtin_strlen(a) … … 110 112 /** strcmp */ 111 113 # define kLdrHlpStrComp(a, b) strcmp(a, b) 114 /** strncmp */ 115 # define kLdrHlpStrNComp_needed 112 116 /** strlen */ 113 117 # define kLdrHlpStrLen(a) strlen(a) … … 127 131 char *kLdrHlpStrChr(const char *psz, int ch); 128 132 #endif 133 #ifdef kLdrHlpStrChr_needed 134 int kLdrHlpStrNComp(const char *psz1, const char *psz2, size_t cch); 135 #endif 129 136 #ifdef kLdrHlpMemChr_needed 130 137 void *kLdrHlpMemChr(const void *pv, int ch, size_t cb); … … 142 149 || !defined(kLdrHlpMemSet) \ 143 150 || (!defined(kLdrHlpStrChr) && !defined(kLdrHlpStrChr_needed)) \ 151 || !defined(kLdrHlpStrComp) \ 152 || (!defined(kLdrHlpStrNComp) && !defined(kLdrHlpStrNComp_needed)) \ 144 153 || !defined(kLdrHlpStrLen) \ 145 154 || !defined(kLdrHlpAllocA) \ -
trunk/kLdr/kLdrMod.c
r2879 r2891 238 238 * KLDRMOD_BASEADDRESS_LINK and KLDRMOD_BASEADDRESS_MAP. 239 239 * @param iSymbol The symbol ordinal. (optional) 240 * @param pszSymbol The symbol name. (optional) 240 * @param pchSymbol The symbol name. (optional) 241 * Important, this doesn't have to be a null-terminated string. 242 * @param cchSymbol The length of the symbol name. 243 * @param pszVersion The symbol version. NULL if not versioned. 241 244 * @param pfnGetForwarder The callback to use when resolving a forwarder symbol. This is optional 242 245 * and if not specified KLDR_ERR_FORWARDER is returned instead. 243 246 * @param pvUser The user argument for the pfnGetForwarder callback. 244 247 * @param puValue Where to store the symbol value. (optional) 245 * @param pfKind Where to store the symbol kind. (optional) 248 * @param pfKind On input one of the KLDRSYMKIND_REQ_* #defines. 249 * On output the symbol kind. (optional) 246 250 */ 247 251 int kLdrModQuerySymbol(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, uint32_t iSymbol, 248 const char *p szSymbol, PFNKLDRMODGETIMPORT pfnGetForwarder, void *pvUser,249 P KLDRADDR puValue, uint32_t *pfKind)252 const char *pchSymbol, size_t cchSymbol, const char *pszVersion, 253 PFNKLDRMODGETIMPORT pfnGetForwarder, void *pvUser, PKLDRADDR puValue, uint32_t *pfKind) 250 254 { 251 255 KLDRMOD_VALIDATE(pMod); … … 255 259 *puValue = 0; 256 260 if (pfKind) 257 *pfKind = 0; 258 return pMod->pOps->pfnQuerySymbol(pMod, pvBits, BaseAddress, iSymbol, pszSymbol, pfnGetForwarder, pvUser, puValue, pfKind); 261 KLDRHLP_VALIDATE_FLAGS(*pfKind, KLDRSYMKIND_REQ_SEGMENTED); 262 return pMod->pOps->pfnQuerySymbol(pMod, pvBits, BaseAddress, iSymbol, pchSymbol, cchSymbol, pszVersion, 263 pfnGetForwarder, pvUser, puValue, pfKind); 259 264 } 260 265 … … 379 384 380 385 /** 386 * Queries info about a resource. 387 * 388 * If there are multiple resources matching the criteria, the best or 389 * first match will be return. 390 * 391 * 392 * @returns 0 on success. 393 * @returns Whatever non-zero status returned by pfnCallback (enumeration was stopped). 394 * @returns non-zero kLdr or native status code on failure. 395 * 396 * @param pMod The module. 397 * @param pvBits Optional pointer to bits returned by kLdrModGetBits() currently located at BaseAddress. 398 * This can be used by some module interpreters to reduce memory consumption. 399 * @param BaseAddress The module base address to use when calculating the resource addresses. 400 * There are two special values that can be used: 401 * KLDRMOD_BASEADDRESS_LINK and KLDRMOD_BASEADDRESS_MAP. 402 * @param idType The resource type id to match if not NIL_KLDRMOD_RSRC_TYPE_ID. 403 * @param pszType The resource type name to match if no NULL. 404 * @param idName The resource name id to match if not NIL_KLDRMOD_RSRC_NAME_ID. 405 * @param pszName The resource name to match if not NULL. 406 * @param idLang The language id to match. 407 * @param pfnCallback The callback function. 408 * @param pvUser The user argument for the callback. 409 */ 410 int kLdrModQueryResource(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, uint32_t idType, const char *pszType, 411 uint32_t idName, const char *pszName, uint32_t idLang, PKLDRADDR pAddrRsrc, size_t *pcbRsrc) 412 { 413 KLDRMOD_VALIDATE(pMod); 414 if (!pAddrRsrc && !pcbRsrc) 415 return KLDR_ERR_INVALID_PARAMETER; 416 if (pAddrRsrc) 417 *pAddrRsrc = NIL_KLDRADDR; 418 if (pcbRsrc) 419 *pcbRsrc = 0; 420 return pMod->pOps->pfnQueryResource(pMod, pvBits, BaseAddress, idType, pszType, idName, pszName, idLang, pAddrRsrc, pcbRsrc); 421 } 422 423 424 /** 425 * Enumerates the resources matching the specfied criteria. 426 * 427 * 428 * @returns 0 on success. 429 * @returns Whatever non-zero status returned by pfnCallback (enumeration was stopped). 430 * @returns non-zero kLdr or native status code on failure. 431 * 432 * @param pMod The module. 433 * @param pvBits Optional pointer to bits returned by kLdrModGetBits() currently located at BaseAddress. 434 * This can be used by some module interpreters to reduce memory consumption. 435 * @param BaseAddress The module base address to use when calculating the resource addresses. 436 * There are two special values that can be used: 437 * KLDRMOD_BASEADDRESS_LINK and KLDRMOD_BASEADDRESS_MAP. 438 * @param idType The resource type id to match if not NIL_KLDRMOD_RSRC_TYPE_ID. 439 * @param pszType The resource type name to match if no NULL. 440 * @param idName The resource name id to match if not NIL_KLDRMOD_RSRC_NAME_ID. 441 * @param pszName The resource name to match if not NULL. 442 * @param idLang The language id to match. 443 * @param pfnCallback The callback function. 444 * @param pvUser The user argument for the callback. 445 */ 446 int kLdrModEnumResources(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, uint32_t idType, const char *pszType, 447 uint32_t idName, const char *pszName, uint32_t idLang, PFNKLDRENUMRSRC pfnCallback, void *pvUser) 448 { 449 KLDRMOD_VALIDATE(pMod); 450 return pMod->pOps->pfnEnumResources(pMod, pvBits, BaseAddress, idType, pszType, idName, pszName, idLang, pfnCallback, pvUser); 451 } 452 453 454 /** 381 455 * Enumerate the debug info formats contained in the executable image. 382 456 * -
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.