Skip to content

Commit a00cc38

Browse files
committed
Fix for memory leak when getting DriverStore folder. Thanks to @Nukem9
1 parent 7f1f3de commit a00cc38

File tree

1 file changed

+28
-4
lines changed

1 file changed

+28
-4
lines changed

OptiScaler/FSR4Upgrade.h

+28-4
Original file line numberDiff line numberDiff line change
@@ -34,16 +34,30 @@ typedef struct _D3DKMT_ENUMADAPTERS_L
3434
D3DKMT_ADAPTERINFO_L Adapters[16];
3535
} D3DKMT_ENUMADAPTERS_L;
3636

37+
typedef struct _D3DKMT_CLOSEADAPTER_L
38+
{
39+
UINT hAdapter; // in: adapter handle
40+
} D3DKMT_CLOSEADAPTER_L;
41+
3742
// Function pointers
3843
typedef UINT(*PFN_D3DKMTQueryAdapterInfo_L)(D3DKMT_QUERYADAPTERINFO_L*);
3944
typedef UINT(*PFN_D3DKMTEnumAdapters_L)(D3DKMT_ENUMADAPTERS_L*);
45+
typedef UINT(*PFN_D3DKMTCloseAdapter)(D3DKMT_CLOSEADAPTER_L*);
4046

4147
inline static std::vector<std::filesystem::path> GetDriverStore()
4248
{
4349
std::vector<std::filesystem::path> result;
4450

4551
// Load D3DKMT functions dynamically
46-
HMODULE hGdi32 = LoadLibrary(L"Gdi32.dll");
52+
bool libraryLoaded = false;
53+
HMODULE hGdi32 = GetModuleHandle(L"Gdi32.dll");
54+
55+
if (hGdi32 == nullptr)
56+
{
57+
hGdi32 = LoadLibrary(L"Gdi32.dll");
58+
libraryLoaded = hGdi32 != nullptr;
59+
}
60+
4761
if (hGdi32 == nullptr)
4862
{
4963
LOG_ERROR("Failed to load Gdi32.dll");
@@ -54,8 +68,9 @@ inline static std::vector<std::filesystem::path> GetDriverStore()
5468
{
5569
auto o_D3DKMTEnumAdapters = (PFN_D3DKMTEnumAdapters_L)GetProcAddress(hGdi32, "D3DKMTEnumAdapters");
5670
auto o_D3DKMTQueryAdapterInfo = (PFN_D3DKMTQueryAdapterInfo_L)GetProcAddress(hGdi32, "D3DKMTQueryAdapterInfo");
71+
auto o_D3DKMTCloseAdapter = (PFN_D3DKMTCloseAdapter)GetProcAddress(hGdi32, "D3DKMTCloseAdapter");
5772

58-
if (o_D3DKMTEnumAdapters == nullptr || o_D3DKMTQueryAdapterInfo == nullptr)
73+
if (o_D3DKMTEnumAdapters == nullptr || o_D3DKMTQueryAdapterInfo == nullptr || o_D3DKMTCloseAdapter == nullptr)
5974
{
6075
LOG_ERROR("Failed to resolve D3DKMT functions");
6176
break;
@@ -91,6 +106,13 @@ inline static std::vector<std::filesystem::path> GetDriverStore()
91106
LOG_ERROR("Failed to query adapter info {:X}", hr);
92107
else
93108
result.push_back(std::filesystem::path(umdFileInfo.UmdFileName).parent_path());
109+
110+
111+
D3DKMT_CLOSEADAPTER_L closeAdapter = {};
112+
closeAdapter.hAdapter = adapter.hAdapter;
113+
auto closeResult = o_D3DKMTCloseAdapter(&closeAdapter);
114+
if (closeResult != 0)
115+
LOG_ERROR("D3DKMTCloseAdapter error: {:X}", closeResult);
94116
}
95117
}
96118
else
@@ -101,7 +123,9 @@ inline static std::vector<std::filesystem::path> GetDriverStore()
101123

102124
} while (false);
103125

104-
FreeLibrary(hGdi32);
126+
if (libraryLoaded)
127+
FreeLibrary(hGdi32);
128+
105129
return result;
106130
}
107131

@@ -122,7 +146,7 @@ struct AmdExtFfxApi : public IAmdExtFfxApi
122146

123147
HRESULT STDMETHODCALLTYPE UpdateFfxApiProvider(void* pData, uint32_t dataSizeInBytes) override
124148
{
125-
LOG_INFO("UpdateFfxApiProvider called");
149+
LOG_INFO("UpdateFfxApiProvider called");
126150

127151
if (pfnUpdateFfxApiProvider == nullptr)
128152
{

0 commit comments

Comments
 (0)