void ApplyHook() { orig_CG_Init = (void (WINAPIV *)(int,int,int,int)) \ DetourFunction((PBYTE)Game->CG_Init, (PBYTE)CG_Init_Hook ); __asm mov [ orig_CG_Init ], eax; orig_RegisterFont = (DWORD (__cdecl *)(char *,int)) \ DetourFunction((PBYTE)Game->CG_RegisterFont, (PBYTE)R_RegisterFont); __asm mov [ orig_RegisterFont ], eax; orig_RenderScene = (void (__cdecl *)(void)) \ DetourFunction((PBYTE)Game->CG_RenderScene, (PBYTE)R_RenderScene); __asm mov [ orig_RenderScene ], eax; orig_EndFrame = (void (__cdecl *)(void)) \ DetourFunction((PBYTE)Game->CG_EndFrame, (PBYTE)EndFrame ); __asm mov [ orig_EndFrame ], eax; orig_CG_FireRecoil = (void (__cdecl *)(void)) \ DetourFunction((PBYTE)Game->CG_FireRecoil, (PBYTE)CG_FireRecoil); __asm mov [ orig_CG_FireRecoil ], eax; orig_CG_Obituary = (void (__cdecl *)(void)) \ DetourFunction((PBYTE)Game->CG_Obituary, (PBYTE)CG_Obituary_Hook ); __asm mov [ orig_CG_Obituary ], eax; orig_CvarReg = (vmCvar_t *(__cdecl *)(LPCSTR,int,int,LPCSTR,int,int,int,int,int,int)) \ DetourFunction((PBYTE)Game->CG_CvarReg, (PBYTE)CvarReg_Hook ); __asm mov [ orig_CvarReg ], eax; } void RemoveHook( ) { DetourRemove((PBYTE)orig_CG_Init, (PBYTE)CG_Init_Hook ); DetourRemove((PBYTE)orig_RegisterFont, (PBYTE)R_RegisterFont ); DetourRemove((PBYTE)orig_RenderScene, (PBYTE)R_RenderScene ); DetourRemove((PBYTE)orig_EndFrame, (PBYTE)EndFrame ); DetourRemove((PBYTE)orig_CG_FireRecoil, (PBYTE)CG_FireRecoil ); DetourRemove((PBYTE)orig_CG_Obituary, (PBYTE)CG_Obituary_Hook ); DetourRemove((PBYTE)orig_CvarReg, (PBYTE)CvarReg_Hook ); } DWORD ToggleHookThread( ) { Sleep( 2000 ); ApplyHook( ); return 0; } void ToggleHook( ) { RemoveHook( ); CTHREAD( ToggleHookThread, 0 ); } DWORD ( WINAPI *orig_VirtualQueryEx )( HANDLE Process, void *pAddress, PMEMORY_BASIC_INFORMATION pMBIBuffer, DWORD Length ); DWORD WINAPI VirtualQueryEx_Hook( HANDLE Process, void *pAddress, PMEMORY_BASIC_INFORMATION pMBIBuffer, DWORD Length ) { if( (DWORD)pAddress == 0x400000 && Length == 0x1C && ToggleHookFinished == true ) { ToggleHookFinished = false; ToggleHook( ); } return orig_VirtualQueryEx( Process, pAddress, pMBIBuffer, Length ); }