1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-25 10:07:47 +01:00
cnc-ddraw/src/dllmain.c

186 lines
5.2 KiB
C
Raw Normal View History

2020-10-13 09:20:52 +02:00
#include <windows.h>
#include <ddraw.h>
#include <stdio.h>
#include "dllmain.h"
#include "IDirectDraw.h"
2020-10-13 09:20:52 +02:00
#include "dd.h"
#include "ddclipper.h"
#include "debug.h"
#include "config.h"
#include "directinput.h"
#include "hook.h"
// exports to force usage of discrete high performance graphics device
DWORD NvOptimusEnablement = 1;
DWORD AmdPowerXpressRequestHighPerformance = 1;
// export for cncnet cnc games
BOOL GameHandlesClose;
2020-10-13 11:29:52 +02:00
// export for some warcraft II tools
2020-10-15 05:13:37 +02:00
PVOID FakePrimarySurface;
2020-10-13 11:29:52 +02:00
2020-10-13 09:20:52 +02:00
HMODULE g_ddraw_module;
BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved)
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
{
#if _DEBUG
dbg_init();
#endif
g_ddraw_module = hDll;
char buf[1024];
if (GetEnvironmentVariable("__COMPAT_LAYER", buf, sizeof(buf)))
{
char* s = strtok(buf, " ");
while (s)
{
2020-10-15 07:22:48 +02:00
if (_strcmpi(s, "WIN95") == 0 || _strcmpi(s, "WIN98") == 0 || _strcmpi(s, "NT4SP5") == 0)
2020-10-13 09:20:52 +02:00
{
char mes[128] = { 0 };
_snprintf(
mes,
sizeof(mes),
"Please disable the '%s' compatibility mode for all game executables and "
"then try to start the game again.",
s);
MessageBoxA(NULL, mes, "Compatibility modes detected - cnc-ddraw", MB_OK);
break;
}
s = strtok(NULL, " ");
}
}
BOOL set_dpi_aware = FALSE;
HMODULE hshcore = GetModuleHandle("shcore.dll");
if (hshcore)
{
typedef HRESULT(__stdcall* SETPROCESSDPIAWERENESSPROC)(PROCESS_DPI_AWARENESS value);
SETPROCESSDPIAWERENESSPROC set_awareness =
(SETPROCESSDPIAWERENESSPROC)GetProcAddress(hshcore, "SetProcessDpiAwareness");
if (set_awareness)
{
HRESULT result = set_awareness(PROCESS_PER_MONITOR_DPI_AWARE);
set_dpi_aware = result == S_OK || result == E_ACCESSDENIED;
}
}
if (!set_dpi_aware)
{
2020-10-15 01:17:40 +02:00
HMODULE huser32 = GetModuleHandle("user32.dll");
2020-10-13 09:20:52 +02:00
2020-10-15 01:17:40 +02:00
if (huser32)
2020-10-13 09:20:52 +02:00
{
typedef BOOL(__stdcall* SETPROCESSDPIAWAREPROC)();
SETPROCESSDPIAWAREPROC set_aware =
2020-10-15 01:17:40 +02:00
(SETPROCESSDPIAWAREPROC)GetProcAddress(huser32, "SetProcessDPIAware");
2020-10-13 09:20:52 +02:00
if (set_aware)
set_aware();
}
}
timeBeginPeriod(1);
dinput_hook();
break;
}
case DLL_PROCESS_DETACH:
{
dprintf("cnc-ddraw DLL_PROCESS_DETACH\n");
cfg_save();
timeEndPeriod(1);
hook_exit();
dinput_unhook();
break;
}
}
return TRUE;
}
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);
HRESULT ret = dd_CreateEx(lpGUID, (LPVOID*)lplpDD, &IID_IDirectDraw, pUnkOuter);
dprintf("<- %s\n", __FUNCTION__);
return ret;
}
HRESULT WINAPI DirectDrawCreateClipper(DWORD dwFlags, LPDIRECTDRAWCLIPPER FAR* lplpDDClipper, IUnknown FAR* pUnkOuter)
{
dprintf("-> %s(dwFlags=%08X, DDClipper=%p, unkOuter=%p)\n", __FUNCTION__, (int)dwFlags, lplpDDClipper, pUnkOuter);
HRESULT ret = dd_CreateClipper(dwFlags, lplpDDClipper, pUnkOuter);
dprintf("<- %s\n", __FUNCTION__);
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;
}
2020-10-13 09:20:52 +02:00
HRESULT WINAPI DirectDrawEnumerateA(LPDDENUMCALLBACK lpCallback, LPVOID lpContext)
{
dprintf("-> %s(lpCallback=%p, lpContext=%p)\n", __FUNCTION__, lpCallback, lpContext);
if (lpCallback)
lpCallback(NULL, "display", "(null)", lpContext);
dprintf("<- %s\n", __FUNCTION__);
return DD_OK;
}
HRESULT DirectDrawEnumerateExA(LPDDENUMCALLBACKEXA lpCallback, LPVOID lpContext, DWORD dwFlags)
2020-10-13 09:20:52 +02:00
{
dprintf("-> %s(lpCallback=%p, lpContext=%p, dwFlags=%d)\n", __FUNCTION__, lpCallback, lpContext, dwFlags);
if (lpCallback)
lpCallback(NULL, "display", "(null)", lpContext, NULL);
2020-10-13 09:20:52 +02:00
dprintf("<- %s\n", __FUNCTION__);
return DD_OK;
2020-10-13 09:20:52 +02:00
}
HRESULT WINAPI DirectDrawEnumerateExW(LPDDENUMCALLBACKEXW lpCallback, LPVOID lpContext, DWORD dwFlags)
2020-10-13 09:20:52 +02:00
{
dprintf("-> %s(lpCallback=%p, lpContext=%p, dwFlags=%d)\n", __FUNCTION__, lpCallback, lpContext, dwFlags);
if (lpCallback)
lpCallback(NULL, L"display", L"(null)", lpContext, NULL);
2020-10-15 05:13:37 +02:00
dprintf("<- %s\n", __FUNCTION__);
return DD_OK;
2020-10-15 05:13:37 +02:00
}
2020-10-13 09:20:52 +02:00
HRESULT WINAPI DirectDrawEnumerateW(LPDDENUMCALLBACKW lpCallback, LPVOID lpContext)
2020-10-15 05:13:37 +02:00
{
dprintf("-> %s(lpCallback=%p, lpContext=%p)\n", __FUNCTION__, lpCallback, lpContext);
if (lpCallback)
lpCallback(NULL, L"display", L"(null)", lpContext);
2020-10-13 09:20:52 +02:00
dprintf("<- %s\n", __FUNCTION__);
return DD_OK;
2020-10-13 09:20:52 +02:00
}