MCPcopy Create free account
hub / github.com/acl-dev/acl / DetourFindPayload

Function DetourFindPayload

lib_fiber/cpp/src/detours/modules.cpp:779–827  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

777_Readable_bytes_(*pcbData)
778_Success_(return != NULL)
779PVOID 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)

Callers 1

DetourFindPayloadExFunction · 0.85

Calls 2

DetourAreSameGuidFunction · 0.85

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…