From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/class.c | 43 ++++++------------------------- server/class.c | 62 ++++++++++++++++++++++----------------------- server/protocol.def | 29 +++++---------------- 3 files changed, 46 insertions(+), 88 deletions(-)
diff --git a/dlls/win32u/class.c b/dlls/win32u/class.c index c919f65f8c6..6148fb6821d 100644 --- a/dlls/win32u/class.c +++ b/dlls/win32u/class.c @@ -711,14 +711,13 @@ INT WINAPI NtUserGetClassName( HWND hwnd, BOOL real, UNICODE_STRING *name ) { ATOM atom = 0;
- SERVER_START_REQ( set_class_info ) + SERVER_START_REQ( get_class_info ) { req->window = wine_server_user_handle( hwnd ); - req->flags = 0; - req->extra_offset = -1; - req->extra_size = 0; - if (!wine_server_call_err( req )) - atom = reply->old_atom; + req->offset = GCW_ATOM; + req->size = sizeof(atom); + wine_server_call_err( req ); + atom = reply->info; } SERVER_END_REQ;
@@ -740,35 +739,9 @@ static BOOL set_server_info( HWND hwnd, INT offset, LONG_PTR newval, UINT size ) SERVER_START_REQ( set_class_info ) { req->window = wine_server_user_handle( hwnd ); - req->extra_offset = -1; - switch(offset) - { - case GCL_STYLE: - req->flags = SET_CLASS_STYLE; - req->style = newval; - break; - case GCL_CBWNDEXTRA: - req->flags = SET_CLASS_WINEXTRA; - req->win_extra = newval; - break; - case GCLP_HMODULE: - req->flags = SET_CLASS_INSTANCE; - req->instance = wine_server_client_ptr( (void *)newval ); - break; - default: - assert( offset >= 0 ); - req->flags = SET_CLASS_EXTRA; - req->extra_offset = offset; - req->extra_size = size; - if ( size == sizeof(LONG) ) - { - LONG newlong = newval; - memcpy( &req->extra_value, &newlong, sizeof(LONG) ); - } - else - memcpy( &req->extra_value, &newval, sizeof(LONG_PTR) ); - break; - } + req->offset = offset; + req->size = size; + req->new_info = newval; ret = !wine_server_call_err( req ); } SERVER_END_REQ; diff --git a/server/class.c b/server/class.c index f468f8ce506..2a520bded17 100644 --- a/server/class.c +++ b/server/class.c @@ -244,45 +244,45 @@ DECL_HANDLER(set_class_info)
if (!class) return;
- if (req->flags && class->process != current->process) + if (class->process != current->process) { set_error( STATUS_ACCESS_DENIED ); return; }
- if (req->extra_size > sizeof(req->extra_value) || - req->extra_offset < -1 || - req->extra_offset > class->nb_extra_bytes - (int)req->extra_size) - { - set_win32_error( ERROR_INVALID_INDEX ); - return; - } - if ((req->flags & SET_CLASS_WINEXTRA) && (req->win_extra < 0 || req->win_extra > 4096)) - { - set_error( STATUS_INVALID_PARAMETER ); - return; - } - if (req->extra_offset != -1) - { - memcpy( &reply->old_extra_value, class->extra_bytes + req->extra_offset, req->extra_size ); - } - else if (req->flags & SET_CLASS_EXTRA) + switch (req->offset) { + case GCL_STYLE: + reply->old_info = class->style; + class->style = req->new_info; + break; + case GCL_CBWNDEXTRA: + if (req->new_info > 4096) + { + set_error( STATUS_INVALID_PARAMETER ); + return; + } + reply->old_info = class->win_extra; + class->win_extra = req->new_info; + break; + case GCL_CBCLSEXTRA: set_win32_error( ERROR_INVALID_INDEX ); - return; + break; + case GCLP_HMODULE: + reply->old_info = class->instance; + class->instance = req->new_info; + break; + default: + if (req->size > sizeof(req->new_info) || req->offset < 0 || + req->offset > class->nb_extra_bytes - (int)req->size) + { + set_win32_error( ERROR_INVALID_INDEX ); + return; + } + memcpy( &reply->old_info, class->extra_bytes + req->offset, req->size ); + memcpy( class->extra_bytes + req->offset, &req->new_info, req->size ); + break; } - - reply->old_atom = class->atom; - reply->old_style = class->style; - reply->old_extra = class->nb_extra_bytes; - reply->old_win_extra = class->win_extra; - reply->old_instance = class->instance; - - if (req->flags & SET_CLASS_STYLE) class->style = req->style; - if (req->flags & SET_CLASS_WINEXTRA) class->win_extra = req->win_extra; - if (req->flags & SET_CLASS_INSTANCE) class->instance = req->instance; - if (req->flags & SET_CLASS_EXTRA) memcpy( class->extra_bytes + req->extra_offset, - &req->extra_value, req->extra_size ); }
diff --git a/server/protocol.def b/server/protocol.def index acdad54aa6d..b87b7d6515a 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -3254,28 +3254,13 @@ enum caret_state
/* Set some information in a class */ @REQ(set_class_info) - user_handle_t window; /* handle to the window */ - unsigned int flags; /* flags for info to set (see below) */ - atom_t atom; /* class atom */ - unsigned int style; /* class style */ - int win_extra; /* number of window extra bytes */ - mod_handle_t instance; /* module instance */ - int extra_offset; /* offset to set in extra bytes */ - data_size_t extra_size; /* size to set in extra bytes */ - lparam_t extra_value; /* value to set in extra bytes */ -@REPLY - unsigned int old_style; /* previous class style */ - atom_t old_atom; /* previous class base atom */ - mod_handle_t old_instance; /* previous module instance */ - lparam_t old_extra_value; /* old value in extra bytes */ - int old_extra; /* previous number of class extra bytes */ - int old_win_extra; /* previous number of window extra bytes */ -@END -#define SET_CLASS_ATOM 0x0001 -#define SET_CLASS_STYLE 0x0002 -#define SET_CLASS_WINEXTRA 0x0004 -#define SET_CLASS_INSTANCE 0x0008 -#define SET_CLASS_EXTRA 0x0010 + user_handle_t window; /* handle to the window */ + int offset; /* offset of the info */ + data_size_t size; /* size of the info value to write */ + lparam_t new_info; /* new class info value */ +@REPLY + lparam_t old_info; /* previous class info value */ +@END
/* Get some information in a class */ @REQ(get_class_info)