1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-14 22:03:27 +01:00

export DirectDrawCreateEx

This commit is contained in:
FunkyFr3sh 2020-10-15 05:13:37 +02:00
parent d45bf45895
commit ae4b72c9c9
9 changed files with 98 additions and 64 deletions

View File

@ -3,8 +3,9 @@ LIBRARY ddraw.dll
EXPORTS
DirectDrawCreate @8
DirectDrawCreateClipper @9
DirectDrawCreateEx @10
DirectDrawEnumerateA @11
GameHandlesClose DATA
NvOptimusEnablement DATA
AmdPowerXpressRequestHighPerformance DATA
pvBmpBits = g_fake_primary_surface_export DATA
pvBmpBits = FakePrimarySurface DATA

View File

@ -17,6 +17,7 @@ HRESULT dd_GetCaps(LPDDCAPS lpDDDriverCaps, LPDDCAPS lpDDEmulCaps);
HRESULT dd_GetMonitorFrequency(LPDWORD lpdwFreq);
HRESULT dd_GetAvailableVidMem(void* lpDDCaps, LPDWORD lpdwTotal, LPDWORD lpdwFree);
HRESULT dd_GetVerticalBlankStatus(LPBOOL lpbIsInVB);
HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOuter);
typedef struct speed_limiter
{

View File

@ -5,7 +5,7 @@
#include <windows.h>
extern BOOL GameHandlesClose;
extern void* g_fake_primary_surface_export;
extern void* FakePrimarySurface;
extern HMODULE g_ddraw_module;
typedef enum PROCESS_DPI_AWARENESS {

View File

@ -19,41 +19,46 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid
IsEqualGUID(&IID_IDirectDraw4, riid) ||
IsEqualGUID(&IID_IDirectDraw7, riid))
{
dprintf(" GUID = %08X (IID_IDirectDrawX)\n", ((GUID*)riid)->Data1);
IDirectDrawImpl* dd = (IDirectDrawImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawImpl));
dprintf(" GUID = %08X (IID_IDirectDrawX), ddraw = %p\n", ((GUID*)riid)->Data1, dd);
dd->lpVtbl = &g_dd_vtblx;
IDirectDraw_AddRef(dd);
*obj = dd;
IDirectDraw_AddRef(dd);
ret = S_OK;
}
else if (IsEqualGUID(&IID_IDirectDraw, riid))
{
dprintf(" GUID = %08X (IID_IDirectDraw)\n", ((GUID*)riid)->Data1);
IDirectDrawImpl* dd = (IDirectDrawImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawImpl));
dprintf(" GUID = %08X (IID_IDirectDraw), ddraw = %p\n", ((GUID*)riid)->Data1, dd);
dd->lpVtbl = &g_dd_vtbl1;
IDirectDraw_AddRef(dd);
*obj = dd;
IDirectDraw_AddRef(dd);
ret = S_OK;
}
else if (IsEqualGUID(&IID_IDirect3D, riid))
{
dprintf(" GUID = %08X (IID_IDirect3D)\n", ((GUID*)riid)->Data1);
IDirect3DImpl* d3d = (IDirect3DImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawImpl));
dprintf(" GUID = %08X (IID_IDirect3D), d3d = %p\n", ((GUID*)riid)->Data1, d3d);
d3d->lpVtbl = &g_d3d_vtbl1;
d3d->lpVtbl->AddRef(d3d);
*obj = d3d;
d3d->lpVtbl->AddRef(d3d);
ret = S_OK;
}
else if (IsEqualGUID(&IID_IDirect3D2, riid) || IsEqualGUID(&IID_IDirect3D3, riid) || IsEqualGUID(&IID_IDirect3D7, riid))
else if (IsEqualGUID(&IID_IDirect3D2, riid) ||
IsEqualGUID(&IID_IDirect3D3, riid) ||
IsEqualGUID(&IID_IDirect3D7, riid))
{
dprintf(" GUID = %08X (IID_IDirect3DX)\n", ((GUID*)riid)->Data1);

View File

@ -1,4 +1,5 @@
#include <windows.h>
#include "IDirectDraw.h"
#include "ddraw.h"
#include "dd.h"
#include "hook.h"
@ -821,3 +822,61 @@ HRESULT dd_GetVerticalBlankStatus(LPBOOL lpbIsInVB)
*lpbIsInVB = TRUE;
return DD_OK;
}
HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOuter)
{
if (g_ddraw)
{
/* FIXME: check the calling module before passing the call! */
if (iid && IsEqualGUID(&IID_IDirectDraw, iid) && g_ddraw->DirectDrawCreate)
{
return g_ddraw->DirectDrawCreate(lpGuid, (LPDIRECTDRAW*)lplpDD, pUnkOuter);
}
return DDERR_DIRECTDRAWALREADYCREATED;
}
g_ddraw = (cnc_ddraw*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(cnc_ddraw));
IDirectDrawImpl* dd = (IDirectDrawImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawImpl));
if (iid && IsEqualGUID(&IID_IDirectDraw, iid))
{
dprintf(" GUID = %08X (IID_IDirectDraw), ddraw = %p\n", ((GUID*)iid)->Data1, dd);
dd->lpVtbl = &g_dd_vtbl1;
}
else
{
dprintf(" GUID = %08X (IID_IDirectDrawX), ddraw = %p\n", iid ? ((GUID*)iid)->Data1 : NULL, dd);
dd->lpVtbl = &g_dd_vtblx;
}
IDirectDraw_AddRef(dd);
*lplpDD = (LPVOID)dd;
if (!g_ddraw->real_dll)
{
g_ddraw->real_dll = LoadLibrary("system32\\ddraw.dll");
}
if (g_ddraw->real_dll && !g_ddraw->DirectDrawCreate)
{
g_ddraw->DirectDrawCreate =
(HRESULT(WINAPI*)(GUID FAR*, LPDIRECTDRAW FAR*, IUnknown FAR*))GetProcAddress(g_ddraw->real_dll, "DirectDrawCreate");
if (g_ddraw->DirectDrawCreate == DirectDrawCreate)
g_ddraw->DirectDrawCreate = NULL;
}
InitializeCriticalSection(&g_ddraw->cs);
g_ddraw->render.sem = CreateSemaphore(NULL, 0, 1, NULL);
g_ddraw->wine = GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_version") != 0;
cfg_load();
return DD_OK;
}

