Changeset 2851 for trunk/kLdr/kLdrMod.c
- Timestamp:
- Nov 2, 2006, 4:21:54 AM (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kLdr/kLdrMod.c
r2849 r2851 39 39 # include "kLdrModELF64.h" 40 40 #endif 41 42 43 /******************************************************************************* 44 * Defined Constants And Macros * 45 *******************************************************************************/ 46 /** @def KLDRMOD_STRICT 47 * Define KLDRMOD_STRICT to enabled strict checks in KLDRMOD. */ 48 #define KLDRMOD_STRICT 1 49 50 /** @def KLDRMOD_ASSERT 51 * Assert that an expression is true when KLDR_STRICT is defined. 52 */ 53 #ifdef KLDRMOD_STRICT 54 # define KLDRMOD_ASSERT(expr) kldrHlpAssert(expr) 55 #else 56 # define KLDRMOD_ASSERT(expr) do {} while (0) 57 #endif 58 59 /** Return / crash validation of a module argument. */ 60 #define KLDRMOD_VALIDATE_EX(pMod, rc) \ 61 do { \ 62 if ( (pMod)->u32Magic != KLDRMOD_MAGIC \ 63 || (pMod)->pOps == NULL \ 64 )\ 65 { \ 66 return (rc); \ 67 } \ 68 } while (0) 69 70 /** Return / crash validation of a module argument. */ 71 #define KLDRMOD_VALIDATE(pMod) \ 72 KLDRMOD_VALIDATE_EX(pMod, KLDR_ERR_INVALID_PARAMETER) 73 74 /** Return / crash validation of a module argument. */ 75 #define KLDRMOD_VALIDATE_VOID(pMod) \ 76 do { \ 77 if ( (pMod)->u32Magic != KLDRMOD_MAGIC \ 78 || (pMod)->pOps == NULL \ 79 )\ 80 { \ 81 return; \ 82 } \ 83 } while (0) 84 85 86 /******************************************************************************* 87 * Global Variables * 88 *******************************************************************************/ 89 /** The list of module interpreters. */ 90 static PCKLDRMODOPS g_pModInterpreterHead = NULL; 91 92 93 94 /******************************************************************************* 95 * Internal Functions * 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 head on. 118 175 */ 119 176 if (u.u16 == IMAGE_DOS_SIGNATURE) 120 r eturnKLDR_ERR_MZ_NOT_SUPPORTED;177 rc = KLDR_ERR_MZ_NOT_SUPPORTED; 121 178 else if (u.u16 == IMAGE_NE_SIGNATURE) 122 r eturnKLDR_ERR_NE_NOT_SUPPORTED;179 rc = KLDR_ERR_NE_NOT_SUPPORTED; 123 180 else if (u.u16 == IMAGE_LX_SIGNATURE) 124 r eturnKLDR_ERR_LX_NOT_SUPPORTED;181 rc = KLDR_ERR_LX_NOT_SUPPORTED; 125 182 else if (u.u16 == IMAGE_LE_SIGNATURE) 126 r eturnKLDR_ERR_LE_NOT_SUPPORTED;183 rc = KLDR_ERR_LE_NOT_SUPPORTED; 127 184 else if (u.u32 == IMAGE_NT_SIGNATURE) 128 r eturnKLDR_ERR_PE_NOT_SUPPORTED;185 rc = 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 KLDRMOD_VALIDATE(pMod); 351 return pMod->pOps->pfnCanExecuteOn(pMod, pvBits, enmArch, enmCpu); 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 KLDRMOD_VALIDATE_VOID(pMod); 489 pMod->pOps->pfnFreeTLS(pMod); 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.