1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-25 01:57:47 +01:00

detect other DirectDraw wrappers and error out

This commit is contained in:
FunkyFr3sh 2024-07-13 03:58:36 +02:00
parent 8cf76cb8f3
commit 6c53f51d7b
3 changed files with 132 additions and 15 deletions

View File

@ -6,6 +6,7 @@
HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast); HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast);
BOOL util_caller_is_ddraw_wrapper(void* returnAddress);
BOOL util_is_bad_read_ptr(void* p); BOOL util_is_bad_read_ptr(void* p);
BOOL util_is_minimized(HWND hwnd); BOOL util_is_minimized(HWND hwnd);
BOOL util_in_foreground(); BOOL util_in_foreground();

View File

@ -10,6 +10,7 @@
#include "config.h" #include "config.h"
#include "hook.h" #include "hook.h"
#include "indeo.h" #include "indeo.h"
#include "utils.h"
#include "versionhelpers.h" #include "versionhelpers.h"
@ -158,31 +159,74 @@ FARPROC WINAPI DDGetProcAddress(HMODULE hModule, LPCSTR lpProcName)
HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnknown FAR* pUnkOuter) HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnknown FAR* pUnkOuter)
{ {
TRACE("-> %s(lpGUID=%p, lplpDD=%p, pUnkOuter=%p)\n", __FUNCTION__, lpGUID, lplpDD, pUnkOuter); TRACE("-> %s(lpGUID=%p, lplpDD=%p, pUnkOuter=%p) [%p]\n", __FUNCTION__, lpGUID, lplpDD, pUnkOuter, _ReturnAddress());
HRESULT ret = dd_CreateEx(lpGUID, (LPVOID*)lplpDD, &IID_IDirectDraw, pUnkOuter);
HRESULT ret;
if (util_caller_is_ddraw_wrapper(_ReturnAddress()))
{
if (lplpDD)
*lplpDD = NULL;
ret = DDERR_GENERIC;
}
else
{
ret = dd_CreateEx(lpGUID, (LPVOID*)lplpDD, &IID_IDirectDraw, pUnkOuter);
}
TRACE("<- %s\n", __FUNCTION__); TRACE("<- %s\n", __FUNCTION__);
return ret; return ret;
} }
HRESULT WINAPI DirectDrawCreateClipper(DWORD dwFlags, LPDIRECTDRAWCLIPPER FAR* lplpDDClipper, IUnknown FAR* pUnkOuter) HRESULT WINAPI DirectDrawCreateClipper(DWORD dwFlags, LPDIRECTDRAWCLIPPER FAR* lplpDDClipper, IUnknown FAR* pUnkOuter)
{ {
TRACE("-> %s(dwFlags=%08X, DDClipper=%p, unkOuter=%p)\n", __FUNCTION__, (int)dwFlags, lplpDDClipper, pUnkOuter); TRACE(
"-> %s(dwFlags=%08X, DDClipper=%p, unkOuter=%p) [%p]\n",
__FUNCTION__,
(int)dwFlags,
lplpDDClipper,
pUnkOuter,
_ReturnAddress());
HRESULT ret = dd_CreateClipper(dwFlags, (IDirectDrawClipperImpl**)lplpDDClipper, pUnkOuter); HRESULT ret = dd_CreateClipper(dwFlags, (IDirectDrawClipperImpl**)lplpDDClipper, pUnkOuter);
TRACE("<- %s\n", __FUNCTION__); TRACE("<- %s\n", __FUNCTION__);
return ret; return ret;
} }
HRESULT WINAPI DirectDrawCreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOuter) 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); TRACE(
HRESULT ret = dd_CreateEx(lpGuid, lplpDD, &IID_IDirectDraw7, pUnkOuter); "-> %s(lpGUID=%p, lplpDD=%p, riid=%08X, pUnkOuter=%p) [%p]\n",
__FUNCTION__,
lpGuid,
lplpDD,
iid,
pUnkOuter,
_ReturnAddress());
HRESULT ret;
if (util_caller_is_ddraw_wrapper(_ReturnAddress()))
{
if (lplpDD)
*lplpDD = NULL;
ret = DDERR_GENERIC;
}
else
{
ret = dd_CreateEx(lpGuid, lplpDD, &IID_IDirectDraw7, pUnkOuter);
}
TRACE("<- %s\n", __FUNCTION__); TRACE("<- %s\n", __FUNCTION__);
return ret; return ret;
} }
HRESULT WINAPI DirectDrawEnumerateA(LPDDENUMCALLBACK lpCallback, LPVOID lpContext) HRESULT WINAPI DirectDrawEnumerateA(LPDDENUMCALLBACK lpCallback, LPVOID lpContext)
{ {
TRACE("-> %s(lpCallback=%p, lpContext=%p)\n", __FUNCTION__, lpCallback, lpContext); TRACE("-> %s(lpCallback=%p, lpContext=%p) [%p]\n", __FUNCTION__, lpCallback, lpContext, _ReturnAddress());
if (lpCallback) if (lpCallback)
lpCallback(NULL, "Primary Display Driver", "display", lpContext); lpCallback(NULL, "Primary Display Driver", "display", lpContext);
@ -193,7 +237,13 @@ HRESULT WINAPI DirectDrawEnumerateA(LPDDENUMCALLBACK lpCallback, LPVOID lpContex
HRESULT WINAPI DirectDrawEnumerateExA(LPDDENUMCALLBACKEXA lpCallback, LPVOID lpContext, DWORD dwFlags) HRESULT WINAPI DirectDrawEnumerateExA(LPDDENUMCALLBACKEXA lpCallback, LPVOID lpContext, DWORD dwFlags)
{ {
TRACE("-> %s(lpCallback=%p, lpContext=%p, dwFlags=%d)\n", __FUNCTION__, lpCallback, lpContext, dwFlags); TRACE(
"-> %s(lpCallback=%p, lpContext=%p, dwFlags=%d) [%p]\n",
__FUNCTION__,
lpCallback,
lpContext,
dwFlags,
_ReturnAddress());
if (lpCallback) if (lpCallback)
lpCallback(NULL, "Primary Display Driver", "display", lpContext, NULL); lpCallback(NULL, "Primary Display Driver", "display", lpContext, NULL);
@ -204,7 +254,12 @@ HRESULT WINAPI DirectDrawEnumerateExA(LPDDENUMCALLBACKEXA lpCallback, LPVOID lpC
HRESULT WINAPI DirectDrawEnumerateExW(LPDDENUMCALLBACKEXW lpCallback, LPVOID lpContext, DWORD dwFlags) HRESULT WINAPI DirectDrawEnumerateExW(LPDDENUMCALLBACKEXW lpCallback, LPVOID lpContext, DWORD dwFlags)
{ {
TRACE("-> %s(lpCallback=%p, lpContext=%p, dwFlags=%d)\n", __FUNCTION__, lpCallback, lpContext, dwFlags); TRACE(
"-> %s(lpCallback=%p, lpContext=%p, dwFlags=%d) [%p]\n", __FUNCTION__,
lpCallback,
lpContext,
dwFlags,
_ReturnAddress());
if (lpCallback) if (lpCallback)
lpCallback(NULL, L"Primary Display Driver", L"display", lpContext, NULL); lpCallback(NULL, L"Primary Display Driver", L"display", lpContext, NULL);
@ -215,7 +270,7 @@ HRESULT WINAPI DirectDrawEnumerateExW(LPDDENUMCALLBACKEXW lpCallback, LPVOID lpC
HRESULT WINAPI DirectDrawEnumerateW(LPDDENUMCALLBACKW lpCallback, LPVOID lpContext) HRESULT WINAPI DirectDrawEnumerateW(LPDDENUMCALLBACKW lpCallback, LPVOID lpContext)
{ {
TRACE("-> %s(lpCallback=%p, lpContext=%p)\n", __FUNCTION__, lpCallback, lpContext); TRACE("-> %s(lpCallback=%p, lpContext=%p) [%p]\n", __FUNCTION__, lpCallback, lpContext, _ReturnAddress());
if (lpCallback) if (lpCallback)
lpCallback(NULL, L"Primary Display Driver", L"display", lpContext); lpCallback(NULL, L"Primary Display Driver", L"display", lpContext);
@ -226,7 +281,7 @@ HRESULT WINAPI DirectDrawEnumerateW(LPDDENUMCALLBACKW lpCallback, LPVOID lpConte
DWORD WINAPI CompleteCreateSysmemSurface(DWORD a) DWORD WINAPI CompleteCreateSysmemSurface(DWORD a)
{ {
TRACE("NOT_IMPLEMENTED -> %s()\n", __FUNCTION__); TRACE("NOT_IMPLEMENTED -> %s() [%p]\n", __FUNCTION__, _ReturnAddress());
DWORD ret = 0; DWORD ret = 0;
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
return ret; return ret;
@ -234,7 +289,7 @@ DWORD WINAPI CompleteCreateSysmemSurface(DWORD a)
HRESULT WINAPI D3DParseUnknownCommand(LPVOID lpCmd, LPVOID* lpRetCmd) HRESULT WINAPI D3DParseUnknownCommand(LPVOID lpCmd, LPVOID* lpRetCmd)
{ {
TRACE("NOT_IMPLEMENTED -> %s(lpCmd=%p, lpRetCmd=%p)\n", __FUNCTION__, lpCmd, lpRetCmd); TRACE("NOT_IMPLEMENTED -> %s(lpCmd=%p, lpRetCmd=%p) [%p]\n", __FUNCTION__, lpCmd, lpRetCmd, _ReturnAddress());
HRESULT ret = E_FAIL; HRESULT ret = E_FAIL;
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
return ret; return ret;
@ -242,7 +297,7 @@ HRESULT WINAPI D3DParseUnknownCommand(LPVOID lpCmd, LPVOID* lpRetCmd)
DWORD WINAPI AcquireDDThreadLock() DWORD WINAPI AcquireDDThreadLock()
{ {
TRACE("NOT_IMPLEMENTED -> %s()\n", __FUNCTION__); TRACE("NOT_IMPLEMENTED -> %s() [%p]\n", __FUNCTION__, _ReturnAddress());
DWORD ret = 0; DWORD ret = 0;
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
return ret; return ret;
@ -250,7 +305,7 @@ DWORD WINAPI AcquireDDThreadLock()
DWORD WINAPI ReleaseDDThreadLock() DWORD WINAPI ReleaseDDThreadLock()
{ {
TRACE("NOT_IMPLEMENTED -> %s()\n", __FUNCTION__); TRACE("NOT_IMPLEMENTED -> %s() [%p]\n", __FUNCTION__, _ReturnAddress());
DWORD ret = 0; DWORD ret = 0;
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
return ret; return ret;
@ -258,7 +313,7 @@ DWORD WINAPI ReleaseDDThreadLock()
DWORD WINAPI DDInternalLock(DWORD a, DWORD b) DWORD WINAPI DDInternalLock(DWORD a, DWORD b)
{ {
TRACE("NOT_IMPLEMENTED -> %s()\n", __FUNCTION__); TRACE("NOT_IMPLEMENTED -> %s() [%p]\n", __FUNCTION__, _ReturnAddress());
DWORD ret = 0; DWORD ret = 0;
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
return ret; return ret;
@ -266,7 +321,7 @@ DWORD WINAPI DDInternalLock(DWORD a, DWORD b)
DWORD WINAPI DDInternalUnlock(DWORD a) DWORD WINAPI DDInternalUnlock(DWORD a)
{ {
TRACE("NOT_IMPLEMENTED -> %s()\n", __FUNCTION__); TRACE("NOT_IMPLEMENTED -> %s() [%p]\n", __FUNCTION__, _ReturnAddress());
DWORD ret = 0; DWORD ret = 0;
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
return ret; return ret;

View File

@ -69,6 +69,67 @@ HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast)
return NULL; return NULL;
} }
BOOL util_caller_is_ddraw_wrapper(void* returnAddress)
{
HMODULE windmode_dll = GetModuleHandleA("windmode.dll");
HMODULE wndmode_dll = GetModuleHandleA("wndmode.dll");
HMODULE dxwnd_dll = GetModuleHandleA("dxwnd.dll");
HMODULE age_dll = GetModuleHandleA("age.dll");
HMODULE mod = NULL;
DWORD flags = GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT;
if (wndmode_dll && GetModuleHandleExA(flags, returnAddress, &mod) && mod == wndmode_dll)
{
MessageBoxA(
NULL,
"Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n"
"Please remove/disable wndmode.dll and then try to start the game again.",
"Conflicting DirectDraw wrapper detected - cnc-ddraw",
MB_OK | MB_TOPMOST);
return TRUE;
}
if (windmode_dll && GetModuleHandleExA(flags, returnAddress, &mod) && mod == windmode_dll)
{
MessageBoxA(
NULL,
"Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n"
"Please remove/disable windmode.dll and then try to start the game again.",
"Conflicting DirectDraw wrapper detected - cnc-ddraw",
MB_OK | MB_TOPMOST);
return TRUE;
}
if (dxwnd_dll && GetModuleHandleExA(flags, returnAddress, &mod) && mod == dxwnd_dll)
{
MessageBoxA(
NULL,
"Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n"
"Please disable DxWnd and then try to start the game again.",
"Conflicting DirectDraw wrapper detected - cnc-ddraw",
MB_OK | MB_TOPMOST);
return TRUE;
}
if (age_dll && GetModuleHandleExA(flags, returnAddress, &mod) && mod == age_dll)
{
MessageBoxA(
NULL,
"Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n"
"Please disable the other wrapper by clicking in the game room on the very top on 'Game', now select 'DirectX' and disable 'Render in 32-bit color'.",
"Conflicting DirectDraw wrapper detected - cnc-ddraw",
MB_OK | MB_TOPMOST);
return TRUE;
}
return FALSE;
}
BOOL util_is_bad_read_ptr(void* p) BOOL util_is_bad_read_ptr(void* p)
{ {
MEMORY_BASIC_INFORMATION mbi = { 0 }; MEMORY_BASIC_INFORMATION mbi = { 0 };