Jacek Caban : win32u: Move NtUserFindWindowEx implementation from user32.
Alexandre Julliard
julliard at winehq.org
Tue Apr 19 16:20:13 CDT 2022
Module: wine
Branch: master
Commit: 0528f37fdd9b11cc95d074bb9e261d5127cb6ec3
URL: https://source.winehq.org/git/wine.git/?a=commit;h=0528f37fdd9b11cc95d074bb9e261d5127cb6ec3
Author: Jacek Caban <jacek at codeweavers.com>
Date: Tue Apr 19 15:34:44 2022 +0200
win32u: Move NtUserFindWindowEx 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 | 61 ++++++++-----------------------------------------
dlls/win32u/syscall.c | 1 +
dlls/win32u/win32u.spec | 2 +-
dlls/win32u/window.c | 49 +++++++++++++++++++++++++++++++++++++++
dlls/wow64win/syscall.h | 1 +
dlls/wow64win/user.c | 16 +++++++++++++
include/ntuser.h | 2 ++
7 files changed, 80 insertions(+), 52 deletions(-)
diff --git a/dlls/user32/win.c b/dlls/user32/win.c
index 511aa363af7..99ee93adba7 100644
--- a/dlls/user32/win.c
+++ b/dlls/user32/win.c
@@ -738,65 +738,24 @@ BOOL WINAPI OpenIcon( HWND hwnd )
/***********************************************************************
* FindWindowExW (USER32.@)
*/
-HWND WINAPI FindWindowExW( HWND parent, HWND child, LPCWSTR className, LPCWSTR title )
+HWND WINAPI FindWindowExW( HWND parent, HWND child, const WCHAR *class, const WCHAR *title )
{
- HWND *list;
- HWND retvalue = 0;
- int i = 0, len = 0;
- WCHAR *buffer = NULL;
-
- if (!parent && child) parent = GetDesktopWindow();
- else if (parent == HWND_MESSAGE) parent = get_hwnd_message_parent();
-
- if (title)
- {
- len = lstrlenW(title) + 1; /* one extra char to check for chars beyond the end */
- if (!(buffer = HeapAlloc( GetProcessHeap(), 0, (len + 1) * sizeof(WCHAR) ))) return 0;
- }
-
- if (className)
- {
- UNICODE_STRING str;
- if (IS_INTRESOURCE(className))
- {
- str.Buffer = (WCHAR *)className;
- str.Length = str.MaximumLength = 0;
- }
- else RtlInitUnicodeString( &str, className );
- list = list_window_children( 0, parent, &str, 0 );
- }
- else list = list_window_children( 0, parent, NULL, 0 );
- if (!list) goto done;
+ UNICODE_STRING class_str, title_str;
- if (child)
- {
- child = WIN_GetFullHandle( child );
- while (list[i] && list[i] != child) i++;
- if (!list[i]) goto done;
- i++; /* start from next window */
- }
+ if (title) RtlInitUnicodeString( &title_str, title );
- if (title)
+ if (class)
{
- while (list[i])
+ if (IS_INTRESOURCE(class))
{
- if (NtUserInternalGetWindowText( list[i], buffer, len + 1 ))
- {
- if (!wcsicmp( buffer, title )) break;
- }
- else
- {
- if (!title[0]) break;
- }
- i++;
+ class_str.Buffer = (WCHAR *)class;
+ class_str.Length = class_str.MaximumLength = 0;
}
+ else RtlInitUnicodeString( &class_str, class );
}
- retvalue = list[i];
- done:
- HeapFree( GetProcessHeap(), 0, list );
- HeapFree( GetProcessHeap(), 0, buffer );
- return retvalue;
+ return NtUserFindWindowEx( parent, child, class ? &class_str : NULL,
+ title ? &title_str : NULL, 0 );
}
diff --git a/dlls/win32u/syscall.c b/dlls/win32u/syscall.c
index 437fe6d0758..f88b8fa30da 100644
--- a/dlls/win32u/syscall.c
+++ b/dlls/win32u/syscall.c
@@ -116,6 +116,7 @@ static void * const syscalls[] =
NtUserCreateWindowStation,
NtUserDestroyAcceleratorTable,
NtUserFindExistingCursorIcon,
+ NtUserFindWindowEx,
NtUserGetAncestor,
NtUserGetAtomName,
NtUserGetClassName,
diff --git a/dlls/win32u/win32u.spec b/dlls/win32u/win32u.spec
index afb413f8726..98bfbb33a2d 100644
--- a/dlls/win32u/win32u.spec
+++ b/dlls/win32u/win32u.spec
@@ -882,7 +882,7 @@
@ stdcall NtUserExcludeUpdateRgn(long long)
@ stub NtUserFillWindow
@ stdcall -syscall NtUserFindExistingCursorIcon(ptr ptr ptr)
-@ stub NtUserFindWindowEx
+@ stdcall -syscall NtUserFindWindowEx(long long ptr ptr long)
@ stdcall NtUserFlashWindowEx(ptr)
@ stub NtUserForceWindowToDpiForTest
@ stub NtUserFrostCrashedWindow
diff --git a/dlls/win32u/window.c b/dlls/win32u/window.c
index 1026b706832..93d92c60de6 100644
--- a/dlls/win32u/window.c
+++ b/dlls/win32u/window.c
@@ -2513,6 +2513,55 @@ NTSTATUS WINAPI NtUserBuildHwndList( HDESK desktop, ULONG unk2, ULONG unk3, ULON
return STATUS_SUCCESS;
}
+/***********************************************************************
+ * NtUserFindWindowEx (USER32.@)
+ */
+HWND WINAPI NtUserFindWindowEx( HWND parent, HWND child, UNICODE_STRING *class, UNICODE_STRING *title,
+ ULONG unk )
+{
+ HWND *list;
+ HWND retvalue = 0;
+ int i = 0, len = 0, title_len;
+ WCHAR *buffer = NULL;
+
+ if (!parent && child) parent = get_desktop_window();
+ else if (parent == HWND_MESSAGE) parent = get_hwnd_message_parent();
+
+ if (title)
+ {
+ len = title->Length / sizeof(WCHAR) + 1; /* one extra char to check for chars beyond the end */
+ if (!(buffer = malloc( (len + 1) * sizeof(WCHAR) ))) return 0;
+ }
+
+ if (!(list = list_window_children( 0, parent, class, 0 ))) goto done;
+
+ if (child)
+ {
+ child = get_full_window_handle( child );
+ while (list[i] && list[i] != child) i++;
+ if (!list[i]) goto done;
+ i++; /* start from next window */
+ }
+
+ if (title)
+ {
+ while (list[i])
+ {
+ title_len = NtUserInternalGetWindowText( list[i], buffer, len + 1 );
+ if (title_len * sizeof(WCHAR) == title->Length &&
+ (!title_len || !wcsnicmp( buffer, title->Buffer, title_len )))
+ break;
+ i++;
+ }
+ }
+ retvalue = list[i];
+
+ done:
+ free( list );
+ free( buffer );
+ return retvalue;
+}
+
/* Retrieve the window text from the server. */
static data_size_t get_server_window_text( HWND hwnd, WCHAR *text, data_size_t count )
{
diff --git a/dlls/wow64win/syscall.h b/dlls/wow64win/syscall.h
index c4e4f7ac219..c1d41c2be43 100644
--- a/dlls/wow64win/syscall.h
+++ b/dlls/wow64win/syscall.h
@@ -103,6 +103,7 @@
SYSCALL_ENTRY( NtUserCreateWindowStation ) \
SYSCALL_ENTRY( NtUserDestroyAcceleratorTable ) \
SYSCALL_ENTRY( NtUserFindExistingCursorIcon ) \
+ SYSCALL_ENTRY( NtUserFindWindowEx ) \
SYSCALL_ENTRY( NtUserGetAncestor ) \
SYSCALL_ENTRY( NtUserGetAtomName ) \
SYSCALL_ENTRY( NtUserGetClassName ) \
diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c
index 2af398cfed9..d916680660a 100644
--- a/dlls/wow64win/user.c
+++ b/dlls/wow64win/user.c
@@ -259,6 +259,22 @@ NTSTATUS WINAPI wow64_NtUserBuildHwndList( UINT *args )
return status;
}
+NTSTATUS WINAPI wow64_NtUserFindWindowEx( UINT *args )
+{
+ HWND parent = get_handle( &args );
+ HWND child = get_handle( &args );
+ UNICODE_STRING32 *class32 = get_ptr( &args );
+ UNICODE_STRING32 *title32 = get_ptr( &args );
+ ULONG unk = get_ulong( &args );
+
+ UNICODE_STRING class, title;
+ HWND ret;
+
+ ret = NtUserFindWindowEx( parent, child, unicode_str_32to64( &class, class32 ),
+ unicode_str_32to64( &title, title32 ), unk );
+ return HandleToUlong( ret );
+}
+
NTSTATUS WINAPI wow64_NtUserInternalGetWindowText( UINT *args )
{
HWND hwnd = get_handle( &args );
diff --git a/include/ntuser.h b/include/ntuser.h
index 8eafd78beef..879eed4bf79 100644
--- a/include/ntuser.h
+++ b/include/ntuser.h
@@ -458,6 +458,8 @@ BOOL WINAPI NtUserEnumDisplaySettings( UNICODE_STRING *device, DWORD mode,
INT WINAPI NtUserExcludeUpdateRgn( HDC hdc, HWND hwnd );
HICON WINAPI NtUserFindExistingCursorIcon( UNICODE_STRING *module, UNICODE_STRING *res_name,
void *desc );
+HWND WINAPI NtUserFindWindowEx( HWND parent, HWND child, UNICODE_STRING *class,
+ UNICODE_STRING *title, ULONG unk );
BOOL WINAPI NtUserFlashWindowEx( FLASHWINFO *info );
HWND WINAPI NtUserGetAncestor( HWND hwnd, UINT type );
SHORT WINAPI NtUserGetAsyncKeyState( INT key );
More information about the wine-cvs
mailing list