From 743df36fcb77df9f2d320fe0c4fa4333e0909386 Mon Sep 17 00:00:00 2001
From: FunkyFr3sh <cc.red.alert.1@googlemail.com>
Date: Mon, 30 Dec 2024 01:27:25 +0100
Subject: [PATCH] hook BeginPaint

---
 inc/hook.h         |  4 +++-
 inc/winapi_hooks.h |  1 +
 src/hook.c         |  2 ++
 src/winapi_hooks.c | 20 ++++++++++++++++++++
 4 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/inc/hook.h b/inc/hook.h
index 089f668..23de636 100644
--- a/inc/hook.h
+++ b/inc/hook.h
@@ -18,7 +18,7 @@ typedef struct HOOKLISTDATA {
     HMODULE mod;
 } HOOKLISTDATA;
 
-typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[38]; } HOOKLIST;
+typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[39]; } HOOKLIST;
 
 typedef BOOL(WINAPI* GETCURSORPOSPROC)(LPPOINT);
 typedef BOOL(WINAPI* CLIPCURSORPROC)(const RECT*);
@@ -64,6 +64,7 @@ typedef BOOL(WINAPI* SETWINDOWPLACEMENTPROC)(HWND, const WINDOWPLACEMENT*);
 typedef BOOL(WINAPI* ENUMDISPLAYSETTINGSAPROC)(LPCSTR, DWORD, DEVMODEA*);
 typedef LRESULT(WINAPI* DEFWINDOWPROCAPROC)(HWND, UINT, WPARAM, LPARAM);
 typedef HWND(WINAPI* SETPARENTPROC)(HWND, HWND);
+typedef HDC (WINAPI* BEGINPAINTPROC)(HWND, LPPAINTSTRUCT);
 typedef SHORT(WINAPI* GETKEYSTATEPROC)(int);
 typedef SHORT(WINAPI* GETASYNCKEYSTATEPROC)(int);
 
@@ -127,6 +128,7 @@ extern SETWINDOWPLACEMENTPROC real_SetWindowPlacement;
 extern ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA;
 extern DEFWINDOWPROCAPROC real_DefWindowProcA;
 extern SETPARENTPROC real_SetParent;
+extern BEGINPAINTPROC real_BeginPaint;
 extern GETKEYSTATEPROC real_GetKeyState;
 extern GETASYNCKEYSTATEPROC real_GetAsyncKeyState;
 extern GETDEVICECAPSPROC real_GetDeviceCaps;
diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h
index cab3ab6..ad44c7e 100644
--- a/inc/winapi_hooks.h
+++ b/inc/winapi_hooks.h
@@ -39,6 +39,7 @@ BOOL WINAPI fake_SetWindowPlacement(HWND hWnd, const WINDOWPLACEMENT* lpwndpl);
 BOOL WINAPI fake_EnumDisplaySettingsA(LPCSTR lpszDeviceName, DWORD iModeNum, DEVMODEA* lpDevMode);
 LRESULT WINAPI fake_DefWindowProcA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
 HWND WINAPI fake_SetParent(HWND hWndChild, HWND hWndNewParent);
+HDC WINAPI fake_BeginPaint(HWND hWnd, LPPAINTSTRUCT lpPaint);
 SHORT WINAPI fake_GetKeyState(int nVirtKey);
 SHORT WINAPI fake_GetAsyncKeyState(int vKey);
 int WINAPI fake_GetDeviceCaps(HDC hdc, int index);
diff --git a/src/hook.c b/src/hook.c
index 1e536fb..29846c7 100644
--- a/src/hook.c
+++ b/src/hook.c
@@ -55,6 +55,7 @@ SETWINDOWPLACEMENTPROC real_SetWindowPlacement = SetWindowPlacement;
 ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA = EnumDisplaySettingsA;
 DEFWINDOWPROCAPROC real_DefWindowProcA = DefWindowProcA;
 SETPARENTPROC real_SetParent = SetParent;
+BEGINPAINTPROC real_BeginPaint = BeginPaint;
 GETKEYSTATEPROC real_GetKeyState = GetKeyState;
 GETASYNCKEYSTATEPROC real_GetAsyncKeyState = GetAsyncKeyState;
 GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps;
@@ -119,6 +120,7 @@ HOOKLIST g_hook_hooklist[] =
             { "EnumDisplaySettingsA", (PROC)fake_EnumDisplaySettingsA, (PROC*)&real_EnumDisplaySettingsA, 0 },
             { "DefWindowProcA", (PROC)fake_DefWindowProcA, (PROC*)&real_DefWindowProcA, 0 },
             { "SetParent", (PROC)fake_SetParent, (PROC*)&real_SetParent, 0 },
+            { "BeginPaint", (PROC)fake_BeginPaint, (PROC*)&real_BeginPaint, 0 },
             { "GetKeyState", (PROC)fake_GetKeyState, (PROC*)&real_GetKeyState, 0 },
             { "GetAsyncKeyState", (PROC)fake_GetAsyncKeyState, (PROC*)&real_GetAsyncKeyState, 0 },
             { "SetForegroundWindow", (PROC)fake_SetForegroundWindow, (PROC*)&real_SetForegroundWindow, 0 },
diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c
index fc6fdbd..88c94fe 100644
--- a/src/winapi_hooks.c
+++ b/src/winapi_hooks.c
@@ -915,6 +915,26 @@ HWND WINAPI fake_SetParent(HWND hWndChild, HWND hWndNewParent)
     return real_SetParent(hWndChild, hWndNewParent);
 }
 
+HDC WINAPI fake_BeginPaint(HWND hWnd, LPPAINTSTRUCT lpPaint)
+{
+    if (g_ddraw.ref && g_ddraw.width && g_ddraw.hwnd && g_ddraw.hwnd == hWnd && lpPaint)
+    {
+        HDC result = real_BeginPaint(hWnd, lpPaint);
+
+        if (result)
+        {
+            lpPaint->rcPaint.left = 0;
+            lpPaint->rcPaint.top = 0;
+            lpPaint->rcPaint.right = g_ddraw.width;
+            lpPaint->rcPaint.bottom = g_ddraw.height;
+        }
+
+        return result;
+    }
+
+    return real_BeginPaint(hWnd, lpPaint);
+}
+
 SHORT WINAPI fake_GetKeyState(int nVirtKey)
 {
     if (g_config.windowed && g_ddraw.ref && g_ddraw.hwnd && !util_in_foreground())