Jacek Caban : win32u: Move NtUserCallNextHookEx implementation from user32.

Alexandre Julliard julliard at winehq.org
Fri Feb 25 14:17:22 CST 2022


Module: wine
Branch: master
Commit: 088033cfb655123fb0daef2c0347e38c26801a19
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=088033cfb655123fb0daef2c0347e38c26801a19

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Feb 25 16:02:27 2022 +0100

win32u: Move NtUserCallNextHookEx implementation from user32.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/user32/hook.c           | 34 ----------------------------------
 dlls/user32/user32.spec      |  2 +-
 dlls/win32u/gdiobj.c         |  1 +
 dlls/win32u/hook.c           | 36 ++++++++++++++++++++++++++++++++++++
 dlls/win32u/win32u.spec      |  2 +-
 dlls/win32u/win32u_private.h |  1 +
 dlls/win32u/wrappers.c       |  6 ++++++
 include/ntuser.h             |  1 +
 8 files changed, 47 insertions(+), 36 deletions(-)

diff --git a/dlls/user32/hook.c b/dlls/user32/hook.c
index d5c357dc216..41307270880 100644
--- a/dlls/user32/hook.c
+++ b/dlls/user32/hook.c
@@ -524,40 +524,6 @@ BOOL WINAPI UnhookWindowsHook( INT id, HOOKPROC proc )
 }
 
 
-/***********************************************************************
- *		CallNextHookEx (USER32.@)
- */
-LRESULT WINAPI CallNextHookEx( HHOOK hhook, INT code, WPARAM wparam, LPARAM lparam )
-{
-    struct user_thread_info *thread_info = get_user_thread_info();
-    struct hook_info info;
-
-    ZeroMemory( &info, sizeof(info) - sizeof(info.module) );
-
-    SERVER_START_REQ( get_hook_info )
-    {
-        req->handle = wine_server_user_handle( thread_info->hook );
-        req->get_next = 1;
-        req->event = EVENT_MIN;
-        wine_server_set_reply( req, info.module, sizeof(info.module)-sizeof(WCHAR) );
-        if (!wine_server_call_err( req ))
-        {
-            info.module[wine_server_reply_size(req) / sizeof(WCHAR)] = 0;
-            info.handle       = wine_server_ptr_handle( reply->handle );
-            info.id           = reply->id;
-            info.pid          = reply->pid;
-            info.tid          = reply->tid;
-            info.proc         = wine_server_get_ptr( reply->proc );
-            info.next_unicode = reply->unicode;
-        }
-    }
-    SERVER_END_REQ;
-
-    info.prev_unicode = thread_info->hook_unicode;
-    return call_hook( &info, code, wparam, lparam );
-}
-
-
 /***********************************************************************
  *		CallMsgFilterA (USER32.@)
  */
diff --git a/dlls/user32/user32.spec b/dlls/user32/user32.spec
index a2976c5653a..fc2a7b1d50f 100644
--- a/dlls/user32/user32.spec
+++ b/dlls/user32/user32.spec
@@ -28,7 +28,7 @@
 @ stdcall CallMsgFilter(ptr long) CallMsgFilterA
 @ stdcall CallMsgFilterA(ptr long)
 @ stdcall CallMsgFilterW(ptr long)
-@ stdcall CallNextHookEx(long long long long)
+@ stdcall CallNextHookEx(long long long long) NtUserCallNextHookEx
 @ stdcall CallWindowProcA(ptr long long long long)
 @ stdcall CallWindowProcW(ptr long long long long)
 @ stdcall CascadeChildWindows(long long)
diff --git a/dlls/win32u/gdiobj.c b/dlls/win32u/gdiobj.c
index 1d54865bf46..4075c202eaf 100644
--- a/dlls/win32u/gdiobj.c
+++ b/dlls/win32u/gdiobj.c
@@ -1150,6 +1150,7 @@ static struct unix_funcs unix_funcs =
     NtGdiUpdateColors,
     NtGdiWidenPath,
     NtUserActivateKeyboardLayout,
+    NtUserCallNextHookEx,
     NtUserCallNoParam,
     NtUserCallOneParam,
     NtUserCallTwoParam,
diff --git a/dlls/win32u/hook.c b/dlls/win32u/hook.c
index 6c17e1d8eac..26f84cf654d 100644
--- a/dlls/win32u/hook.c
+++ b/dlls/win32u/hook.c
@@ -256,6 +256,42 @@ static LRESULT call_hook( struct win_hook_params *info )
     return ret;
 }
 
