Skip to content

Commit f7d8672

Browse files
committed
Use identity for AddressLookupTable
1 parent 50994b0 commit f7d8672

10 files changed

+100
-54
lines changed

Dllmain/BuildNo.rc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
#define BUILD_NUMBER 8129
1+
#define BUILD_NUMBER 8130

d3d9/AddressLookupTable.cpp

Lines changed: 88 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include "d3d9.h"
2+
#include "Libraries\ComPtr.h"
23

34
// Destructor for AddressLookupTableD3d9Object
45
AddressLookupTableD3d9Object::~AddressLookupTableD3d9Object() {}
@@ -145,33 +146,46 @@ m_IDirect3DDXVADevice9* AddressLookupTableD3d9::CreateInterface<m_IDirect3DDXVAD
145146
return new m_IDirect3DDXVADevice9(static_cast<m_IDirect3DDXVADevice9*>(Proxy), Device);
146147
}
147148

148-
template m_IDirect3D9Ex* AddressLookupTableD3d9::FindCreateAddress<m_IDirect3D9Ex, void, LPVOID>(void*, void*, REFIID, LPVOID);
149-
template m_IDirect3DDevice9Ex* AddressLookupTableD3d9::FindCreateAddress<m_IDirect3DDevice9Ex, m_IDirect3D9Ex, UINT>(void*, m_IDirect3D9Ex*, REFIID, UINT);
150-
template m_IDirect3DCubeTexture9* AddressLookupTableD3d9::FindCreateAddress<m_IDirect3DCubeTexture9, m_IDirect3DDevice9Ex, LPVOID>(void*, m_IDirect3DDevice9Ex*, REFIID, LPVOID);
151-
template m_IDirect3DIndexBuffer9* AddressLookupTableD3d9::FindCreateAddress<m_IDirect3DIndexBuffer9, m_IDirect3DDevice9Ex, LPVOID>(void*, m_IDirect3DDevice9Ex*, REFIID, LPVOID);
152-
template m_IDirect3DPixelShader9* AddressLookupTableD3d9::FindCreateAddress<m_IDirect3DPixelShader9, m_IDirect3DDevice9Ex, LPVOID>(void*, m_IDirect3DDevice9Ex*, REFIID, LPVOID);
153-
template m_IDirect3DQuery9* AddressLookupTableD3d9::FindCreateAddress<m_IDirect3DQuery9, m_IDirect3DDevice9Ex, LPVOID>(void*, m_IDirect3DDevice9Ex*, REFIID, LPVOID);
154-
template m_IDirect3DStateBlock9* AddressLookupTableD3d9::FindCreateAddress<m_IDirect3DStateBlock9, m_IDirect3DDevice9Ex, LPVOID>(void*, m_IDirect3DDevice9Ex*, REFIID, LPVOID);
155-
template m_IDirect3DSurface9* AddressLookupTableD3d9::FindCreateAddress<m_IDirect3DSurface9, m_IDirect3DDevice9Ex, LPVOID>(void*, m_IDirect3DDevice9Ex*, REFIID, LPVOID);
156-
template m_IDirect3DSwapChain9Ex* AddressLookupTableD3d9::FindCreateAddress<m_IDirect3DSwapChain9Ex, m_IDirect3DDevice9Ex, LPVOID>(void*, m_IDirect3DDevice9Ex*, REFIID, LPVOID);
157-
template m_IDirect3DTexture9* AddressLookupTableD3d9::FindCreateAddress<m_IDirect3DTexture9, m_IDirect3DDevice9Ex, LPVOID>(void*, m_IDirect3DDevice9Ex*, REFIID, LPVOID);
158-
template m_IDirect3DVertexBuffer9* AddressLookupTableD3d9::FindCreateAddress<m_IDirect3DVertexBuffer9, m_IDirect3DDevice9Ex, LPVOID>(void*, m_IDirect3DDevice9Ex*, REFIID, LPVOID);
159-
template m_IDirect3DVertexDeclaration9* AddressLookupTableD3d9::FindCreateAddress<m_IDirect3DVertexDeclaration9, m_IDirect3DDevice9Ex, LPVOID>(void*, m_IDirect3DDevice9Ex*, REFIID, LPVOID);
160-
template m_IDirect3DVertexShader9* AddressLookupTableD3d9::FindCreateAddress<m_IDirect3DVertexShader9, m_IDirect3DDevice9Ex, LPVOID>(void*, m_IDirect3DDevice9Ex*, REFIID, LPVOID);
161-
template m_IDirect3DVolume9* AddressLookupTableD3d9::FindCreateAddress<m_IDirect3DVolume9, m_IDirect3DDevice9Ex, LPVOID>(void*, m_IDirect3DDevice9Ex*, REFIID, LPVOID);
162-
template m_IDirect3DVolumeTexture9* AddressLookupTableD3d9::FindCreateAddress<m_IDirect3DVolumeTexture9, m_IDirect3DDevice9Ex, LPVOID>(void*, m_IDirect3DDevice9Ex*, REFIID, LPVOID);
163-
template m_IDirect3DVideoDevice9* AddressLookupTableD3d9::FindCreateAddress<m_IDirect3DVideoDevice9, m_IDirect3DDevice9Ex, LPVOID>(void*, m_IDirect3DDevice9Ex*, REFIID, LPVOID);
164-
template m_IDirect3DDXVADevice9* AddressLookupTableD3d9::FindCreateAddress<m_IDirect3DDXVADevice9, m_IDirect3DDevice9Ex, LPVOID>(void*, m_IDirect3DDevice9Ex*, REFIID, LPVOID);
149+
template m_IDirect3D9Ex* AddressLookupTableD3d9::FindCreateAddress<m_IDirect3D9Ex, void, LPVOID>(IUnknown*, void*, REFIID, LPVOID);
150+
template m_IDirect3DDevice9Ex* AddressLookupTableD3d9::FindCreateAddress<m_IDirect3DDevice9Ex, m_IDirect3D9Ex, UINT>(IUnknown*, m_IDirect3D9Ex*, REFIID, UINT);
151+
template m_IDirect3DCubeTexture9* AddressLookupTableD3d9::FindCreateAddress<m_IDirect3DCubeTexture9, m_IDirect3DDevice9Ex, LPVOID>(IUnknown*, m_IDirect3DDevice9Ex*, REFIID, LPVOID);
152+
template m_IDirect3DIndexBuffer9* AddressLookupTableD3d9::FindCreateAddress<m_IDirect3DIndexBuffer9, m_IDirect3DDevice9Ex, LPVOID>(IUnknown*, m_IDirect3DDevice9Ex*, REFIID, LPVOID);
153+
template m_IDirect3DPixelShader9* AddressLookupTableD3d9::FindCreateAddress<m_IDirect3DPixelShader9, m_IDirect3DDevice9Ex, LPVOID>(IUnknown*, m_IDirect3DDevice9Ex*, REFIID, LPVOID);
154+
template m_IDirect3DQuery9* AddressLookupTableD3d9::FindCreateAddress<m_IDirect3DQuery9, m_IDirect3DDevice9Ex, LPVOID>(IUnknown*, m_IDirect3DDevice9Ex*, REFIID, LPVOID);
155+
template m_IDirect3DStateBlock9* AddressLookupTableD3d9::FindCreateAddress<m_IDirect3DStateBlock9, m_IDirect3DDevice9Ex, LPVOID>(IUnknown*, m_IDirect3DDevice9Ex*, REFIID, LPVOID);
156+
template m_IDirect3DSurface9* AddressLookupTableD3d9::FindCreateAddress<m_IDirect3DSurface9, m_IDirect3DDevice9Ex, LPVOID>(IUnknown*, m_IDirect3DDevice9Ex*, REFIID, LPVOID);
157+
template m_IDirect3DSwapChain9Ex* AddressLookupTableD3d9::FindCreateAddress<m_IDirect3DSwapChain9Ex, m_IDirect3DDevice9Ex, LPVOID>(IUnknown*, m_IDirect3DDevice9Ex*, REFIID, LPVOID);
158+
template m_IDirect3DTexture9* AddressLookupTableD3d9::FindCreateAddress<m_IDirect3DTexture9, m_IDirect3DDevice9Ex, LPVOID>(IUnknown*, m_IDirect3DDevice9Ex*, REFIID, LPVOID);
159+
template m_IDirect3DVertexBuffer9* AddressLookupTableD3d9::FindCreateAddress<m_IDirect3DVertexBuffer9, m_IDirect3DDevice9Ex, LPVOID>(IUnknown*, m_IDirect3DDevice9Ex*, REFIID, LPVOID);
160+
template m_IDirect3DVertexDeclaration9* AddressLookupTableD3d9::FindCreateAddress<m_IDirect3DVertexDeclaration9, m_IDirect3DDevice9Ex, LPVOID>(IUnknown*, m_IDirect3DDevice9Ex*, REFIID, LPVOID);
161+
template m_IDirect3DVertexShader9* AddressLookupTableD3d9::FindCreateAddress<m_IDirect3DVertexShader9, m_IDirect3DDevice9Ex, LPVOID>(IUnknown*, m_IDirect3DDevice9Ex*, REFIID, LPVOID);
162+
template m_IDirect3DVolume9* AddressLookupTableD3d9::FindCreateAddress<m_IDirect3DVolume9, m_IDirect3DDevice9Ex, LPVOID>(IUnknown*, m_IDirect3DDevice9Ex*, REFIID, LPVOID);
163+
template m_IDirect3DVolumeTexture9* AddressLookupTableD3d9::FindCreateAddress<m_IDirect3DVolumeTexture9, m_IDirect3DDevice9Ex, LPVOID>(IUnknown*, m_IDirect3DDevice9Ex*, REFIID, LPVOID);
164+
template m_IDirect3DVideoDevice9* AddressLookupTableD3d9::FindCreateAddress<m_IDirect3DVideoDevice9, m_IDirect3DDevice9Ex, LPVOID>(IUnknown*, m_IDirect3DDevice9Ex*, REFIID, LPVOID);
165+
template m_IDirect3DDXVADevice9* AddressLookupTableD3d9::FindCreateAddress<m_IDirect3DDXVADevice9, m_IDirect3DDevice9Ex, LPVOID>(IUnknown*, m_IDirect3DDevice9Ex*, REFIID, LPVOID);
165166
template <typename T, typename D, typename L>
166-
T* AddressLookupTableD3d9::FindCreateAddress(void* Proxy, D* Device, REFIID riid, L Data)
167+
T* AddressLookupTableD3d9::FindCreateAddress(IUnknown* Proxy, D* Device, REFIID riid, L Data)
167168
{
168169
if (!Proxy)
169170
{
170171
return nullptr;
171172
}
172173

173174
constexpr UINT CacheIndex = AddressCacheIndex<T>::CacheIndex;
174-
auto it = g_map[CacheIndex].find(Proxy);
175+
176+
IUnknown* identity = Proxy;
177+
if constexpr (CacheIndex != AddressCacheIndex<m_IDirect3D9Ex>::CacheIndex &&
178+
CacheIndex != AddressCacheIndex<m_IDirect3DDevice9Ex>::CacheIndex &&
179+
CacheIndex != AddressCacheIndex<m_IDirect3DSwapChain9Ex>::CacheIndex)
180+
{
181+
ComPtr<IUnknown> pAddress;
182+
if (SUCCEEDED(Proxy->QueryInterface(IID_IUnknown, (void**)pAddress.GetAddressOf())))
183+
{
184+
identity = pAddress.Get();
185+
}
186+
}
187+
188+
auto it = g_map[CacheIndex].find(identity);
175189

176190
if (it != std::end(g_map[CacheIndex]))
177191
{
@@ -180,36 +194,56 @@ T* AddressLookupTableD3d9::FindCreateAddress(void* Proxy, D* Device, REFIID riid
180194
return addr;
181195
}
182196

197+
IUnknown* Object = nullptr;
198+
if (SUCCEEDED(Proxy->QueryInterface(riid, (void**)&Object)))
199+
{
200+
Proxy->Release();
201+
return CreateInterface((T*)Object, Device, riid, Data);
202+
}
203+
183204
return CreateInterface((T*)Proxy, Device, riid, Data);
184205
}
185206

186-
template m_IDirect3D9Ex* AddressLookupTableD3d9::FindAddress<m_IDirect3D9Ex>(void*);
187-
template m_IDirect3DDevice9Ex* AddressLookupTableD3d9::FindAddress<m_IDirect3DDevice9Ex>(void*);
188-
template m_IDirect3DCubeTexture9* AddressLookupTableD3d9::FindAddress<m_IDirect3DCubeTexture9>(void*);
189-
template m_IDirect3DIndexBuffer9* AddressLookupTableD3d9::FindAddress<m_IDirect3DIndexBuffer9>(void*);
190-
template m_IDirect3DPixelShader9* AddressLookupTableD3d9::FindAddress<m_IDirect3DPixelShader9>(void*);
191-
template m_IDirect3DQuery9* AddressLookupTableD3d9::FindAddress<m_IDirect3DQuery9>(void*);
192-
template m_IDirect3DStateBlock9* AddressLookupTableD3d9::FindAddress<m_IDirect3DStateBlock9>(void*);
193-
template m_IDirect3DSurface9* AddressLookupTableD3d9::FindAddress<m_IDirect3DSurface9>(void*);
194-
template m_IDirect3DSwapChain9Ex* AddressLookupTableD3d9::FindAddress<m_IDirect3DSwapChain9Ex>(void*);
195-
template m_IDirect3DTexture9* AddressLookupTableD3d9::FindAddress<m_IDirect3DTexture9>(void*);
196-
template m_IDirect3DVertexBuffer9* AddressLookupTableD3d9::FindAddress<m_IDirect3DVertexBuffer9>(void*);
197-
template m_IDirect3DVertexDeclaration9* AddressLookupTableD3d9::FindAddress<m_IDirect3DVertexDeclaration9>(void*);
198-
template m_IDirect3DVertexShader9* AddressLookupTableD3d9::FindAddress<m_IDirect3DVertexShader9>(void*);
199-
template m_IDirect3DVolume9* AddressLookupTableD3d9::FindAddress<m_IDirect3DVolume9>(void*);
200-
template m_IDirect3DVolumeTexture9* AddressLookupTableD3d9::FindAddress<m_IDirect3DVolumeTexture9>(void*);
201-
template m_IDirect3DVideoDevice9* AddressLookupTableD3d9::FindAddress<m_IDirect3DVideoDevice9>(void*);
202-
template m_IDirect3DDXVADevice9* AddressLookupTableD3d9::FindAddress<m_IDirect3DDXVADevice9>(void*);
207+
template m_IDirect3D9Ex* AddressLookupTableD3d9::FindAddress<m_IDirect3D9Ex>(IUnknown*);
208+
template m_IDirect3DDevice9Ex* AddressLookupTableD3d9::FindAddress<m_IDirect3DDevice9Ex>(IUnknown*);
209+
template m_IDirect3DCubeTexture9* AddressLookupTableD3d9::FindAddress<m_IDirect3DCubeTexture9>(IUnknown*);
210+
template m_IDirect3DIndexBuffer9* AddressLookupTableD3d9::FindAddress<m_IDirect3DIndexBuffer9>(IUnknown*);
211+
template m_IDirect3DPixelShader9* AddressLookupTableD3d9::FindAddress<m_IDirect3DPixelShader9>(IUnknown*);
212+
template m_IDirect3DQuery9* AddressLookupTableD3d9::FindAddress<m_IDirect3DQuery9>(IUnknown*);
213+
template m_IDirect3DStateBlock9* AddressLookupTableD3d9::FindAddress<m_IDirect3DStateBlock9>(IUnknown*);
214+
template m_IDirect3DSurface9* AddressLookupTableD3d9::FindAddress<m_IDirect3DSurface9>(IUnknown*);
215+
template m_IDirect3DSwapChain9Ex* AddressLookupTableD3d9::FindAddress<m_IDirect3DSwapChain9Ex>(IUnknown*);
216+
template m_IDirect3DTexture9* AddressLookupTableD3d9::FindAddress<m_IDirect3DTexture9>(IUnknown*);
217+
template m_IDirect3DVertexBuffer9* AddressLookupTableD3d9::FindAddress<m_IDirect3DVertexBuffer9>(IUnknown*);
218+
template m_IDirect3DVertexDeclaration9* AddressLookupTableD3d9::FindAddress<m_IDirect3DVertexDeclaration9>(IUnknown*);
219+
template m_IDirect3DVertexShader9* AddressLookupTableD3d9::FindAddress<m_IDirect3DVertexShader9>(IUnknown*);
220+
template m_IDirect3DVolume9* AddressLookupTableD3d9::FindAddress<m_IDirect3DVolume9>(IUnknown*);
221+
template m_IDirect3DVolumeTexture9* AddressLookupTableD3d9::FindAddress<m_IDirect3DVolumeTexture9>(IUnknown*);
222+
template m_IDirect3DVideoDevice9* AddressLookupTableD3d9::FindAddress<m_IDirect3DVideoDevice9>(IUnknown*);
223+
template m_IDirect3DDXVADevice9* AddressLookupTableD3d9::FindAddress<m_IDirect3DDXVADevice9>(IUnknown*);
203224
template <typename T>
204-
T* AddressLookupTableD3d9::FindAddress(void* Proxy)
225+
T* AddressLookupTableD3d9::FindAddress(IUnknown* Proxy)
205226
{
206227
if (!Proxy)
207228
{
208229
return nullptr;
209230
}
210231

211232
constexpr UINT CacheIndex = AddressCacheIndex<T>::CacheIndex;
212-
auto it = g_map[CacheIndex].find(Proxy);
233+
234+
IUnknown* identity = Proxy;
235+
if constexpr (CacheIndex != AddressCacheIndex<m_IDirect3D9Ex>::CacheIndex &&
236+
CacheIndex != AddressCacheIndex<m_IDirect3DDevice9Ex>::CacheIndex &&
237+
CacheIndex != AddressCacheIndex<m_IDirect3DSwapChain9Ex>::CacheIndex)
238+
{
239+
ComPtr<IUnknown> pAddress;
240+
if (SUCCEEDED(Proxy->QueryInterface(IID_IUnknown, (void**)pAddress.GetAddressOf())))
241+
{
242+
identity = pAddress.Get();
243+
}
244+
}
245+
246+
auto it = g_map[CacheIndex].find(identity);
213247

214248
if (it != std::end(g_map[CacheIndex]))
215249
{
@@ -237,15 +271,27 @@ M* AddressLookupTableD3d9::GetSafeProxyInterface(T* WrapperInterface)
237271
return nullptr;
238272
}
239273

240-
template void AddressLookupTableD3d9::SaveAddress<m_IDirect3D9Ex>(m_IDirect3D9Ex*, void*);
274+
template void AddressLookupTableD3d9::SaveAddress<m_IDirect3D9Ex>(m_IDirect3D9Ex*, IUnknown*);
241275
template <typename T>
242-
void AddressLookupTableD3d9::SaveAddress(T* Wrapper, void* Proxy)
276+
void AddressLookupTableD3d9::SaveAddress(T* Wrapper, IUnknown* Proxy)
243277
{
244278
constexpr UINT CacheIndex = AddressCacheIndex<T>::CacheIndex;
245279
if (Wrapper && Proxy)
246280
{
281+
IUnknown* identity = Proxy;
282+
if constexpr (CacheIndex != AddressCacheIndex<m_IDirect3D9Ex>::CacheIndex &&
283+
CacheIndex != AddressCacheIndex<m_IDirect3DDevice9Ex>::CacheIndex &&
284+
CacheIndex != AddressCacheIndex<m_IDirect3DSwapChain9Ex>::CacheIndex)
285+
{
286+
ComPtr<IUnknown> pAddress;
287+
if (SUCCEEDED(Proxy->QueryInterface(IID_IUnknown, (void**)pAddress.GetAddressOf())))
288+
{
289+
identity = pAddress.Get();
290+
}
291+
}
292+
247293
// Check if the entry already exists in the map
248-
auto it = g_map[CacheIndex].find(Proxy);
294+
auto it = g_map[CacheIndex].find(identity);
249295
if (it != g_map[CacheIndex].end())
250296
{
251297
// If the entry exists, call DeleteMe() on the existing object
@@ -256,7 +302,7 @@ void AddressLookupTableD3d9::SaveAddress(T* Wrapper, void* Proxy)
256302
}
257303

258304
// Now save the new entry in the map
259-
g_map[CacheIndex][Proxy] = Wrapper;
305+
g_map[CacheIndex][identity] = Wrapper;
260306
}
261307
}
262308

d3d9/AddressLookupTable.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,16 @@ class AddressLookupTableD3d9
1616
~AddressLookupTableD3d9();
1717

1818
template <typename T, typename D, typename L>
19-
T* FindCreateAddress(void* Proxy, D* Device, REFIID riid, L Data);
19+
T* FindCreateAddress(IUnknown* Proxy, D* Device, REFIID riid, L Data);
2020

2121
template <typename T>
22-
T* FindAddress(void* Proxy);
22+
T* FindAddress(IUnknown* Proxy);
2323

2424
template <typename T, typename M>
2525
M* GetSafeProxyInterface(T* WrapperInterface);
2626

2727
template <typename T>
28-
void SaveAddress(T* Wrapper, void* Proxy);
28+
void SaveAddress(T* Wrapper, IUnknown* Proxy);
2929

3030
template <typename T>
3131
void DeleteAddress(T* Wrapper);

d3d9/IDirect3D9Ex.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ HRESULT m_IDirect3D9Ex::QueryInterface(REFIID riid, void** ppvObj)
6262
{
6363
if (riid == IID_IDirect3D9 || riid == IID_IDirect3D9Ex)
6464
{
65-
*ppvObj = ProxyAddressLookupTable9.FindCreateAddress<m_IDirect3D9Ex, void, LPVOID>(*ppvObj, nullptr, riid, nullptr);
65+
*ppvObj = ProxyAddressLookupTable9.FindCreateAddress<m_IDirect3D9Ex, void, LPVOID>(static_cast<IUnknown*>(*ppvObj), nullptr, riid, nullptr);
6666
}
6767
else
6868
{

d3d9/IDirect3DCubeTexture9.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ HRESULT m_IDirect3DCubeTexture9::GetCubeMapSurface(THIS_ D3DCUBEMAP_FACES FaceTy
191191

192192
if (SUCCEEDED(hr) && ppCubeMapSurface)
193193
{
194-
*ppCubeMapSurface = m_pDeviceEx->GetLookupTable()->FindCreateAddress<m_IDirect3DSurface9, m_IDirect3DDevice9Ex, LPVOID>(*ppCubeMapSurface, m_pDeviceEx, IID_IDirect3DSurface9, nullptr);
194+
D3d9Wrapper::genericQueryInterface(IID_IDirect3DSurface9, (LPVOID*)ppCubeMapSurface, m_pDeviceEx);
195195
}
196196

197197
return hr;

d3d9/IDirect3DDevice9Ex.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ HRESULT m_IDirect3DDevice9Ex::QueryInterface(REFIID riid, void** ppvObj)
8484
{
8585
if (riid == IID_IDirect3DDevice9 || riid == IID_IDirect3DDevice9Ex)
8686
{
87-
*ppvObj = SHARED.ProxyAddressLookupTable9.FindCreateAddress<m_IDirect3DDevice9Ex, m_IDirect3D9Ex, UINT>(*ppvObj, m_pD3DEx, riid, DDKey);
87+
*ppvObj = SHARED.ProxyAddressLookupTable9.FindCreateAddress<m_IDirect3DDevice9Ex, m_IDirect3D9Ex, UINT>(static_cast<IUnknown*>(*ppvObj), m_pD3DEx, riid, DDKey);
8888
}
8989
else
9090
{

d3d9/IDirect3DSwapChain9Ex.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ HRESULT m_IDirect3DSwapChain9Ex::QueryInterface(THIS_ REFIID riid, void** ppvObj
4848
{
4949
if (riid == IID_IDirect3DSwapChain9 || riid == IID_IDirect3DSwapChain9Ex)
5050
{
51-
*ppvObj = m_pDeviceEx->GetLookupTable()->FindCreateAddress<m_IDirect3DSwapChain9Ex, m_IDirect3DDevice9Ex, LPVOID>(*ppvObj, m_pDeviceEx, riid, nullptr);
51+
*ppvObj = m_pDeviceEx->GetLookupTable()->FindCreateAddress<m_IDirect3DSwapChain9Ex, m_IDirect3DDevice9Ex, LPVOID>(static_cast<IUnknown*>(*ppvObj), m_pDeviceEx, riid, nullptr);
5252
}
5353
else
5454
{

d3d9/IDirect3DTexture9.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ HRESULT m_IDirect3DTexture9::GetSurfaceLevel(THIS_ UINT Level, IDirect3DSurface9
191191

192192
if (SUCCEEDED(hr) && ppSurfaceLevel)
193193
{
194-
*ppSurfaceLevel = m_pDeviceEx->GetLookupTable()->FindCreateAddress<m_IDirect3DSurface9, m_IDirect3DDevice9Ex, LPVOID>(*ppSurfaceLevel, m_pDeviceEx, IID_IDirect3DSurface9, nullptr);
194+
D3d9Wrapper::genericQueryInterface(IID_IDirect3DSurface9, (LPVOID*)ppSurfaceLevel, m_pDeviceEx);
195195
}
196196

197197
return hr;

d3d9/IDirect3DVolume9.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ HRESULT m_IDirect3DVolume9::GetContainer(THIS_ REFIID riid, void** ppContainer)
112112

113113
HRESULT hr = ProxyInterface->GetContainer(riid, ppContainer);
114114

115-
if (SUCCEEDED(hr))
115+
if (SUCCEEDED(hr) && ppContainer)
116116
{
117117
D3d9Wrapper::genericQueryInterface(riid, ppContainer, m_pDeviceEx);
118118
}

d3d9/InterfaceQuery.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,14 @@ void WINAPI D3d9Wrapper::genericQueryInterface(REFIID riid, LPVOID *ppvObj, m_ID
5454

5555
if (riid == IID_IDirect3DSwapChain9 || riid == IID_IDirect3DSwapChain9Ex)
5656
{
57-
*ppvObj = m_pDeviceEx->GetLookupTable()->FindCreateAddress<m_IDirect3DSwapChain9Ex, m_IDirect3DDevice9Ex, LPVOID>(*ppvObj, m_pDeviceEx, riid, nullptr);
57+
*ppvObj = m_pDeviceEx->GetLookupTable()->FindCreateAddress<m_IDirect3DSwapChain9Ex, m_IDirect3DDevice9Ex, LPVOID>(static_cast<IUnknown*>(*ppvObj), m_pDeviceEx, riid, nullptr);
5858
return;
5959
}
6060

6161
#define QUERYINTERFACE(x) \
6262
if (riid == IID_ ## x) \
6363
{ \
64-
*ppvObj = m_pDeviceEx->GetLookupTable()->FindCreateAddress<m_ ## x, m_IDirect3DDevice9Ex, LPVOID>(*ppvObj, m_pDeviceEx, riid, nullptr); \
64+
*ppvObj = m_pDeviceEx->GetLookupTable()->FindCreateAddress<m_ ## x, m_IDirect3DDevice9Ex, LPVOID>(static_cast<IUnknown*>(*ppvObj), m_pDeviceEx, riid, nullptr); \
6565
return; \
6666
}
6767

0 commit comments

Comments
 (0)