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