Module: wine Branch: master Commit: 6d8b1887a5e84dbda6c2abf778583d8397ab7dec URL: https://gitlab.winehq.org/wine/wine/-/commit/6d8b1887a5e84dbda6c2abf778583d8...
Author: Jacek Caban jacek@codeweavers.com Date: Tue Aug 16 14:22:21 2022 +0200
wow64win: Implement more user callbacks.
---
dlls/user32/user_main.c | 25 ++++++++--- dlls/win32u/font.c | 4 +- dlls/win32u/message.c | 1 + dlls/wow64win/user.c | 115 +++++++++++++++++++++++++++++++++++++++++++++--- include/ntuser.h | 3 +- 5 files changed, 134 insertions(+), 14 deletions(-)
diff --git a/dlls/user32/user_main.c b/dlls/user32/user_main.c index bc817089e46..f16f8e04464 100644 --- a/dlls/user32/user_main.c +++ b/dlls/user32/user_main.c @@ -125,8 +125,17 @@ static NTSTATUS WINAPI User32DrawScrollBar( const struct draw_scroll_bar_params
static NTSTATUS WINAPI User32DrawText( const struct draw_text_params *params, ULONG size ) { + RECT rect = params->rect; + int ret; + size -= FIELD_OFFSET( struct draw_text_params, str ); - return DrawTextW( params->hdc, params->str, size / sizeof(WCHAR), params->rect, params->flags ); + ret = DrawTextW( params->hdc, params->str, size / sizeof(WCHAR), &rect, params->flags ); + if (params->ret_rect) + { + *params->ret_rect = rect; + return ret; + } + return NtCallbackReturn( &rect, sizeof(rect), ret ); }
static NTSTATUS WINAPI User32ImmProcessKey( const struct imm_process_key_params *params, ULONG size ) @@ -180,12 +189,16 @@ static BOOL WINAPI User32LoadDriver( const WCHAR *path, ULONG size )
static NTSTATUS WINAPI User32UnpackDDEMessage( const struct unpack_dde_message_params *params, ULONG size ) { - struct unpack_dde_message_result *result = params->result; - result->wparam = params->wparam; - result->lparam = params->lparam; + struct unpack_dde_message_result result = { .wparam = params->wparam, .lparam = params->lparam }; + size -= FIELD_OFFSET( struct unpack_dde_message_params, data ); - return unpack_dde_message( params->hwnd, params->message, &result->wparam, &result->lparam, - params->data, size ); + if (!unpack_dde_message( params->hwnd, params->message, &result.wparam, &result.lparam, + params->data, size )) + return FALSE; + + if (params->result) *params->result = result; + else NtCallbackReturn( &result, sizeof(result), TRUE ); + return TRUE; }
static const void *kernel_callback_table[NtUserCallCount] = diff --git a/dlls/win32u/font.c b/dlls/win32u/font.c index 5ea89c9220e..e26c7bfa316 100644 --- a/dlls/win32u/font.c +++ b/dlls/win32u/font.c @@ -6610,10 +6610,12 @@ INT WINAPI DrawTextW( HDC hdc, const WCHAR *str, INT count, RECT *rect, UINT fla size = FIELD_OFFSET( struct draw_text_params, str[count] ); if (!(params = malloc( size ))) return 0; params->hdc = hdc; - params->rect = rect; + params->rect = *rect; + params->ret_rect = rect; params->flags = flags; if (count) memcpy( params->str, str, count * sizeof(WCHAR) ); ret = KeUserModeCallback( NtUserDrawText, params, size, &ret_ptr, &ret_len ); + if (ret_len == sizeof(*rect)) *rect = *(const RECT *)ret_ptr; free( params ); return ret; } diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index 24e6dcf368c..f4f134e213b 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -2009,6 +2009,7 @@ static int peek_message( MSG *msg, HWND hwnd, UINT first, UINT last, UINT flags, params->lparam = info.msg.lParam; if (size) memcpy( params->data, buffer, size ); ret = KeUserModeCallback( NtUserUnpackDDEMessage, params, len, &ret_ptr, &len ); + if (len == sizeof(result)) result = *(struct unpack_dde_message_result *)ret_ptr; free( params ); if (!ret) continue; /* ignore it */ info.msg.wParam = result.wparam; diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index 178b609e508..bb17e034eb2 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -287,6 +287,39 @@ struct win_proc_params32 ULONG procW; };
+struct win_event_hook_params32 +{ + DWORD event; + ULONG hwnd; + LONG object_id; + LONG child_id; + ULONG handle; + DWORD tid; + DWORD time; + ULONG proc; + WCHAR module[MAX_PATH]; +}; + +struct draw_text_params32 +{ + ULONG hdc; + int count; + RECT rect; + ULONG ret_rect; + UINT flags; + WCHAR str[1]; +}; + +struct unpack_dde_message_params32 +{ + ULONG result; + ULONG hwnd; + UINT message; + LONG wparam; + LONG lparam; + char data[1]; +}; + static MSG *msg_32to64( MSG *msg, const MSG32 *msg32 ) { if (!msg32) return NULL; @@ -480,8 +513,22 @@ static NTSTATUS WINAPI wow64_NtUserCallSendAsyncCallback( void *arg, ULONG size
static NTSTATUS WINAPI wow64_NtUserCallWinEventHook( void *arg, ULONG size ) { - FIXME( "\n" ); - return 0; + struct win_event_hook_params *params = arg; + struct win_event_hook_params32 params32; + + params32.event = params->event; + params32.hwnd = HandleToUlong( params->hwnd ); + params32.object_id = params->object_id; + params32.child_id = params->child_id; + params32.handle = HandleToUlong( params->handle ); + params32.tid = params->tid; + params32.time = params->time; + params32.proc = PtrToUlong( params->proc ); + + size -= FIELD_OFFSET( struct win_event_hook_params, module ); + if (size) memcpy( params32.module, params->module, size ); + return dispatch_callback( NtUserCallWinEventHook, ¶ms32, + FIELD_OFFSET( struct win_event_hook_params32, module ) + size); }
static NTSTATUS WINAPI wow64_NtUserCallWinProc( void *arg, ULONG size ) @@ -766,8 +813,31 @@ static NTSTATUS WINAPI wow64_NtUserDrawScrollBar( void *arg, ULONG size )
static NTSTATUS WINAPI wow64_NtUserDrawText( void *arg, ULONG size ) { - FIXME( "\n" ); - return 0; + struct draw_text_params *params = arg; + struct draw_text_params32 *params32; + RECT *rect_ptr = params->ret_rect; + ULONG ret_len, len; + void *ret_ptr; + NTSTATUS ret; + + len = (size - FIELD_OFFSET( struct draw_text_params, str )) / sizeof(WCHAR); + if (!(params32 = Wow64AllocateTemp( FIELD_OFFSET( struct draw_text_params32, str[len] )))) + return 0; + + params32->hdc = HandleToUlong( params->hdc ); + params32->count = params->count; + params32->rect = params->rect; + params32->ret_rect = 0; + params32->flags = params->flags; + if (len) memcpy( params32->str, params->str, len * sizeof(WCHAR) ); + + ret = Wow64KiUserCallbackDispatcher( NtUserDrawText, params, size, &ret_ptr, &ret_len ); + if (ret_len == sizeof(RECT) && rect_ptr) + { + *rect_ptr = *(const RECT *)ret_ptr; + return ret; + } + return NtCallbackReturn( ret_ptr, ret_len, ret ); }
static NTSTATUS WINAPI wow64_NtUserFreeCachedClipboardData( void *arg, ULONG size ) @@ -874,8 +944,41 @@ static NTSTATUS WINAPI wow64_NtUserRenderSynthesizedFormat( void *arg, ULONG siz
static NTSTATUS WINAPI wow64_NtUserUnpackDDEMessage( void *arg, ULONG size ) { - FIXME( "\n" ); - return 0; + struct unpack_dde_message_params *params = arg; + struct unpack_dde_message_params32 *params32; + struct unpack_dde_message_result result; + struct + { + LONG wparam; + LONG lparam; + } *result32; + void *ret_ptr; + ULONG ret_len; + + size -= FIELD_OFFSET( struct unpack_dde_message_params, data ); + if (!(params32 = Wow64AllocateTemp( FIELD_OFFSET( struct unpack_dde_message_params32, data[size] )))) + return 0; + + params32->result = 0; + params32->hwnd = HandleToUlong( params->hwnd ); + params32->message = params->message; + params32->wparam = params->wparam; + params32->lparam = params->lparam; + if (size) memcpy( params32->data, params->data, size ); + size = FIELD_OFFSET( struct unpack_dde_message_params32, data[size] ); + + if (!Wow64KiUserCallbackDispatcher( NtUserUnpackDDEMessage, params32, size, &ret_ptr, &ret_len )) + return FALSE; + if (ret_len == sizeof(*result32)) + { + result32 = ret_ptr; + result.wparam = result32->wparam; + result.lparam = result32->lparam; + } + + if (!params->result) NtCallbackReturn( &result, sizeof(result), TRUE ); + *params->result = result; + return TRUE; }
static NTSTATUS WINAPI wow64_NtUserCallFreeIcon( void *arg, ULONG size ) diff --git a/include/ntuser.h b/include/ntuser.h index 7c375e43999..326d0371998 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -184,7 +184,8 @@ struct draw_text_params { HDC hdc; int count; - RECT *rect; /* FIXME: Use NtCallbackReturn instead */ + RECT rect; + RECT *ret_rect; /* FIXME: Use NtCallbackReturn instead */ UINT flags; WCHAR str[1]; };