From 1cb652ff3cdebdbe63525c107953286fd2d8e516 Mon Sep 17 00:00:00 2001 From: cdozdil Date: Sun, 19 Jan 2025 00:29:37 +0300 Subject: [PATCH] prevent double hooks --- OptiScaler/FSR2_Dx12.cpp | 77 ++++++++++++++++++++++++---------------- 1 file changed, 46 insertions(+), 31 deletions(-) diff --git a/OptiScaler/FSR2_Dx12.cpp b/OptiScaler/FSR2_Dx12.cpp index b69c2eab..69f51603 100644 --- a/OptiScaler/FSR2_Dx12.cpp +++ b/OptiScaler/FSR2_Dx12.cpp @@ -873,31 +873,38 @@ void HookFSR2ExeInputs() auto exeName = wstring_to_string(exeNameW); // ffxFsr2ContextCreate - o_ffxFsr2ContextCreate_Dx12 = (PFN_ffxFsr2ContextCreate)DetourFindFunction(exeName.c_str(), "ffxFsr2ContextCreate"); + if (o_ffxFsr2ContextCreate_Dx12 == nullptr) + o_ffxFsr2ContextCreate_Dx12 = (PFN_ffxFsr2ContextCreate)DetourFindFunction(exeName.c_str(), "ffxFsr2ContextCreate"); if (o_ffxFsr2ContextCreate_Dx12 == nullptr) o_ffxFsr2ContextCreate_Dx12 = (PFN_ffxFsr2ContextCreate)DetourFindFunction(exeName.c_str(), "?ffxFsr2ContextCreate@@YAHPEAUFfxFsr2Context@@PEBUFfxFsr2ContextDescription@@@Z"); //ffxFsr2ContextDispatch 2.X - o_ffxFsr2ContextDispatch_Dx12 = (PFN_ffxFsr2ContextDispatch)DetourFindFunction(exeName.c_str(), "ffxFsr2ContextDispatch"); + if (o_ffxFsr2ContextCreate_Dx12 == nullptr) + o_ffxFsr2ContextCreate_Dx12 = (PFN_ffxFsr2ContextDispatch)DetourFindFunction(exeName.c_str(), "ffxFsr2ContextDispatch"); //ffxFsr2ContextDispatch FSR2.0 - o_ffxFsr20ContextDispatch_Dx12 = (PFN_ffxFsr2ContextDispatch)DetourFindFunction(exeName.c_str(), "?ffxFsr2ContextDispatch@@YAHPEAUFfxFsr2Context@@PEBUFfxFsr2DispatchDescription@@@Z"); + if (o_ffxFsr20ContextDispatch_Dx12 == nullptr) + o_ffxFsr20ContextDispatch_Dx12 = (PFN_ffxFsr2ContextDispatch)DetourFindFunction(exeName.c_str(), "?ffxFsr2ContextDispatch@@YAHPEAUFfxFsr2Context@@PEBUFfxFsr2DispatchDescription@@@Z"); //ffxFsr2ContextDispatch Tiny Tina - o_ffxFsr2TinyContextDispatch_Dx12 = (PFN_ffxFsr2ContextDispatch)DetourFindFunction(exeName.c_str(), "?ffxFsr2ContextDispatch@@YAHPEAUFfxFsr2Context@@PEBUFfxFsr2DispatchParams@@@Z"); + if (o_ffxFsr2TinyContextDispatch_Dx12 == nullptr) + o_ffxFsr2TinyContextDispatch_Dx12 = (PFN_ffxFsr2ContextDispatch)DetourFindFunction(exeName.c_str(), "?ffxFsr2ContextDispatch@@YAHPEAUFfxFsr2Context@@PEBUFfxFsr2DispatchParams@@@Z"); //ffxFsr2ContextDestroy - o_ffxFsr2ContextDestroy_Dx12 = (PFN_ffxFsr2ContextDestroy)DetourFindFunction(exeName.c_str(), "ffxFsr2ContextDestroy"); + if (o_ffxFsr2ContextDestroy_Dx12 == nullptr) + o_ffxFsr2ContextDestroy_Dx12 = (PFN_ffxFsr2ContextDestroy)DetourFindFunction(exeName.c_str(), "ffxFsr2ContextDestroy"); if (o_ffxFsr2ContextDestroy_Dx12 == nullptr) o_ffxFsr2ContextDestroy_Dx12 = (PFN_ffxFsr2ContextDestroy)DetourFindFunction(exeName.c_str(), "?ffxFsr2ContextDestroy@@YAHPEAUFfxFsr2Context@@@Z"); //ffxFsr2GetUpscaleRatioFromQualityMode - o_ffxFsr2GetUpscaleRatioFromQualityMode_Dx12 = (PFN_ffxFsr2GetUpscaleRatioFromQualityMode)DetourFindFunction(exeName.c_str(), "ffxFsr2GetUpscaleRatioFromQualityMode"); + if (o_ffxFsr2GetUpscaleRatioFromQualityMode_Dx12 == nullptr) + o_ffxFsr2GetUpscaleRatioFromQualityMode_Dx12 = (PFN_ffxFsr2GetUpscaleRatioFromQualityMode)DetourFindFunction(exeName.c_str(), "ffxFsr2GetUpscaleRatioFromQualityMode"); if (o_ffxFsr2GetUpscaleRatioFromQualityMode_Dx12 == nullptr) o_ffxFsr2GetUpscaleRatioFromQualityMode_Dx12 = (PFN_ffxFsr2GetUpscaleRatioFromQualityMode)DetourFindFunction(exeName.c_str(), "?ffxFsr2GetUpscaleRatioFromQualityMode@@YAMW4FfxFsr2QualityMode@@@Z"); //ffxFsr2GetRenderResolutionFromQualityMode - o_ffxFsr2GetRenderResolutionFromQualityMode_Dx12 = (PFN_ffxFsr2GetRenderResolutionFromQualityMode)DetourFindFunction(exeName.c_str(), "ffxFsr2GetRenderResolutionFromQualityMode"); + if (o_ffxFsr2GetRenderResolutionFromQualityMode_Dx12 == nullptr) + o_ffxFsr2GetRenderResolutionFromQualityMode_Dx12 = (PFN_ffxFsr2GetRenderResolutionFromQualityMode)DetourFindFunction(exeName.c_str(), "ffxFsr2GetRenderResolutionFromQualityMode"); if (o_ffxFsr2GetRenderResolutionFromQualityMode_Dx12 == nullptr) o_ffxFsr2GetRenderResolutionFromQualityMode_Dx12 = (PFN_ffxFsr2GetRenderResolutionFromQualityMode)DetourFindFunction(exeName.c_str(), "?ffxFsr2GetRenderResolutionFromQualityMode@@YAHPEAI0IIW4FfxFsr2QualityMode@@@Z"); if (o_ffxFsr2GetRenderResolutionFromQualityMode_Dx12 == nullptr) @@ -1036,39 +1043,46 @@ void HookFSR2Inputs(HMODULE module) if (module != nullptr) { - o_ffxFsr2ContextCreate_Dx12 = (PFN_ffxFsr2ContextCreate)GetProcAddress(module, "ffxFsr2ContextCreate"); - o_ffxFsr2ContextDispatch_Dx12 = (PFN_ffxFsr2ContextDispatch)GetProcAddress(module, "ffxFsr2ContextDispatch"); - o_ffxFsr2ContextDestroy_Dx12 = (PFN_ffxFsr2ContextDestroy)GetProcAddress(module, "ffxFsr2ContextDestroy"); - o_ffxFsr2GetUpscaleRatioFromQualityMode_Dx12 = (PFN_ffxFsr2GetUpscaleRatioFromQualityMode)GetProcAddress(module, "ffxFsr2GetUpscaleRatioFromQualityMode"); - o_ffxFsr2GetRenderResolutionFromQualityMode_Dx12 = (PFN_ffxFsr2GetRenderResolutionFromQualityMode)GetProcAddress(module, "ffxFsr2GetRenderResolutionFromQualityMode"); + if (o_ffxFsr2ContextCreate_Dx12 == nullptr) + o_ffxFsr2ContextCreate_Dx12 = (PFN_ffxFsr2ContextCreate)GetProcAddress(module, "ffxFsr2ContextCreate"); + + if (o_ffxFsr2ContextDispatch_Dx12 == nullptr) + o_ffxFsr2ContextDispatch_Dx12 = (PFN_ffxFsr2ContextDispatch)GetProcAddress(module, "ffxFsr2ContextDispatch"); + + if (o_ffxFsr2ContextDestroy_Dx12 == nullptr) + o_ffxFsr2ContextDestroy_Dx12 = (PFN_ffxFsr2ContextDestroy)GetProcAddress(module, "ffxFsr2ContextDestroy"); + + if (o_ffxFsr2GetUpscaleRatioFromQualityMode_Dx12 == nullptr) + o_ffxFsr2GetUpscaleRatioFromQualityMode_Dx12 = (PFN_ffxFsr2GetUpscaleRatioFromQualityMode)GetProcAddress(module, "ffxFsr2GetUpscaleRatioFromQualityMode"); + + if (o_ffxFsr2GetRenderResolutionFromQualityMode_Dx12 == nullptr) + o_ffxFsr2GetRenderResolutionFromQualityMode_Dx12 = (PFN_ffxFsr2GetRenderResolutionFromQualityMode)GetProcAddress(module, "ffxFsr2GetRenderResolutionFromQualityMode"); } if (o_ffxFsr2ContextCreate_Dx12 != nullptr) - { LOG_INFO("FSR2 methods found, now hooking"); - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); - if (o_ffxFsr2ContextCreate_Dx12 != nullptr) - DetourAttach(&(PVOID&)o_ffxFsr2ContextCreate_Dx12, ffxFsr2ContextCreate_Dx12); + if (o_ffxFsr2ContextCreate_Dx12 != nullptr) + DetourAttach(&(PVOID&)o_ffxFsr2ContextCreate_Dx12, ffxFsr2ContextCreate_Dx12); - if (o_ffxFsr2ContextDispatch_Dx12 != nullptr) - DetourAttach(&(PVOID&)o_ffxFsr2ContextDispatch_Dx12, ffxFsr2ContextDispatch_Dx12); + if (o_ffxFsr2ContextDispatch_Dx12 != nullptr) + DetourAttach(&(PVOID&)o_ffxFsr2ContextDispatch_Dx12, ffxFsr2ContextDispatch_Dx12); - if (o_ffxFsr2ContextDestroy_Dx12 != nullptr) - DetourAttach(&(PVOID&)o_ffxFsr2ContextDestroy_Dx12, ffxFsr2ContextDestroy_Dx12); + if (o_ffxFsr2ContextDestroy_Dx12 != nullptr) + DetourAttach(&(PVOID&)o_ffxFsr2ContextDestroy_Dx12, ffxFsr2ContextDestroy_Dx12); - if (o_ffxFsr2GetUpscaleRatioFromQualityMode_Dx12 != nullptr) - DetourAttach(&(PVOID&)o_ffxFsr2GetUpscaleRatioFromQualityMode_Dx12, ffxFsr2GetUpscaleRatioFromQualityMode_Dx12); + if (o_ffxFsr2GetUpscaleRatioFromQualityMode_Dx12 != nullptr) + DetourAttach(&(PVOID&)o_ffxFsr2GetUpscaleRatioFromQualityMode_Dx12, ffxFsr2GetUpscaleRatioFromQualityMode_Dx12); - if (o_ffxFsr2GetRenderResolutionFromQualityMode_Dx12 != nullptr) - DetourAttach(&(PVOID&)o_ffxFsr2GetRenderResolutionFromQualityMode_Dx12, ffxFsr2GetRenderResolutionFromQualityMode_Dx12); + if (o_ffxFsr2GetRenderResolutionFromQualityMode_Dx12 != nullptr) + DetourAttach(&(PVOID&)o_ffxFsr2GetRenderResolutionFromQualityMode_Dx12, ffxFsr2GetRenderResolutionFromQualityMode_Dx12); - Config::Instance()->fsrHooks = true; + Config::Instance()->fsrHooks = true; - DetourTransactionCommit(); - } + DetourTransactionCommit(); LOG_DEBUG("ffxFsr2ContextCreate_Dx12: {:X}", (size_t)o_ffxFsr2ContextCreate_Dx12); LOG_DEBUG("ffxFsr2ContextDispatch_Dx12: {:X}", (size_t)o_ffxFsr2ContextDispatch_Dx12); @@ -1088,7 +1102,8 @@ void HookFSR2Dx12Inputs(HMODULE module) if (module != nullptr) { - o_ffxFsr2GetInterfaceDX12 = (PFN_ffxFsr2GetInterfaceDX12)GetProcAddress(module, "ffxFsr2GetInterfaceDX12"); + if (o_ffxFsr2GetInterfaceDX12 == nullptr) + o_ffxFsr2GetInterfaceDX12 = (PFN_ffxFsr2GetInterfaceDX12)GetProcAddress(module, "ffxFsr2GetInterfaceDX12"); } if (o_ffxFsr2GetInterfaceDX12 != nullptr) @@ -1098,8 +1113,8 @@ void HookFSR2Dx12Inputs(HMODULE module) DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); - //if (o_ffxFsr2GetInterfaceDX12 != nullptr) - // DetourAttach(&(PVOID&)o_ffxFsr2GetInterfaceDX12, hk_ffxFsr2GetInterfaceDX12); + if (o_ffxFsr2GetInterfaceDX12 != nullptr) + DetourAttach(&(PVOID&)o_ffxFsr2GetInterfaceDX12, hk_ffxFsr2GetInterfaceDX12); DetourTransactionCommit(); }