#include <Windows.h>
typedef void( __stdcall* RenderScreen_t )( void* a, void* b, void* c );
class CRenderer* g_pRenderer = NULL;
RenderScreen_t pRenderScreen = NULL;
DWORD dwRendBase = NULL;
BOOL iWrite ( DWORD Address, void* Data, DWORD Length )
{
DWORD Old = 0;
VirtualProtect( ( void* )( Address ), Length, PAGE_EXECUTE_READWRITE, &Old);
memcpy( ( void* )Address, Data, Length );
VirtualProtect( ( void* )( Address ), Length, Old, &Old);
return 0;
}
DWORD HookVTable ( PDWORD Class, DWORD function, int index )
{
DWORD oldRights, newRights, oldAddress;
if ( !IsBadReadPtr( Class, 4 ) )
{
DWORD* functionAddress = (DWORD*) ( (PDWORD) ( *Class + ( index * 4 ) ) );
if ( *functionAddress != function )
{
if (VirtualProtectEx(GetCurrentProcess(), functionAddress, 4, PAGE_EXECUTE_READWRITE, &oldRights))
{
oldAddress = *functionAddress;
*functionAddress = (DWORD) function;
}
VirtualProtectEx(GetCurrentProcess(), functionAddress, 4, oldRights, &newRights);
}
}
return oldAddress;
}
void stuffon(){
iWrite( 0x7786FF, (PBYTE)"\x90\x90", 2 );//mm1 / 1
iWrite( 0x7787DB, (PBYTE)"\x90\x90", 2 );//mm2 / 4
iWrite( 0x7836F9, (PBYTE)"\x90\x90", 2 );//mm3 / 8
//iWrite( 0x468CBE, (PBYTE)"\x90\x90", 2 );//Unlocks1
//iWrite( 0x5028C5, (PBYTE)"\x90\x90", 2 );//Unlocks2
iWrite( 0x78B29E, (PBYTE)"\x90\x90\x90\x90\x90\x90", 6 );//tv static
}
void stuffoff(){
iWrite( 0x7786FF, (PBYTE)"\x75\x0C", 2 );//mm1
iWrite( 0x7787DB, (PBYTE)"\x75\x09", 2 );//mm2
iWrite( 0x7836F9, (PBYTE)"\x75\x06", 2 );//mm3
//iWrite( 0x468CBE, (PBYTE)"\x74\x07", 2 );//Unlocks1
//iWrite( 0x5028C5, (PBYTE)"\x7C\x14", 2 );//Unlocks2
iWrite( 0x78B29E, (PBYTE)"\x8B\x92\xA0\x00\x00\x00", 6 );//tv static
}
void __stdcall hkRenderScreen( void* a, void* b, void* c )
{
_asm pushad;
stuffon();
__asm{
popad;
push c;
push b;
push a;
call pRenderScreen;
pushad;
}
stuffoff();
_asm popad;
}
DWORD WINAPI RendHook(LPVOID)
{
while(dwRendBase == 0) dwRendBase = (DWORD)GetModuleHandleA("RendDX9.dll");
DWORD OffRend = dwRendBase+0x23D098;
CRenderer *g_pRenderer = *(CRenderer**)OffRend;
if(g_pRenderer)
{
pRenderScreen = ( RenderScreen_t )HookVTable((PDWORD)g_pRenderer,( DWORD )hkRenderScreen, 10 );
}
return 0;
}
BOOL WINAPI DllMain (HINSTANCE hModule, DWORD dwReason, LPVOID lpvReserved)
{
if (dwReason == DLL_PROCESS_ATTACH)
{CreateThread(0,0,RendHook,0,0,0);}
return -1;
}