| 404 | } |
| 405 | |
| 406 | HMODULE WINAPI DetourGetContainingModule(_In_ PVOID pvAddr) |
| 407 | { |
| 408 | MEMORY_BASIC_INFORMATION mbi; |
| 409 | ZeroMemory(&mbi, sizeof(mbi)); |
| 410 | |
| 411 | __try { |
| 412 | if (VirtualQuery(pvAddr, &mbi, sizeof(mbi)) <= 0) { |
| 413 | SetLastError(ERROR_BAD_EXE_FORMAT); |
| 414 | return NULL; |
| 415 | } |
| 416 | |
| 417 | // Skip uncommitted regions and guard pages. |
| 418 | // |
| 419 | if ((mbi.State != MEM_COMMIT) || |
| 420 | ((mbi.Protect & 0xff) == PAGE_NOACCESS) || |
| 421 | (mbi.Protect & PAGE_GUARD)) { |
| 422 | SetLastError(ERROR_BAD_EXE_FORMAT); |
| 423 | return NULL; |
| 424 | } |
| 425 | |
| 426 | PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)mbi.AllocationBase; |
| 427 | if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE) { |
| 428 | SetLastError(ERROR_BAD_EXE_FORMAT); |
| 429 | return NULL; |
| 430 | } |
| 431 | |
| 432 | PIMAGE_NT_HEADERS pNtHeader = (PIMAGE_NT_HEADERS)((PBYTE)pDosHeader + |
| 433 | pDosHeader->e_lfanew); |
| 434 | if (pNtHeader->Signature != IMAGE_NT_SIGNATURE) { |
| 435 | SetLastError(ERROR_INVALID_EXE_SIGNATURE); |
| 436 | return NULL; |
| 437 | } |
| 438 | if (pNtHeader->FileHeader.SizeOfOptionalHeader == 0) { |
| 439 | SetLastError(ERROR_EXE_MARKED_INVALID); |
| 440 | return NULL; |
| 441 | } |
| 442 | SetLastError(NO_ERROR); |
| 443 | |
| 444 | return (HMODULE)pDosHeader; |
| 445 | } |
| 446 | __except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ? |
| 447 | EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) { |
| 448 | SetLastError(ERROR_INVALID_EXE_SIGNATURE); |
| 449 | return NULL; |
| 450 | } |
| 451 | } |
| 452 | |
| 453 | |
| 454 | static inline PBYTE RvaAdjust(_Pre_notnull_ PIMAGE_DOS_HEADER pDosHeader, _In_ DWORD raddr) |
no outgoing calls
no test coverage detected
searching dependent graphs…