From 5409a188e60bd532aaa7668a37ab7769dcab2e64 Mon Sep 17 00:00:00 2001 From: ThirteenAG Date: Tue, 26 Dec 2023 21:32:30 +0800 Subject: [PATCH] more events --- source/common.ixx | 40 ++++++++++++++++++++++++++++++ source/dllmain.cpp | 10 ++++++++ source/fusiondxhook.ixx | 54 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 104 insertions(+) diff --git a/source/common.ixx b/source/common.ixx index 32a11b9e..7d1422d0 100644 --- a/source/common.ixx +++ b/source/common.ixx @@ -90,6 +90,10 @@ public: static Event<> BeforeReset; return BeforeReset; } + static Event<>& onAfterPostFX() { + static Event<> AfterPostFX; + return AfterPostFX; + } struct D3D9 { static Event& onBeforeCreateDevice() { @@ -116,6 +120,22 @@ public: static Event AfterReset; return AfterReset; } + static Event& onBeforeSetPixelShader() { + static Event BeforeSetPixelShader; + return BeforeSetPixelShader; + } + static Event& onAfterSetPixelShader() { + static Event AfterSetPixelShader; + return AfterSetPixelShader; + } + static Event& onBeforeSetVertexShader() { + static Event BeforeSetVertexShader; + return BeforeSetVertexShader; + } + static Event& onAfterSetVertexShader() { + static Event AfterSetVertexShader; + return AfterSetVertexShader; + } static Event& onSetVertexShaderConstantF() { static Event SetVertexShaderConstantF; return SetVertexShaderConstantF; @@ -124,6 +144,22 @@ public: static Event SetPixelShaderConstantF; return SetPixelShaderConstantF; } + static Event& onBeforeCreatePixelShader() { + static Event BeforeCreatePixelShader; + return BeforeCreatePixelShader; + } + static Event& onAfterCreatePixelShader() { + static Event AfterCreatePixelShader; + return AfterCreatePixelShader; + } + static Event& onBeforeCreateVertexShader() { + static Event BeforeCreateVertexShader; + return BeforeCreateVertexShader; + } + static Event& onAfterCreateVertexShader() { + static Event AfterCreateVertexShader; + return AfterCreateVertexShader; + } static Event& onBeforeCreateTexture() { static Event BeforeCreateTexture; return BeforeCreateTexture; @@ -136,6 +172,10 @@ public: static Event SetTexture; return SetTexture; } + static Event& onDrawPrimitive() { + static Event DrawPrimitive; + return DrawPrimitive; + } }; }; diff --git a/source/dllmain.cpp b/source/dllmain.cpp index d2e24fa4..aee3f62b 100644 --- a/source/dllmain.cpp +++ b/source/dllmain.cpp @@ -4,6 +4,13 @@ import common; import comvars; import dllblacklist; +injector::hook_back 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 hbsub_8C4480; void __cdecl sub_8C4480Hook() { @@ -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() += []() diff --git a/source/fusiondxhook.ixx b/source/fusiondxhook.ixx index 68fac3d2..5cdae930 100644 --- a/source/fusiondxhook.ixx +++ b/source/fusiondxhook.ixx @@ -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 { @@ -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; @@ -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(); @@ -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);