From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/class.c | 39 +++++---------------------------------- server/class.c | 36 ++++++++++++++++++++++++++++++++++++ server/protocol.def | 9 +++++++++ 3 files changed, 50 insertions(+), 34 deletions(-)
diff --git a/dlls/win32u/class.c b/dlls/win32u/class.c index 62d858fc0e9..c919f65f8c6 100644 --- a/dlls/win32u/class.c +++ b/dlls/win32u/class.c @@ -933,15 +933,14 @@ static ULONG_PTR get_class_long_size( HWND hwnd, INT offset, UINT size, BOOL ans
if (class == OBJ_OTHER_PROCESS) { - 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 = (offset >= 0) ? offset : -1; - req->extra_size = (offset >= 0) ? size : 0; + req->offset = offset; + req->size = size; if (!wine_server_call_err( req )) { - switch(offset) + switch (offset) { case GCLP_HBRBACKGROUND: case GCLP_HCURSOR: @@ -950,37 +949,9 @@ static ULONG_PTR get_class_long_size( HWND hwnd, INT offset, UINT size, BOOL ans case GCLP_WNDPROC: case GCLP_MENUNAME: FIXME( "offset %d not supported on other process window %p\n", offset, hwnd ); - RtlSetLastWin32Error( ERROR_INVALID_HANDLE ); - break; - case GCL_STYLE: - retvalue = reply->old_style; - break; - case GCL_CBWNDEXTRA: - retvalue = reply->old_win_extra; - break; - case GCL_CBCLSEXTRA: - retvalue = reply->old_extra; - break; - case GCLP_HMODULE: - retvalue = (ULONG_PTR)wine_server_get_ptr( reply->old_instance ); - break; - case GCW_ATOM: - retvalue = reply->old_atom; break; default: - if (offset >= 0) - { - if (size == sizeof(DWORD)) - { - DWORD retdword; - memcpy( &retdword, &reply->old_extra_value, sizeof(DWORD) ); - retvalue = retdword; - } - else - memcpy( &retvalue, &reply->old_extra_value, - sizeof(ULONG_PTR) ); - } - else RtlSetLastWin32Error( ERROR_INVALID_INDEX ); + retvalue = reply->info; break; } } diff --git a/server/class.c b/server/class.c index 3b2d38a3bfd..f468f8ce506 100644 --- a/server/class.c +++ b/server/class.c @@ -284,3 +284,39 @@ DECL_HANDLER(set_class_info) if (req->flags & SET_CLASS_EXTRA) memcpy( class->extra_bytes + req->extra_offset, &req->extra_value, req->extra_size ); } + + +/* get some information in a class */ +DECL_HANDLER(get_class_info) +{ + struct window_class *class; + + if (!(class = get_window_class( req->window ))) return; + + switch (req->offset) + { + case GCLP_HBRBACKGROUND: + case GCLP_HCURSOR: + case GCLP_HICON: + case GCLP_HICONSM: + case GCLP_WNDPROC: + case GCLP_MENUNAME: + /* not supported */ + set_win32_error( ERROR_INVALID_HANDLE ); + break; + case GCL_STYLE: reply->info = class->style; break; + case GCL_CBWNDEXTRA: reply->info = class->win_extra; break; + case GCL_CBCLSEXTRA: reply->info = class->nb_extra_bytes; break; + case GCLP_HMODULE: reply->info = class->instance; break; + case GCW_ATOM: reply->info = class->atom; break; + default: + if (req->size > sizeof(reply->info) || req->offset < 0 || + req->offset > class->nb_extra_bytes - (int)req->size) + { + set_win32_error( ERROR_INVALID_INDEX ); + return; + } + memcpy( &reply->info, class->extra_bytes + req->offset, req->size ); + break; + } +} diff --git a/server/protocol.def b/server/protocol.def index 3ed29335a1a..acdad54aa6d 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -3277,6 +3277,15 @@ enum caret_state #define SET_CLASS_INSTANCE 0x0008 #define SET_CLASS_EXTRA 0x0010
+/* Get some information in a class */ +@REQ(get_class_info) + user_handle_t window; /* handle to the window */ + int offset; /* offset of the info */ + data_size_t size; /* size of the info value to read */ +@REPLY + lparam_t info; /* current class info value */ +@END +
/* Open the clipboard */ @REQ(open_clipboard)