Changeset 2848
- Timestamp:
- Nov 2, 2006, 1:08:16 AM (19 years ago)
- Location:
- trunk/kLdr
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kLdr/kLdr.h
r2847 r2848 53 53 /** @defgroup grp_kLdrRdr kLdrRdr - The file provider 54 54 * @{ */ 55 56 /** The kLdr address type. */ 57 typedef uint64_t KLDRADDR; 58 /** Pointer to a kLdr address. */ 59 typedef KLDRADDR *PKLDRADDR; 60 /** Pointer to a const kLdr address. */ 61 typedef const KLDRADDR *PCKLDRADDR; 62 63 /** NIL address. */ 64 #define NIL_KLDRADDR (~(uint64_t)0) 65 66 /** The kLdr size type. */ 67 typedef uint64_t KLDRSIZE; 68 /** Pointer to a kLdr size. */ 69 typedef KLDRSIZE *PKLDRSIZE; 70 /** Pointer to a const kLdr size. */ 71 typedef const KLDRSIZE *PCKLDRSIZE; 72 73 55 74 56 75 /** … … 268 287 typedef struct KLDRSTACKINFO 269 288 { 289 /** The base address of the stack (sub) segment. 290 * Set this to NIL_KLDRADDR if the module doesn't include any stack segment. */ 291 KLDRADDR Address; 270 292 /** The base address of the stack (sub) segment, link address. 271 * Set this to ~(uintmax_t)0 if the module doesn't include any stack (sub)segment. */ 272 uintmax_t uLinkAddress; 273 /** The base address of the stack (sub) segment, actual load address. 274 * Set this to ~(uintmax_t)0 if the module doesn't include any stack (sub)segment or if 275 * the module isn't mapped (loaded) yet. */ 276 uintmax_t uLoadAddress; 293 * Set this to NIL_KLDRADDR if the module doesn't include any stack (sub)segment. */ 294 KLDRADDR LinkAddress; 277 295 /** The stack size of the main thread. 278 296 * If no stack (sub)segment in the module, this is the stack size of the main thread. 279 297 * If the module doesn't contain this kind of information this field will be set to 0. */ 280 uintmax_tcbStack;298 KLDRSIZE cbStack; 281 299 /** The stack size of non-main threads. 282 300 * If the module doesn't contain this kind of information this field will be set to 0. */ 283 uintmax_t cbStackThread; 284 } KLDRSTACKINFO, *PKLDRSTACKINFO; 301 KLDRSIZE cbStackThread; 302 } KLDRSTACKINFO; 303 /** Pointer to stack information. */ 304 typedef KLDRSTACKINFO *PKLDRSTACKINFO; 305 /** Pointer to const stack information. */ 306 typedef const KLDRSTACKINFO *PCKLDRSTACKINFO; 285 307 286 308 … … 295 317 const char *pszName; 296 318 /** The size of the segment. */ 297 uintmax_tcb;319 KLDRSIZE cb; 298 320 /** The link time load address. */ 299 uintmax_t LinkAddress; 300 /** The actual load address (if loaded). */ 301 uintmax_t LoadAddress; 321 KLDRADDR LinkAddress; 322 /** The address the segment was mapped at by kLdrModMap(). 323 * Set to NIL_KLDRADDR if not mapped. */ 324 KLDRADDR MapAddress; 302 325 /** The segment protection. */ 303 326 KLDRPROT enmProt; 304 } KLDRSEG, *PKLDRSEG; 327 } KLDRSEG; 328 /** Pointer to a loader segment. */ 329 typedef KLDRSEG *PKLDRSEG; 330 /** Pointer to a loader segment. */ 331 typedef const KLDRSEG *PCKLDRSEG; 305 332 306 333 … … 513 540 514 541 /** Special base address value alias for the link address. */ 515 #define KLDRMOD_BASEADDRESS_LINK (~( uintmax_t)1)542 #define KLDRMOD_BASEADDRESS_LINK (~(KLDRADDR)1) 516 543 /** Special base address value alias for the actual load address (must be mapped). */ 517 #define KLDRMOD_BASEADDRESS_MAP (~(uintmax_t)2) 544 #define KLDRMOD_BASEADDRESS_MAP (~(KLDRADDR)2) 545 546 /** Special import module ordinal value used to indicate that there is no 547 * specific module associated with the requested symbol. */ 548 #define NIL_KLDRMOD_IMPORT (~(uint32_t)0) 549 550 /** Special symbol ordinal value used to indicate that the symbol 551 * only has a string name. */ 552 #define NIL_KLDRMOD_SYM_ORDINAL (~(uint32_t)0) 553 518 554 519 555 /** @name Load symbol kind flags. 520 556 * @{ */ 521 557 /** The bitness doesn't matter. */ 522 #define KLDRSYMKIND_NO_BIT 0x00000000558 #define KLDRSYMKIND_NO_BIT 0x00000000 523 559 /** 16-bit symbol. */ 524 #define KLDRSYMKIND_16BIT 0x00000001560 #define KLDRSYMKIND_16BIT 0x00000001 525 561 /** 32-bit symbol. */ 526 #define KLDRSYMKIND_32BIT 0x00000002562 #define KLDRSYMKIND_32BIT 0x00000002 527 563 /** 64-bit symbol. */ 528 #define KLDRSYMKIND_64BIT 0x00000003564 #define KLDRSYMKIND_64BIT 0x00000003 529 565 /** Mask out the bit.*/ 530 #define KLDRSYMKIND_BIT_MASK 0x00000003566 #define KLDRSYMKIND_BIT_MASK 0x00000003 531 567 /** We don't know the type of symbol. */ 532 #define KLDRSYMKIND_NO_TYPE 0x00000000568 #define KLDRSYMKIND_NO_TYPE 0x00000000 533 569 /** The symbol is a code object (method/function/procedure/whateveryouwannacallit). */ 534 #define KLDRSYMKIND_CODE 0x00000010570 #define KLDRSYMKIND_CODE 0x00000010 535 571 /** The symbol is a data object. */ 536 #define KLDRSYMKIND_DATA 0x00000020572 #define KLDRSYMKIND_DATA 0x00000020 537 573 /** Mask out the symbol type. */ 538 #define KLDRSYMKIND_TYPE_MASK 0x00000030574 #define KLDRSYMKIND_TYPE_MASK 0x00000030 539 575 /** Valid symbol kind mask. */ 540 #define KLDRSYMKIND_MASK 0x00000033576 #define KLDRSYMKIND_MASK 0x00000033 541 577 /** @} */ 542 578 … … 544 580 * @{ */ 545 581 /** Returns ALL kinds of symbols. The default is to only return public/exported symbols. */ 546 #define KLDRMOD_ENUM_SYMBOL_FLAGS_ALL 0x00000001 547 /** @} */ 548 549 550 typedef int FNKLDRMODGETIMPORT(PKLDRMOD pMod, const char *pszModule, const char *pszSymbol, uint32_t uSymbol, 551 uintmax_t *pValue, uint32_t *pfKind, void *pvModuleUser, void *pvUser); 582 #define KLDRMOD_ENUM_SYMS_FLAGS_ALL 0x00000001 583 /** @} */ 584 585 586 /** 587 * Callback for resolving imported symbols when applying fixups. 588 * 589 * @returns 0 on success and *pValue and *pfKind filled. 590 * @returns Non-zero OS specific or kLdr status code on failure. 591 * 592 * @param pMod The module which fixups are begin applied. 593 * @param iImport The import module ordinal number or NIL_KLDRMOD_IMPORT. 594 * @param uSymbol The symbol ordinal number or NIL_KLDRMOD_SYM_ORDINAL. 595 * @param pszSymbol The symbol name. Can be NULL if uSymbol isn't nil. 596 * @param puValue Where to store the symbol value. 597 * @param pfKind Where to store the symbol kind flags. 598 * @param pvUser The user parameter specified to the relocation function. 599 */ 600 typedef int FNKLDRMODGETIMPORT(PKLDRMOD pMod, uint32_t iImport, uint32_t uSymbol, const char *pszSymbol, 601 PKLDRADDR puValue, uint32_t *pfKind, void *pvUser); 602 /** Pointer to a import callback. */ 552 603 typedef FNKLDRMODGETIMPORT *PFNKLDRMODGETIMPORT; 553 typedef int FNKLDRMODENUMSYMS(PKLDRMOD pMod, const char *pszSymbol, unsigned uSymbol, uintmax_t Value, uint32_t fKind, void *pvUser); 604 605 /** 606 * Symbol enumerator callback. 607 * 608 * @returns 0 if enumeration should continue. 609 * @returns non-zero if the enumeration should stop. This status code is the returned by kLdrModEnumSymbols(). 610 * 611 * @param pMod The module which symbols are being enumerated.s 612 * @param uSymbol The symbol ordinal number or NIL_KLDRMOD_SYM_ORDINAL. 613 * @param pszSymbol The symbol name. This can be NULL if there is a symbol ordinal. 614 * This can also be an empty string if the symbol doesn't have a name 615 * or it's name has been stripped. 616 * @param uValue The symbol value. 617 * @param fKind The symbol kind flags. 618 * @param pvUser The user parameter specified to kLdrModEnumSymbols(). 619 */ 620 typedef int FNKLDRMODENUMSYMS(PKLDRMOD pMod, uint32_t uSymbol, const char *pszSymbol, 621 KLDRADDR uValue, uint32_t fKind, void *pvUser); 622 /** Pointer to a symbol enumerator callback. */ 554 623 typedef FNKLDRMODENUMSYMS *PFNKLDRMODENUMSYMS; 555 624 … … 558 627 int kLdrModOpenNative(const char *pszFilename, PPKLDRMOD ppMod); 559 628 int kLdrModClose(PKLDRMOD pMod); 560 int kLdrModQuerySymbol(PKLDRMOD pMod, const void *pvBits, uintmax_t BaseAddress, const char *pszSymbol, uintmax_t *pValue, uint32_t *pfKind); 561 int kLdrModEnumSymbols(PKLDRMOD pMod, unsigned fFlags, const void *pvBits, uintmax_t BaseAddress, PFNKLDRMODENUMSYMS pfnCallback, void *pvUser); 562 int kLdrModGetImport(PKLDRMOD pMod, uint32_t iImport, const char *pszName, size_t cchName); 563 int32_t kLdrModNumberOfImports(PKLDRMOD pMod); 629 630 int kLdrModQuerySymbol(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, uint32_t uSymbol, 631 const char *pszSymbol, PKLDRADDR puValue, uint32_t *pfKind); 632 int kLdrModEnumSymbols(PKLDRMOD pMod, uint32_t fFlags, const void *pvBits, KLDRADDR BaseAddress, 633 PFNKLDRMODENUMSYMS pfnCallback, void *pvUser); 634 int kLdrModGetImport(PKLDRMOD pMod, void *pvBits, uint32_t iImport, const char *pszName, size_t cchName); 635 int32_t kLdrModNumberOfImports(PKLDRMOD pMod, void *pvBits); 636 int kLdrModCanExecuteOn(PKLDRMOD pMod, void *pvBits, KLDRARCH enmArch, KLDRCPU enmCpu); 637 int kLdrModGetStackInfo(PKLDRMOD pMod, void *pvBits, KLDRADDR BaseAddress, PKLDRSTACKINFO pStackInfo); 638 int kLdrModQueryMainEntrypoint(PKLDRMOD pMod, void *pvBits, KLDRADDR BaseAddress, PKLDRADDR pMainEPAddress); 639 size_t kLdrModSize(PKLDRMOD pMod); 640 641 /** @name Operations On The Internally Managed Mapping 642 * @{ */ 564 643 int kLdrModMap(PKLDRMOD pMod); 565 644 int kLdrModUnmap(PKLDRMOD pMod); 566 int kLdrModFixupMapping(PKLDRMOD pMod, PFNKLDRMODGETIMPORT pfnGetImport, void *pvUser);567 size_t kLdrModSize(PKLDRMOD pMod);568 int kLdrModGetBits(PKLDRMOD pMod, void *pvBits, uintmax_t BaseAddress, PFNKLDRMODGETIMPORT pfnGetImport, void *pvUser);569 int kLdrModRelocateBits(PKLDRMOD pMod, void *pvBits, uintmax_t NewBaseAddress, uintmax_t OldBaseAddress, PFNKLDRMODGETIMPORT pfnGetImport, void *pvUser);570 int kLdrModCanExecuteOn(PKLDRMOD pMod, KLDRARCH enmArch, KLDRCPU enmCpu);571 int kLdrModGetStackInfo(PKLDRMOD pMod, PKLDRSTACKINFO pStackInfo);572 int kLdrModQueryMainEntrypoint(PKLDRMOD pMod, void *pvBits, uintmax_t uBaseAddress, uintmax_t *puValue);573 645 int kLdrModAllocTLS(PKLDRMOD pMod); 574 646 void kLdrModFreeTLS(PKLDRMOD pMod); 575 647 int kLdrModReload(PKLDRMOD pMod); 648 int kLdrModFixupMapping(PKLDRMOD pMod, PFNKLDRMODGETIMPORT pfnGetImport, void *pvUser); 576 649 int kLdrModCallInit(PKLDRMOD pMod); 577 650 int kLdrModCallTerm(PKLDRMOD pMod); 578 651 int kLdrModCallThread(PKLDRMOD pMod, unsigned fAttachingOrDetaching); 652 /** @} */ 653 654 /** @name Operations On The Externally Managed Mappings 655 * @{ */ 656 int kLdrModGetBits(PKLDRMOD pMod, void *pvBits, KLDRADDR BaseAddress, PFNKLDRMODGETIMPORT pfnGetImport, void *pvUser); 657 int kLdrModRelocateBits(PKLDRMOD pMod, void *pvBits, KLDRADDR NewBaseAddress, KLDRADDR OldBaseAddress, 658 PFNKLDRMODGETIMPORT pfnGetImport, void *pvUser); 659 /** @} */ 579 660 580 661 /** @} */ … … 781 862 /** Buffer overflow. */ 782 863 #define KLDR_ERR_BUFFER_OVERFLOW (KLDR_ERR_BASE + 45) 864 /** The specified ARCH+CPU isn't compatible with image. */ 865 #define KLDR_ERR_ARCH_CPU_NOT_COMPATIBLE (KLDR_ERR_BASE + 45) 783 866 784 867 /** Encountered a bad fixup. */ -
trunk/kLdr/kLdrDyld.c
r2847 r2848 1367 1367 for (iSeg = 0; iSeg < pMod->pMod->cSegments; iSeg++) 1368 1368 { 1369 uintmax_t off = (uintmax_t)Address - pMod->pMod->aSegments[iSeg].LoadAddress;1369 KLDRADDR off = (KLDRADDR)Address - pMod->pMod->aSegments[iSeg].MapAddress; 1370 1370 if (off < pMod->pMod->aSegments[iSeg].cb) 1371 1371 { -
trunk/kLdr/kLdrDyldMod.c
r2847 r2848 704 704 * Query number of prerequiste modules and allocate the array. 705 705 */ 706 cPrereqs = kLdrModNumberOfImports(pMod->pMod );706 cPrereqs = kLdrModNumberOfImports(pMod->pMod, NULL); 707 707 kldrHlpAssert(cPrereqs >= 0); 708 708 if (pMod->cPrereqs != cPrereqs) … … 726 726 727 727 KLDRDYLDMOD_ASSERT(pMod->papPrereqs[i] == NULL); 728 rc = kLdrModGetImport(pMod->pMod, i, s_szPrereq, sizeof(s_szPrereq));728 rc = kLdrModGetImport(pMod->pMod, NULL, i, s_szPrereq, sizeof(s_szPrereq)); 729 729 if (rc) 730 730 break; … … 993 993 if (!g_fkLdrDyldDoneMainStack) 994 994 { 995 rc = kLdrModGetStackInfo(pMod->pMod, &StackInfo);995 rc = kLdrModGetStackInfo(pMod->pMod, NULL, KLDRMOD_BASEADDRESS_MAP, &StackInfo); 996 996 if (!rc) 997 997 { … … 1003 1003 1004 1004 /* needs allocating? */ 1005 if ( StackInfo. uLinkAddress == ~(uintmax_t)01005 if ( StackInfo.LinkAddress == NIL_KLDRADDR 1006 1006 || StackInfo.cbStack < cbDefOverride) 1007 1007 { … … 1019 1019 else 1020 1020 { 1021 KLDRDYLDMOD_ASSERT(StackInfo. uLoadAddress != ~(uintmax_t)0);1021 KLDRDYLDMOD_ASSERT(StackInfo.Address != NIL_KLDRADDR); 1022 1022 KLDRDYLDMOD_ASSERT(StackInfo.cbStack > 0); 1023 1023 1024 1024 g_fkLdrDyldMainStackAllocated = 0; 1025 g_pvkLdrDyldMainStack = (void *)(uintptr_t)StackInfo. uLoadAddress;1026 KLDRDYLDMOD_ASSERT((uintptr_t)g_pvkLdrDyldMainStack == StackInfo. uLoadAddress);1025 g_pvkLdrDyldMainStack = (void *)(uintptr_t)StackInfo.Address; 1026 KLDRDYLDMOD_ASSERT((uintptr_t)g_pvkLdrDyldMainStack == StackInfo.Address); 1027 1027 1028 1028 g_cbkLdrDyldMainStack = (size_t)StackInfo.cbStack; … … 1056 1056 { 1057 1057 int rc; 1058 uintmax_t uValue;1058 KLDRADDR MainEPAddress; 1059 1059 void *pvStack; 1060 1060 size_t cbStack; 1061 1061 KLDRDYLDMOD_ASSERT(pMod->fExecutable); 1062 1062 1063 rc = kLdrModQueryMainEntrypoint(pMod->pMod, NULL, KLDRMOD_BASEADDRESS_MAP, & uValue);1063 rc = kLdrModQueryMainEntrypoint(pMod->pMod, NULL, KLDRMOD_BASEADDRESS_MAP, &MainEPAddress); 1064 1064 if (rc) 1065 1065 return rc; … … 1067 1067 if (rc) 1068 1068 return rc; 1069 return kldrDyldOSStartExe((uintptr_t) uValue, pvStack, cbStack);1069 return kldrDyldOSStartExe((uintptr_t)MainEPAddress, pvStack, cbStack); 1070 1070 } 1071 1071 … … 1125 1125 { 1126 1126 int rc; 1127 uintmax_tuValue = 0;1127 KLDRADDR uValue = 0; 1128 1128 uint32_t fKind = 0; 1129 1129 1130 1130 rc = kLdrModQuerySymbol(pMod->pMod, NULL, KLDRMOD_BASEADDRESS_MAP, 1131 pszSymbolName ? pszSymbolName : (const char *)uSymbolOrdinal, &uValue, pfKind);1131 uSymbolOrdinal, pszSymbolName, &uValue, &fKind); 1132 1132 if (!rc) 1133 1133 { -
trunk/kLdr/kLdrMod.c
r2828 r2848 39 39 # include "kLdrModELF64.h" 40 40 #endif 41 42 43 /** 44 * Open a executable image by file name. 45 * 46 * @returns 0 on success and *ppMod pointing to a module instance. 47 * On failure, a non-zero OS specific error code is returned. 48 * @param pszFilename The filename to open. 49 * @param ppMod Where to store the module handle. 50 */ 51 int kLdrModOpen(const char *pszFilename, PPKLDRMOD ppMod) 52 { 53 /* 54 * Open the file using a bit provider. 55 */ 56 PKLDRRDR pRdr; 57 int rc = kLdrRdrOpen(&pRdr, pszFilename); 58 if (!rc) 59 { 60 rc = kLdrModOpenFromRdr(pRdr, ppMod); 61 if (!rc) 62 return 0; 63 kLdrRdrClose(pRdr); 64 } 65 return rc; 66 } 41 67 42 68 … … 108 134 109 135 /** 110 * Open a executable image by file name.136 * Open a executable image using the native loader (if any). 111 137 * 112 138 * @returns 0 on success and *ppMod pointing to a module instance. … … 115 141 * @param ppMod Where to store the module handle. 116 142 */ 117 int kLdrModOpen(const char *pszFilename, PPKLDRMOD ppMod) 118 { 119 /* 120 * Open the file using a bit provider. 121 */ 122 PKLDRRDR pRdr; 123 int rc = kLdrRdrOpen(&pRdr, pszFilename); 124 if (!rc) 125 { 126 rc = kLdrModOpenFromRdr(pRdr, ppMod); 127 if (!rc) 128 return 0; 129 kLdrRdrClose(pRdr); 130 } 131 return rc; 132 } 133 143 int kLdrModOpenNative(const char *pszFilename, PPKLDRMOD ppMod) 144 { 145 #ifdef __OS2__ 146 147 //DosLoadModule() 148 #elif defined(__WIN__) 149 150 #else 151 # error "Port me" 152 #endif 153 return -1; 154 } 155 156 157 158 /** 159 * Closes an open module. 160 * 161 * The caller is responsible for calling kLdrModUnmap() and kLdrFreeTLS() 162 * before closing the module. 163 * 164 * @returns 0 on success, 165 * @param pMod The module. 166 */ 167 int kLdrModClose(PKLDRMOD pMod) 168 { 169 //pMod-> 170 return -1; 171 } 172 173 174 175 /** 176 * Queries a symbol by name or ordinal number. 177 * 178 * @returns 0 and *puValue and *pfKind on success. 179 * KLDR_ERR_SYMBOL_NOT_FOUND is returned if the symbol wasn't found. 180 * Other failures could stem from bad executable format failures, 181 * read failure in case pvBits isn't specified and no mapping should be used. 182 * @param pMod The module. 183 * @param pvBits Optional pointer to bits returned by kLdrModGetBits() currently located at BaseAddress. 184 * This can be used by some module interpreters to reduce memory consumption. 185 * @param BaseAddress The module base address to use when calculating the symbol value. 186 * There are two special values that can be used: 187 * KLDRMOD_BASEADDRESS_LINK and KLDRMOD_BASEADDRESS_MAP. 188 * @param uSymbol The symbol ordinal. (optional) 189 * @param pszSymbol The symbol name. (optional) 190 * @param puValue Where to store the symbol value. (optional) 191 * @param pfKind Where to store the symbol kind. (optional) 192 */ 193 int kLdrModQuerySymbol(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, uint32_t uSymbol, 194 const char *pszSymbol, PKLDRADDR puValue, uint32_t *pfKind) 195 { 196 return -1; 197 } 198 199 200 /** 201 * Enumerate the symbols in the module. 202 * 203 * @returns 0 on success and non-zero a status code on failure. 204 * @param pMod The module which symbols should be enumerated. 205 * @param fFlags The enumeration flags. A combination of the KLDRMOD_ENUM_SYMS_FLAGS_* \#defines. 206 * @param pvBits Optional pointer to bits returned by kLdrModGetBits() currently located at BaseAddress. 207 * This can be used by some module interpreters to reduce memory consumption. 208 * @param BaseAddress The module base address to use when calculating the symbol values. 209 * There are two special values that could be can: 210 * KLDRMOD_BASEADDRESS_LINK and KLDRMOD_BASEADDRESS_MAP. 211 * @param pfnCallback The enumeration callback function. 212 * @param pvUser The user argument to the callback function. 213 */ 214 int kLdrModEnumSymbols(PKLDRMOD pMod, uint32_t fFlags, const void *pvBits, KLDRADDR BaseAddress, 215 PFNKLDRMODENUMSYMS pfnCallback, void *pvUser) 216 { 217 return -1; 218 } 219 220 221 /** 222 * Get the name of an import module by ordinal number. 223 * 224 * @returns 0 and name in pszName on success. 225 * On buffer overruns KLDR_ERR_BUFFER_OVERFLOW will be returned. 226 * On other failures and appropriate error code is returned. 227 * @param pMod The module. 228 * @param pvBits Optional pointer to bits returned by kLdrModGetBits(). 229 * This can be used by some module interpreters to reduce memory consumption. 230 * @param iImport The import module ordinal number. 231 * @param pszName Where to store the name. 232 * @param cchName The size of the name buffer. 233 */ 234 int kLdrModGetImport(PKLDRMOD pMod, void *pvBits, uint32_t iImport, const char *pszName, size_t cchName) 235 { 236 return -1; 237 } 238 239 240 /** 241 * Get the number of import modules. 242 * 243 * @returns The number of import modules. -1 if something really bad happens. 244 * @param pMod The module. 245 * @param pvBits Optional pointer to bits returned by kLdrModGetBits(). 246 * This can be used by some module interpreters to reduce memory consumption. 247 */ 248 int32_t kLdrModNumberOfImports(PKLDRMOD pMod, void *pvBits) 249 { 250 return -1; 251 } 252 253 254 /** 255 * Checks if this module can be executed by the specified arch+cpu. 256 * 257 * @returns 0 if it can, KLDR_ERR_ARCH_CPU_NOT_COMPATIBLE if it can't. 258 * Other failures may occur and cause other return values. 259 * @param pMod The module. 260 * @param pvBits Optional pointer to bits returned by kLdrModGetBits(). 261 * This can be used by some module interpreters to reduce memory consumption. 262 */ 263 int kLdrModCanExecuteOn(PKLDRMOD pMod, void *pvBits, KLDRARCH enmArch, KLDRCPU enmCpu) 264 { 265 //return KLDR_ERR_ARCH_CPU_NOT_COMPATIBLE; 266 return 0; 267 } 268 269 270 /** 271 * Gets the image stack info. 272 * 273 * @returns 0 on success, non-zero on failure. 274 * @param pMod 275 * @param pvBits Optional pointer to bits returned by kLdrModGetBits() currently located at BaseAddress. 276 * This can be used by some module interpreters to reduce memory consumption. 277 * @param BaseAddress The module base address to use when calculating the stack address. 278 * There are two special values that can be used: 279 * KLDRMOD_BASEADDRESS_LINK and KLDRMOD_BASEADDRESS_MAP. 280 * @param pStackInfo The stack information. 281 */ 282 int kLdrModGetStackInfo(PKLDRMOD pMod, void *pvBits, KLDRADDR BaseAddress, PKLDRSTACKINFO pStackInfo) 283 { 284 return -1; 285 } 286 287 288 /** 289 * Queries the main entrypoint of the module. 290 * 291 * Only executable are supposed to have an main entrypoint, though some object and DLL 292 * formats will also allow this. 293 * 294 * @returns 0 and *pMainEPAddress on success. Non-zero status code on failure. 295 * @param pMod The module. 296 * @param pvBits Optional pointer to bits returned by kLdrModGetBits() currently located at BaseAddress. 297 * This can be used by some module interpreters to reduce memory consumption. 298 * @param BaseAddress The module base address to use when calculating the entrypoint address. 299 * There are two special values that can be used: 300 * KLDRMOD_BASEADDRESS_LINK and KLDRMOD_BASEADDRESS_MAP. 301 * @param pMainEPAddress Where to store the entry point address. 302 */ 303 int kLdrModQueryMainEntrypoint(PKLDRMOD pMod, void *pvBits, KLDRADDR BaseAddress, PKLDRADDR pMainEPAddress) 304 { 305 return 1; 306 } 307 308 309 /** 310 * Get the size of the mapped module. 311 * 312 * @returns The size of the mapped module (in bytes). 313 * @param pMod The module. 314 */ 315 size_t kLdrModSize(PKLDRMOD pMod) 316 { 317 return 0; 318 } 319 320 321 /** 322 * Maps the module into the memory of the caller. 323 * 324 * On success the actual addresses for the segments can be found in MapAddress 325 * member of each segment in the segment array. 326 * 327 * @returns 0 on success, non-zero OS or kLdr status code on failure. 328 * @param pMod The module to be mapped. 329 * @remark kLdr only supports one mapping at a time of a module. 330 */ 331 int kLdrModMap(PKLDRMOD pMod) 332 { 333 return -1; 334 } 335 336 337 /** 338 * Unmaps a module previously mapped by kLdrModMap(). 339 * 340 * @returns 0 on success, non-zero OS or kLdr status code on failure. 341 * @param pMod The module to unmap. 342 */ 343 int kLdrModUnmap(PKLDRMOD pMod) 344 { 345 return -1; 346 } 347 348 349 /** 350 * Allocates Thread Local Storage for module mapped by kLdrModMap(). 351 * 352 * Calling kLdrModAllocTLS() more than once without calling kLdrModFreeTLS() 353 * between each invocation is not supported. 354 * 355 * @returns 0 on success, non-zero OS or kLdr status code on failure. 356 * @param pMod The module. 357 */ 358 int kLdrModAllocTLS(PKLDRMOD pMod) 359 { 360 return 0; 361 } 362 363 364 /** 365 * Frees Thread Local Storage previously allocated by kLdrModAllocTLS(). 366 * 367 * The caller is responsible for only calling kLdrModFreeTLS() once 368 * after calling kLdrModAllocTLS(). 369 * 370 * @returns 0 on success, non-zero OS or kLdr status code on failure. 371 * @param pMod The module. 372 */ 373 void kLdrModFreeTLS(PKLDRMOD pMod) 374 { 375 } 376 377 378 /** 379 * Reloads all dirty pages in a module previously mapped by kLdrModMap(). 380 * 381 * The module interpreter may omit code pages if it can safely apply code 382 * fixups again in a subsequent kLdrModFixupMapping() call. 383 * 384 * The caller is responsible for freeing TLS before calling this function. 385 * 386 * @returns 0 on success, non-zero OS or kLdr status code on failure. 387 * @param pMod The module. 388 */ 389 int kLdrModReload(PKLDRMOD pMod) 390 { 391 return -1; 392 } 393 394 395 /** 396 * Fixup the mapping made by kLdrModMap(). 397 * 398 * The caller is only responsible for not calling this function more than 399 * once without doing kLDrModReload() inbetween. 400 * 401 * @returns 0 on success, non-zero OS or kLdr status code on failure. 402 * @param pMod The module. 403 * @param pfnGetImport The callback for resolving external (imported) symbols. 404 * @param pvUser The callback user argument. 405 */ 406 int kLdrModFixupMapping(PKLDRMOD pMod, PFNKLDRMODGETIMPORT pfnGetImport, void *pvUser) 407 { 408 return -1; 409 } 410 411 412 /** 413 * Call the module initializiation function of a mapped module (if any). 414 * 415 * @returns 0 on success or no init function, non-zero on init function failure or invalid pMod. 416 * @param pMod The module. 417 */ 418 int kLdrModCallInit(PKLDRMOD pMod) 419 { 420 return -1; 421 } 422 423 424 /** 425 * Call the module termination function of a mapped module (if any). 426 * 427 * @returns 0 on success or no term function, non-zero on invalid pMod. 428 * @param pMod The module. 429 * 430 * @remark Termination function failure will be ignored by the module interpreter. 431 */ 432 int kLdrModCallTerm(PKLDRMOD pMod) 433 { 434 return 0; 435 } 436 437 438 /** 439 * Call the thread attach or detach function of a mapped module (if any). 440 * 441 * @returns 0 on success or no attach/detach function, non-zero on attach failure or invalid pMod. 442 * @param pMod The module. 443 * 444 * @remark Detach function failure will be ignored by the module interpreter. 445 */ 446 int kLdrModCallThread(PKLDRMOD pMod, unsigned fAttachingOrDetaching) 447 { 448 return 0; 449 } 450 451 452 /** 453 * Gets the module bits. 454 * 455 * The module interpreter will fill a mapping allocated by the caller with the 456 * module bits reallocated to the specified address. 457 * 458 * @returns 0 on succes, non-zero OS or kLdr status code on failure. 459 * @param pMod The module. 460 * @param pvBits Where to put the bits. 461 * @param BaseAddress The base address that should correspond to the first byte in pvBits 462 * upon return. 463 * @param pfnGetImport The callback ufor resolving external (imported) symbols. 464 * @param pvUser The callback user argument. 465 */ 466 int kLdrModGetBits(PKLDRMOD pMod, void *pvBits, KLDRADDR BaseAddress, PFNKLDRMODGETIMPORT pfnGetImport, void *pvUser) 467 { 468 return -1; 469 } 470 471 472 /** 473 * Relocates the module bits previously obtained by kLdrModGetBits(). 474 * 475 * @returns 0 on succes, non-zero OS or kLdr status code on failure. 476 * @param pMod The module. 477 * @param pvBits Where to put the bits. 478 * @param NewBaseAddress The new base address. 479 * @param OldBaseAddress The old base address (i.e. the one specified to kLdrModGetBits() or as 480 * NewBaseAddressto the previous kLdrModRelocateBits() call). 481 * @param pfnGetImport The callback ufor resolving external (imported) symbols. 482 * @param pvUser The callback user argument. 483 */ 484 int kLdrModRelocateBits(PKLDRMOD pMod, void *pvBits, KLDRADDR NewBaseAddress, KLDRADDR OldBaseAddress, 485 PFNKLDRMODGETIMPORT pfnGetImport, void *pvUser) 486 { 487 return -1; 488 } 489 490 491
Note:
See TracChangeset
for help on using the changeset viewer.