| 542 | } |
| 543 | |
| 544 | BOOL WINAPI DetourEnumerateImportsEx(_In_opt_ HMODULE hModule, |
| 545 | _In_opt_ PVOID pContext, |
| 546 | _In_opt_ PF_DETOUR_IMPORT_FILE_CALLBACK pfImportFile, |
| 547 | _In_opt_ PF_DETOUR_IMPORT_FUNC_CALLBACK_EX pfImportFunc) |
| 548 | { |
| 549 | PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)hModule; |
| 550 | if (hModule == NULL) { |
| 551 | pDosHeader = (PIMAGE_DOS_HEADER)GetModuleHandleW(NULL); |
| 552 | } |
| 553 | |
| 554 | __try { |
| 555 | #pragma warning(suppress:6011) // GetModuleHandleW(NULL) never returns NULL. |
| 556 | if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE) { |
| 557 | SetLastError(ERROR_BAD_EXE_FORMAT); |
| 558 | return FALSE; |
| 559 | } |
| 560 | |
| 561 | PIMAGE_NT_HEADERS pNtHeader = (PIMAGE_NT_HEADERS)((PBYTE)pDosHeader + |
| 562 | pDosHeader->e_lfanew); |
| 563 | if (pNtHeader->Signature != IMAGE_NT_SIGNATURE) { |
| 564 | SetLastError(ERROR_INVALID_EXE_SIGNATURE); |
| 565 | return FALSE; |
| 566 | } |
| 567 | if (pNtHeader->FileHeader.SizeOfOptionalHeader == 0) { |
| 568 | SetLastError(ERROR_EXE_MARKED_INVALID); |
| 569 | return FALSE; |
| 570 | } |
| 571 | |
| 572 | PIMAGE_IMPORT_DESCRIPTOR iidp |
| 573 | = (PIMAGE_IMPORT_DESCRIPTOR) |
| 574 | RvaAdjust(pDosHeader, |
| 575 | pNtHeader->OptionalHeader |
| 576 | .DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress); |
| 577 | |
| 578 | if (iidp == NULL) { |
| 579 | SetLastError(ERROR_EXE_MARKED_INVALID); |
| 580 | return FALSE; |
| 581 | } |
| 582 | |
| 583 | for (; iidp->OriginalFirstThunk != 0; iidp++) { |
| 584 | |
| 585 | PCSTR pszName = (PCHAR)RvaAdjust(pDosHeader, iidp->Name); |
| 586 | if (pszName == NULL) { |
| 587 | SetLastError(ERROR_EXE_MARKED_INVALID); |
| 588 | return FALSE; |
| 589 | } |
| 590 | |
| 591 | PIMAGE_THUNK_DATA pThunks = (PIMAGE_THUNK_DATA) |
| 592 | RvaAdjust(pDosHeader, iidp->OriginalFirstThunk); |
| 593 | PVOID * pAddrs = (PVOID *) |
| 594 | RvaAdjust(pDosHeader, iidp->FirstThunk); |
| 595 | |
| 596 | HMODULE hFile = DetourGetContainingModule(pAddrs[0]); |
| 597 | |
| 598 | if (pfImportFile != NULL) { |
| 599 | if (!pfImportFile(pContext, hFile, pszName)) { |
| 600 | break; |
| 601 | } |
no test coverage detected
searching dependent graphs…