From 5baeb50d1e6a7099fe4e5105e5c9b434a5962aa4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 29 May 2021 20:52:57 +0200 Subject: [PATCH] some passthrough tweaks --- inc/dd.h | 1 + src/IDirectDraw/IDirectDraw.c | 27 ++++++++++++++++++++++++--- src/dd.c | 5 +++++ 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index 3eb75be..1bbf067 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -53,6 +53,7 @@ typedef struct cnc_ddraw /* real export from system32\ddraw.dll */ HMODULE real_dll; DIRECTDRAWCREATEPROC DirectDrawCreate; + LPDIRECTDRAW real_dd; struct { diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index 30154be..bfa8fd5 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -96,9 +96,12 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid ret = S_OK; } - else if (IsEqualGUID(&IID_IMediaStream, riid) || IsEqualGUID(&IID_IAMMediaStream, riid)) + else if ( + !g_ddraw->passthrough && + (IsEqualGUID(&IID_IMediaStream, riid) || IsEqualGUID(&IID_IAMMediaStream, riid))) { - IAMMediaStreamImpl* ms = (IAMMediaStreamImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IAMMediaStreamImpl)); + IAMMediaStreamImpl* ms = + (IAMMediaStreamImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IAMMediaStreamImpl)); dprintf(" GUID = %08X (IID_IXXMediaStream), ms = %p\n", ((GUID*)riid)->Data1, ms); @@ -113,6 +116,24 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid { dprintf("NOT_IMPLEMENTED GUID = %08X\n", ((GUID*)riid)->Data1); + if (g_ddraw->passthrough) + { + if (!g_ddraw->real_dll) + g_ddraw->real_dll = LoadLibrary("system32\\ddraw.dll"); + + if (g_ddraw->real_dll && !g_ddraw->DirectDrawCreate) + g_ddraw->DirectDrawCreate = (void*)GetProcAddress(g_ddraw->real_dll, "DirectDrawCreate"); + + if (g_ddraw->DirectDrawCreate == DirectDrawCreate) + g_ddraw->DirectDrawCreate = NULL; + + if (!g_ddraw->real_dd && g_ddraw->DirectDrawCreate) + g_ddraw->DirectDrawCreate(NULL, &g_ddraw->real_dd, NULL); + + if (g_ddraw->real_dd) + return g_ddraw->real_dd->lpVtbl->QueryInterface(g_ddraw->real_dd, riid, obj); + } + ret = E_NOINTERFACE; } } @@ -176,7 +197,7 @@ HRESULT __stdcall IDirectDraw__CreatePalette(IDirectDrawImpl* This, DWORD dwFlag HRESULT __stdcall IDirectDraw__CreateSurface(IDirectDrawImpl* This, LPDDSURFACEDESC lpDDSurfaceDesc, LPDIRECTDRAWSURFACE FAR* lpDDSurface, IUnknown FAR* unkOuter) { dprintf("-> %s(This=%p, lpDDSurfaceDesc=%p, lpDDSurface=%p, unkOuter=%p)\n", __FUNCTION__, This, lpDDSurfaceDesc, lpDDSurface, unkOuter); - HRESULT ret = dd_CreateSurface(lpDDSurfaceDesc, lpDDSurface, unkOuter); + HRESULT ret = dd_CreateSurface(This, lpDDSurfaceDesc, lpDDSurface, unkOuter); dprintf("<- %s\n", __FUNCTION__); return ret; } diff --git a/src/dd.c b/src/dd.c index eba9283..649df8f 100644 --- a/src/dd.c +++ b/src/dd.c @@ -841,6 +841,11 @@ ULONG dd_Release() g_fpsl.htimer = NULL; } + if (g_ddraw->real_dd) + { + g_ddraw->real_dd->lpVtbl->Release(g_ddraw->real_dd); + } + DeleteCriticalSection(&g_ddraw->cs); /* restore old wndproc, subsequent ddraw creation will otherwise fail */