Skip to content

Commit

Permalink
more events
Browse files Browse the repository at this point in the history
  • Loading branch information
ThirteenAG committed Dec 26, 2023
1 parent 7ab1687 commit 5409a18
Show file tree
Hide file tree
Showing 3 changed files with 104 additions and 0 deletions.
40 changes: 40 additions & 0 deletions source/common.ixx
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,10 @@ public:
static Event<> BeforeReset;
return BeforeReset;
}
static Event<>& onAfterPostFX() {
static Event<> AfterPostFX;
return AfterPostFX;
}

struct D3D9 {
static Event<LPDIRECT3D9&, UINT&, D3DDEVTYPE&, HWND&, DWORD&, D3DPRESENT_PARAMETERS*&, IDirect3DDevice9**&>& onBeforeCreateDevice() {
Expand All @@ -116,6 +120,22 @@ public:
static Event<LPDIRECT3DDEVICE9&, D3DPRESENT_PARAMETERS*&> AfterReset;
return AfterReset;
}
static Event<LPDIRECT3DDEVICE9&, IDirect3DPixelShader9*&>& onBeforeSetPixelShader() {
static Event<LPDIRECT3DDEVICE9&, IDirect3DPixelShader9*&> BeforeSetPixelShader;
return BeforeSetPixelShader;
}
static Event<LPDIRECT3DDEVICE9&, IDirect3DPixelShader9*&>& onAfterSetPixelShader() {
static Event<LPDIRECT3DDEVICE9&, IDirect3DPixelShader9*&> AfterSetPixelShader;
return AfterSetPixelShader;
}
static Event<LPDIRECT3DDEVICE9&, IDirect3DVertexShader9*&>& onBeforeSetVertexShader() {
static Event<LPDIRECT3DDEVICE9&, IDirect3DVertexShader9*&> BeforeSetVertexShader;
return BeforeSetVertexShader;
}
static Event<LPDIRECT3DDEVICE9&, IDirect3DVertexShader9*&>& onAfterSetVertexShader() {
static Event<LPDIRECT3DDEVICE9&, IDirect3DVertexShader9*&> AfterSetVertexShader;
return AfterSetVertexShader;
}
static Event<LPDIRECT3DDEVICE9&, UINT&, float*&, UINT&>& onSetVertexShaderConstantF() {
static Event<LPDIRECT3DDEVICE9&, UINT&, float*&, UINT&> SetVertexShaderConstantF;
return SetVertexShaderConstantF;
Expand All @@ -124,6 +144,22 @@ public:
static Event<LPDIRECT3DDEVICE9&, UINT&, float*&, UINT&> SetPixelShaderConstantF;
return SetPixelShaderConstantF;
}
static Event<LPDIRECT3DDEVICE9&, DWORD*&, IDirect3DPixelShader9**&>& onBeforeCreatePixelShader() {
static Event<LPDIRECT3DDEVICE9&, DWORD*&, IDirect3DPixelShader9**&> BeforeCreatePixelShader;
return BeforeCreatePixelShader;
}
static Event<LPDIRECT3DDEVICE9&, DWORD*&, IDirect3DPixelShader9**&>& onAfterCreatePixelShader() {
static Event<LPDIRECT3DDEVICE9&, DWORD*&, IDirect3DPixelShader9**&> AfterCreatePixelShader;
return AfterCreatePixelShader;
}
static Event<LPDIRECT3DDEVICE9&, DWORD*&, IDirect3DVertexShader9**&>& onBeforeCreateVertexShader() {
static Event<LPDIRECT3DDEVICE9&, DWORD*&, IDirect3DVertexShader9**&> BeforeCreateVertexShader;
return BeforeCreateVertexShader;
}
static Event<LPDIRECT3DDEVICE9&, DWORD*&, IDirect3DVertexShader9**&>& onAfterCreateVertexShader() {
static Event<LPDIRECT3DDEVICE9&, DWORD*&, IDirect3DVertexShader9**&> AfterCreateVertexShader;
return AfterCreateVertexShader;
}
static Event<LPDIRECT3DDEVICE9&, UINT&, UINT&, UINT&, DWORD&, D3DFORMAT&, D3DPOOL&, IDirect3DTexture9**&, HANDLE*&>& onBeforeCreateTexture() {
static Event<LPDIRECT3DDEVICE9&, UINT&, UINT&, UINT&, DWORD&, D3DFORMAT&, D3DPOOL&, IDirect3DTexture9**&, HANDLE*&> BeforeCreateTexture;
return BeforeCreateTexture;
Expand All @@ -136,6 +172,10 @@ public:
static Event<LPDIRECT3DDEVICE9&, DWORD&, IDirect3DBaseTexture9*&> SetTexture;
return SetTexture;
}
static Event<LPDIRECT3DDEVICE9&, D3DPRIMITIVETYPE&, UINT&, UINT&>& onDrawPrimitive() {
static Event<LPDIRECT3DDEVICE9&, D3DPRIMITIVETYPE&, UINT&, UINT&> DrawPrimitive;
return DrawPrimitive;
}
};
};

