mirror of
https://github.com/optiscaler/OptiScaler.git
synced 2026-09-26 07:16:17 +00:00
fixed nvapi is not loading when there is no nvngx
This commit is contained in:
+213
-199
@@ -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<PfnNvAPI_GPU_GetArchInfo>(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;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
};
|
||||
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<PfnNvAPI_GPU_GetArchInfo>(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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user