From ae0035f322973f266f0d363d5fa103ef6511f35a Mon Sep 17 00:00:00 2001 From: cdozdil Date: Fri, 8 Nov 2024 00:20:35 +0300 Subject: [PATCH] fixed nvapi is not loading when there is no nvngx --- OptiScaler/NVNGX_Proxy.h | 412 ++++++++++++++++++++------------------- 1 file changed, 213 insertions(+), 199 deletions(-) diff --git a/OptiScaler/NVNGX_Proxy.h b/OptiScaler/NVNGX_Proxy.h index 728c7098..ec43fab1 100644 --- a/OptiScaler/NVNGX_Proxy.h +++ b/OptiScaler/NVNGX_Proxy.h @@ -26,12 +26,12 @@ enum class NV_INTERFACE : uint32_t D3D12_SetRawScgPriority = 0x5DB3048A, }; -typedef void* (__stdcall* PFN_NvApi_QueryInterface)(NV_INTERFACE InterfaceId); +typedef void* (*PFN_NvApi_QueryInterface)(NV_INTERFACE InterfaceId); typedef NVSDK_NGX_Result(*PFN_NVSDK_NGX_D3D1X_GetFeatureRequirements)(IDXGIAdapter* Adapter, const NVSDK_NGX_FeatureDiscoveryInfo* FeatureDiscoveryInfo, NVSDK_NGX_FeatureRequirement* OutSupported); typedef NVSDK_NGX_Result(*PFN_NVSDK_NGX_VULKAN_GetFeatureRequirements)(const VkInstance Instance, const VkPhysicalDevice PhysicalDevice, const NVSDK_NGX_FeatureDiscoveryInfo* FeatureDiscoveryInfo, NVSDK_NGX_FeatureRequirement* OutSupported); -using PfnNvAPI_GPU_GetArchInfo = uint32_t(__stdcall*)(void* GPUHandle, NV_GPU_ARCH_INFO* ArchInfo); +typedef uint32_t(*PfnNvAPI_GPU_GetArchInfo)(void* GPUHandle, NV_GPU_ARCH_INFO* ArchInfo); inline static PFN_NvApi_QueryInterface OriginalNvAPI_QueryInterface = nullptr; inline static PfnNvAPI_GPU_GetArchInfo OriginalNvAPI_GPU_GetArchInfo = nullptr; @@ -39,201 +39,15 @@ inline static PFN_NVSDK_NGX_D3D1X_GetFeatureRequirements Original_D3D11_GetFeatu inline static PFN_NVSDK_NGX_D3D1X_GetFeatureRequirements Original_D3D12_GetFeatureRequirements = nullptr; inline static PFN_NVSDK_NGX_VULKAN_GetFeatureRequirements Original_Vulkan_GetFeatureRequirements = nullptr; -inline static uint32_t __stdcall HookedNvAPI_GPU_GetArchInfo(void* GPUHandle, NV_GPU_ARCH_INFO* ArchInfo) -{ - if (OriginalNvAPI_GPU_GetArchInfo) - { - const auto status = OriginalNvAPI_GPU_GetArchInfo(GPUHandle, ArchInfo); - - if (status == 0 && ArchInfo) - { - LOG_DEBUG("From api arch: {0:X} impl: {1:X} rev: {2:X}!", ArchInfo->architecture, ArchInfo->implementation, ArchInfo->revision); - - // for 16xx cards - if (ArchInfo->architecture == NV_GPU_ARCHITECTURE_TU100 && ArchInfo->implementation > NV_GPU_ARCH_IMPLEMENTATION_TU106) - { - ArchInfo->implementation = NV_GPU_ARCH_IMPLEMENTATION_TU106; - ArchInfo->implementation_id = NV_GPU_ARCH_IMPLEMENTATION_TU106; - - LOG_INFO("Spoofed arch: {0:X} impl: {1:X} rev: {2:X}!", ArchInfo->architecture, ArchInfo->implementation, ArchInfo->revision); - } - //else if (ArchInfo->architecture < NV_GPU_ARCHITECTURE_TU100 && ArchInfo->architecture >= NV_GPU_ARCHITECTURE_GP100) - //{ - // LOG_INFO("Spoofing below 16xx arch: {0:X} impl: {1:X} rev: {2:X}!", ArchInfo->architecture, ArchInfo->implementation, ArchInfo->revision); - - // ArchInfo->architecture = NV_GPU_ARCHITECTURE_TU100; - // ArchInfo->architecture_id = NV_GPU_ARCHITECTURE_TU100; - // ArchInfo->implementation = NV_GPU_ARCH_IMPLEMENTATION_TU106; - // ArchInfo->implementation_id = NV_GPU_ARCH_IMPLEMENTATION_TU106; - - // LOG_INFO("Spoofed arch: {0:X} impl: {1:X} rev: {2:X}!", ArchInfo->architecture, ArchInfo->implementation, ArchInfo->revision); - //} - } - - return status; - } - - return 0xFFFFFFFF; -} - -inline static void* __stdcall HookedNvAPI_QueryInterface(NV_INTERFACE InterfaceId) -{ - LOG_FUNC(); - const auto result = OriginalNvAPI_QueryInterface(InterfaceId); - - if (result) - { - if (InterfaceId == NV_INTERFACE::GPU_GetArchInfo && !Config::Instance()->DE_Available) - { - OriginalNvAPI_GPU_GetArchInfo = static_cast(result); - return &HookedNvAPI_GPU_GetArchInfo; - } - } - - return result; -} - -inline static NVSDK_NGX_Result __stdcall Hooked_Dx12_GetFeatureRequirements(IDXGIAdapter* Adapter, const NVSDK_NGX_FeatureDiscoveryInfo* FeatureDiscoveryInfo, NVSDK_NGX_FeatureRequirement* OutSupported) -{ - LOG_FUNC(); - - auto result = Original_D3D12_GetFeatureRequirements(Adapter, FeatureDiscoveryInfo, OutSupported); - - if (result == NVSDK_NGX_Result_Success && FeatureDiscoveryInfo->FeatureID == NVSDK_NGX_Feature_SuperSampling) - { - LOG_INFO("Spoofing support!"); - OutSupported->FeatureSupported = NVSDK_NGX_FeatureSupportResult_Supported; - OutSupported->MinHWArchitecture = 0; - strcpy_s(OutSupported->MinOSVersion, "10.0.10240.16384"); - } - - return result; -} - -inline static NVSDK_NGX_Result __stdcall Hooked_Dx11_GetFeatureRequirements(IDXGIAdapter* Adapter, const NVSDK_NGX_FeatureDiscoveryInfo* FeatureDiscoveryInfo, NVSDK_NGX_FeatureRequirement* OutSupported) -{ - LOG_FUNC(); - - auto result = Original_D3D11_GetFeatureRequirements(Adapter, FeatureDiscoveryInfo, OutSupported); - - if (result == NVSDK_NGX_Result_Success && FeatureDiscoveryInfo->FeatureID == NVSDK_NGX_Feature_SuperSampling) - { - LOG_INFO("Spoofing support!"); - OutSupported->FeatureSupported = NVSDK_NGX_FeatureSupportResult_Supported; - OutSupported->MinHWArchitecture = 0; - strcpy_s(OutSupported->MinOSVersion, "10.0.10240.16384"); - } - - return result; -} - -inline static NVSDK_NGX_Result __stdcall Hooked_Vulkan_GetFeatureRequirements(const VkInstance Instance, const VkPhysicalDevice PhysicalDevice, - const NVSDK_NGX_FeatureDiscoveryInfo* FeatureDiscoveryInfo, NVSDK_NGX_FeatureRequirement* OutSupported) -{ - LOG_FUNC(); - - auto result = Original_Vulkan_GetFeatureRequirements(Instance, PhysicalDevice, FeatureDiscoveryInfo, OutSupported); - - if (result == NVSDK_NGX_Result_Success && FeatureDiscoveryInfo->FeatureID == NVSDK_NGX_Feature_SuperSampling) - { - LOG_INFO("Spoofing support!"); - OutSupported->FeatureSupported = NVSDK_NGX_FeatureSupportResult_Supported; - OutSupported->MinHWArchitecture = 0; - strcpy_s(OutSupported->MinOSVersion, "10.0.10240.16384"); - } - - return result; -} - -inline static void HookNvApi() -{ - if (OriginalNvAPI_QueryInterface != nullptr) - return; - - LOG_DEBUG("Trying to hook NvApi"); - OriginalNvAPI_QueryInterface = (PFN_NvApi_QueryInterface)DetourFindFunction("nvapi64.dll", "nvapi_QueryInterface"); - LOG_DEBUG("OriginalNvAPI_QueryInterface = {0:X}", (unsigned long long)OriginalNvAPI_QueryInterface); - - if (OriginalNvAPI_QueryInterface != nullptr) - { - LOG_INFO("NvAPI_QueryInterface found, hooking!"); - fakenvapi::Init((fakenvapi::PFN_Fake_QueryInterface&)OriginalNvAPI_QueryInterface); - - if (!Config::Instance()->DE_Available) - { - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - DetourAttach(&(PVOID&)OriginalNvAPI_QueryInterface, HookedNvAPI_QueryInterface); - DetourTransactionCommit(); - } - } -} - -inline static void HookNgxApi(HMODULE nvngx) -{ - if (Original_D3D11_GetFeatureRequirements != nullptr || Original_D3D12_GetFeatureRequirements != nullptr) - return; - - LOG_DEBUG("Trying to hook NgxApi"); - - Original_D3D11_GetFeatureRequirements = (PFN_NVSDK_NGX_D3D1X_GetFeatureRequirements)GetProcAddress(nvngx, "NVSDK_NGX_D3D11_GetFeatureRequirements"); - Original_D3D12_GetFeatureRequirements = (PFN_NVSDK_NGX_D3D1X_GetFeatureRequirements)GetProcAddress(nvngx, "NVSDK_NGX_D3D12_GetFeatureRequirements"); - Original_Vulkan_GetFeatureRequirements = (PFN_NVSDK_NGX_VULKAN_GetFeatureRequirements)GetProcAddress(nvngx, "NVSDK_NGX_VULKAN_GetFeatureRequirements"); - - if (Original_D3D11_GetFeatureRequirements != nullptr || Original_D3D12_GetFeatureRequirements != nullptr || Original_Vulkan_GetFeatureRequirements != nullptr) - { - LOG_INFO("NVSDK_NGX_XXXXXX_GetFeatureRequirements found, hooking!"); - - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - - if (Original_D3D11_GetFeatureRequirements != nullptr) - DetourAttach(&(PVOID&)Original_D3D11_GetFeatureRequirements, Hooked_Dx11_GetFeatureRequirements); - - if (Original_D3D12_GetFeatureRequirements != nullptr) - DetourAttach(&(PVOID&)Original_D3D12_GetFeatureRequirements, Hooked_Dx12_GetFeatureRequirements); - - if (Original_Vulkan_GetFeatureRequirements != nullptr) - DetourAttach(&(PVOID&)Original_Vulkan_GetFeatureRequirements, Hooked_Vulkan_GetFeatureRequirements); - - DetourTransactionCommit(); - } -} - -inline static void UnhookApis() -{ - if (OriginalNvAPI_QueryInterface != nullptr || Original_D3D11_GetFeatureRequirements != nullptr || Original_D3D12_GetFeatureRequirements != nullptr) - { - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - - if (OriginalNvAPI_QueryInterface != nullptr) - { - DetourDetach(&(PVOID&)OriginalNvAPI_QueryInterface, HookedNvAPI_QueryInterface); - OriginalNvAPI_QueryInterface = nullptr; - } - - if (Original_D3D11_GetFeatureRequirements != nullptr) - { - DetourDetach(&(PVOID&)Original_D3D11_GetFeatureRequirements, Hooked_Dx11_GetFeatureRequirements); - Original_D3D11_GetFeatureRequirements = nullptr; - } - - if (Original_D3D12_GetFeatureRequirements != nullptr) - { - DetourDetach(&(PVOID&)Original_D3D12_GetFeatureRequirements, Hooked_Dx12_GetFeatureRequirements); - Original_D3D12_GetFeatureRequirements = nullptr; - } - - if (Original_Vulkan_GetFeatureRequirements != nullptr) - { - DetourDetach(&(PVOID&)Original_Vulkan_GetFeatureRequirements, Hooked_Vulkan_GetFeatureRequirements); - Original_Vulkan_GetFeatureRequirements = nullptr; - } - - DetourTransactionCommit(); - } -} +uint32_t HookedNvAPI_GPU_GetArchInfo(void* GPUHandle, NV_GPU_ARCH_INFO* ArchInfo); +void* HookedNvAPI_QueryInterface(NV_INTERFACE InterfaceId); +NVSDK_NGX_Result Hooked_Dx12_GetFeatureRequirements(IDXGIAdapter* Adapter, const NVSDK_NGX_FeatureDiscoveryInfo* FeatureDiscoveryInfo, NVSDK_NGX_FeatureRequirement* OutSupported); +NVSDK_NGX_Result Hooked_Dx11_GetFeatureRequirements(IDXGIAdapter* Adapter, const NVSDK_NGX_FeatureDiscoveryInfo* FeatureDiscoveryInfo, NVSDK_NGX_FeatureRequirement* OutSupported); +NVSDK_NGX_Result __stdcall Hooked_Vulkan_GetFeatureRequirements(const VkInstance Instance, const VkPhysicalDevice PhysicalDevice, + const NVSDK_NGX_FeatureDiscoveryInfo* FeatureDiscoveryInfo, NVSDK_NGX_FeatureRequirement* OutSupported); +void HookNvApi(); +void HookNgxApi(HMODULE nvngx); +void UnhookApis(); #pragma endregion @@ -495,7 +309,7 @@ public: if (_dll != nullptr) { HookNvApi(); - + if (!Config::Instance()->DE_Available) HookNgxApi(_dll); @@ -554,6 +368,11 @@ public: _UpdateFeature = (PFN_UpdateFeature)GetProcAddress(_dll, "NVSDK_NGX_UpdateFeature"); } + else + { + if (Config::Instance()->OverrideNvapiDll.value_or(false)) + HookNvApi(); + } Config::Instance()->upscalerDisableHook = false; } @@ -1027,6 +846,201 @@ public: return _UpdateFeature; } +}; -}; \ No newline at end of file +inline static uint32_t HookedNvAPI_GPU_GetArchInfo(void* GPUHandle, NV_GPU_ARCH_INFO* ArchInfo) +{ + if (OriginalNvAPI_GPU_GetArchInfo) + { + const auto status = OriginalNvAPI_GPU_GetArchInfo(GPUHandle, ArchInfo); + + if (status == 0 && ArchInfo) + { + LOG_DEBUG("From api arch: {0:X} impl: {1:X} rev: {2:X}!", ArchInfo->architecture, ArchInfo->implementation, ArchInfo->revision); + + // for 16xx cards + if (ArchInfo->architecture == NV_GPU_ARCHITECTURE_TU100 && ArchInfo->implementation > NV_GPU_ARCH_IMPLEMENTATION_TU106) + { + ArchInfo->implementation = NV_GPU_ARCH_IMPLEMENTATION_TU106; + ArchInfo->implementation_id = NV_GPU_ARCH_IMPLEMENTATION_TU106; + + LOG_INFO("Spoofed arch: {0:X} impl: {1:X} rev: {2:X}!", ArchInfo->architecture, ArchInfo->implementation, ArchInfo->revision); + } + //else if (ArchInfo->architecture < NV_GPU_ARCHITECTURE_TU100 && ArchInfo->architecture >= NV_GPU_ARCHITECTURE_GP100) + //{ + // LOG_INFO("Spoofing below 16xx arch: {0:X} impl: {1:X} rev: {2:X}!", ArchInfo->architecture, ArchInfo->implementation, ArchInfo->revision); + + // ArchInfo->architecture = NV_GPU_ARCHITECTURE_TU100; + // ArchInfo->architecture_id = NV_GPU_ARCHITECTURE_TU100; + // ArchInfo->implementation = NV_GPU_ARCH_IMPLEMENTATION_TU106; + // ArchInfo->implementation_id = NV_GPU_ARCH_IMPLEMENTATION_TU106; + + // LOG_INFO("Spoofed arch: {0:X} impl: {1:X} rev: {2:X}!", ArchInfo->architecture, ArchInfo->implementation, ArchInfo->revision); + //} + } + + return status; + } + + return 0xFFFFFFFF; +} + +inline static void* HookedNvAPI_QueryInterface(NV_INTERFACE InterfaceId) +{ + LOG_FUNC(); + const auto result = OriginalNvAPI_QueryInterface(InterfaceId); + + if (result) + { + if (InterfaceId == NV_INTERFACE::GPU_GetArchInfo && !Config::Instance()->DE_Available) + { + OriginalNvAPI_GPU_GetArchInfo = static_cast(result); + return &HookedNvAPI_GPU_GetArchInfo; + } + } + + return result; +} + +inline static NVSDK_NGX_Result Hooked_Dx12_GetFeatureRequirements(IDXGIAdapter* Adapter, const NVSDK_NGX_FeatureDiscoveryInfo* FeatureDiscoveryInfo, NVSDK_NGX_FeatureRequirement* OutSupported) +{ + LOG_FUNC(); + + auto result = Original_D3D12_GetFeatureRequirements(Adapter, FeatureDiscoveryInfo, OutSupported); + + if (result == NVSDK_NGX_Result_Success && FeatureDiscoveryInfo->FeatureID == NVSDK_NGX_Feature_SuperSampling) + { + LOG_INFO("Spoofing support!"); + OutSupported->FeatureSupported = NVSDK_NGX_FeatureSupportResult_Supported; + OutSupported->MinHWArchitecture = 0; + strcpy_s(OutSupported->MinOSVersion, "10.0.10240.16384"); + } + + return result; +} + +inline static NVSDK_NGX_Result Hooked_Dx11_GetFeatureRequirements(IDXGIAdapter* Adapter, const NVSDK_NGX_FeatureDiscoveryInfo* FeatureDiscoveryInfo, NVSDK_NGX_FeatureRequirement* OutSupported) +{ + LOG_FUNC(); + + auto result = Original_D3D11_GetFeatureRequirements(Adapter, FeatureDiscoveryInfo, OutSupported); + + if (result == NVSDK_NGX_Result_Success && FeatureDiscoveryInfo->FeatureID == NVSDK_NGX_Feature_SuperSampling) + { + LOG_INFO("Spoofing support!"); + OutSupported->FeatureSupported = NVSDK_NGX_FeatureSupportResult_Supported; + OutSupported->MinHWArchitecture = 0; + strcpy_s(OutSupported->MinOSVersion, "10.0.10240.16384"); + } + + return result; +} + +inline static NVSDK_NGX_Result __stdcall Hooked_Vulkan_GetFeatureRequirements(const VkInstance Instance, const VkPhysicalDevice PhysicalDevice, + const NVSDK_NGX_FeatureDiscoveryInfo* FeatureDiscoveryInfo, NVSDK_NGX_FeatureRequirement* OutSupported) +{ + LOG_FUNC(); + + auto result = Original_Vulkan_GetFeatureRequirements(Instance, PhysicalDevice, FeatureDiscoveryInfo, OutSupported); + + if (result == NVSDK_NGX_Result_Success && FeatureDiscoveryInfo->FeatureID == NVSDK_NGX_Feature_SuperSampling) + { + LOG_INFO("Spoofing support!"); + OutSupported->FeatureSupported = NVSDK_NGX_FeatureSupportResult_Supported; + OutSupported->MinHWArchitecture = 0; + strcpy_s(OutSupported->MinOSVersion, "10.0.10240.16384"); + } + + return result; +} + +inline static void HookNvApi() +{ + if (OriginalNvAPI_QueryInterface != nullptr) + return; + + LOG_DEBUG("Trying to hook NvApi"); + OriginalNvAPI_QueryInterface = (PFN_NvApi_QueryInterface)DetourFindFunction("nvapi64.dll", "nvapi_QueryInterface"); + LOG_DEBUG("OriginalNvAPI_QueryInterface = {0:X}", (unsigned long long)OriginalNvAPI_QueryInterface); + + if (OriginalNvAPI_QueryInterface != nullptr) + { + LOG_INFO("NvAPI_QueryInterface found, hooking!"); + fakenvapi::Init((fakenvapi::PFN_Fake_QueryInterface&)OriginalNvAPI_QueryInterface); + + if (!Config::Instance()->DE_Available && NVNGXProxy::NVNGXModule() != nullptr) + { + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + DetourAttach(&(PVOID&)OriginalNvAPI_QueryInterface, HookedNvAPI_QueryInterface); + DetourTransactionCommit(); + } + } +} + +inline static void HookNgxApi(HMODULE nvngx) +{ + if (Original_D3D11_GetFeatureRequirements != nullptr || Original_D3D12_GetFeatureRequirements != nullptr) + return; + + LOG_DEBUG("Trying to hook NgxApi"); + + Original_D3D11_GetFeatureRequirements = (PFN_NVSDK_NGX_D3D1X_GetFeatureRequirements)GetProcAddress(nvngx, "NVSDK_NGX_D3D11_GetFeatureRequirements"); + Original_D3D12_GetFeatureRequirements = (PFN_NVSDK_NGX_D3D1X_GetFeatureRequirements)GetProcAddress(nvngx, "NVSDK_NGX_D3D12_GetFeatureRequirements"); + Original_Vulkan_GetFeatureRequirements = (PFN_NVSDK_NGX_VULKAN_GetFeatureRequirements)GetProcAddress(nvngx, "NVSDK_NGX_VULKAN_GetFeatureRequirements"); + + if (Original_D3D11_GetFeatureRequirements != nullptr || Original_D3D12_GetFeatureRequirements != nullptr || Original_Vulkan_GetFeatureRequirements != nullptr) + { + LOG_INFO("NVSDK_NGX_XXXXXX_GetFeatureRequirements found, hooking!"); + + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + + if (Original_D3D11_GetFeatureRequirements != nullptr) + DetourAttach(&(PVOID&)Original_D3D11_GetFeatureRequirements, Hooked_Dx11_GetFeatureRequirements); + + if (Original_D3D12_GetFeatureRequirements != nullptr) + DetourAttach(&(PVOID&)Original_D3D12_GetFeatureRequirements, Hooked_Dx12_GetFeatureRequirements); + + if (Original_Vulkan_GetFeatureRequirements != nullptr) + DetourAttach(&(PVOID&)Original_Vulkan_GetFeatureRequirements, Hooked_Vulkan_GetFeatureRequirements); + + DetourTransactionCommit(); + } +} + +inline static void UnhookApis() +{ + if (OriginalNvAPI_QueryInterface != nullptr || Original_D3D11_GetFeatureRequirements != nullptr || Original_D3D12_GetFeatureRequirements != nullptr) + { + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + + if (OriginalNvAPI_QueryInterface != nullptr) + { + DetourDetach(&(PVOID&)OriginalNvAPI_QueryInterface, HookedNvAPI_QueryInterface); + OriginalNvAPI_QueryInterface = nullptr; + } + + if (Original_D3D11_GetFeatureRequirements != nullptr) + { + DetourDetach(&(PVOID&)Original_D3D11_GetFeatureRequirements, Hooked_Dx11_GetFeatureRequirements); + Original_D3D11_GetFeatureRequirements = nullptr; + } + + if (Original_D3D12_GetFeatureRequirements != nullptr) + { + DetourDetach(&(PVOID&)Original_D3D12_GetFeatureRequirements, Hooked_Dx12_GetFeatureRequirements); + Original_D3D12_GetFeatureRequirements = nullptr; + } + + if (Original_Vulkan_GetFeatureRequirements != nullptr) + { + DetourDetach(&(PVOID&)Original_Vulkan_GetFeatureRequirements, Hooked_Vulkan_GetFeatureRequirements); + Original_Vulkan_GetFeatureRequirements = nullptr; + } + + DetourTransactionCommit(); + } +} \ No newline at end of file