| 777 | _Readable_bytes_(*pcbData) |
| 778 | _Success_(return != NULL) |
| 779 | PVOID WINAPI DetourFindPayload(_In_opt_ HMODULE hModule, |
| 780 | _In_ REFGUID rguid, |
| 781 | _Out_opt_ DWORD *pcbData) |
| 782 | { |
| 783 | PBYTE pbData = NULL; |
| 784 | if (pcbData) { |
| 785 | *pcbData = 0; |
| 786 | } |
| 787 | |
| 788 | PDETOUR_LOADED_BINARY pBinary = GetPayloadSectionFromModule(hModule); |
| 789 | if (pBinary == NULL) { |
| 790 | // Error set by GetPayloadSectionFromModule. |
| 791 | return NULL; |
| 792 | } |
| 793 | |
| 794 | __try { |
| 795 | DETOUR_SECTION_HEADER *pHeader = (DETOUR_SECTION_HEADER *)pBinary; |
| 796 | if (pHeader->cbHeaderSize < sizeof(DETOUR_SECTION_HEADER) || |
| 797 | pHeader->nSignature != DETOUR_SECTION_HEADER_SIGNATURE) { |
| 798 | |
| 799 | SetLastError(ERROR_INVALID_EXE_SIGNATURE); |
| 800 | return NULL; |
| 801 | } |
| 802 | |
| 803 | PBYTE pbBeg = ((PBYTE)pHeader) + pHeader->nDataOffset; |
| 804 | PBYTE pbEnd = ((PBYTE)pHeader) + pHeader->cbDataSize; |
| 805 | |
| 806 | for (pbData = pbBeg; pbData < pbEnd;) { |
| 807 | DETOUR_SECTION_RECORD *pSection = (DETOUR_SECTION_RECORD *)pbData; |
| 808 | |
| 809 | if (DetourAreSameGuid(pSection->guid, rguid)) { |
| 810 | if (pcbData) { |
| 811 | *pcbData = pSection->cbBytes - sizeof(*pSection); |
| 812 | } |
| 813 | SetLastError(NO_ERROR); |
| 814 | return (PBYTE)(pSection + 1); |
| 815 | } |
| 816 | |
| 817 | pbData = (PBYTE)pSection + pSection->cbBytes; |
| 818 | } |
| 819 | SetLastError(ERROR_INVALID_HANDLE); |
| 820 | return NULL; |
| 821 | } |
| 822 | __except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ? |
| 823 | EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) { |
| 824 | SetLastError(ERROR_INVALID_HANDLE); |
| 825 | return NULL; |
| 826 | } |
| 827 | } |
| 828 | |
| 829 | _Writable_bytes_(*pcbData) |
| 830 | _Readable_bytes_(*pcbData) |
no test coverage detected
searching dependent graphs…