PVOID WINAPI DetourFindPayload(HMODULE hModule, REFGUID rguid, DWORD * pcbData) { PBYTE pbData = NULL; if (pcbData) { *pcbData = 0; } PDETOUR_LOADED_BINARY pBinary = GetPayloadSectionFromModule(hModule); if (pBinary == NULL) { // Error set by GetPayloadSectionFromModule. return NULL; } __try { DETOUR_SECTION_HEADER *pHeader = (DETOUR_SECTION_HEADER *)pBinary; if (pHeader->cbHeaderSize < sizeof(DETOUR_SECTION_HEADER) || pHeader->nSignature != DETOUR_SECTION_HEADER_SIGNATURE) { SetLastError(ERROR_INVALID_EXE_SIGNATURE); return NULL; } PBYTE pbBeg = ((PBYTE)pHeader) + pHeader->nDataOffset; PBYTE pbEnd = ((PBYTE)pHeader) + pHeader->cbDataSize; for (pbData = pbBeg; pbData < pbEnd;) { DETOUR_SECTION_RECORD *pSection = (DETOUR_SECTION_RECORD *)pbData; if (pSection->guid.Data1 == rguid.Data1 && pSection->guid.Data2 == rguid.Data2 && pSection->guid.Data3 == rguid.Data3 && pSection->guid.Data4[0] == rguid.Data4[0] && pSection->guid.Data4[1] == rguid.Data4[1] && pSection->guid.Data4[2] == rguid.Data4[2] && pSection->guid.Data4[3] == rguid.Data4[3] && pSection->guid.Data4[4] == rguid.Data4[4] && pSection->guid.Data4[5] == rguid.Data4[5] && pSection->guid.Data4[6] == rguid.Data4[6] && pSection->guid.Data4[7] == rguid.Data4[7]) { if (pcbData) { *pcbData = pSection->cbBytes - sizeof(*pSection); SetLastError(NO_ERROR); return (PBYTE)(pSection + 1); } } pbData = (PBYTE)pSection + pSection->cbBytes; } SetLastError(ERROR_INVALID_HANDLE); return NULL; } __except(EXCEPTION_EXECUTE_HANDLER) { SetLastError(ERROR_INVALID_HANDLE); return NULL; } }
DWORD WINAPI DetourGetSizeOfPayloads(HMODULE hModule) { PDETOUR_LOADED_BINARY pBinary = GetPayloadSectionFromModule(hModule); if (pBinary == NULL) { // Error set by GetPayloadSectonFromModule. return 0; } __try { DETOUR_SECTION_HEADER *pHeader = (DETOUR_SECTION_HEADER *)pBinary; if (pHeader->cbHeaderSize < sizeof(DETOUR_SECTION_HEADER) || pHeader->nSignature != DETOUR_SECTION_HEADER_SIGNATURE) { SetLastError(ERROR_INVALID_HANDLE); return 0; } SetLastError(NO_ERROR); return pHeader->cbDataSize; } __except(EXCEPTION_EXECUTE_HANDLER) { SetLastError(ERROR_INVALID_HANDLE); return 0; } }