11#include " d3d9.h"
2+ #include " Libraries\ComPtr.h"
23
34// Destructor for AddressLookupTableD3d9Object
45AddressLookupTableD3d9Object::~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);
165166template <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 *);
203224template <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 *);
241275template <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
0 commit comments