From 3f9ac549bce8e296b1f448bb9b767134272769e9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 2 Sep 2021 22:22:48 +0200 Subject: [PATCH] #121 return empty device identifier --- inc/IDirectDraw.h | 1 + inc/dd.h | 1 + src/IDirectDraw/IDirectDraw.c | 12 +++++++----- src/dd.c | 26 +++++++++++++++++++++++--- src/dllmain.c | 2 +- src/winapi_hooks.c | 2 +- 6 files changed, 34 insertions(+), 10 deletions(-) diff --git a/inc/IDirectDraw.h b/inc/IDirectDraw.h index e28f29b..b354342 100644 --- a/inc/IDirectDraw.h +++ b/inc/IDirectDraw.h @@ -14,6 +14,7 @@ typedef struct IDirectDrawImpl struct IDirectDrawImplVtbl* lpVtbl; ULONG ref; + GUID guid; } IDirectDrawImpl; diff --git a/inc/dd.h b/inc/dd.h index ba9bd3e..a344d7d 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -20,6 +20,7 @@ HRESULT dd_GetDisplayMode(LPDDSURFACEDESC lpDDSurfaceDesc); HRESULT dd_GetMonitorFrequency(LPDWORD lpdwFreq); HRESULT dd_GetAvailableVidMem(LPDDSCAPS lpDDCaps, LPDWORD lpdwTotal, LPDWORD lpdwFree); HRESULT dd_GetVerticalBlankStatus(LPBOOL lpbIsInVB); +HRESULT dd_GetDeviceIdentifier(LPDDDEVICEIDENTIFIER pDDDI, DWORD dwFlags, REFIID riid); HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOuter); #define FIX_CHILDS_DISABLED 0 diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index 24e6a90..91609f1 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -26,6 +26,7 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid TRACE(" GUID = %08X (IID_IDirectDrawX), ddraw = %p\n", ((GUID*)riid)->Data1, dd); + memcpy(&dd->guid, riid, sizeof(dd->guid)); dd->lpVtbl = &g_dd_vtblx; IDirectDraw_AddRef(dd); @@ -40,6 +41,7 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid TRACE(" GUID = %08X (IID_IDirectDraw), ddraw = %p\n", ((GUID*)riid)->Data1, dd); + memcpy(&dd->guid, riid, sizeof(dd->guid)); dd->lpVtbl = &g_dd_vtbl1; IDirectDraw_AddRef(dd); @@ -138,9 +140,9 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid g_ddraw->DirectDrawCreate(NULL, &g_ddraw->real_dd, NULL); if (g_ddraw->real_dd) - return IDirectDraw_QueryInterface(g_ddraw->real_dd, riid, ppvObj); - - ret = E_NOINTERFACE; + ret = IDirectDraw_QueryInterface(g_ddraw->real_dd, riid, ppvObj); + else + ret = E_NOINTERFACE; } } @@ -477,8 +479,8 @@ HRESULT __stdcall IDirectDraw__TestCooperativeLevel(IDirectDrawImpl* This) HRESULT __stdcall IDirectDraw__GetDeviceIdentifier(IDirectDrawImpl* This, LPDDDEVICEIDENTIFIER2 pDDDI, DWORD dwFlags) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); - HRESULT ret = DDERR_INVALIDPARAMS; + TRACE("NOT_IMPLEMENTED -> %s(This=%p, pDDDI=%p, dwFlags=%08X)\n", __FUNCTION__, This, pDDDI, dwFlags); + HRESULT ret = dd_GetDeviceIdentifier((LPDDDEVICEIDENTIFIER)pDDDI, dwFlags, &This->guid); TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } diff --git a/src/dd.c b/src/dd.c index f35fa1b..629c13e 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1016,7 +1016,26 @@ HRESULT dd_GetAvailableVidMem(LPDDSCAPS lpDDCaps, LPDWORD lpdwTotal, LPDWORD lpd HRESULT dd_GetVerticalBlankStatus(LPBOOL lpbIsInVB) { - *lpbIsInVB = TRUE; + if (lpbIsInVB) + *lpbIsInVB = TRUE; + + return DD_OK; +} + +HRESULT dd_GetDeviceIdentifier(LPDDDEVICEIDENTIFIER pDDDI, DWORD dwFlags, REFIID riid) +{ + if (!pDDDI) + return DDERR_INVALIDPARAMS; + + if (IsEqualGUID(&IID_IDirectDraw7, riid)) + { + memset(pDDDI, 0, sizeof(DDDEVICEIDENTIFIER2)); + } + else + { + memset(pDDDI, 0, sizeof(DDDEVICEIDENTIFIER)); + } + return DD_OK; } @@ -1037,8 +1056,9 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute } IDirectDrawImpl* dd = (IDirectDrawImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawImpl)); + memcpy(&dd->guid, iid, sizeof(dd->guid)); - if (iid && IsEqualGUID(&IID_IDirectDraw, iid)) + if (IsEqualGUID(&IID_IDirectDraw, iid)) { TRACE(" GUID = %08X (IID_IDirectDraw), ddraw = %p\n", ((GUID*)iid)->Data1, dd); @@ -1046,7 +1066,7 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute } else { - TRACE(" GUID = %08X (IID_IDirectDrawX), ddraw = %p\n", iid ? ((GUID*)iid)->Data1 : 0, dd); + TRACE(" GUID = %08X (IID_IDirectDrawX), ddraw = %p\n", ((GUID*)iid)->Data1, dd); dd->lpVtbl = &g_dd_vtblx; } diff --git a/src/dllmain.c b/src/dllmain.c index 8cf02a5..e33135a 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -136,7 +136,7 @@ HRESULT WINAPI DirectDrawCreateClipper(DWORD dwFlags, LPDIRECTDRAWCLIPPER FAR* l HRESULT WINAPI DirectDrawCreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOuter) { TRACE("-> %s(lpGUID=%p, lplpDD=%p, riid=%08X, pUnkOuter=%p)\n", __FUNCTION__, lpGuid, lplpDD, iid, pUnkOuter); - HRESULT ret = dd_CreateEx(lpGuid, lplpDD, iid, pUnkOuter); + HRESULT ret = dd_CreateEx(lpGuid, lplpDD, &IID_IDirectDraw7, pUnkOuter); TRACE("<- %s\n", __FUNCTION__); return ret; } diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 64c271d..95e0a9d 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -654,7 +654,7 @@ HRESULT WINAPI fake_CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD IsEqualGUID(&IID_IDirectDraw4, riid) || IsEqualGUID(&IID_IDirectDraw7, riid)) { - return dd_CreateEx(NULL, ppv, NULL, NULL); + return dd_CreateEx(NULL, ppv, riid, NULL); } else {