From 50e6cf75344dee1bc678564d4346f36a215883c6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 4 Jun 2021 22:46:15 +0200 Subject: [PATCH] make fixwndprochook useful for other games as well --- inc/hook.h | 2 ++ inc/winapi_hooks.h | 1 + src/hook.c | 2 ++ src/winapi_hooks.c | 30 ++++++++++++++++++++++++------ 4 files changed, 29 insertions(+), 6 deletions(-) diff --git a/inc/hook.h b/inc/hook.h index d2fbcac..b561d93 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -25,6 +25,7 @@ typedef BOOL (WINAPI* SETWINDOWPOSPROC)(HWND, HWND, int, int, int, int, UINT); typedef BOOL (WINAPI* MOVEWINDOWPROC)(HWND, int, int, int, int, BOOL); typedef LRESULT (WINAPI* SENDMESSAGEAPROC)(HWND, UINT, WPARAM, LPARAM); typedef LONG (WINAPI* SETWINDOWLONGAPROC)(HWND, int, LONG); +typedef LONG (WINAPI* GETWINDOWLONGAPROC)(HWND, int); 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); @@ -52,6 +53,7 @@ extern SETWINDOWPOSPROC real_SetWindowPos; extern MOVEWINDOWPROC real_MoveWindow; extern SENDMESSAGEAPROC real_SendMessageA; extern SETWINDOWLONGAPROC real_SetWindowLongA; +extern GETWINDOWLONGAPROC real_GetWindowLongA; extern ENABLEWINDOWPROC real_EnableWindow; extern CREATEWINDOWEXAPROC real_CreateWindowExA; extern DESTROYWINDOWPROC real_DestroyWindow; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index bf2e092..7139b42 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -22,6 +22,7 @@ BOOL WINAPI fake_SetWindowPos(HWND hWnd, HWND hWndInsertAfter, int X, int Y, int BOOL WINAPI fake_MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint); LRESULT WINAPI fake_SendMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); LONG WINAPI fake_SetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLong); +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); diff --git a/src/hook.c b/src/hook.c index ed4daf3..8a29f08 100644 --- a/src/hook.c +++ b/src/hook.c @@ -33,6 +33,7 @@ SETWINDOWPOSPROC real_SetWindowPos = SetWindowPos; MOVEWINDOWPROC real_MoveWindow = MoveWindow; SENDMESSAGEAPROC real_SendMessageA = SendMessageA; SETWINDOWLONGAPROC real_SetWindowLongA = SetWindowLongA; +GETWINDOWLONGAPROC real_GetWindowLongA = GetWindowLongA; ENABLEWINDOWPROC real_EnableWindow = EnableWindow; CREATEWINDOWEXAPROC real_CreateWindowExA = CreateWindowExA; DESTROYWINDOWPROC real_DestroyWindow = DestroyWindow; @@ -66,6 +67,7 @@ static hook_list g_hooks[] = { "MoveWindow", (PROC)fake_MoveWindow, (PROC*)&real_MoveWindow }, { "SendMessageA", (PROC)fake_SendMessageA, (PROC*)&real_SendMessageA }, { "SetWindowLongA", (PROC)fake_SetWindowLongA, (PROC*)&real_SetWindowLongA }, + { "GetWindowLongA", (PROC)fake_GetWindowLongA, (PROC*)&real_GetWindowLongA }, { "EnableWindow", (PROC)fake_EnableWindow, (PROC*)&real_EnableWindow }, { "CreateWindowExA", (PROC)fake_CreateWindowExA, (PROC*)&real_CreateWindowExA }, { "DestroyWindow", (PROC)fake_DestroyWindow, (PROC*)&real_DestroyWindow }, diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 8f7969b..1e7faa0 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -306,14 +306,19 @@ LONG WINAPI fake_SetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLong) { if (dwNewLong == (LONG)compat_WndProc) { - LONG result = real_SetWindowLongA(hWnd, nIndex, (LONG)g_compat_wndproc); - g_compat_wndproc = NULL; - return result; + WNDPROC old = g_ddraw->wndproc = g_compat_wndproc; + //g_compat_wndproc = NULL; + return (LONG)old; } - else if (!g_compat_wndproc) + else { - g_compat_wndproc = (WNDPROC)real_SetWindowLongA(hWnd, nIndex, dwNewLong); - return g_compat_wndproc ? (LONG)compat_WndProc : 0; + if (dwNewLong != (LONG)g_ddraw->wndproc) + { + g_compat_wndproc = g_ddraw->wndproc; + g_ddraw->wndproc = (WNDPROC)dwNewLong; + } + + return (LONG)compat_WndProc; } } } @@ -321,6 +326,19 @@ LONG WINAPI fake_SetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLong) return real_SetWindowLongA(hWnd, nIndex, dwNewLong); } +LONG WINAPI fake_GetWindowLongA(HWND hWnd, int nIndex) +{ + if (g_ddraw && g_ddraw->hwnd == hWnd) + { + if (nIndex == GWL_WNDPROC && g_ddraw->fixwndprochook) + { + return (LONG)compat_WndProc; + } + } + + return real_GetWindowLongA(hWnd, nIndex); +} + BOOL WINAPI fake_EnableWindow(HWND hWnd, BOOL bEnable) { if (g_ddraw && g_ddraw->hwnd == hWnd)