From 887026d985ee89d330b0f9455bc4a302d20623f0 Mon Sep 17 00:00:00 2001 From: cdozdil Date: Fri, 25 Apr 2025 10:13:32 +0300 Subject: [PATCH] Prevent unloading of D3d11 and Vulkan dlls --- OptiScaler/dllmain.cpp | 25 +++++++++++-------------- OptiScaler/hooks/Kernel_Hooks.h | 20 ++++++++++++++++++++ OptiScaler/pch.h | 6 ++++-- 3 files changed, 35 insertions(+), 16 deletions(-) diff --git a/OptiScaler/dllmain.cpp b/OptiScaler/dllmain.cpp index 65834d8a..5949f4fd 100644 --- a/OptiScaler/dllmain.cpp +++ b/OptiScaler/dllmain.cpp @@ -535,7 +535,6 @@ static void CheckWorkingMode() } // DirectX 11 - HMODULE d3d11Module = nullptr; d3d11Module = KernelBaseProxy::GetModuleHandleW_()(L"d3d11.dll"); if (Config::Instance()->OverlayMenu.value() && d3d11Module != nullptr) { @@ -544,9 +543,7 @@ static void CheckWorkingMode() } // Vulkan - HMODULE vulkanModule = nullptr; vulkanModule = KernelBaseProxy::GetModuleHandleW_()(L"vulkan-1.dll"); - if ((State::Instance().isRunningOnDXVK || State::Instance().isRunningOnLinux) && vulkanModule == nullptr) vulkanModule = KernelBaseProxy::LoadLibraryExW_()(L"vulkan-1.dll", NULL, 0); @@ -637,32 +634,32 @@ static void CheckWorkingMode() // SpecialK if (!State::Instance().enablerAvailable && (Config::Instance()->FGType.value_or_default() != FGType::OptiFG || !Config::Instance()->OverlayMenu.value_or_default()) && - skHandle == nullptr && Config::Instance()->LoadSpecialK.value_or_default()) + skModule == nullptr && Config::Instance()->LoadSpecialK.value_or_default()) { auto skFile = Util::DllPath().parent_path() / L"SpecialK64.dll"; SetEnvironmentVariableW(L"RESHADE_DISABLE_GRAPHICS_HOOK", L"1"); State::EnableServeOriginal(200); - skHandle = LoadLibraryW(skFile.c_str()); + skModule = LoadLibraryW(skFile.c_str()); State::DisableServeOriginal(200); - LOG_INFO("Loading SpecialK64.dll, result: {0:X}", (UINT64)skHandle); + LOG_INFO("Loading SpecialK64.dll, result: {0:X}", (UINT64)skModule); } // ReShade - if (!State::Instance().enablerAvailable && reshadeHandle == nullptr && Config::Instance()->LoadReShade.value_or_default()) + if (!State::Instance().enablerAvailable && reshadeModule == nullptr && Config::Instance()->LoadReShade.value_or_default()) { auto rsFile = Util::DllPath().parent_path() / L"ReShade64.dll"; SetEnvironmentVariableW(L"RESHADE_DISABLE_LOADING_CHECK", L"1"); - if (skHandle != nullptr) + if (skModule != nullptr) SetEnvironmentVariableW(L"RESHADE_DISABLE_GRAPHICS_HOOK", L"1"); State::EnableServeOriginal(201); - reshadeHandle = LoadLibraryW(rsFile.c_str()); + reshadeModule = LoadLibraryW(rsFile.c_str()); State::DisableServeOriginal(201); - LOG_INFO("Loading ReShade64.dll, result: {0:X}", (size_t)reshadeHandle); + LOG_INFO("Loading ReShade64.dll, result: {0:X}", (size_t)reshadeModule); } // Hook kernel32 methods @@ -974,11 +971,11 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserv //unhookGdi32(); //DetachHooks(); - if (skHandle != nullptr) - KernelBaseProxy::FreeLibrary_()(skHandle); + if (skModule != nullptr) + KernelBaseProxy::FreeLibrary_()(skModule); - if (reshadeHandle != nullptr) - KernelBaseProxy::FreeLibrary_()(reshadeHandle); + if (reshadeModule != nullptr) + KernelBaseProxy::FreeLibrary_()(reshadeModule); spdlog::info(""); spdlog::info("DLL_PROCESS_DETACH"); diff --git a/OptiScaler/hooks/Kernel_Hooks.h b/OptiScaler/hooks/Kernel_Hooks.h index 04d56af9..fd049a56 100644 --- a/OptiScaler/hooks/Kernel_Hooks.h +++ b/OptiScaler/hooks/Kernel_Hooks.h @@ -996,6 +996,16 @@ private: LOG_WARN("Call for KernelBase"); return TRUE; } + else if (lpLibrary == vulkanModule) + { + LOG_WARN("Call for Vulkan"); + return TRUE; + } + else if (lpLibrary == d3d11Module) + { + LOG_WARN("Call for D3D11"); + return TRUE; + } } return o_K32_FreeLibrary(lpLibrary); @@ -1048,6 +1058,16 @@ private: LOG_WARN("Call for KernelBase"); return TRUE; } + else if (lpLibrary == vulkanModule) + { + LOG_WARN("Call for Vulkan"); + return TRUE; + } + else if (lpLibrary == d3d11Module) + { + LOG_WARN("Call for D3D11"); + return TRUE; + } } return o_KB_FreeLibrary(lpLibrary); diff --git a/OptiScaler/pch.h b/OptiScaler/pch.h index 92a0f461..f081c374 100644 --- a/OptiScaler/pch.h +++ b/OptiScaler/pch.h @@ -34,8 +34,10 @@ inline HMODULE dllModule = nullptr; inline HMODULE originalModule = nullptr; -inline HMODULE skHandle = nullptr; -inline HMODULE reshadeHandle = nullptr; +inline HMODULE skModule = nullptr; +inline HMODULE reshadeModule = nullptr; +inline HMODULE vulkanModule = nullptr; +inline HMODULE d3d11Module = nullptr; inline DWORD processId; #define LOG_TRACE(msg, ...) \