bool ToggleHookFinished = true; void RemoveHook( ) { //Only remove CGAME + UI Once as when you rehook VM_Create it will auto hook them again ;) CGame.RemoveDetour( ); UI.RemoveDetour( ); VCreate.RemoveDetour( ); } void ApplyHook( ) { VCreate.SetDetour( ); } DWORD ToggleHookThread( ) { Sleep( 2000 ); ApplyHook( ); ToggleHookFinished = true; return 0; } void ToggleHook( ) { RemoveHook( ); CTHREAD( ToggleHookThread, 0 ); } DWORD (__stdcall *orig_VirtualQueryEx )( HANDLE Process, void *pAddress, PMEMORY_BASIC_INFORMATION pMBIBuffer, DWORD Length ); DWORD __stdcall 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 ); } BOOL APIENTRY DllMain( HMODULE hModule, DWORD dwReason, LPVOID lpReserved ) { if ( dwReason == DLL_PROCESS_ATTACH ) { orig_VMCreate = (DWORD (WINAPIV *)(LPVOID)) VCreate.CreatePBDetourEx( (PBYTE) VMCREATE_ADDR, (PBYTE) VMCreate_Hook ); orig_LoadLibrary = (HMODULE (WINAPI *)(LPCTSTR)) DetourFunction( (PBYTE) LoadLibraryA, (PBYTE)LoadLibrary_Hook ); orig_VirtualQueryEx = (DWORD (__stdcall *)(HANDLE,void *,PMEMORY_BASIC_INFORMATION,DWORD))VQEX.CreatePBDetourEx( (PBYTE)GetProcAddress( LoadLibraryA( "kernel32.dll" ), "VirtualQueryEx" ), (PBYTE)VirtualQueryEx_hook ); } return TRUE; }