Jacek Caban : user32: Avoid using WIN_GetPtr for window handle validation.
Alexandre Julliard
julliard at winehq.org
Thu Jul 28 16:01:11 CDT 2022
Module: wine
Branch: master
Commit: 11657aab278e73a892843b33e196b8f4375d54f9
URL: https://gitlab.winehq.org/wine/wine/-/commit/11657aab278e73a892843b33e196b8f4375d54f9
Author: Jacek Caban <jacek at codeweavers.com>
Date: Tue Jul 26 16:08:55 2022 +0200
user32: Avoid using WIN_GetPtr for window handle validation.
We will eventually want to make GetWindowThreadProcessId fast (probably based on shared handle table) instead of calling win32u.
---
dlls/user32/win.c | 47 +++--------------------------------------------
dlls/win32u/window.c | 10 ++++++++++
include/ntuser.h | 4 ++++
3 files changed, 17 insertions(+), 44 deletions(-)
diff --git a/dlls/user32/win.c b/dlls/user32/win.c
index 8b5033ad821..b149a202433 100644
--- a/dlls/user32/win.c
+++ b/dlls/user32/win.c
@@ -153,13 +153,7 @@ void WIN_ReleasePtr( WND *ptr )
*/
HWND WIN_IsCurrentProcess( HWND hwnd )
{
- WND *ptr;
- HWND ret;
-
- if (!(ptr = WIN_GetPtr( hwnd )) || ptr == WND_OTHER_PROCESS || ptr == WND_DESKTOP) return 0;
- ret = ptr->obj.handle;
- WIN_ReleasePtr( ptr );
- return ret;
+ return UlongToHandle( NtUserCallHwnd( hwnd, NtUserIsCurrehtProcessWindow ));
}
@@ -170,13 +164,7 @@ HWND WIN_IsCurrentProcess( HWND hwnd )
*/
HWND WIN_IsCurrentThread( HWND hwnd )
{
- WND *ptr;
- HWND ret = 0;
-
- if (!(ptr = WIN_GetPtr( hwnd )) || ptr == WND_OTHER_PROCESS || ptr == WND_DESKTOP) return 0;
- if (ptr->tid == GetCurrentThreadId()) ret = ptr->obj.handle;
- WIN_ReleasePtr( ptr );
- return ret;
+ return UlongToHandle( NtUserCallHwnd( hwnd, NtUserIsCurrehtThreadWindow ));
}
@@ -205,36 +193,7 @@ UINT win_set_flags( HWND hwnd, UINT set_mask, UINT clear_mask )
*/
HWND WIN_GetFullHandle( HWND hwnd )
{
- WND *ptr;
-
- if (!hwnd || (ULONG_PTR)hwnd >> 16) return hwnd;
- if (LOWORD(hwnd) <= 1 || LOWORD(hwnd) == 0xffff) return hwnd;
- /* do sign extension for -2 and -3 */
- if (LOWORD(hwnd) >= (WORD)-3) return (HWND)(LONG_PTR)(INT16)LOWORD(hwnd);
-
- if (!(ptr = WIN_GetPtr( hwnd ))) return hwnd;
-
- if (ptr == WND_DESKTOP)
- {
- if (LOWORD(hwnd) == LOWORD(GetDesktopWindow())) return GetDesktopWindow();
- else return get_hwnd_message_parent();
- }
-
- if (ptr != WND_OTHER_PROCESS)
- {
- hwnd = ptr->obj.handle;
- WIN_ReleasePtr( ptr );
- }
- else /* may belong to another process */
- {
- SERVER_START_REQ( get_window_info )
- {
- req->handle = wine_server_user_handle( hwnd );
- if (!wine_server_call_err( req )) hwnd = wine_server_ptr_handle( reply->full_handle );
- }
- SERVER_END_REQ;
- }
- return hwnd;
+ return UlongToHandle( NtUserCallHwnd( hwnd, NtUserGetFullWindowHandle ));
}
diff --git a/dlls/win32u/window.c b/dlls/win32u/window.c
index a2ef9e72a06..1b72635e99c 100644
--- a/dlls/win32u/window.c
+++ b/dlls/win32u/window.c
@@ -5408,6 +5408,16 @@ ULONG_PTR WINAPI NtUserCallHwnd( HWND hwnd, DWORD code )
case NtUserCallHwnd_SetForegroundWindow:
return set_foreground_window( hwnd, FALSE );
+ /* temporary exports */
+ case NtUserGetFullWindowHandle:
+ return HandleToUlong( get_full_window_handle( hwnd ));
+
+ case NtUserIsCurrehtProcessWindow:
+ return HandleToUlong( is_current_process_window( hwnd ));
+
+ case NtUserIsCurrehtThreadWindow:
+ return HandleToUlong( is_current_thread_window( hwnd ));
+
default:
FIXME( "invalid code %u\n", code );
return 0;
diff --git a/include/ntuser.h b/include/ntuser.h
index 59916d25d6d..dc5f5ee501a 100644
--- a/include/ntuser.h
+++ b/include/ntuser.h
@@ -1112,6 +1112,10 @@ enum
NtUserCallHwnd_IsWindowUnicode,
NtUserCallHwnd_IsWindowVisible,
NtUserCallHwnd_SetForegroundWindow,
+ /* temporary exports */
+ NtUserGetFullWindowHandle,
+ NtUserIsCurrehtProcessWindow,
+ NtUserIsCurrehtThreadWindow,
};
static inline UINT NtUserArrangeIconicWindows( HWND parent )
More information about the wine-cvs
mailing list