Code:
void CMenuMgr::SetHooks( bool bOn )
{
this->bHooked = bOn;
if(bOn){
DWORD OldProtect;
BYTE PatchBytes[] = { 0xE8, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90, 0x90 };
VirtualProtect(PatchBytes, 5, PAGE_EXECUTE_READWRITE, &OldProtect);
*(DWORD*) (PatchBytes + 1) = (DWORD) (myPresent) - (DWORD) (dwPresent + 5);
memcpy((void*) dwPresent, PatchBytes, 5);
VirtualProtect(PatchBytes, 5, PAGE_EXECUTE_READWRITE, &OldProtect);
*(DWORD*) (PatchBytes + 1) = (DWORD) (myReset) - (DWORD) (dwReset + 5);
memcpy((void*) dwReset, PatchBytes, 8);
VirtualProtect(PatchBytes, 5, PAGE_EXECUTE_READWRITE, &OldProtect);
*(DWORD*) (PatchBytes + 1) = (DWORD) (myDrawIndexedPrimitive) - (DWORD) (dwDIP + 5);
memcpy((void*) dwDIP, PatchBytes, 8);
} else {
DWORD OldProtect;
BYTE RepatchBytesPresent[] = { 0x8B, 0x51, 0x44, 0xFF, 0xD2, 0x89, 0x45, 0xEC };
VirtualProtect(RepatchBytesPresent, 8, PAGE_EXECUTE_READWRITE, &OldProtect);
memcpy((void*)dwPresent, RepatchBytesPresent, 8);
BYTE RepatchBytesReset[] = { 0x8B, 0x51, 0x40, 0xFF, 0xD2, 0x89, 0x45, 0xFC };
VirtualProtect(RepatchBytesReset, 8, PAGE_EXECUTE_READWRITE, &OldProtect);
memcpy((void*)dwReset, RepatchBytesReset, 8);
BYTE RepatchBytesDIP[] = { 0x8B, 0x91, 0x48, 0x01, 0x00, 0x00, 0xFF, 0xD2 };
VirtualProtect(RepatchBytesReset, 8, PAGE_EXECUTE_READWRITE, &OldProtect);
memcpy((void*)dwDIP, RepatchBytesDIP, 8);
}
}