From 743df36fcb77df9f2d320fe0c4fa4333e0909386 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh 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())