diff --git a/main.c b/main.c index 3b4156b..9e127b9 100644 --- a/main.c +++ b/main.c @@ -384,8 +384,19 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk if(ddraw) { + /* FIXME: check the calling module before passing the call! */ + return ddraw->DirectDrawCreate(lpGUID, lplpDD, pUnkOuter); + + /* printf(" returning DDERR_DIRECTDRAWALREADYCREATED\n"); return DDERR_DIRECTDRAWALREADYCREATED; + */ + } + + HMODULE real_dll = LoadLibrary("system32\\ddraw.dll"); + if(!real_dll) + { + return DDERR_GENERIC; } IDirectDrawImpl *This = (IDirectDrawImpl *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawImpl)); @@ -394,6 +405,16 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk *lplpDD = (LPDIRECTDRAW)This; ddraw = This; + This->DirectDrawCreate = (HRESULT WINAPI (*)(GUID FAR*, LPDIRECTDRAW FAR*, IUnknown FAR*))GetProcAddress(real_dll, "DirectDrawCreate"); + + CloseHandle(real_dll); + + if(!This->DirectDrawCreate) + { + ddraw_Release(This); + return DDERR_GENERIC; + } + /* load configuration options from ddraw.ini */ char cwd[MAX_PATH]; char ini_path[MAX_PATH]; diff --git a/main.h b/main.h index f9865ce..b3d46ae 100644 --- a/main.h +++ b/main.h @@ -39,6 +39,9 @@ typedef struct IDirectDrawImpl DWORD freq; BOOL windowed; + /* real export from system32\ddraw.dll */ + HRESULT WINAPI (*DirectDrawCreate)(GUID FAR*, LPDIRECTDRAW FAR*, IUnknown FAR*); + struct render { LPTHREAD_START_ROUTINE (*main)(void *); diff --git a/render_ddraw.c b/render_ddraw.c index ce27296..ed81eb7 100644 --- a/render_ddraw.c +++ b/render_ddraw.c @@ -65,19 +65,7 @@ struct render_ddraw_impl render_ddraw = HRESULT WINAPI render_ddraw_Initialize() { - HMODULE real_dll; - HRESULT WINAPI (*real_DirectDrawCreate)(GUID FAR*, LPDIRECTDRAW FAR*, IUnknown FAR*); - - real_dll = LoadLibrary("system32\\ddraw.dll"); - if(!real_dll) - { - return DDERR_GENERIC; - } - - render_ddraw.ddraw = NULL; - - real_DirectDrawCreate = (HRESULT WINAPI (*)(GUID FAR*, LPDIRECTDRAW FAR*, IUnknown FAR*))GetProcAddress(real_dll, "DirectDrawCreate"); - if(real_DirectDrawCreate(NULL, &render_ddraw.ddraw, NULL) != DD_OK) + if(ddraw->DirectDrawCreate(NULL, &render_ddraw.ddraw, NULL) != DD_OK) { return DDERR_GENERIC; }