Code:
#include <windows.h>
#include <d3dx9.h>
#include <d3d9.h>
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
#define WIN32_LEAN_AND_MEAN
typedef HRESULT (WINAPI* CreateDevice_Prototype) (LPDIRECT3D9, UINT, D3DDEVTYPE, HWND, DWORD, D3DPRESENT_PARAMETERS*, LPDIRECT3DDEVICE9*);
typedef HRESULT (WINAPI* Reset_Prototype) (LPDIRECT3DDEVICE9, D3DPRESENT_PARAMETERS*);
typedef HRESULT (WINAPI* EndScene_Prototype) (LPDIRECT3DDEVICE9);
typedef HRESULT (WINAPI* DrawIndexedPrimitive_Prototype) (LPDIRECT3DDEVICE9, D3DPRIMITIVETYPE, INT, UINT, UINT, UINT, UINT);
CreateDevice_Prototype CreateDevice_Pointer = NULL;
Reset_Prototype Reset_Pointer = NULL;
EndScene_Prototype EndScene_Pointer = NULL;
DrawIndexedPrimitive_Prototype DrawIndexedPrimitive_Pointer = NULL;
HRESULT WINAPI Direct3DCreate9_VMTable (VOID);
HRESULT WINAPI CreateDevice_Detour (LPDIRECT3D9, UINT, D3DDEVTYPE, HWND, DWORD, D3DPRESENT_PARAMETERS*, LPDIRECT3DDEVICE9*);
HRESULT WINAPI Reset_Detour (LPDIRECT3DDEVICE9, D3DPRESENT_PARAMETERS*);
HRESULT WINAPI EndScene_Detour (LPDIRECT3DDEVICE9);
HRESULT WINAPI DrawIndexedPrimitive_Detour(LPDIRECT3DDEVICE9, D3DPRIMITIVETYPE, INT, UINT, UINT, UINT, UINT);
DWORD WINAPI VirtualMethodTableRepatchingLoopToCounterExtensionRepatching(LPVOID);
PDWORD Direct3D_VMTable = NULL;
int ESCount = 0;
int RCount = 0;
int DIPCount = 0;
bool WINAPI DllMain(HINSTANCE Module, DWORD Reason, LPVOID Reserved) {
if (Reason == DLL_PROCESS_ATTACH) {
DisableThreadLibraryCalls(Module);
MessageBox(NULL, (LPCSTR)"Attempting to hook D3D9...", (LPCSTR)"Xareq Private", MB_OK);
if (Direct3DCreate9_VMTable() == D3D_OK) {
MessageBox(NULL, (LPCSTR)"Hook Successful!", (LPCSTR)"Xareq Private", MB_OK);
return true;
};
MessageBox(NULL, (LPCSTR)"Hook Failed!", (LPCSTR)"Xareq Private", MB_OK);
return false;
};
};
HRESULT WINAPI Direct3DCreate9_VMTable(VOID) {
LPDIRECT3D9 Direct3D_Object = Direct3DCreate9(D3D_SDK_VERSION);
if(Direct3D_Object == NULL)
return D3DERR_INVALIDCALL;
Direct3D_VMTable = (PDWORD)*(PDWORD)Direct3D_Object;
Direct3D_Object -> Release();
DWORD Protect;
if(VirtualProtect(&Direct3D_VMTable[16], sizeof(DWORD), PAGE_READWRITE, &Protect) != 0) {
*(PDWORD)&CreateDevice_Pointer = Direct3D_VMTable[16];
*(PDWORD)&Direct3D_VMTable[16] = (DWORD)CreateDevice_Detour;
if(VirtualProtect(&Direct3D_VMTable[16], sizeof(DWORD), Protect, &Protect) == 0)
return D3DERR_INVALIDCALL;
}
else {
return D3DERR_INVALIDCALL;
};
return D3D_OK;
};
HRESULT WINAPI CreateDevice_Detour(
LPDIRECT3D9 Direct3D_Object,
UINT Adapter,
D3DDEVTYPE DeviceType,
HWND FocusWindow,
DWORD BehaviorFlags,
D3DPRESENT_PARAMETERS* PresentationParameters,
LPDIRECT3DDEVICE9* Returned_Device_Interface
) {
HRESULT Returned_Result = CreateDevice_Pointer(
Direct3D_Object,
Adapter,
DeviceType,
FocusWindow,
BehaviorFlags,
PresentationParameters,
Returned_Device_Interface
);
DWORD Protect;
if(VirtualProtect(&Direct3D_VMTable[16], sizeof(DWORD), PAGE_READWRITE, &Protect) != 0) {
*(PDWORD)&Direct3D_VMTable[16] = *(PDWORD)&CreateDevice_Pointer;
CreateDevice_Pointer = NULL;
if(VirtualProtect(&Direct3D_VMTable[16], sizeof(DWORD), Protect, &Protect) == 0) {
return D3DERR_INVALIDCALL;
};
}
else {
return D3DERR_INVALIDCALL;
};
if(Returned_Result == D3D_OK) {
Direct3D_VMTable = (PDWORD)*(PDWORD)*Returned_Device_Interface;
*(PDWORD)&Reset_Pointer = (DWORD)Direct3D_VMTable[16];
*(PDWORD)&EndScene_Pointer = (DWORD)Direct3D_VMTable[42];
*(PDWORD)&DrawIndexedPrimitive_Pointer = (DWORD)Direct3D_VMTable[82];
if(CreateThread(NULL, 0, VirtualMethodTableRepatchingLoopToCounterExtensionRepatching, NULL, 0, NULL) == NULL)
return D3DERR_INVALIDCALL;
};
return Returned_Result;
};
HRESULT WINAPI Reset_Detour(LPDIRECT3DDEVICE9 Device_Interface, D3DPRESENT_PARAMETERS* PresentationParameters)
{
_asm NOP;
_asm PUSHAD;
if (RCount == 0) {
RCount = (RCount + 1);
MessageBox(NULL, (LPCSTR)"Reset Hooked!", (LPCSTR)"Xareq Private", MB_OK);
};
_asm POPAD;
return Reset_Pointer(Device_Interface, PresentationParameters);
};
HRESULT WINAPI EndScene_Detour(LPDIRECT3DDEVICE9 Device_Interface)
{
_asm NOP;
_asm PUSHAD;
D3DCOLOR Color = D3DCOLOR_XRGB(255, 255, 255);
D3DRECT Rectangle = {15, 15, 30, 30};
Device_Interface -> Clear(1, &Rectangle, (D3DCLEAR_TARGET | D3DCLEAR_TARGET), Color, 0, 0);
if (ESCount == 0) {
ESCount = (ESCount + 1);
MessageBox(NULL, (LPCSTR)"EndScene hooked!", (LPCSTR)"Xareq Private", MB_OK);
};
_asm POPAD;
return EndScene_Pointer(Device_Interface);
};
HRESULT WINAPI DrawIndexedPrimitive_DetouredCode(LPDIRECT3DDEVICE9 Device_Interface, UINT Stride) {
_asm NOP;
_asm PUSHAD;
if (DIPCount == 0) {
DIPCount = (DIPCount + 1);
MessageBox(NULL, (LPCSTR)"Reset Hooked!", (LPCSTR)"Xareq Private", MB_OK);
};
_asm POPAD;
};
HRESULT WINAPI DrawIndexedPrimitive_Detour(
LPDIRECT3DDEVICE9 Device_Interface,
D3DPRIMITIVETYPE Type,
INT BaseIndex,
UINT MinIndex,
UINT NumVertices,
UINT StartIndex,
UINT PrimitiveCount
) {
LPDIRECT3DVERTEXBUFFER9 Stream_Data;
UINT Offset = 0;
UINT Stride = 0;
if(Device_Interface -> GetStreamSource(0, &Stream_Data, &Offset, &Stride) == D3D_OK) {
Stream_Data->Release();
};
DrawIndexedPrimitive_DetouredCode(Device_Interface, Stride);
return DrawIndexedPrimitive_Pointer(Device_Interface, Type, BaseIndex, MinIndex, NumVertices, StartIndex, PrimitiveCount);
};
DWORD WINAPI VirtualMethodTableRepatchingLoopToCounterExtensionRepatching(LPVOID Parameter) {
UNREFERENCED_PARAMETER(Parameter);
while (true) {
Sleep(50);
*(PDWORD)&Direct3D_VMTable[16] = (DWORD)Reset_Detour;
*(PDWORD)&Direct3D_VMTable[42] = (DWORD)EndScene_Detour;
*(PDWORD)&Direct3D_VMTable[82] = (DWORD)DrawIndexedPrimitive_Detour;
};
return 1;
};