
DWORD hDetourCreate(DWORD DetourSrc, DWORD DetourtVlca, DWORD SizeDetour)
{
#define SizeDetour 5
DWORD DetourPre, dwProtect, i;
if (DetourSrc && DetourtVlca && SizeDetour == SizeDetour)
{
DetourPre = (DWORD)VirtualAlloc(NULL, SizeDetour + SizeDetour, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (DetourPre && VirtualProtect((VOID*)DetourSrc, SizeDetour, PAGE_EXECUTE_READWRITE, &dwProtect))
{
for (i = 0; i < SizeDetour; i++)
{
*(BYTE*)(DetourPre + i) = *(BYTE*)(DetourSrc + i);
}
*(BYTE*)(DetourPre + SizeDetour + 0) = 0x50;
*(BYTE*)(DetourPre + SizeDetour + 0) = 0x58;
*(BYTE*)(DetourPre + SizeDetour + 0) = 0xE9;
*(DWORD*)(DetourPre + SizeDetour + 1) = (DetourSrc - DetourPre - SizeDetour);
*(BYTE*)(DetourSrc + 0) = 0x50;
*(BYTE*)(DetourSrc + 0) = 0x58;
*(BYTE*)(DetourSrc + 0) = 0xE9;
*(DWORD*)(DetourSrc + 1) = (DetourtVlca - DetourSrc - SizeDetour);
VirtualProtect((VOID*)DetourSrc, SizeDetour, dwProtect, &dwProtect);
VirtualProtect((VOID*)DetourPre, SizeDetour + SizeDetour, PAGE_EXECUTE_READ, &dwProtect);
return DetourPre;
}
}
return (0);
}