From: Rémi Bernon rbernon@codeweavers.com
--- dlls/user32/win.c | 2 +- dlls/win32u/imm.c | 2 +- dlls/win32u/main.c | 2 +- dlls/win32u/menu.c | 2 +- dlls/win32u/vulkan.c | 2 +- dlls/win32u/win32u.spec | 2 +- dlls/win32u/window.c | 6 +++--- dlls/wow64win/user.c | 4 ++-- include/ntuser.h | 2 +- 9 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/dlls/user32/win.c b/dlls/user32/win.c index 330b827f0a3..870c403d36b 100644 --- a/dlls/user32/win.c +++ b/dlls/user32/win.c @@ -412,7 +412,7 @@ HWND WIN_CreateWindowEx( CREATESTRUCTW *cs, LPCWSTR className, HINSTANCE module,
hwnd = NtUserCreateWindowEx( cs->dwExStyle, &class, NULL, &window_name, cs->style, cs->x, cs->y, cs->cx, cs->cy, cs->hwndParent, menu, module, - cs->lpCreateParams, 0, cs->hInstance, 0, !unicode ); + cs->lpCreateParams, 0, cs->hInstance, className, !unicode ); if (!hwnd && menu && menu != cs->hMenu) NtUserDestroyMenu( menu ); if (!unicode && window_name.Buffer != name_buf) RtlFreeUnicodeString( &window_name ); return hwnd; diff --git a/dlls/win32u/imm.c b/dlls/win32u/imm.c index 565a734a14f..8b416a654d9 100644 --- a/dlls/win32u/imm.c +++ b/dlls/win32u/imm.c @@ -310,7 +310,7 @@ BOOL register_imm_window( HWND hwnd )
thread_data->default_hwnd = NtUserCreateWindowEx( 0, &class_name, NULL, &name, WS_POPUP | WS_DISABLED | WS_CLIPSIBLINGS, - 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, FALSE ); + 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, NULL, FALSE ); }
return TRUE; diff --git a/dlls/win32u/main.c b/dlls/win32u/main.c index 103c0d4ed9a..d3192738ddd 100644 --- a/dlls/win32u/main.c +++ b/dlls/win32u/main.c @@ -1310,7 +1310,7 @@ HWND SYSCALL_API NtUserCreateWindowEx( DWORD ex_style, UNICODE_STRING *class_nam UNICODE_STRING *version, UNICODE_STRING *window_name, DWORD style, INT x, INT y, INT cx, INT cy, HWND parent, HMENU menu, HINSTANCE instance, void *params, - DWORD flags, HINSTANCE client_instance, DWORD unk, BOOL ansi ) + DWORD flags, HINSTANCE client_instance, const WCHAR *class, BOOL ansi ) { SYSCALL_FUNC( NtUserCreateWindowEx ); } diff --git a/dlls/win32u/menu.c b/dlls/win32u/menu.c index c3917ab391c..dda7d119ecc 100644 --- a/dlls/win32u/menu.c +++ b/dlls/win32u/menu.c @@ -3347,7 +3347,7 @@ static BOOL init_popup( HWND owner, HMENU hmenu, UINT flags ) menu->hWnd = NtUserCreateWindowEx( ex_style, &class_name, NULL, NULL, WS_POPUP, 0, 0, 0, 0, owner, 0, (HINSTANCE)get_window_long_ptr( owner, GWLP_HINSTANCE, FALSE ), - (void *)hmenu, 0, NULL, 0, FALSE ); + (void *)hmenu, 0, NULL, (WCHAR *)POPUPMENU_CLASS_ATOM, FALSE ); return !!menu->hWnd; }
diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index 877091cd590..610b6b7064a 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -840,7 +840,7 @@ static VkResult win32u_vkCreateWin32SurfaceKHR( VkInstance client_instance, cons static const WCHAR staticW[] = {'s','t','a','t','i','c',0}; UNICODE_STRING static_us = RTL_CONSTANT_STRING( staticW ); dummy = NtUserCreateWindowEx( 0, &static_us, NULL, &static_us, WS_POPUP, 0, 0, 0, 0, - NULL, NULL, NULL, NULL, 0, NULL, 0, FALSE ); + NULL, NULL, NULL, NULL, 0, NULL, NULL, FALSE ); WARN( "Created dummy window %p for null surface window\n", dummy ); surface->hwnd = dummy; } diff --git a/dlls/win32u/win32u.spec b/dlls/win32u/win32u.spec index 2273c1fbb4d..84654596515 100644 --- a/dlls/win32u/win32u.spec +++ b/dlls/win32u/win32u.spec @@ -874,7 +874,7 @@ @ stdcall -syscall NtUserCreatePopupMenu() @ stub -syscall NtUserCreateSyntheticPointerDevice2 @ stub -syscall NtUserCreateSystemThreads -@ stdcall -syscall NtUserCreateWindowEx(long ptr ptr ptr long long long long long long long long ptr long long long long) +@ stdcall -syscall NtUserCreateWindowEx(long ptr ptr ptr long long long long long long long long ptr long long ptr long) @ stub -syscall NtUserCreateWindowGroup @ stdcall -syscall NtUserCreateWindowStation(ptr long long long long long long) @ stub -syscall NtUserCsDdeUninitialize diff --git a/dlls/win32u/window.c b/dlls/win32u/window.c index 07d53339a5e..1d6009c1752 100644 --- a/dlls/win32u/window.c +++ b/dlls/win32u/window.c @@ -5560,7 +5560,7 @@ HWND WINAPI NtUserCreateWindowEx( DWORD ex_style, UNICODE_STRING *class_name, UNICODE_STRING *version, UNICODE_STRING *window_name, DWORD style, INT x, INT y, INT cx, INT cy, HWND parent, HMENU menu, HINSTANCE class_instance, void *params, - DWORD flags, HINSTANCE instance, DWORD unk, BOOL ansi ) + DWORD flags, HINSTANCE instance, const WCHAR *class, BOOL ansi ) { UINT win_dpi, context; struct window_surface *surface; @@ -5573,9 +5573,9 @@ HWND WINAPI NtUserCreateWindowEx( DWORD ex_style, UNICODE_STRING *class_name, WND *win;
TRACE( "ex_style %#x, class_name %s, version %s, window_name %s, style %#x, x %u, y %u, cx %u, cy %u, " - "parent %p, menu %p, class_instance %p, params %p, flags %#x, instance %p, unk %u, ansi %u\n", + "parent %p, menu %p, class_instance %p, params %p, flags %#x, instance %p, class %s, ansi %u\n", ex_style, debugstr_us(class_name), debugstr_us(version), debugstr_us(window_name), style, x, y, cx, cy, - parent, menu, class_instance, params, flags, instance, unk, ansi ); + parent, menu, class_instance, params, flags, instance, debugstr_w(class), ansi );
cs.lpCreateParams = params; cs.hInstance = instance ? instance : class_instance; diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index 25eb9cf680b..ae15083bf0e 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -1960,7 +1960,7 @@ NTSTATUS WINAPI wow64_NtUserCreateWindowEx( UINT *args ) void *params = get_ptr( &args ); DWORD flags = get_ulong( &args ); HINSTANCE client_instance = get_ptr( &args ); - DWORD unk = get_ulong( &args ); + const WCHAR *class = get_ptr( &args ); BOOL ansi = get_ulong( &args );
UNICODE_STRING class_name, version, window_name; @@ -1971,7 +1971,7 @@ NTSTATUS WINAPI wow64_NtUserCreateWindowEx( UINT *args ) unicode_str_32to64( &version, version32 ), unicode_str_32to64( &window_name, window_name32 ), style, x, y, width, height, parent, menu, - instance, params, flags, client_instance, unk, ansi ); + instance, params, flags, client_instance, class, ansi ); return HandleToUlong( ret ); }
diff --git a/include/ntuser.h b/include/ntuser.h index 0cf257d4d07..4a451cc155c 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -784,7 +784,7 @@ W32KAPI HWND WINAPI NtUserCreateWindowEx( DWORD ex_style, UNICODE_STRING *cla UNICODE_STRING *version, UNICODE_STRING *window_name, DWORD style, INT x, INT y, INT cx, INT cy, HWND parent, HMENU menu, HINSTANCE instance, void *params, - DWORD flags, HINSTANCE client_instance, DWORD unk, BOOL ansi ); + DWORD flags, HINSTANCE client_instance, const WCHAR *class, BOOL ansi ); W32KAPI HWINSTA WINAPI NtUserCreateWindowStation( OBJECT_ATTRIBUTES *attr, ACCESS_MASK mask, ULONG arg3, ULONG arg4, ULONG arg5, ULONG arg6, ULONG arg7 ); W32KAPI HDWP WINAPI NtUserDeferWindowPosAndBand( HDWP hdwp, HWND hwnd, HWND after, INT x, INT y,
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/window.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/dlls/win32u/window.c b/dlls/win32u/window.c index 1d6009c1752..4c3fba74894 100644 --- a/dlls/win32u/window.c +++ b/dlls/win32u/window.c @@ -5584,7 +5584,6 @@ HWND WINAPI NtUserCreateWindowEx( DWORD ex_style, UNICODE_STRING *class_name, cs.style = style; cs.dwExStyle = ex_style; cs.lpszName = window_name ? window_name->Buffer : NULL; - cs.lpszClass = class_name->Buffer; cs.x = x; cs.y = y; cs.cx = cx; @@ -5664,6 +5663,10 @@ HWND WINAPI NtUserCreateWindowEx( DWORD ex_style, UNICODE_STRING *class_name, /* call the WH_CBT hook */
release_win_ptr( win ); + + if (class && IS_INTRESOURCE(class)) cs.lpszClass = class; + else cs.lpszClass = class_name->Buffer; + cbtc.hwndInsertAfter = HWND_TOP; cbtc.lpcs = &cs; if (call_hooks( WH_CBT, HCBT_CREATEWND, (WPARAM)hwnd, (LPARAM)&cbtc, sizeof(cbtc) ))
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/user32/tests/class.c | 8 ++++---- dlls/win32u/window.c | 10 +++++++++- 2 files changed, 13 insertions(+), 5 deletions(-)
diff --git a/dlls/user32/tests/class.c b/dlls/user32/tests/class.c index 38490ae2049..92e07e44bdf 100644 --- a/dlls/user32/tests/class.c +++ b/dlls/user32/tests/class.c @@ -1509,8 +1509,8 @@ static LRESULT WINAPI test_class_wndproc( HWND hwnd, UINT msg, WPARAM wparam, LP if (msg == WM_NCCREATE) { CREATESTRUCTA *cs = (CREATESTRUCTA *)lparam; - if (IS_INTRESOURCE(cs->lpszClass)) todo_wine check_atom_name_a( (UINT_PTR)cs->lpszClass, "WineTestClass" ); - else todo_wine ok( !strcmp( cs->lpszClass, "WineTestClass" ), "got %s\n", debugstr_a(cs->lpszClass) ); + if (IS_INTRESOURCE(cs->lpszClass)) check_atom_name_a( (UINT_PTR)cs->lpszClass, "WineTestClass" ); + else ok( !strcmp( cs->lpszClass, "WineTestClass" ), "got %s\n", debugstr_a(cs->lpszClass) ); return 1; }
@@ -1535,8 +1535,8 @@ static LRESULT WINAPI test_class_integral_wndproc( HWND hwnd, UINT msg, WPARAM w if (msg == WM_NCCREATE) { CREATESTRUCTA *cs = (CREATESTRUCTA *)lparam; - if (IS_INTRESOURCE(cs->lpszClass)) todo_wine ok( (UINT_PTR)cs->lpszClass == 1234, "got %p\n", cs->lpszClass ); - else todo_wine ok( !strcmp( cs->lpszClass, "#1234" ), "got %s\n", debugstr_a(cs->lpszClass) ); + if (IS_INTRESOURCE(cs->lpszClass)) ok( (UINT_PTR)cs->lpszClass == 1234, "got %p\n", cs->lpszClass ); + else ok( !strcmp( cs->lpszClass, "#1234" ), "got %s\n", debugstr_a(cs->lpszClass) ); return 1; }
diff --git a/dlls/win32u/window.c b/dlls/win32u/window.c index 4c3fba74894..7e7726f52f9 100644 --- a/dlls/win32u/window.c +++ b/dlls/win32u/window.c @@ -5562,6 +5562,7 @@ HWND WINAPI NtUserCreateWindowEx( DWORD ex_style, UNICODE_STRING *class_name, HWND parent, HMENU menu, HINSTANCE class_instance, void *params, DWORD flags, HINSTANCE instance, const WCHAR *class, BOOL ansi ) { + WCHAR base_nameW[MAX_ATOM_LEN + 1]; UINT win_dpi, context; struct window_surface *surface; struct window_rects new_rects; @@ -5665,7 +5666,14 @@ HWND WINAPI NtUserCreateWindowEx( DWORD ex_style, UNICODE_STRING *class_name, release_win_ptr( win );
if (class && IS_INTRESOURCE(class)) cs.lpszClass = class; - else cs.lpszClass = class_name->Buffer; + else + { + UNICODE_STRING base_name; + base_name.Buffer = base_nameW; + base_name.MaximumLength = sizeof(base_nameW); + NtUserGetClassName( hwnd, FALSE, &base_name ); + cs.lpszClass = base_name.Buffer; + }
cbtc.hwndInsertAfter = HWND_TOP; cbtc.lpcs = &cs;