Module: wine Branch: master Commit: 088033cfb655123fb0daef2c0347e38c26801a19 URL: https://source.winehq.org/git/wine.git/?a=commit;h=088033cfb655123fb0daef2c0...
Author: Jacek Caban jacek@codeweavers.com Date: Fri Feb 25 16:02:27 2022 +0100
win32u: Move NtUserCallNextHookEx implementation from user32.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Huw Davies huw@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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 );