Module: wine Branch: master Commit: cb4c3b8d77d6f89e418cde3f3a4b7f9daea9d381 URL: https://source.winehq.org/git/wine.git/?a=commit;h=cb4c3b8d77d6f89e418cde3f3...
Author: Jacek Caban jacek@codeweavers.com Date: Fri Feb 25 16:03:05 2022 +0100
win32u: Move GetWindowThreadProcessId 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/win.c | 31 +------------------------- dlls/win32u/gdiobj.c | 1 + dlls/win32u/win32u.spec | 2 +- dlls/win32u/win32u_private.h | 1 + dlls/win32u/window.c | 53 ++++++++++++++++++++++++++++++++++++++++++++ dlls/win32u/wrappers.c | 6 +++++ include/ntuser.h | 7 ++++++ 7 files changed, 70 insertions(+), 31 deletions(-)
diff --git a/dlls/user32/win.c b/dlls/user32/win.c index a63a650196c..cd36140e1aa 100644 --- a/dlls/user32/win.c +++ b/dlls/user32/win.c @@ -3091,36 +3091,7 @@ BOOL WINAPI IsWindow( HWND hwnd ) */ DWORD WINAPI GetWindowThreadProcessId( HWND hwnd, LPDWORD process ) { - WND *ptr; - DWORD tid = 0; - - if (!(ptr = WIN_GetPtr( hwnd ))) - { - SetLastError( ERROR_INVALID_WINDOW_HANDLE); - return 0; - } - - if (ptr != WND_OTHER_PROCESS && ptr != WND_DESKTOP) - { - /* got a valid window */ - tid = ptr->tid; - if (process) *process = GetCurrentProcessId(); - WIN_ReleasePtr( ptr ); - return tid; - } - - /* check other processes */ - SERVER_START_REQ( get_window_info ) - { - req->handle = wine_server_user_handle( hwnd ); - if (!wine_server_call_err( req )) - { - tid = (DWORD)reply->tid; - if (process) *process = (DWORD)reply->pid; - } - } - SERVER_END_REQ; - return tid; + return NtUserCallHwndParam( hwnd, (UINT_PTR)process, NtUserGetWindowThread ); }
diff --git a/dlls/win32u/gdiobj.c b/dlls/win32u/gdiobj.c index 4075c202eaf..fe22c1ed2fe 100644 --- a/dlls/win32u/gdiobj.c +++ b/dlls/win32u/gdiobj.c @@ -1150,6 +1150,7 @@ static struct unix_funcs unix_funcs = NtGdiUpdateColors, NtGdiWidenPath, NtUserActivateKeyboardLayout, + NtUserCallHwndParam, NtUserCallNextHookEx, NtUserCallNoParam, NtUserCallOneParam, diff --git a/dlls/win32u/win32u.spec b/dlls/win32u/win32u.spec index 1c220163d50..f53c90990b5 100644 --- a/dlls/win32u/win32u.spec +++ b/dlls/win32u/win32u.spec @@ -772,7 +772,7 @@ @ stub NtUserCallHwndLock @ stub NtUserCallHwndLockSafe @ stub NtUserCallHwndOpt -@ stub NtUserCallHwndParam +@ stdcall NtUserCallHwndParam(long ptr long) @ stub NtUserCallHwndParamLock @ stub NtUserCallHwndParamLockSafe @ stub NtUserCallHwndSafe diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h index 1447469c19d..168694378d2 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 ); + DWORD (WINAPI *pNtUserCallHwndParam)( HWND hwnd, DWORD_PTR param, DWORD code ); 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 ); diff --git a/dlls/win32u/window.c b/dlls/win32u/window.c index ca6d270fd06..985b68ff1c2 100644 --- a/dlls/win32u/window.c +++ b/dlls/win32u/window.c @@ -31,6 +31,9 @@ #include "win32u_private.h" #include "ntuser_private.h" #include "wine/server.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(win);
#define NB_USER_HANDLES ((LAST_USER_HANDLE - FIRST_USER_HANDLE + 1) >> 1) #define USER_HANDLE_TO_INDEX(hwnd) ((LOWORD(hwnd) - FIRST_USER_HANDLE) >> 1) @@ -244,6 +247,41 @@ HWND is_current_thread_window( HWND hwnd ) return ret; }
+/* see GetWindowThreadProcessId */ +static DWORD get_window_thread( HWND hwnd, DWORD *process ) +{ + WND *ptr; + DWORD tid = 0; + + if (!(ptr = get_win_ptr( hwnd ))) + { + SetLastError( ERROR_INVALID_WINDOW_HANDLE); + return 0; + } + + if (ptr != WND_OTHER_PROCESS && ptr != WND_DESKTOP) + { + /* got a valid window */ + tid = ptr->tid; + if (process) *process = GetCurrentProcessId(); + release_win_ptr( ptr ); + return tid; + } + + /* check other processes */ + SERVER_START_REQ( get_window_info ) + { + req->handle = wine_server_user_handle( hwnd ); + if (!wine_server_call_err( req )) + { + tid = (DWORD)reply->tid; + if (process) *process = (DWORD)reply->pid; + } + } + SERVER_END_REQ; + return tid; +} + /*********************************************************************** * NtUserGetProp (win32u.@) * @@ -361,3 +399,18 @@ NTSTATUS WINAPI NtUserBuildHwndList( HDESK desktop, ULONG unk2, ULONG unk3, ULON buffer[*size - 1] = HWND_BOTTOM; return STATUS_SUCCESS; } + +/***************************************************************************** + * NtUserCallHwndParam (win32u.@) + */ +DWORD WINAPI NtUserCallHwndParam( HWND hwnd, DWORD_PTR param, DWORD code ) +{ + switch (code) + { + case NtUserGetWindowThread: + return get_window_thread( hwnd, (DWORD *)param ); + default: + FIXME( "invalid code %u\n", code ); + return 0; + } +} diff --git a/dlls/win32u/wrappers.c b/dlls/win32u/wrappers.c index 9ea7ed0c09b..4fd01459374 100644 --- a/dlls/win32u/wrappers.c +++ b/dlls/win32u/wrappers.c @@ -725,6 +725,12 @@ ULONG_PTR WINAPI NtUserCallTwoParam( ULONG_PTR arg1, ULONG_PTR arg2, ULONG code return unix_funcs->pNtUserCallTwoParam( arg1, arg2, code ); }
+DWORD WINAPI NtUserCallHwndParam( HWND hwnd, DWORD_PTR param, DWORD code ) +{ + if (!unix_funcs) return 0; + return unix_funcs->pNtUserCallHwndParam( hwnd, param, code ); +} + LONG WINAPI NtUserChangeDisplaySettings( UNICODE_STRING *devname, DEVMODEW *devmode, HWND hwnd, DWORD flags, void *lparam ) { diff --git a/include/ntuser.h b/include/ntuser.h index 9eb311b3e52..70a1df91113 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -134,6 +134,12 @@ enum NtUserSetHandlePtr, };
+/* NtUserCallHwndParam codes, not compatible with Windows */ +enum +{ + NtUserGetWindowThread, +}; + /* color index used to retrieve system 55aa brush */ #define COLOR_55AA_BRUSH 0x100
@@ -192,6 +198,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 ); +DWORD WINAPI NtUserCallHwndParam( HWND hwnd, DWORD_PTR param, DWORD code ); 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 );