From 78b912b09c985532665f889a896f0dbaa65955f0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 24 Dec 2024 07:48:15 +0100 Subject: [PATCH] hook SetParent --- inc/hook.h | 4 +++- inc/winapi_hooks.h | 1 + src/hook.c | 2 ++ src/winapi_hooks.c | 29 +++++++++++++++++++++++++++++ 4 files changed, 35 insertions(+), 1 deletion(-) diff --git a/inc/hook.h b/inc/hook.h index bbab6da..089f668 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[37]; } HOOKLIST; +typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[38]; } HOOKLIST; typedef BOOL(WINAPI* GETCURSORPOSPROC)(LPPOINT); typedef BOOL(WINAPI* CLIPCURSORPROC)(const RECT*); @@ -63,6 +63,7 @@ typedef BOOL(WINAPI* GETWINDOWPLACEMENTPROC)(HWND, WINDOWPLACEMENT*); 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 SHORT(WINAPI* GETKEYSTATEPROC)(int); typedef SHORT(WINAPI* GETASYNCKEYSTATEPROC)(int); @@ -125,6 +126,7 @@ extern GETWINDOWPLACEMENTPROC real_GetWindowPlacement; extern SETWINDOWPLACEMENTPROC real_SetWindowPlacement; extern ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA; extern DEFWINDOWPROCAPROC real_DefWindowProcA; +extern SETPARENTPROC real_SetParent; 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 6c6cbb1..cab3ab6 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -38,6 +38,7 @@ BOOL WINAPI fake_GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl); 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); 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 1e4bf14..1e536fb 100644 --- a/src/hook.c +++ b/src/hook.c @@ -54,6 +54,7 @@ GETWINDOWPLACEMENTPROC real_GetWindowPlacement = GetWindowPlacement; SETWINDOWPLACEMENTPROC real_SetWindowPlacement = SetWindowPlacement; ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA = EnumDisplaySettingsA; DEFWINDOWPROCAPROC real_DefWindowProcA = DefWindowProcA; +SETPARENTPROC real_SetParent = SetParent; GETKEYSTATEPROC real_GetKeyState = GetKeyState; GETASYNCKEYSTATEPROC real_GetAsyncKeyState = GetAsyncKeyState; GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps; @@ -117,6 +118,7 @@ HOOKLIST g_hook_hooklist[] = { "SetWindowPlacement", (PROC)fake_SetWindowPlacement, (PROC*)&real_SetWindowPlacement, 0 }, { "EnumDisplaySettingsA", (PROC)fake_EnumDisplaySettingsA, (PROC*)&real_EnumDisplaySettingsA, 0 }, { "DefWindowProcA", (PROC)fake_DefWindowProcA, (PROC*)&real_DefWindowProcA, 0 }, + { "SetParent", (PROC)fake_SetParent, (PROC*)&real_SetParent, 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 bbb680b..0d2f981 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -886,6 +886,35 @@ LRESULT WINAPI fake_DefWindowProcA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lP return real_DefWindowProcA(hWnd, Msg, wParam, lParam); } +HWND WINAPI fake_SetParent(HWND hWndChild, HWND hWndNewParent) +{ + if (g_ddraw.ref && g_ddraw.hwnd && g_ddraw.hwnd == hWndNewParent) + { + char class_name[MAX_PATH] = { 0 }; + GetClassNameA(hWndChild, class_name, sizeof(class_name) - 1); + + if (strcmp(class_name, "VideoRenderer") == 0) + { + RECT rc_org; + fake_GetWindowRect(hWndChild, &rc_org); + + HWND result = real_SetParent(hWndChild, hWndNewParent); + + real_MoveWindow( + hWndChild, + rc_org.left, + rc_org.top, + (rc_org.right - rc_org.left), + (rc_org.bottom - rc_org.top), + FALSE); + + return result; + } + } + + return real_SetParent(hWndChild, hWndNewParent); +} + SHORT WINAPI fake_GetKeyState(int nVirtKey) { if (g_config.windowed && g_ddraw.ref && g_ddraw.hwnd && !util_in_foreground())