Expand Down
10 changes: 10 additions & 0 deletions source/dllmain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,13 @@ import common;
import comvars;
import dllblacklist;

injector::hook_back<void(__fastcall*)(void*, void*, int, int, int)> hbsub_92E7C0;
void __fastcall sub_92E7C0Hook(void* _this, void* edx, int a2, int a3, int a4)
{
hbsub_92E7C0.fun(_this, edx, a2, a3, a4);
FusionFix::onAfterPostFX().executeAll();
}

injector::hook_back<void(*)()> hbsub_8C4480;
void __cdecl sub_8C4480Hook()
{
Expand Down Expand Up @@ -121,6 +128,9 @@ void Init()
pattern = find_pattern("E8 ? ? ? ? E8 ? ? ? ? E8 ? ? ? ? 8D 54 24 08", "E8 ? ? ? ? E8 ? ? ? ? 68 ? ? ? ? 6A 00 6A 00");
hbsub_8C4480.fun = injector::MakeCALL(pattern.get_first(0), sub_8C4480Hook, true).get();

pattern = find_pattern("E8 ? ? ? ? 6A 0A FF B7", "E8 ? ? ? ? 8B 8E ? ? ? ? 8B 56 10");
hbsub_92E7C0.fun = injector::MakeCALL(pattern.get_first(0), sub_92E7C0Hook, true).get();

static auto futures = FusionFix::onInitEventAsync().executeAllAsync();

FusionFix::onGameInitEvent() += []()
Expand Down
54 changes: 54 additions & 0 deletions source/fusiondxhook.ixx
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,11 @@ export HRESULT(WINAPI* SetVertexShaderConstantFOriginalPtr)(LPDIRECT3DDEVICE9, U
export HRESULT(WINAPI* SetPixelShaderConstantFOriginalPtr)(LPDIRECT3DDEVICE9, UINT, const float*, UINT) = nullptr;
export HRESULT(WINAPI* CreateTextureOriginalPtr)(LPDIRECT3DDEVICE9, UINT, UINT, UINT, DWORD, D3DFORMAT, D3DPOOL, IDirect3DTexture9**, HANDLE*) = nullptr;
export HRESULT(WINAPI* SetTextureOriginalPtr)(LPDIRECT3DDEVICE9, DWORD, IDirect3DBaseTexture9*) = nullptr;
export HRESULT(WINAPI* DrawPrimitiveOriginalPtr)(LPDIRECT3DDEVICE9, D3DPRIMITIVETYPE, UINT, UINT) = nullptr;
export HRESULT(WINAPI* SetPixelShaderOriginalPtr)(LPDIRECT3DDEVICE9, IDirect3DPixelShader9*) = nullptr;
export HRESULT(WINAPI* SetVertexShaderOriginalPtr)(LPDIRECT3DDEVICE9, IDirect3DVertexShader9*) = nullptr;
export HRESULT(WINAPI* CreatePixelShaderOriginalPtr)(LPDIRECT3DDEVICE9, DWORD*, IDirect3DPixelShader9**) = nullptr;
export HRESULT(WINAPI* CreateVertexShaderOriginalPtr)(LPDIRECT3DDEVICE9, DWORD*, IDirect3DVertexShader9**) = nullptr;

class FusionDxHook
{
Expand Down Expand Up @@ -360,6 +365,45 @@ public:
return SetTextureOriginalPtr(pDevice, Stage, pTexture);
};

auto D3D9DrawPrimitive = [](LPDIRECT3DDEVICE9 pDevice, D3DPRIMITIVETYPE PrimitiveType, UINT StartVertex, UINT PrimitiveCount) -> HRESULT
{
auto hr = DrawPrimitiveOriginalPtr(pDevice, PrimitiveType, StartVertex, PrimitiveCount);
FusionFix::D3D9::onDrawPrimitive().executeAll(pDevice, PrimitiveType, StartVertex, PrimitiveCount);
return hr;
};

auto D3D9SetPixelShader = [](LPDIRECT3DDEVICE9 pDevice, IDirect3DPixelShader9* pShader) -> HRESULT
{
FusionFix::D3D9::onBeforeSetPixelShader().executeAll(pDevice, pShader);
auto hr = SetPixelShaderOriginalPtr(pDevice, pShader);
FusionFix::D3D9::onAfterSetPixelShader().executeAll(pDevice, pShader);
return hr;
};

auto D3D9SetVertexShader = [](LPDIRECT3DDEVICE9 pDevice, IDirect3DVertexShader9* pShader) -> HRESULT
{
FusionFix::D3D9::onBeforeSetVertexShader().executeAll(pDevice, pShader);
auto hr = SetVertexShaderOriginalPtr(pDevice, pShader);
FusionFix::D3D9::onAfterSetVertexShader().executeAll(pDevice, pShader);
return hr;
};

auto D3D9CreatePixelShader = [](LPDIRECT3DDEVICE9 pDevice, DWORD* pFunction, IDirect3DPixelShader9** ppShader) -> HRESULT
{
FusionFix::D3D9::onBeforeCreatePixelShader().executeAll(pDevice, pFunction, ppShader);
auto hr = CreatePixelShaderOriginalPtr(pDevice, pFunction, ppShader);
FusionFix::D3D9::onAfterCreatePixelShader().executeAll(pDevice, pFunction, ppShader);
return hr;
};

auto D3D9CreateVertexShader = [](LPDIRECT3DDEVICE9 pDevice, DWORD* pFunction, IDirect3DVertexShader9** ppShader) -> HRESULT
{
FusionFix::D3D9::onBeforeCreateVertexShader().executeAll(pDevice, pFunction, ppShader);
auto hr = CreateVertexShaderOriginalPtr(pDevice, pFunction, ppShader);
FusionFix::D3D9::onAfterCreateVertexShader().executeAll(pDevice, pFunction, ppShader);
return hr;
};

static HRESULT(WINAPI* CreateDevice)(LPDIRECT3D9, UINT, D3DDEVTYPE, HWND, DWORD, D3DPRESENT_PARAMETERS*, IDirect3DDevice9**) = D3D9CreateDevice;
static HRESULT(WINAPI* BeginScene)(LPDIRECT3DDEVICE9) = D3D9BeginScene;
static HRESULT(WINAPI* EndScene)(LPDIRECT3DDEVICE9) = D3D9EndScene;
Expand All @@ -368,6 +412,11 @@ public:
static HRESULT(WINAPI* SetPixelShaderConstantF)(LPDIRECT3DDEVICE9, UINT, float*, UINT) = D3D9SetPixelShaderConstantF;
static HRESULT(WINAPI* CreateTexture)(LPDIRECT3DDEVICE9, UINT, UINT, UINT, DWORD, D3DFORMAT, D3DPOOL, IDirect3DTexture9**, HANDLE*) = D3D9CreateTexture;
static HRESULT(WINAPI* SetTexture)(LPDIRECT3DDEVICE9, DWORD, IDirect3DBaseTexture9*) = D3D9SetTexture;
static HRESULT(WINAPI* DrawPrimitive)(LPDIRECT3DDEVICE9, D3DPRIMITIVETYPE, UINT, UINT) = D3D9DrawPrimitive;
static HRESULT(WINAPI* SetPixelShader)(LPDIRECT3DDEVICE9, IDirect3DPixelShader9*) = D3D9SetPixelShader;
static HRESULT(WINAPI* SetVertexShader)(LPDIRECT3DDEVICE9, IDirect3DVertexShader9*) = D3D9SetVertexShader;
static HRESULT(WINAPI* CreatePixelShader)(LPDIRECT3DDEVICE9, DWORD*, IDirect3DPixelShader9**) = D3D9CreatePixelShader;
static HRESULT(WINAPI* CreateVertexShader)(LPDIRECT3DDEVICE9, DWORD*, IDirect3DVertexShader9**) = D3D9CreateVertexShader;

MH_Initialize();

Expand All @@ -379,6 +428,11 @@ public:
bind(hD3D9, typeid(IDirect3DDevice9VTBL), IDirect3DDevice9VTBL().GetIndex("SetPixelShaderConstantF"), SetPixelShaderConstantF, (void**)&SetPixelShaderConstantFOriginalPtr);
bind(hD3D9, typeid(IDirect3DDevice9VTBL), IDirect3DDevice9VTBL().GetIndex("CreateTexture"), CreateTexture, (void**)&CreateTextureOriginalPtr);
bind(hD3D9, typeid(IDirect3DDevice9VTBL), IDirect3DDevice9VTBL().GetIndex("SetTexture"), SetTexture, (void**)&SetTextureOriginalPtr);
bind(hD3D9, typeid(IDirect3DDevice9VTBL), IDirect3DDevice9VTBL().GetIndex("DrawPrimitive"), DrawPrimitive, (void**)&DrawPrimitiveOriginalPtr);
bind(hD3D9, typeid(IDirect3DDevice9VTBL), IDirect3DDevice9VTBL().GetIndex("SetPixelShader"), SetPixelShader, (void**)&SetPixelShaderOriginalPtr);
bind(hD3D9, typeid(IDirect3DDevice9VTBL), IDirect3DDevice9VTBL().GetIndex("SetVertexShader"), SetVertexShader, (void**)&SetVertexShaderOriginalPtr);
bind(hD3D9, typeid(IDirect3DDevice9VTBL), IDirect3DDevice9VTBL().GetIndex("CreatePixelShader"), CreatePixelShader, (void**)&CreatePixelShaderOriginalPtr);
bind(hD3D9, typeid(IDirect3DDevice9VTBL), IDirect3DDevice9VTBL().GetIndex("CreateVertexShader"), CreateVertexShader, (void**)&CreateVertexShaderOriginalPtr);

FusionFix::onShutdownEvent() += []() {
MH_DisableHook(MH_ALL_HOOKS);
Expand Down

0 comments on commit 5409a18

Please sign in to comment.