[prev in list] [next in list] [prev in thread] [next in thread]
List: wine-cvs
Subject: =?UTF-8?Q?Jacek_Caban_=3A_wow64win=3A_Implement_more_user_callbacks=2E?=
From: Alexandre Julliard <julliard () winehq ! org>
Date: 2022-08-16 20:57:42
Message-ID: E1oO3hT-0001nw-Ec () winehq ! org
[Download RAW message or body]
Module: wine
Branch: master
Commit: 6d8b1887a5e84dbda6c2abf778583d8397ab7dec
URL: https://gitlab.winehq.org/wine/wine/-/commit/6d8b1887a5e84dbda6c2abf778583d8397ab7dec
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];
};
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic