#include #include #include #pragma comment(lib, "d3d9.lib") #pragma comment(lib, "d3dx9.lib") typedef HRESULT ( WINAPI * _EndScene ) ( IDirect3DDevice9 * ) ; //прототип _EndScene oEndScene ; //экземпляр прототипа, для возврата оригинала typedef HRESULT ( WINAPI * _Reset ) ( IDirect3DDevice9 * , D3DPRESENT_PARAMETERS * ) ; _Reset oReset ; HRESULT WINAPI myEndScene ( IDirect3DDevice9 * m_pDevice ) { ImGui_ImplDX9_NewFrame ( ) ; ImGui_ImplWin32_NewFrame ( ) ; ImGui :: NewFrame ( ) ; ImGui :: EndFrame ( ) ; ImGui :: Render ( ) ; ImGui_ImplDX9_RenderDrawData ( ImGui :: GetDrawData ( ) ) ; return oEndScene ( m_pDevice ) ; // возврат оригинала } HRESULT WINAPI myReset ( IDirect3DDevice9 * m_pDevice , D3DPRESENT_PARAMETERS * pPresentationParameters ) { auto result = oReset ( m_pDevice , pPresentationParameters ) ; return result ; } void InitHook ( ) { void * * vTableDevice = * ( void * * * ) ( * ( DWORD * ) 0xC97C28 ) ; // адрес Device VMTHookManager * vmtHooks = new VMTHookManager ( vTableDevice ) ; oEndScene = ( _EndScene ) vmtHooks -> Hook ( 42 , ( void * ) myEndScene ) ; // 42 - номер EndScene } int WINAPI Thread ( ) { while ( * ( DWORD * ) 0xC8D4C0 != 9 ) // проверка на статус загрузки игры Sleep ( 100 ) ; InitHook ( ) ; return 0 ; } BOOL WINAPI DllMain ( HMODULE hModule , DWORD dwReason , LPVOID lpReserved ) { if ( dwReason == DLL_PROCESS_ATTACH ) CreateThread ( NULL , NULL , ( LPTHREAD_START_ROUTINE ) Thread , NULL , NULL , NULL ) ; return TRUE ; }