View File

@ -11,11 +11,13 @@ HRESULT dd_CreateClipper(DWORD dwFlags, LPDIRECTDRAWCLIPPER FAR *lplpDDClipper,
return DDERR_INVALIDPARAMS;
IDirectDrawClipperImpl *c = (IDirectDrawClipperImpl *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawClipperImpl));
c->lpVtbl = &g_ddc_vtbl;
dprintf(" Clipper = %p\n", c);
*lplpDDClipper = (LPDIRECTDRAWCLIPPER)c;
c->lpVtbl = &g_ddc_vtbl;
IDirectDrawClipper_AddRef(c);
*lplpDDClipper = (LPDIRECTDRAWCLIPPER)c;
return DD_OK;
}

View File

@ -53,13 +53,14 @@ HRESULT ddp_SetEntries(IDirectDrawPaletteImpl *This, DWORD dwFlags, DWORD dwStar
HRESULT dd_CreatePalette(DWORD dwFlags, LPPALETTEENTRY lpDDColorArray, LPDIRECTDRAWPALETTE FAR * lpDDPalette, IUnknown FAR * unkOuter)
{
IDirectDrawPaletteImpl *p = (IDirectDrawPaletteImpl *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawPaletteImpl));
p->lpVtbl = &g_ddp_vtbl;
dprintf(" Palette = %p\n", p);
*lpDDPalette = (LPDIRECTDRAWPALETTE)p;
p->lpVtbl = &g_ddp_vtbl;
ddp_SetEntries(p, dwFlags, 0, 256, lpDDColorArray);
IDirectDrawPalette_AddRef(p);
*lpDDPalette = (LPDIRECTDRAWPALETTE)p;
return DD_OK;
}

