diff --git a/inc/hook.h b/inc/hook.h index cd1dab8..f6d175f 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -58,6 +58,9 @@ typedef BOOL(WINAPI* PEEKMESSAGEAPROC)(LPMSG, HWND, UINT, UINT, UINT); typedef BOOL(WINAPI* GETMESSAGEAPROC)(LPMSG, HWND, UINT, UINT); typedef BOOL(WINAPI* GETWINDOWPLACEMENTPROC)(HWND, WINDOWPLACEMENT*); typedef BOOL(WINAPI* ENUMDISPLAYSETTINGSAPROC)(LPCSTR, DWORD, DEVMODEA*); + +typedef BOOL(WINAPI* VALIDATERECTPROC)(HWND, const RECT*); +typedef BOOL(WINAPI* INVALIDATERECTPROC)(HWND, const RECT*, BOOL); typedef SHORT(WINAPI* GETKEYSTATEPROC)(int); typedef SHORT(WINAPI* GETASYNCKEYSTATEPROC)(int); @@ -109,6 +112,8 @@ extern PEEKMESSAGEAPROC real_PeekMessageA; extern GETMESSAGEAPROC real_GetMessageA; extern GETWINDOWPLACEMENTPROC real_GetWindowPlacement; extern ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA; +extern VALIDATERECTPROC real_ValidateRect; +extern INVALIDATERECTPROC real_InvalidateRect; 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 6e2965d..4ec75c9 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -34,6 +34,8 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax); BOOL WINAPI fake_GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl); BOOL WINAPI fake_EnumDisplaySettingsA(LPCSTR lpszDeviceName, DWORD iModeNum, DEVMODEA* lpDevMode); +BOOL WINAPI fake_ValidateRect(HWND hWnd, const RECT* lpRect); +BOOL WINAPI fake_InvalidateRect(HWND hWnd, const RECT* lpRect, BOOL bErase); 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 416125c..bab3648 100644 --- a/src/hook.c +++ b/src/hook.c @@ -51,6 +51,8 @@ PEEKMESSAGEAPROC real_PeekMessageA = PeekMessageA; GETMESSAGEAPROC real_GetMessageA = GetMessageA; GETWINDOWPLACEMENTPROC real_GetWindowPlacement = GetWindowPlacement; ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA = EnumDisplaySettingsA; +VALIDATERECTPROC real_ValidateRect = ValidateRect; +INVALIDATERECTPROC real_InvalidateRect = InvalidateRect; GETKEYSTATEPROC real_GetKeyState = GetKeyState; GETASYNCKEYSTATEPROC real_GetAsyncKeyState = GetAsyncKeyState; GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps; @@ -100,6 +102,8 @@ HOOKLIST g_hook_hooklist[] = //{ "GetMessageA", (PROC)fake_GetMessageA, (PROC*)&real_GetMessageA, 0 }, { "GetWindowPlacement", (PROC)fake_GetWindowPlacement, (PROC*)&real_GetWindowPlacement, 0 }, { "EnumDisplaySettingsA", (PROC)fake_EnumDisplaySettingsA, (PROC*)&real_EnumDisplaySettingsA, 0 }, + { "ValidateRect", (PROC)fake_ValidateRect, (PROC*)&real_ValidateRect, 0 }, + { "InvalidateRect", (PROC)fake_InvalidateRect, (PROC*)&real_InvalidateRect, 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 b856f0e..f6bd9e8 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -822,6 +822,46 @@ BOOL WINAPI fake_EnumDisplaySettingsA(LPCSTR lpszDeviceName, DWORD iModeNum, DEV return result; } +BOOL WINAPI fake_ValidateRect(HWND hWnd, const RECT* lpRect) +{ + if (!g_ddraw.ref || !g_ddraw.width || !g_ddraw.hwnd || hWnd != g_ddraw.hwnd || !lpRect) + return real_ValidateRect(hWnd, lpRect); + + RECT dst_rc; + + dst_rc.left = (LONG)(roundf(lpRect->left * g_ddraw.render.scale_w)); + dst_rc.top = (LONG)(roundf(lpRect->top * g_ddraw.render.scale_h)); + dst_rc.bottom = (LONG)(roundf(lpRect->bottom * g_ddraw.render.scale_h)); + dst_rc.right = (LONG)(roundf(lpRect->right * g_ddraw.render.scale_w)); + + OffsetRect( + &dst_rc, + g_ddraw.render.viewport.x, + g_ddraw.render.viewport.y); + + return real_ValidateRect(hWnd, lpRect); +} + +BOOL WINAPI fake_InvalidateRect(HWND hWnd, const RECT* lpRect, BOOL bErase) +{ + if (!g_ddraw.ref || !g_ddraw.width || !g_ddraw.hwnd || hWnd != g_ddraw.hwnd || !lpRect) + return real_InvalidateRect(hWnd, lpRect, bErase); + + RECT dst_rc; + + dst_rc.left = (LONG)(roundf(lpRect->left * g_ddraw.render.scale_w)); + dst_rc.top = (LONG)(roundf(lpRect->top * g_ddraw.render.scale_h)); + dst_rc.bottom = (LONG)(roundf(lpRect->bottom * g_ddraw.render.scale_h)); + dst_rc.right = (LONG)(roundf(lpRect->right * g_ddraw.render.scale_w)); + + OffsetRect( + &dst_rc, + g_ddraw.render.viewport.x, + g_ddraw.render.viewport.y); + + return real_InvalidateRect(hWnd, &dst_rc, bErase); +} + SHORT WINAPI fake_GetKeyState(int nVirtKey) { if (g_config.windowed && g_ddraw.ref && g_ddraw.hwnd && !util_in_foreground())