Changeset 2891 for trunk


Ignore:
Timestamp:
Nov 21, 2006, 10:40:45 PM (19 years ago)
Author:
bird
Message:

interface adjustment (in progress).

Location:
trunk/kLdr
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/kLdr/kLdr.h

    r2889 r2891  
    603603/** Forwarder symbol. */
    604604#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
    605609/** @} */
    606610
     
    621625 * @param   iImport     The import module ordinal number or NIL_KLDRMOD_IMPORT.
    622626 * @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.
    624630 * @param   puValue     Where to store the symbol value.
    625631 * @param   pfKind      Where to store the symbol kind flags.
    626632 * @param   pvUser      The user parameter specified to the relocation function.
    627633 */
    628 typedef int FNKLDRMODGETIMPORT(PKLDRMOD pMod, uint32_t iImport, uint32_t iSymbol, const char *pszSymbol,
    629                                PKLDRADDR puValue, uint32_t *pfKind, void *pvUser);
     634typedef 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);
    630636/** Pointer to a import callback. */
    631637typedef FNKLDRMODGETIMPORT *PFNKLDRMODGETIMPORT;
     
    639645 * @param   pMod        The module which symbols are being enumerated.s
    640646 * @param   iSymbol     The symbol ordinal number or NIL_KLDRMOD_SYM_ORDINAL.
    641  * @param   pszSymbol   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.
    642648 *                      This can also be an empty string if the symbol doesn't have a name
    643649 *                      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.
    644653 * @param   uValue      The symbol value.
    645654 * @param   fKind       The symbol kind flags.
    646655 * @param   pvUser      The user parameter specified to kLdrModEnumSymbols().
    647656 */
    648 typedef int FNKLDRMODENUMSYMS(PKLDRMOD pMod, uint32_t iSymbol, const char *pszSymbol,
     657typedef int FNKLDRMODENUMSYMS(PKLDRMOD pMod, uint32_t iSymbol, const char *pchSymbol, size_t cchSymbol, const char *pszVersion,
    649658                              KLDRADDR uValue, uint32_t fKind, void *pvUser);
    650659/** Pointer to a symbol enumerator callback. */
     
    672681typedef int FNKLDRENUMDBG(PKLDRMOD pMod, uint32_t iDbgInfo, KLDRDBGINFOTYPE enmType, int16_t iMajorVer, int16_t iMinorVer,
    673682                          off_t offFile, KLDRADDR LinkAddress, KLDRSIZE cb, const char *pszExtFile, void *pvUser);
    674 /** Pointer to a debug info enumberator callback. */
     683/** Pointer to a debug info enumerator callback. */
    675684typedef 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 */
     702typedef 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. */
     705typedef 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
    676735
    677736int     kLdrModOpen(const char *pszFilename, PPKLDRMOD ppMod);
     
    682741
    683742int     kLdrModQuerySymbol(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, uint32_t iSymbol,
    684                            const char *pszSymbol, PFNKLDRMODGETIMPORT pfnGetForwarder, void *pvUser,
    685                            PKLDRADDR puValue, uint32_t *pfKind);
     743                           const char *pchSymbol, size_t cchSymbol, const char *pszVersion,
     744                           PFNKLDRMODGETIMPORT pfnGetForwarder, void *pvUser, PKLDRADDR puValue, uint32_t *pfKind);
    686745int     kLdrModEnumSymbols(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress,
    687746                           uint32_t fFlags, PFNKLDRMODENUMSYMS pfnCallback, void *pvUser);
     
    691750int     kLdrModGetStackInfo(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, PKLDRSTACKINFO pStackInfo);
    692751int     kLdrModQueryMainEntrypoint(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, PKLDRADDR pMainEPAddress);
     752int     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);
     754int     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);
    693756int     kLdrModEnumDbgInfo(PKLDRMOD pMod, const void *pvBits, PFNKLDRENUMDBG pfnCallback, void *pvUser);
    694757int     kLdrModHasDbgInfo(PKLDRMOD pMod, const void *pvBits);
     758int     kLdrModMostlyDone(PKLDRMOD pMod);
     759
    695760
    696761/** @name Operations On The Internally Managed Mapping
     
    751816    /** @copydoc kLdrModQuerySymbol */
    752817    int (* pfnQuerySymbol)(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, uint32_t iSymbol,
    753                            const char *pszSymbol, PFNKLDRMODGETIMPORT pfnGetForwarder, void *pvUser,
    754                            PKLDRADDR puValue, uint32_t *pfKind);
     818                           const char *pchSymbol, size_t cchSymbol, const char *pszVersion,
     819                           PFNKLDRMODGETIMPORT pfnGetForwarder, void *pvUser, PKLDRADDR puValue, uint32_t *pfKind);
    755820    /** @copydoc kLdrModEnumSymbols */
    756821    int (* pfnEnumSymbols)(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, uint32_t fFlags,
     
    766831    /** @copydoc kLdrModQueryMainEntrypoint */
    767832    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);
    768839    /** @copydoc kLdrModEnumDbgInfo */
    769840    int (* pfnEnumDbgInfo)(PKLDRMOD pMod, const void *pvBits, PFNKLDRENUMDBG pfnCallback, void *pvUser);
     
    795866    int (* pfnRelocateBits)(PKLDRMOD pMod, void *pvBits, KLDRADDR NewBaseAddress, KLDRADDR OldBaseAddress,
    796867                            PFNKLDRMODGETIMPORT pfnGetImport, void *pvUser);
     868    /** @copydoc kLdrModMostlyDone */
     869    int (* pfnMostlyDone)(PKLDRMOD pMod);
    797870    /** Dummy which should be assigned a non-zero value. */
    798871    uint32_t uEndOfStructure;
     
    876949int     kLdrDyldGetName(HKLDRMOD hMod, char *pszName, size_t cchName);
    877950int     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);
     951int     kLdrDyldQuerySymbol(HKLDRMOD hMod, uint32_t uSymbolOrdinal, const char *pszSymbolName,
     952                            const char *pszSymbolVersion, uintptr_t *pValue, uint32_t *pfKind);
     953int     kLdrDyldQueryResource(HKLDRMOD hMod, uint32_t idType, const char *pszType, uint32_t idName,
     954                              const char *pszName, uint32_t idLang, void **pvRsrc, size_t *pcbRsrc);
     955int     kLdrDyldEnumResources(HKLDRMOD hMod, uint32_t idType, const char *pszType, uint32_t idName,
     956                              const char *pszName, uint32_t idLang, PFNKLDRENUMRSRC pfnCallback, void *pvUser);
    879957
    880958/** @name OS/2 like API
    881959 * @{ */
     960#if defined(__OS2__)
     961# define KLDROS2API _System
     962#else
     963# define KLDROS2API
     964#endif
    882965int     kLdrDosLoadModule(char *pszObject, size_t cbObject, const char *pszModule, PHKLDRMOD phMod);
    883966int     kLdrDosFreeModule(HKLDRMOD hMod);
     
    889972int     kLdrDosReplaceModule(const char *pszOldModule, const char *pszNewModule, const char *pszBackupModule);
    890973int     kLdrDosGetResource(HKLDRMOD hMod, uint32_t idType, uint32_t idName, void **pvResAddr);
    891 int     kLdrDosQueryResourceSize(HKLDRMOD hMod, uint32_t idTypeID, uint32_t idName, uint32_t *pcb);
     974int     kLdrDosQueryResourceSize(HKLDRMOD hMod, uint32_t idType, uint32_t idName, uint32_t *pcb);
    892975int     kLdrDosFreeResource(void *pvResAddr);
    893976/** @} */
     
    899982void *      kLdrDlSym(HKLDRMOD hMod, const char *pszSymbol);
    900983int         kLdrDlClose(HKLDRMOD hMod);
     984/** @todo GNU extensions */
    901985/** @} */
    902986
    903987/** @name Win32 like API
    904988 * @{ */
    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
     994HKLDRMOD KLDRWINAPI kLdrWLoadLibrary(const char *pszFilename);
     995HKLDRMOD KLDRWINAPI kLdrWLoadLibraryEx(const char *pszFilename, void *hFileReserved, uint32_t fFlags);
     996uint32_t KLDRWINAPI kLdrWGetModuleFileName(HKLDRMOD hMod, char *pszModName, size_t cchModName);
     997HKLDRMOD KLDRWINAPI kLdrWGetModuleHandle(const char *pszFilename);
     998int      KLDRWINAPI kLdrWGetModuleHandleEx(uint32_t fFlags, const char *pszFilename, HKLDRMOD hMod);
     999void *   KLDRWINAPI kLdrWGetProcAddress(HKLDRMOD hMod, const char *pszProcName);
     1000uint32_t KLDRWINAPI kLdrWGetDllDirectory(size_t cchDir, char *pszDir);
     1001int      KLDRWINAPI kLdrWSetDllDirectory(const char *pszDir);
     1002int      KLDRWINAPI kLdrWFreeLibrary(HKLDRMOD hMod);
     1003int      KLDRWINAPI kLdrWDisableThreadLibraryCalls(HKLDRMOD hMod);
     1004
     1005/** The handle to a resource that's been found. */
     1006typedef struct KLDRWRSRCFOUND *HKLDRWRSRCFOUND;
     1007/** The handle to a loaded resource. */
     1008typedef struct KLDRWRSRCLOADED *HKLDRWRSRCLOADED;
     1009HKLDRWRSRCFOUND  KLDRWINAPI kLdrWFindResource(HKLDRMOD hMod, const char *pszType, const char *pszName);
     1010HKLDRWRSRCFOUND  KLDRWINAPI kLdrWFindResourceEx(HKLDRMOD hMod, const char *pszType, const char *pszName, uint16_t idLang);
     1011uint32_t         KLDRWINAPI kLdrWSizeofResource(HKLDRMOD hMod, HKLDRWRSRCFOUND hFoundRsrc);
     1012HKLDRWRSRCLOADED KLDRWINAPI kLdrWLoadResource(HKLDRMOD hMod, HKLDRWRSRCFOUND hFoundRsrc);
     1013void    *KLDRWINAPI kLdrWLockResource(HKLDRMOD hMod, HKLDRWRSRCLOADED hLoadedRsrc);
     1014int      KLDRWINAPI kLdrWFreeResource(HKLDRMOD hMod, HKLDRWRSRCLOADED hLoadedRsrc);
     1015
     1016typedef int (KLDRWINAPI *PFNKLDRWENUMRESTYPE)(HKLDRMOD hMod, const char *pszType, uintptr_t uUser);
     1017int      KLDRWINAPI kLdrWEnumResourceTypes(HKLDRMOD hMod, PFNKLDRWENUMRESTYPE pfnEnum, uintptr_t uUser);
     1018int      KLDRWINAPI kLdrWEnumResourceTypesEx(HKLDRMOD hMod, PFNKLDRWENUMRESTYPE pfnEnum, uintptr_t uUser, uint32_t fFlags, uint16_t idLang);
     1019
     1020typedef int (KLDRWINAPI *PFNKLDRWENUMRESNAME)(HKLDRMOD hMod, const char *pszType, char *pszName, uintptr_t uUser);
     1021int      KLDRWINAPI kLdrWEnumResourceNames(HKLDRMOD hMod, const char *pszType, PFNKLDRWENUMRESNAME pfnEnum, uintptr_t uUser);
     1022int      KLDRWINAPI kLdrWEnumResourceNamesEx(HKLDRMOD hMod, const char *pszType, PFNKLDRWENUMRESNAME pfnEnum, uintptr_t uUser, uint32_t fFlags, uint16_t idLang);
     1023
     1024typedef int (KLDRWINAPI *PFNKLDRWENUMRESLANG)(HKLDRMOD hMod, const char *pszType, const char *pszName, uint16_t idLang, uintptr_t uUser);
     1025int      KLDRWINAPI kLdrWEnumResourceLanguages(HKLDRMOD hMod, const char *pszType, const char *pszName, PFNKLDRWENUMRESLANG pfnEnum, uintptr_t uUser);
     1026int      KLDRWINAPI kLdrWEnumResourceLanguagesEx(HKLDRMOD hMod, const char *pszType, const char *pszName,
     1027                                                 PFNKLDRWENUMRESLANG pfnEnum, uintptr_t uUser, uint32_t fFlags, uint16_t idLang);
    9161028/** @} */
    9171029
  • trunk/kLdr/kLdrHlp.h

    r2883 r2891  
    8282/** strcmp */
    8383# define kLdrHlpStrComp(a, b)  __builtin_strcmp(a, b)
     84/** strncmp */
     85# define kLdrHlpStrNComp(a,b,c) __builtin_strncmp(a, b, c)
    8486/** strlen */
    8587# define kLdrHlpStrLen(a)      __builtin_strlen(a)
     
    110112/** strcmp */
    111113# define kLdrHlpStrComp(a, b)  strcmp(a, b)
     114/** strncmp */
     115# define kLdrHlpStrNComp_needed
    112116/** strlen */
    113117# define kLdrHlpStrLen(a)      strlen(a)
     
    127131char   *kLdrHlpStrChr(const char *psz, int ch);
    128132#endif
     133#ifdef kLdrHlpStrChr_needed
     134int     kLdrHlpStrNComp(const char *psz1, const char *psz2, size_t cch);
     135#endif
    129136#ifdef kLdrHlpMemChr_needed
    130137void   *kLdrHlpMemChr(const void *pv, int ch, size_t cb);
     
    142149 || !defined(kLdrHlpMemSet) \
    143150 || (!defined(kLdrHlpStrChr) && !defined(kLdrHlpStrChr_needed)) \
     151 || !defined(kLdrHlpStrComp) \
     152 || (!defined(kLdrHlpStrNComp) && !defined(kLdrHlpStrNComp_needed)) \
    144153 || !defined(kLdrHlpStrLen) \
    145154 || !defined(kLdrHlpAllocA) \
  • trunk/kLdr/kLdrMod.c

    r2879 r2891  
    238238 *                              KLDRMOD_BASEADDRESS_LINK and KLDRMOD_BASEADDRESS_MAP.
    239239 * @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.
    241244 * @param   pfnGetForwarder The callback to use when resolving a forwarder symbol. This is optional
    242245 *                          and if not specified KLDR_ERR_FORWARDER is returned instead.
    243246 * @param   pvUser          The user argument for the pfnGetForwarder callback.
    244247 * @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)
    246250 */
    247251int     kLdrModQuerySymbol(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, uint32_t iSymbol,
    248                            const char *pszSymbol, PFNKLDRMODGETIMPORT pfnGetForwarder, void *pvUser,
    249                            PKLDRADDR puValue, uint32_t *pfKind)
     252                           const char *pchSymbol, size_t cchSymbol, const char *pszVersion,
     253                           PFNKLDRMODGETIMPORT pfnGetForwarder, void *pvUser, PKLDRADDR puValue, uint32_t *pfKind)
    250254{
    251255    KLDRMOD_VALIDATE(pMod);
     
    255259        *puValue = 0;
    256260    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);
    259264}
    260265
     
    379384
    380385/**
     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 */
     410int     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 */
     446int     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/**
    381455 * Enumerate the debug info formats contained in the executable image.
    382456 *
  • trunk/kLdr/kLdrModPE.c

    r2883 r2891  
    685685/** @copydoc kLdrModQuerySymbol */
    686686static 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
    689690{
    690691    PKLDRMODPE                      pModPE = (PKLDRMODPE)pMod->pvData;
     
    704705        <   sizeof(IMAGE_EXPORT_DIRECTORY))
    705706        return KLDR_ERR_SYMBOL_NOT_FOUND;
     707    if (pszVersion && *pszVersion)
     708        return KLDR_ERR_SYMBOL_NOT_FOUND;
    706709
    707710    pExpDir = KLDRMODPE_RVA2TYPE(pvBits,
    708711                                 pModPE->Hdrs.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress,
    709712                                 PIMAGE_EXPORT_DIRECTORY);
    710     if (!pszSymbol)
     713    if (!pchSymbol)
    711714    {
    712715        /*
     
    742745                {
    743746                    pszName = KLDRMODPE_RVA2TYPE(pvBits, paRVANames[i], const char *);
    744                     KLDRMODPE_ASSERT(kLdrHlpStrComp(pszName, pszSymbol));
     747                    KLDRMODPE_ASSERT(kLdrHlpStrNComp(pszName, pchSymbol, cchSymbol) || pszName[cchSymbol]);
    745748                    KLDRMODPE_ASSERT(i == 0 || kLdrHlpStrComp(pszName, KLDRMODPE_RVA2TYPE(pvBits, paRVANames[i - 1], const char *)));
    746749                }
     
    751754            i = (iEnd - iStart) / 2 + iStart;
    752755            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;
    754759            if (diff < 0)
    755760                iStart = i + 1;     /* The symbol must be after the current name. */
     
    906911             * Now the rest is up to the callback (almost).
    907912             */
    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);
    909915            if (!rc && pfKind)
    910916                *pfKind |= KLDRSYMKIND_FORWARDER;
     
    972978        for (iName = 0; iName < cNames; iName++)
    973979        {
     980            const char *pszName;
    974981            if (paOrdinals[iName] != iFunction)
    975982                continue;
    976983            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,
    978986                             uValue, fKind, pvUser);
    979987            if (rc)
     
    986994        if (!fFoundName)
    987995        {
    988             rc = pfnCallback(pMod, iFunction + pExpDir->Base, NULL, uValue, fKind, pvUser);
     996            rc = pfnCallback(pMod, iFunction + pExpDir->Base, NULL, 0, NULL, uValue, fKind, pvUser);
    989997            if (rc)
    990998                return rc;
     
    15751583            /* Ordinal or name import? */
    15761584            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);
    15781586            else if (KLDRMODPE_VALID_RVA(pModPE, pThunk->u1.Ordinal))
    15791587            {
    15801588                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);
    15821591            }
    15831592            else
     
    16401649            /* Ordinal or name import? */
    16411650            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);
    16431652            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            }
    16471658            else
    16481659            {
     
    19441955    kldrModPEGetStackInfo,
    19451956    kldrModPEQueryMainEntrypoint,
     1957    NULL, /** @todo resources */
     1958    NULL, /** @todo resources */
    19461959    kldrModPEEnumDbgInfo,
    19471960    kldrModPEHasDbgInfo,
     
    19581971    kldrModPEGetBits,
    19591972    kldrModPERelocateBits,
     1973    NULL, /** @todo mostly done */
    19601974    42 /* the end */
    19611975};
Note: See TracChangeset for help on using the changeset viewer.