From 50e6cf75344dee1bc678564d4346f36a215883c6 Mon Sep 17 00:00:00 2001
From: FunkyFr3sh <cc.red.alert.1@googlemail.com>
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)