Jacek Caban : win32u: Move GetWindowThreadProcessId implementation from user32.
Alexandre Julliard
julliard at winehq.org
Fri Feb 25 14:17:22 CST 2022
Module: wine
Branch: master
Commit: cb4c3b8d77d6f89e418cde3f3a4b7f9daea9d381
URL: https://source.winehq.org/git/wine.git/?a=commit;h=cb4c3b8d77d6f89e418cde3f3a4b7f9daea9d381
Author: Jacek Caban <jacek at codeweavers.com>
Date: Fri Feb 25 16:03:05 2022 +0100
win32u: Move GetWindowThreadProcessId 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/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 );
More information about the wine-cvs
mailing list