From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/win32u/class.c | 12 +++++++----- server/class.c | 2 ++ server/protocol.def | 1 + 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/dlls/win32u/class.c b/dlls/win32u/class.c index 708e0f04f0c..3d050dfed87 100644 --- a/dlls/win32u/class.c +++ b/dlls/win32u/class.c @@ -614,7 +614,7 @@ struct dce *set_class_dce( CLASS *class, struct dce *dce ) ATOM WINAPI NtUserRegisterClassExWOW( const WNDCLASSEXW *wc, UNICODE_STRING *name, UNICODE_STRING *version, struct client_menu_name *menu_name, DWORD fnid, DWORD flags, DWORD *wow ) { - const BOOL is_builtin = fnid, ansi = flags; + const BOOL ansi = flags; const shared_object_t *shared; struct obj_locator locator; HICON icon_internal; @@ -625,10 +625,10 @@ ATOM WINAPI NtUserRegisterClassExWOW( const WNDCLASSEXW *wc, UNICODE_STRING *nam BOOL ret; /* create the desktop window to trigger builtin class registration */ - if (!is_builtin) get_desktop_window(); + if (!fnid) get_desktop_window(); if (wc->cbSize != sizeof(*wc) || wc->cbClsExtra < 0 || wc->cbWndExtra < 0 || - (!is_builtin && wc->hInstance == user32_module)) /* we can't register a class for user32 */ + (!fnid && wc->hInstance == user32_module)) /* we can't register a class for user32 */ { RtlSetLastWin32Error( ERROR_INVALID_PARAMETER ); return 0; @@ -648,7 +648,7 @@ ATOM WINAPI NtUserRegisterClassExWOW( const WNDCLASSEXW *wc, UNICODE_STRING *nam if (!(class = calloc( 1, sizeof(*class) ))) return 0; - class->local = !is_builtin && !(wc->style & CS_GLOBALCLASS); + class->local = !fnid && !(wc->style & CS_GLOBALCLASS); /* Other non-null values must be set by caller */ icon_internal = wc->hIconSm ? 0 : create_small_icon( wc->hIcon ); @@ -673,6 +673,7 @@ ATOM WINAPI NtUserRegisterClassExWOW( const WNDCLASSEXW *wc, UNICODE_STRING *nam req->local = class->local; req->client_ptr = wine_server_client_ptr( class ); req->atom = wine_server_add_atom( req, name ); + req->fnid = fnid; req->name_offset = version->Length / sizeof(WCHAR); ret = !wine_server_call_err( req ); locator = reply->locator; @@ -1109,6 +1110,7 @@ static void register_builtin( enum ntuser_client_procs proc ) .lpfnWndProc = BUILTIN_WINPROC( proc ), }; + if (descr->atom) return; /* already registered */ if (descr->cursor) class.hCursor = LoadImageW( 0, (const WCHAR *)descr->cursor, IMAGE_CURSOR, 0, 0, LR_SHARED | LR_DEFAULTSIZE ); @@ -1116,7 +1118,7 @@ static void register_builtin( enum ntuser_client_procs proc ) asciiz_to_unicode( nameW, descr->name ); RtlInitUnicodeString( &name, nameW ); - if ((descr->atom = NtUserRegisterClassExWOW( &class, &name, &version, NULL, 1, 0, NULL ))) return; + if ((descr->atom = NtUserRegisterClassExWOW( &class, &name, &version, NULL, MAKE_FNID(proc), 0, NULL ))) return; if (class.hCursor) NtUserDestroyCursor( class.hCursor, 0 ); } diff --git a/server/class.c b/server/class.c index 2ca94bca7be..39a6ec6b818 100644 --- a/server/class.c +++ b/server/class.c @@ -46,6 +46,7 @@ struct window_class int count; /* reference count */ int local; /* local class? */ atom_t atom; /* class atom for versioned class */ + unsigned int fnid; /* builtin control FNID, or 0 */ client_ptr_t client_ptr; /* pointer to class in client address space */ class_shm_t *shared; /* class in session shared memory */ }; @@ -237,6 +238,7 @@ DECL_HANDLER(create_class) return; } class->atom = atom; + class->fnid = req->fnid; class->client_ptr = req->client_ptr; SHARED_WRITE_BEGIN( class->shared, class_shm_t ) diff --git a/server/protocol.def b/server/protocol.def index 4f4f90c80e1..f8b3de0d604 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -3289,6 +3289,7 @@ enum caret_state @REQ(create_class) int local; /* is it a local class? */ atom_t atom; /* class atom */ + unsigned int fnid; /* FNID for builtin classes, or 0 */ client_ptr_t client_ptr; /* pointer to class in client address space */ data_size_t name_offset; /* base class name offset for specified atom */ VARARG(info,class_info); /* class info */ -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11044