forked from ReScrap/ScrapHacks
Simplyfy D3D8 Hook and enable hooking at runtime instead of only at launch
This commit is contained in:
parent
8c1acb3e85
commit
1f83c25129
1 changed files with 10 additions and 33 deletions
|
@ -1,6 +1,8 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
#include <Windows.h>
|
||||||
#include <d3d8.h>
|
#include <d3d8.h>
|
||||||
#include <d3dx8.h>
|
#include <d3dx8.h>
|
||||||
|
#include <dxerr8.h>
|
||||||
uintmax_t frame = 0;
|
uintmax_t frame = 0;
|
||||||
DWORD *GetVTable(void *addr)
|
DWORD *GetVTable(void *addr)
|
||||||
{
|
{
|
||||||
|
@ -53,37 +55,6 @@ HRESULT WINAPI H_EndScene(LPDIRECT3DDEVICE8 dev)
|
||||||
return hook->func<t_func>(Render(dev));
|
return hook->func<t_func>(Render(dev));
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT WINAPI H_CreateDevice(void *pDirect3D, unsigned int uiAdapter, D3DDEVTYPE pDeviceType, HWND hFocusWindow,
|
|
||||||
unsigned long ulBehaviorFlags, D3DPRESENT_PARAMETERS *pPresentationParameters,
|
|
||||||
LPDIRECT3DDEVICE8 *ppReturnedDeviceInterface)
|
|
||||||
{
|
|
||||||
typedef HRESULT(WINAPI * t_func)(void *, unsigned int, D3DDEVTYPE, HWND, unsigned long, D3DPRESENT_PARAMETERS *, LPDIRECT3DDEVICE8 *);
|
|
||||||
shared_ptr<Hook> hook = Hook::get(H_CreateDevice);
|
|
||||||
HRESULT ret = hook->func<t_func>(pDirect3D, uiAdapter, pDeviceType, hFocusWindow, ulBehaviorFlags, pPresentationParameters, ppReturnedDeviceInterface);
|
|
||||||
cout << "CreateDevice -> " << ret << endl;
|
|
||||||
void *EndScene = reinterpret_cast<void *>(GetVTable(ppReturnedDeviceInterface[0])[35]);
|
|
||||||
cout << "EndScene @ " << EndScene << endl; // EndScene
|
|
||||||
Hook::addr(EndScene, H_EndScene);
|
|
||||||
Hook::drop(H_CreateDevice);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
LPDIRECT3D8 WINAPI H_Direct3DCreate8(unsigned int SDKVersion)
|
|
||||||
{
|
|
||||||
typedef LPDIRECT3D8(_stdcall * t_func)(unsigned int);
|
|
||||||
shared_ptr<Hook> hook = Hook::get(H_Direct3DCreate8);
|
|
||||||
|
|
||||||
LPDIRECT3D8 ret = hook->func<t_func>(SDKVersion);
|
|
||||||
cout << "D3D8-Create: " << SDKVersion << " -> " << ret << endl;
|
|
||||||
void *CreateDevice = reinterpret_cast<void *>(GetVTable(ret)[15]);
|
|
||||||
void *Release = reinterpret_cast<void *>(GetVTable(ret)[2]);
|
|
||||||
cout << "CreateDevice @ " << CreateDevice << endl; // CreateDevice
|
|
||||||
Hook::addr(CreateDevice, H_CreateDevice);
|
|
||||||
Hook::drop(H_Direct3DCreate8);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
void unhook_d3d8()
|
void unhook_d3d8()
|
||||||
{
|
{
|
||||||
if (hFont != INVALID_HANDLE_VALUE)
|
if (hFont != INVALID_HANDLE_VALUE)
|
||||||
|
@ -99,7 +70,13 @@ void unhook_d3d8()
|
||||||
|
|
||||||
void hook_d3d8()
|
void hook_d3d8()
|
||||||
{
|
{
|
||||||
|
typedef void(_cdecl * t_func)();
|
||||||
hFont = CreateFont(20, 0, 0, 0, FW_BOLD, 0, 0, 0, ANSI_CHARSET, 0, 0, 0, 0, "Verdana");
|
hFont = CreateFont(20, 0, 0, 0, FW_BOLD, 0, 0, 0, ANSI_CHARSET, 0, 0, 0, 0, "Verdana");
|
||||||
hBrush = CreateSolidBrush(D3DCOLOR_ARGB(25, 0, 0, 0));
|
hBrush = CreateSolidBrush(D3DCOLOR_ARGB(25, 0, 0, 0));
|
||||||
Hook::module("d3d8.dll", "Direct3DCreate8", H_Direct3DCreate8);
|
Hook::addr(ptr<void>(0x853954,0x2a3d8,0,4*35,0),H_EndScene);
|
||||||
}
|
shared_ptr<Hook> hook = Hook::get(hook_d3d8);
|
||||||
|
hook->func_void<t_func>();
|
||||||
|
hook->disable();
|
||||||
|
Hook::drop(hook_d3d8);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue