Fix FG in Dying Light 2

Thanks to Artur for finding this fix
This commit is contained in:
FakeMichau
2024-07-12 21:48:20 +02:00
parent 7b3b2ae073
commit 945c7ff53b
4 changed files with 84 additions and 60 deletions
+70 -60
View File
@@ -32,6 +32,13 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
return TRUE;
}
// names from: https://github.com/SveSop/nvapi_standalone/blob/master/dlls/nvapi/nvapi.c
NVAPI_INTERFACE_TABLE additional_interface_table[] = {
{ "NvAPI_Diag_ReportCallStart", 0x33c7358c },
{ "NvAPI_Diag_ReportCallReturn", 0x593e8644 },
{ "MISC_unknown", 0xe9b009b9 }
};
namespace nvd {
extern "C" {
NvAPI_Status __cdecl placeholder() {
@@ -46,75 +53,78 @@ namespace nvd {
if (entry != registry.end())
return entry->second;
constexpr auto table_size = sizeof(nvapi_interface_table)/sizeof(nvapi_interface_table[0]);
struct NVAPI_INTERFACE_TABLE extended_interface_table[table_size + sizeof(additional_interface_table)/sizeof(additional_interface_table[0])] {};
memcpy(extended_interface_table, nvapi_interface_table, sizeof(nvapi_interface_table));
for (unsigned int i = 0; i < sizeof(additional_interface_table)/sizeof(additional_interface_table[0]); i++) {
extended_interface_table[table_size + i] = additional_interface_table[i];
}
auto it = std::find_if(
std::begin(nvapi_interface_table),
std::end(nvapi_interface_table),
std::begin(extended_interface_table),
std::end(extended_interface_table),
[id](const auto& item) { return item.id == id; });
if (it == std::end(nvapi_interface_table)) {
if (it == std::end(extended_interface_table)) {
log(std::format("NvAPI_QueryInterface (0x{:x}): Unknown interface ID", id));
return registry.insert({ id, nullptr }).first->second;
}
#define INSERT_AND_RETURN_WHEN_EQUALS(method) \
if (std::string(it->func) == #method) \
return registry.insert({id, (void *)method}).first->second;
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_Initialize)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_GetInterfaceVersionString)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_EnumNvidiaDisplayHandle)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_GetLogicalGPUFromPhysicalGPU)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_EnumPhysicalGPUs)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_EnumLogicalGPUs)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_GetGPUIDfromPhysicalGPU)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_GetPhysicalGPUFromGPUID)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_GetPhysicalGPUsFromDisplay)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_GetErrorMessage)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_GPU_GetLogicalGpuInfo)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_GPU_GetConnectedDisplayIds)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_GPU_CudaEnumComputeCapableGpus)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_GPU_GetArchInfo)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_GPU_GetPCIIdentifiers)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_GPU_GetFullName)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_GPU_GetGpuCoreCount)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_GPU_GetAllClockFrequencies)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_GPU_GetAdapterIdFromPhysicalGpu)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_DISP_GetDisplayIdByDisplayName)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_DISP_GetGDIPrimaryDisplayId)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_Disp_SetOutputMode)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_Disp_GetOutputMode)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_Mosaic_GetDisplayViewportsByResolution)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_SYS_GetDisplayDriverInfo)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_SYS_GetDriverAndBranchVersion)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_SYS_GetDisplayIdFromGpuAndOutputId)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_SYS_GetGpuAndOutputIdFromDisplayId)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_D3D_SetResourceHint)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_D3D_GetObjectHandleForResource)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_D3D_GetSleepStatus)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_D3D_GetLatency)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_D3D_SetSleepMode)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_D3D_SetLatencyMarker)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_D3D_Sleep)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_D3D11_IsNvShaderExtnOpCodeSupported)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_D3D11_BeginUAVOverlap)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_D3D11_EndUAVOverlap)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_D3D11_SetDepthBoundsTest)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_D3D12_GetRaytracingCaps)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_D3D12_IsNvShaderExtnOpCodeSupported)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_D3D12_SetNvShaderExtnSlotSpaceLocalThread)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_D3D12_GetRaytracingAccelerationStructurePrebuildInfoEx)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_D3D12_BuildRaytracingAccelerationStructureEx)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_D3D12_NotifyOutOfBandCommandQueue)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_D3D12_SetAsyncFrameMarker)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_DRS_CreateSession)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_DRS_LoadSettings)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_DRS_GetBaseProfile)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_DRS_GetSetting)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_DRS_DestroySession)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_Unload)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_GetInterfaceVersionString)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_EnumNvidiaDisplayHandle)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_GetLogicalGPUFromPhysicalGPU)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_EnumPhysicalGPUs)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_EnumLogicalGPUs)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_GetGPUIDfromPhysicalGPU)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_GetPhysicalGPUFromGPUID)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_GetPhysicalGPUsFromDisplay)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_GetErrorMessage)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_GPU_GetLogicalGpuInfo)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_GPU_GetConnectedDisplayIds)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_GPU_CudaEnumComputeCapableGpus)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_GPU_GetArchInfo)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_GPU_GetPCIIdentifiers)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_GPU_GetFullName)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_GPU_GetGpuCoreCount)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_GPU_GetAllClockFrequencies)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_GPU_GetAdapterIdFromPhysicalGpu)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_DISP_GetDisplayIdByDisplayName)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_DISP_GetGDIPrimaryDisplayId)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_Disp_SetOutputMode)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_Disp_GetOutputMode)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_Mosaic_GetDisplayViewportsByResolution)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_SYS_GetDisplayDriverInfo)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_SYS_GetDriverAndBranchVersion)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_SYS_GetDisplayIdFromGpuAndOutputId)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_SYS_GetGpuAndOutputIdFromDisplayId)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_D3D_SetResourceHint)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_D3D_GetObjectHandleForResource)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_D3D_GetSleepStatus)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_D3D_GetLatency)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_D3D_SetSleepMode)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_D3D_SetLatencyMarker)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_D3D_Sleep)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_D3D11_IsNvShaderExtnOpCodeSupported)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_D3D11_BeginUAVOverlap)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_D3D11_EndUAVOverlap)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_D3D11_SetDepthBoundsTest)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_D3D12_GetRaytracingCaps)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_D3D12_IsNvShaderExtnOpCodeSupported)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_D3D12_SetNvShaderExtnSlotSpaceLocalThread)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_D3D12_GetRaytracingAccelerationStructurePrebuildInfoEx)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_D3D12_BuildRaytracingAccelerationStructureEx)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_D3D12_NotifyOutOfBandCommandQueue)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_D3D12_SetAsyncFrameMarker)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_DRS_CreateSession)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_DRS_LoadSettings)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_DRS_GetBaseProfile)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_DRS_GetSetting)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_DRS_DestroySession)
INSERT_AND_RETURN_WHEN_EQUALS(NvAPI_Unload)
INSERT_AND_RETURN_WHEN_EQUALS(MISC_unknown)
#undef INSERT_AND_RETURN_WHEN_EQUALS
log(std::format("{}: not implemented, placeholder given", it->func));
log(std::format("{}: not implemented, placeholder given", it->func));
return registry.insert({ id, (void*)placeholder }).first->second;
// return registry.insert({ id, nullptr }).first->second;
}
+5
View File
@@ -449,4 +449,9 @@ namespace nvd {
NvAPI_Status __cdecl NvAPI_Unload() {
return Ok();
}
NvAPI_Status __cdecl MISC_unknown(IUnknown* unknown, MiscUnk* pMiscUnk) {
*pMiscUnk = { 0x1, 0x1, 0x1, 0x1 };
return Ok();
}
}
+1
View File
@@ -79,4 +79,5 @@ namespace nvd {
NvAPI_Status __cdecl NvAPI_DRS_GetSetting(NvDRSSessionHandle hSession, NvDRSProfileHandle hProfile, NvU32 settingId, NVDRS_SETTING* pSetting);
NvAPI_Status __cdecl NvAPI_DRS_DestroySession(NvDRSSessionHandle session);
NvAPI_Status __cdecl NvAPI_Unload();
NvAPI_Status __cdecl MISC_unknown(IUnknown* unknown, MiscUnk* pMiscUnk);
}
+8
View File
@@ -5,8 +5,16 @@
#include <map>
#include <cstdint>
struct MiscUnk {
uint32_t data[4];
};
void tonvss(NvAPI_ShortString nvss, std::string str);
#define INSERT_AND_RETURN_WHEN_EQUALS(method) \
if (std::string(it->func) == #method) \
return registry.insert({id, (void *)method}).first->second;
// function taken from jp7677's dxvk-nvapi project licensed under MIT
inline std::string fromErrorNr(const int16_t errorNr) {
static const std::map<int16_t, std::string> errors{