From 21790200afed06f38d25fc941a6e6529f250cd30 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 4 Aug 2021 15:24:16 +0200 Subject: [PATCH] hook ShowWindow --- inc/hook.h | 2 ++ inc/winapi_hooks.h | 1 + src/hook.c | 2 ++ src/winapi_hooks.c | 14 ++++++++++++++ src/wndproc.c | 2 +- 5 files changed, 20 insertions(+), 1 deletion(-) diff --git a/inc/hook.h b/inc/hook.h index 4b26fe9..db564e4 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -30,6 +30,7 @@ typedef BOOL(WINAPI* ENABLEWINDOWPROC)(HWND, BOOL); typedef HWND(WINAPI* CREATEWINDOWEXAPROC)(DWORD, LPCSTR, LPCSTR, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, LPVOID); typedef BOOL(WINAPI* DESTROYWINDOWPROC)(HWND); typedef int (WINAPI* MAPWINDOWPOINTSPROC)(HWND, HWND, LPPOINT, UINT); +typedef BOOL (WINAPI* SHOWWINDOWPROC)(HWND, int); typedef HHOOK(WINAPI* SETWINDOWSHOOKEXAPROC)(int, HOOKPROC, HINSTANCE, DWORD); typedef int (WINAPI* GETDEVICECAPSPROC)(HDC, int); typedef HMODULE(WINAPI* LOADLIBRARYAPROC)(LPCSTR); @@ -60,6 +61,7 @@ extern ENABLEWINDOWPROC real_EnableWindow; extern CREATEWINDOWEXAPROC real_CreateWindowExA; extern DESTROYWINDOWPROC real_DestroyWindow; extern MAPWINDOWPOINTSPROC real_MapWindowPoints; +extern SHOWWINDOWPROC real_ShowWindow; extern SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA; extern GETDEVICECAPSPROC real_GetDeviceCaps; extern LOADLIBRARYAPROC real_LoadLibraryA; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index 499b375..3b4ca4c 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -26,6 +26,7 @@ LONG WINAPI fake_GetWindowLongA(HWND hWnd, int nIndex); BOOL WINAPI fake_EnableWindow(HWND hWnd, BOOL bEnable); BOOL WINAPI fake_DestroyWindow(HWND hWnd); int WINAPI fake_MapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UINT cPoints); +BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow); HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId); int WINAPI fake_GetDeviceCaps(HDC hdc, int index); HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName); diff --git a/src/hook.c b/src/hook.c index 32b4a45..6cabb4f 100644 --- a/src/hook.c +++ b/src/hook.c @@ -38,6 +38,7 @@ ENABLEWINDOWPROC real_EnableWindow = EnableWindow; CREATEWINDOWEXAPROC real_CreateWindowExA = CreateWindowExA; DESTROYWINDOWPROC real_DestroyWindow = DestroyWindow; MAPWINDOWPOINTSPROC real_MapWindowPoints = MapWindowPoints; +SHOWWINDOWPROC real_ShowWindow = ShowWindow; SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA = SetWindowsHookExA; GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps; LOADLIBRARYAPROC real_LoadLibraryA = LoadLibraryA; @@ -74,6 +75,7 @@ static HOOKLIST g_hooks[] = { "CreateWindowExA", (PROC)fake_CreateWindowExA, (PROC*)&real_CreateWindowExA }, { "DestroyWindow", (PROC)fake_DestroyWindow, (PROC*)&real_DestroyWindow }, { "MapWindowPoints", (PROC)fake_MapWindowPoints, (PROC*)&real_MapWindowPoints }, + { "ShowWindow", (PROC)fake_ShowWindow, (PROC*)&real_ShowWindow }, { "", NULL, NULL } } }, diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 5010df5..a55018a 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -471,6 +471,20 @@ int WINAPI fake_MapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UI return real_MapWindowPoints(hWndFrom, hWndTo, lpPoints, cPoints); } +BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow) +{ + if (g_ddraw && g_ddraw->hwnd == hWnd) + { + if (nCmdShow == SW_SHOWMAXIMIZED) + nCmdShow = SW_SHOWNORMAL; + + if (nCmdShow == SW_MAXIMIZE) + nCmdShow = SW_NORMAL; + } + + return real_ShowWindow(hWnd, nCmdShow); +} + HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId) { if (idHook == WH_KEYBOARD_LL && hmod && GetModuleHandle("AcGenral") == hmod) diff --git a/src/wndproc.c b/src/wndproc.c index 4fe730c..784ea6f 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -524,7 +524,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (g_ddraw->renderer != d3d9_render_main) { - ShowWindow(g_ddraw->hwnd, SW_MINIMIZE); + real_ShowWindow(g_ddraw->hwnd, SW_MINIMIZE); ChangeDisplaySettings(NULL, g_ddraw->bnet_active ? CDS_FULLSCREEN : 0); } }