View File

@ -879,7 +879,7 @@ HRESULT dd_CreateSurface(LPDDSURFACEDESC lpDDSurfaceDesc, LPDIRECTDRAWSURFACE FA
if (lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)
{
g_fake_primary_surface_export = dst_surface->surface;
FakePrimarySurface = dst_surface->surface;
}
SelectObject(dst_surface->hdc, dst_surface->bitmap);

View File

@ -7,7 +7,6 @@
#include "debug.h"
#include "config.h"
#include "directinput.h"
#include "IDirectDraw.h"
#include "hook.h"
// exports to force usage of discrete high performance graphics device
@ -18,7 +17,7 @@ DWORD AmdPowerXpressRequestHighPerformance = 1;
BOOL GameHandlesClose;
// export for some warcraft II tools
void *g_fake_primary_surface_export;
PVOID FakePrimarySurface;
HMODULE g_ddraw_module;
@ -138,49 +137,15 @@ HRESULT WINAPI DirectDrawCreateClipper(DWORD dwFlags, LPDIRECTDRAWCLIPPER FAR* l
HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnknown FAR* pUnkOuter)
{
dprintf("-> %s(lpGUID=%p, lplpDD=%p, pUnkOuter=%p)\n", __FUNCTION__, lpGUID, lplpDD, pUnkOuter);
if (g_ddraw)
{
/* FIXME: check the calling module before passing the call! */
if (g_ddraw->DirectDrawCreate)
{
dprintf("<- %s\n", __FUNCTION__);
return g_ddraw->DirectDrawCreate(lpGUID, lplpDD, pUnkOuter);
}
dprintf("<- %s\n", __FUNCTION__);
return DDERR_DIRECTDRAWALREADYCREATED;
}
g_ddraw = (cnc_ddraw*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(cnc_ddraw));
IDirectDrawImpl* dst_ddraw = (IDirectDrawImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawImpl));
dst_ddraw->lpVtbl = &g_dd_vtbl1;
*lplpDD = (LPDIRECTDRAW)dst_ddraw;
IDirectDraw_AddRef(dst_ddraw);
if (!g_ddraw->real_dll)
{
g_ddraw->real_dll = LoadLibrary("system32\\ddraw.dll");
}
if (g_ddraw->real_dll && !g_ddraw->DirectDrawCreate)
{
g_ddraw->DirectDrawCreate =
(HRESULT(WINAPI*)(GUID FAR*, LPDIRECTDRAW FAR*, IUnknown FAR*))GetProcAddress(g_ddraw->real_dll, "DirectDrawCreate");
if (g_ddraw->DirectDrawCreate == DirectDrawCreate)
g_ddraw->DirectDrawCreate = NULL;
}
InitializeCriticalSection(&g_ddraw->cs);
g_ddraw->render.sem = CreateSemaphore(NULL, 0, 1, NULL);
g_ddraw->wine = GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_version") != 0;
cfg_load();
HRESULT ret = dd_CreateEx(lpGUID, (LPVOID*)lplpDD, &IID_IDirectDraw, pUnkOuter);
dprintf("<- %s\n", __FUNCTION__);
return DD_OK;
return ret;
}
HRESULT WINAPI DirectDrawCreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOuter)
{
dprintf("-> %s(lpGUID=%p, lplpDD=%p, riid=%08X, pUnkOuter=%p)\n", __FUNCTION__, lpGuid, lplpDD, iid, pUnkOuter);
HRESULT ret = dd_CreateEx(lpGuid, lplpDD, iid, pUnkOuter);
dprintf("<- %s\n", __FUNCTION__);
return ret;
}