+/***********************************************************************
+ *	     NtUserCallNextHookEx (win32u.@)
+ */
+LRESULT WINAPI NtUserCallNextHookEx( HHOOK hhook, INT code, WPARAM wparam, LPARAM lparam )
+{
+    struct user_thread_info *thread_info = get_user_thread_info();
+    struct win_hook_params info;
+
+    memset( &info, 0, sizeof(info) - sizeof(info.module) );
+
+    SERVER_START_REQ( get_hook_info )
+    {
+        req->handle = wine_server_user_handle( thread_info->hook );
+        req->get_next = 1;
+        req->event = EVENT_MIN;
+        wine_server_set_reply( req, info.module, sizeof(info.module)-sizeof(WCHAR) );
+        if (!wine_server_call_err( req ))
+        {
+            info.module[wine_server_reply_size(req) / sizeof(WCHAR)] = 0;
+            info.handle       = wine_server_ptr_handle( reply->handle );
+            info.id           = reply->id;
+            info.pid          = reply->pid;
+            info.tid          = reply->tid;
+            info.proc         = wine_server_get_ptr( reply->proc );
+            info.next_unicode = reply->unicode;
+        }
+    }
+    SERVER_END_REQ;
+
+    info.code   = code;
+    info.wparam = wparam;
+    info.lparam = lparam;
+    info.prev_unicode = thread_info->hook_unicode;
+    return call_hook( &info );
+}
+
 LRESULT call_current_hook( HHOOK hhook, INT code, WPARAM wparam, LPARAM lparam )
 {
     struct win_hook_params info;
diff --git a/dlls/win32u/win32u.spec b/dlls/win32u/win32u.spec
index 08de34b6f61..1c220163d50 100644
--- a/dlls/win32u/win32u.spec
+++ b/dlls/win32u/win32u.spec
@@ -777,7 +777,7 @@
 @ stub NtUserCallHwndParamLockSafe
 @ stub NtUserCallHwndSafe
 @ stub NtUserCallMsgFilter
-@ stub NtUserCallNextHookEx
+@ stdcall NtUserCallNextHookEx(long long long long)
 @ stdcall NtUserCallNoParam(long)
 @ stdcall NtUserCallOneParam(long long)
 @ stdcall NtUserCallTwoParam(long long long)
diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h
index 54b8c11f318..6d72ab5286f 100644
--- a/dlls/win32u/win32u_private.h
+++ b/dlls/win32u/win32u_private.h
@@ -183,6 +183,7 @@ struct unix_funcs
     BOOL     (WINAPI *pNtGdiUpdateColors)( HDC hdc );
     BOOL     (WINAPI *pNtGdiWidenPath)( HDC hdc );
     HKL      (WINAPI *pNtUserActivateKeyboardLayout)( HKL layout, UINT flags );
+    LRESULT  (WINAPI *pNtUserCallNextHookEx)( HHOOK hhook, INT code, WPARAM wparam, LPARAM lparam );
     ULONG_PTR (WINAPI *pNtUserCallNoParam)( ULONG code );
     ULONG_PTR (WINAPI *pNtUserCallOneParam)( ULONG_PTR arg, ULONG code );
     ULONG_PTR (WINAPI *pNtUserCallTwoParam)( ULONG_PTR arg1, ULONG_PTR arg2, ULONG code );
diff --git a/dlls/win32u/wrappers.c b/dlls/win32u/wrappers.c
index ca69422f086..9ea7ed0c09b 100644
--- a/dlls/win32u/wrappers.c
+++ b/dlls/win32u/wrappers.c
@@ -701,6 +701,12 @@ HKL WINAPI NtUserActivateKeyboardLayout( HKL layout, UINT flags )
     return unix_funcs->pNtUserActivateKeyboardLayout( layout, flags );
 }
 
+LRESULT WINAPI NtUserCallNextHookEx( HHOOK hhook, INT code, WPARAM wparam, LPARAM lparam )
+{
+    if (!unix_funcs) return 0;
+    return unix_funcs->pNtUserCallNextHookEx( hhook, code, wparam, lparam );
+}
+
 ULONG_PTR WINAPI NtUserCallNoParam( ULONG code )
 {
     if (!unix_funcs) return 0;
diff --git a/include/ntuser.h b/include/ntuser.h
index 5ea1b40eae7..cbb4311fed1 100644
--- a/include/ntuser.h
+++ b/include/ntuser.h
@@ -191,6 +191,7 @@ BOOL    WINAPI NtUserAddClipboardFormatListener( HWND hwnd );
 BOOL    WINAPI NtUserAttachThreadInput( DWORD from, DWORD to, BOOL attach );
 NTSTATUS WINAPI NtUserBuildHwndList( HDESK desktop, ULONG unk2, ULONG unk3, ULONG unk4,
                                      ULONG thread_id, ULONG count, HWND *buffer, ULONG *size );
+LRESULT WINAPI NtUserCallNextHookEx( HHOOK hhook, INT code, WPARAM wparam, LPARAM lparam );
 ULONG_PTR WINAPI NtUserCallNoParam( ULONG code );
 ULONG_PTR WINAPI NtUserCallOneParam( ULONG_PTR arg, ULONG code );
 ULONG_PTR WINAPI NtUserCallTwoParam( ULONG_PTR arg1, ULONG_PTR arg2, ULONG code );




More information about the wine-cvs mailing list