Changeset 2851
- Timestamp:
- Nov 2, 2006, 4:21:54 AM (19 years ago)
- Location:
- trunk/kLdr
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kLdr/kLdr.h
r2850 r2851 532 532 533 533 534 /** 535 * Loader module. 534 /** Pointer to a module interpreter method table. */ 535 typedef struct KLDRMODOPS *PKLDRMODOPS; 536 /** Pointer to const module interpreter methods table. */ 537 typedef const struct KLDRMODOPS *PCKLDRMODOPS; 538 539 /** 540 * Module interpreter instance. 541 * All members are read only unless you're kLdrMod or the module interpreter. 536 542 */ 537 543 typedef struct KLDRMOD … … 560 566 /** The number of segments in the module. */ 561 567 uint32_t cSegments; 568 569 570 562 571 /** The module data. */ 563 572 void *pvData; … … 565 574 KLDRSEG aSegments[1]; 566 575 } KLDRMOD, *PKLDRMOD, **PPKLDRMOD; 576 577 578 567 579 568 580 … … 712 724 PFNKLDRMODGETIMPORT pfnGetImport, void *pvUser); 713 725 /** @} */ 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 714 809 715 810 -
trunk/kLdr/kLdrHlp.h
r2847 r2851 221 221 } while (0) 222 222 223 224 225 226 227 228 229 230 231 223 232 /** @} */ 224 233 -
trunk/kLdr/kLdrMod.c
r2849 r2851 39 39 # include "kLdrModELF64.h" 40 40 #endif 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 41 98 42 99 … … 115 172 116 173 /* 117 * Use the magic to select the appropriate image interpreter .174 * Use the magic to select the appropriate image interpreter. 118 175 */ 119 176 if (u.u16 == IMAGE_DOS_SIGNATURE) 120 r eturnKLDR_ERR_MZ_NOT_SUPPORTED;177 r KLDR_ERR_MZ_NOT_SUPPORTED; 121 178 else if (u.u16 == IMAGE_NE_SIGNATURE) 122 r eturnKLDR_ERR_NE_NOT_SUPPORTED;179 r KLDR_ERR_NE_NOT_SUPPORTED; 123 180 else if (u.u16 == IMAGE_LX_SIGNATURE) 124 r eturnKLDR_ERR_LX_NOT_SUPPORTED;181 r KLDR_ERR_LX_NOT_SUPPORTED; 125 182 else if (u.u16 == IMAGE_LE_SIGNATURE) 126 r eturnKLDR_ERR_LE_NOT_SUPPORTED;183 r KLDR_ERR_LE_NOT_SUPPORTED; 127 184 else if (u.u32 == IMAGE_NT_SIGNATURE) 128 r eturnKLDR_ERR_PE_NOT_SUPPORTED;185 r KLDR_ERR_PE_NOT_SUPPORTED; 129 186 else if (u.u32 == IMAGE_ELF_SIGNATURE) 130 return KLDR_ERR_ELF_NOT_SUPPORTED; 131 return KLDR_ERR_UNKNOWN_FORMAT; 187 rc = KLDR_ERR_ELF_NOT_SUPPORTED; 188 else 189 rc = KLDR_ERR_UNKNOWN_FORMAT; 190 191 /* 192 * If no head on hit, let each interpreter have a go. 193 */ 194 if (rc) 195 { 196 PCKLDRMODOPS pOps; 197 for (pOps = g_pModInterpreterHead; pOps; pOps = pOps->pNext) 198 { 199 int rc2 = pOps->pfnCreate(pOps, pRdr, offHdr, ppMod); 200 if (!rc2) 201 return rc; 202 } 203 *ppMod = NULL; 204 } 205 return rc; 132 206 } 133 207 … … 162 236 * before closing the module. 163 237 * 164 * @returns 0 on success, 238 * @returns 0 on success, non-zero on failure. The module instance state 239 * is unknown on failure, it's best not to touch it. 165 240 * @param pMod The module. 166 241 */ 167 242 int kLdrModClose(PKLDRMOD pMod) 168 243 { 169 //pMod-> 170 return -1; 171 } 172 244 KLDRMOD_VALIDATE(pMod); 245 return pMod->pOps->pfnDestroy(pMod); 246 } 173 247 174 248 … … 194 268 const char *pszSymbol, PKLDRADDR puValue, uint32_t *pfKind) 195 269 { 196 return -1; 270 KLDRMOD_VALIDATE(pMod); 271 if (!puValue && !pfKind) 272 return KLDR_ERR_INVALID_PARAMETER; 273 if (puValue) 274 *puValue = 0; 275 if (pfKind) 276 *pfKind = 0; 277 return pMod->pOps->pfnDestroy(pMod); 197 278 } 198 279 … … 215 296 PFNKLDRMODENUMSYMS pfnCallback, void *pvUser) 216 297 { 217 return -1; 298 KLDRMOD_VALIDATE(pMod); 299 KLDRHLP_VALIDATE_FLAGS(fFlags, KLDRMOD_ENUM_SYMS_FLAGS_ALL); 300 return pMod->pOps->pfnEnumSymbols(pMod, fFlags, pvBits, BaseAddress, pfnCallback, pvUser); 218 301 } 219 302 … … 234 317 int kLdrModGetImport(PKLDRMOD pMod, void *pvBits, uint32_t iImport, const char *pszName, size_t cchName) 235 318 { 236 return -1; 319 KLDRMOD_VALIDATE(pMod); 320 return pMod->pOps->pfnGetImport(pMod, pvBits, iImport, pszName, cchName); 237 321 } 238 322 … … 248 332 int32_t kLdrModNumberOfImports(PKLDRMOD pMod, void *pvBits) 249 333 { 250 return -1; 334 KLDRMOD_VALIDATE(pMod); 335 return pMod->pOps->pfnNumberOfImports(pMod, pvBits); 251 336 } 252 337 … … 263 348 int kLdrModCanExecuteOn(PKLDRMOD pMod, void *pvBits, KLDRARCH enmArch, KLDRCPU enmCpu) 264 349 { 265 //return KLDR_ERR_ARCH_CPU_NOT_COMPATIBLE;266 return 0;350 ; 351 return ; 267 352 } 268 353 … … 282 367 int kLdrModGetStackInfo(PKLDRMOD pMod, void *pvBits, KLDRADDR BaseAddress, PKLDRSTACKINFO pStackInfo) 283 368 { 284 return -1; 369 KLDRMOD_VALIDATE(pMod); 370 return pMod->pOps->pfnGetStackInfo(pMod, pvBits, BaseAddress, pStackInfo); 285 371 } 286 372 … … 303 389 int kLdrModQueryMainEntrypoint(PKLDRMOD pMod, void *pvBits, KLDRADDR BaseAddress, PKLDRADDR pMainEPAddress) 304 390 { 305 return 1; 391 KLDRMOD_VALIDATE(pMod); 392 *pMainEPAddress = 0; 393 return pMod->pOps->pfnQueryMainEntrypoint(pMod, pvBits, BaseAddress, pMainEPAddress); 306 394 } 307 395 … … 320 408 int kLdrModEnumDbgInfo(PKLDRMOD pMod, void *pvBits, PFNKLDRENUMDBG pfnCallback, void *pvUser) 321 409 { 322 return 0; 410 KLDRMOD_VALIDATE(pMod); 411 return pMod->pOps->pfnEnumDbgInfo(pMod, pvBits, pfnCallback, pvUser); 323 412 } 324 413 … … 335 424 int kLdrModHasDbgInfo(PKLDRMOD pMod, void *pvBits) 336 425 { 337 return -1; 426 KLDRMOD_VALIDATE(pMod); 427 return pMod->pOps->pfnHasDbgInfo(pMod, pvBits); 338 428 } 339 429 … … 351 441 int kLdrModMap(PKLDRMOD pMod) 352 442 { 353 return -1; 443 KLDRMOD_VALIDATE(pMod); 444 return pMod->pOps->pfnMap(pMod); 354 445 } 355 446 … … 363 454 int kLdrModUnmap(PKLDRMOD pMod) 364 455 { 365 return -1; 456 KLDRMOD_VALIDATE(pMod); 457 return pMod->pOps->pfnUnmap(pMod); 366 458 } 367 459 … … 378 470 int kLdrModAllocTLS(PKLDRMOD pMod) 379 471 { 380 return 0; 472 KLDRMOD_VALIDATE(pMod); 473 return pMod->pOps->pfnAllocTLS(pMod); 381 474 } 382 475 … … 393 486 void kLdrModFreeTLS(PKLDRMOD pMod) 394 487 { 488 489 395 490 } 396 491 … … 409 504 int kLdrModReload(PKLDRMOD pMod) 410 505 { 411 return -1; 506 KLDRMOD_VALIDATE(pMod); 507 return pMod->pOps->pfnReload(pMod); 412 508 } 413 509 … … 426 522 int kLdrModFixupMapping(PKLDRMOD pMod, PFNKLDRMODGETIMPORT pfnGetImport, void *pvUser) 427 523 { 428 return -1; 524 KLDRMOD_VALIDATE(pMod); 525 return pMod->pOps->pfnFixupMapping(pMod, pfnGetImport, pvUser); 429 526 } 430 527 … … 438 535 int kLdrModCallInit(PKLDRMOD pMod) 439 536 { 440 return -1; 537 KLDRMOD_VALIDATE(pMod); 538 return pMod->pOps->pfnCallInit(pMod); 441 539 } 442 540 … … 452 550 int kLdrModCallTerm(PKLDRMOD pMod) 453 551 { 454 return 0; 552 KLDRMOD_VALIDATE(pMod); 553 return pMod->pOps->pfnCallTerm(pMod); 455 554 } 456 555 … … 466 565 int kLdrModCallThread(PKLDRMOD pMod, unsigned fAttachingOrDetaching) 467 566 { 468 return 0; 567 KLDRMOD_VALIDATE(pMod); 568 KLDRHLP_VALIDATE_FLAGS(fAttachingOrDetaching, 1); 569 return pMod->pOps->pfnCallThread(pMod, fAttachingOrDetaching); 469 570 } 470 571 … … 478 579 size_t kLdrModSize(PKLDRMOD pMod) 479 580 { 480 return 0; 581 KLDRMOD_VALIDATE_EX(pMod, 0); 582 return pMod->pOps->pfnSize(pMod); 481 583 } 482 584 … … 498 600 int kLdrModGetBits(PKLDRMOD pMod, void *pvBits, KLDRADDR BaseAddress, PFNKLDRMODGETIMPORT pfnGetImport, void *pvUser) 499 601 { 500 return -1; 602 KLDRMOD_VALIDATE(pMod); 603 return pMod->pOps->pfnGetBits(pMod, pvBits, BaseAddress, pfnGetImport, pvUser); 501 604 } 502 605 … … 517 620 PFNKLDRMODGETIMPORT pfnGetImport, void *pvUser) 518 621 { 519 return -1; 520 } 521 622 KLDRMOD_VALIDATE(pMod); 623 return pMod->pOps->pfnRelocateBits(pMod, pvBits, NewBaseAddress, OldBaseAddress, pfnGetImport, pvUser); 624 } 625
Note:
See TracChangeset
for help on using the changeset viewer.
