diff --git a/OptiScaler/nvapi/fakenvapi/main.cpp b/OptiScaler/nvapi/fakenvapi/main.cpp index 49c0407d..8c599e8f 100755 --- a/OptiScaler/nvapi/fakenvapi/main.cpp +++ b/OptiScaler/nvapi/fakenvapi/main.cpp @@ -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; } diff --git a/OptiScaler/nvapi/fakenvapi/nvapi.cpp b/OptiScaler/nvapi/fakenvapi/nvapi.cpp index f98f4237..3923a0d4 100755 --- a/OptiScaler/nvapi/fakenvapi/nvapi.cpp +++ b/OptiScaler/nvapi/fakenvapi/nvapi.cpp @@ -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(); + } } \ No newline at end of file diff --git a/OptiScaler/nvapi/fakenvapi/nvapi.h b/OptiScaler/nvapi/fakenvapi/nvapi.h index da160f5f..8ddf6517 100755 --- a/OptiScaler/nvapi/fakenvapi/nvapi.h +++ b/OptiScaler/nvapi/fakenvapi/nvapi.h @@ -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); } \ No newline at end of file diff --git a/OptiScaler/nvapi/fakenvapi/util.h b/OptiScaler/nvapi/fakenvapi/util.h index f4981671..c8206d1b 100644 --- a/OptiScaler/nvapi/fakenvapi/util.h +++ b/OptiScaler/nvapi/fakenvapi/util.h @@ -5,8 +5,16 @@ #include #include +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 errors{