BOOL WINAPI DetourEnumerateExports(HMODULE hModule, PVOID pContext, PF_DETOUR_ENUMERATE_EXPORT_CALLBACK pfExport) { PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)hModule; if (hModule == NULL) { pDosHeader = (PIMAGE_DOS_HEADER)GetModuleHandle(NULL); } __try { if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE) { SetLastError(ERROR_BAD_EXE_FORMAT); return NULL; } PIMAGE_NT_HEADERS pNtHeader = (PIMAGE_NT_HEADERS)((PBYTE)pDosHeader + pDosHeader->e_lfanew); if (pNtHeader->Signature != IMAGE_NT_SIGNATURE) { SetLastError(ERROR_INVALID_EXE_SIGNATURE); return FALSE; } if (pNtHeader->FileHeader.SizeOfOptionalHeader == 0) { SetLastError(ERROR_EXE_MARKED_INVALID); return FALSE; } PIMAGE_EXPORT_DIRECTORY pExportDir = (PIMAGE_EXPORT_DIRECTORY) RvaAdjust(hModule, pNtHeader->OptionalHeader .DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress); if (pExportDir == NULL) { SetLastError(ERROR_EXE_MARKED_INVALID); return FALSE; } PDWORD pdwFunctions = (PDWORD)RvaAdjust(hModule, pExportDir->AddressOfFunctions); PDWORD pdwNames = (PDWORD)RvaAdjust(hModule, pExportDir->AddressOfNames); PWORD pwOrdinals = (PWORD)RvaAdjust(hModule, pExportDir->AddressOfNameOrdinals); for (DWORD nFunc = 0; nFunc < pExportDir->NumberOfFunctions; nFunc++) { PBYTE pbCode = (pdwFunctions != NULL) ? (PBYTE)RvaAdjust(hModule, pdwFunctions[nFunc]) : NULL; PCHAR pszName = (nFunc < pExportDir->NumberOfNames && pdwNames != NULL) ? (PCHAR)RvaAdjust(hModule, pdwNames[nFunc]) : NULL; ULONG nOrdinal = (pwOrdinals != NULL) ? pExportDir->Base + pwOrdinals[nFunc] : NULL; if (!(*pfExport)(pContext, nOrdinal, pszName, pbCode)) { break; } } SetLastError(NO_ERROR); return TRUE; } __except(EXCEPTION_EXECUTE_HANDLER) { SetLastError(ERROR_EXE_MARKED_INVALID); return NULL; } }
BOOL WINAPI DetourEnumerateImports(HMODULE hModule, PVOID pContext, PF_DETOUR_IMPORT_FILE_CALLBACK pfImportFile, PF_DETOUR_IMPORT_FUNC_CALLBACK pfImportFunc) { PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)hModule; if (hModule == NULL) { pDosHeader = (PIMAGE_DOS_HEADER)GetModuleHandleW(NULL); } __try { if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE) { SetLastError(ERROR_BAD_EXE_FORMAT); return FALSE; } PIMAGE_NT_HEADERS pNtHeader = (PIMAGE_NT_HEADERS)((PBYTE)pDosHeader + pDosHeader->e_lfanew); if (pNtHeader->Signature != IMAGE_NT_SIGNATURE) { SetLastError(ERROR_INVALID_EXE_SIGNATURE); return FALSE; } if (pNtHeader->FileHeader.SizeOfOptionalHeader == 0) { SetLastError(ERROR_EXE_MARKED_INVALID); return FALSE; } PIMAGE_IMPORT_DESCRIPTOR iidp = (PIMAGE_IMPORT_DESCRIPTOR) RvaAdjust(pDosHeader, pNtHeader->OptionalHeader .DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress); if (iidp == NULL) { SetLastError(ERROR_EXE_MARKED_INVALID); return FALSE; } for (; iidp->OriginalFirstThunk != 0; iidp++) { PCSTR pszName = (PCHAR)RvaAdjust(pDosHeader, iidp->Name); if (pszName == NULL) { SetLastError(ERROR_EXE_MARKED_INVALID); return FALSE; } PIMAGE_THUNK_DATA pThunks = (PIMAGE_THUNK_DATA) RvaAdjust(pDosHeader, iidp->OriginalFirstThunk); PVOID * pAddrs = (PVOID *) RvaAdjust(pDosHeader, iidp->FirstThunk); HMODULE hFile = DetourGetContainingModule(pAddrs[0]); if (pfImportFile != NULL) { if (!pfImportFile(pContext, hFile, pszName)) { break; } } DWORD nNames = 0; if (pThunks) { for (; pThunks[nNames].u1.Ordinal; nNames++) { DWORD nOrdinal = 0; PCSTR pszFunc = NULL; if (IMAGE_SNAP_BY_ORDINAL(pThunks[nNames].u1.Ordinal)) { nOrdinal = (DWORD)IMAGE_ORDINAL(pThunks[nNames].u1.Ordinal); } else { pszFunc = (PCSTR)RvaAdjust(pDosHeader, (DWORD)pThunks[nNames].u1.AddressOfData + 2); } if (pfImportFunc != NULL) { if (!pfImportFunc(pContext, nOrdinal, pszFunc, pAddrs[nNames])) { break; } } } if (pfImportFunc != NULL) { pfImportFunc(pContext, 0, NULL, NULL); } } } if (pfImportFile != NULL) { pfImportFile(pContext, NULL, NULL); } SetLastError(NO_ERROR); return TRUE; } __except(EXCEPTION_EXECUTE_HANDLER) { SetLastError(ERROR_EXE_MARKED_INVALID); return FALSE; } }