Module: wine Branch: master Commit: a9e42169ca36e057bb75a65e573fd41e7fc10a7c URL: https://gitlab.winehq.org/wine/wine/-/commit/a9e42169ca36e057bb75a65e573fd41...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Jan 18 15:04:41 2024 +0100
user32: Return result through NtCallbackReturn for the draw text callback.
---
dlls/user32/user_main.c | 10 ++++++---- dlls/win32u/font.c | 14 ++++++++++---- dlls/wow64win/user.c | 7 +------ include/ntuser.h | 5 +++++ 4 files changed, 22 insertions(+), 14 deletions(-)
diff --git a/dlls/user32/user_main.c b/dlls/user32/user_main.c index 045f95b3619..f1b169a9741 100644 --- a/dlls/user32/user_main.c +++ b/dlls/user32/user_main.c @@ -125,13 +125,15 @@ static NTSTATUS WINAPI User32DrawScrollBar( const struct draw_scroll_bar_params return 0; }
-static NTSTATUS WINAPI User32DrawText( struct draw_text_params *params, ULONG size ) +static NTSTATUS WINAPI User32DrawText( void *args, ULONG size ) { - int ret; + const struct draw_text_params *params = args; + struct draw_text_result result;
size -= FIELD_OFFSET( struct draw_text_params, str ); - ret = DrawTextW( params->hdc, params->str, size / sizeof(WCHAR), ¶ms->rect, params->flags ); - return NtCallbackReturn( ¶ms->rect, sizeof(params->rect), ret ); + result.rect = params->rect; + result.height = DrawTextW( params->hdc, params->str, size / sizeof(WCHAR), &result.rect, params->flags ); + return NtCallbackReturn( &result, sizeof(result), STATUS_SUCCESS ); }
static NTSTATUS WINAPI User32ImmProcessKey( const struct imm_process_key_params *params, ULONG size ) diff --git a/dlls/win32u/font.c b/dlls/win32u/font.c index af1a9b97f67..9ee89f1b5c4 100644 --- a/dlls/win32u/font.c +++ b/dlls/win32u/font.c @@ -7076,9 +7076,10 @@ BOOL WINAPI NtGdiGetCharWidthInfo( HDC hdc, struct char_width_info *info ) INT WINAPI DrawTextW( HDC hdc, const WCHAR *str, INT count, RECT *rect, UINT flags ) { struct draw_text_params *params; + struct draw_text_result *result; ULONG ret_len, size; - void *ret_ptr; - int ret; + NTSTATUS status; + int ret = 0;
if (count == -1) count = wcslen( str ); size = FIELD_OFFSET( struct draw_text_params, str[count] ); @@ -7087,8 +7088,13 @@ INT WINAPI DrawTextW( HDC hdc, const WCHAR *str, INT count, RECT *rect, UINT fla params->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; + + status = KeUserModeCallback( NtUserDrawText, params, size, (void **)&result, &ret_len ); + if (!status && ret_len == sizeof(*result)) + { + ret = result->height; + *rect = result->rect; + } free( params ); return ret; } diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index 939155b7d41..d1f8a04e959 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -1266,18 +1266,13 @@ static NTSTATUS WINAPI wow64_NtUserDrawText( void *arg, ULONG size ) struct draw_text_params *params = arg; struct draw_text_params32 *params32; ULONG offset = offsetof( struct draw_text_params, str ) - offsetof( struct draw_text_params32, str ); - ULONG ret_len; - void *ret_ptr; - NTSTATUS ret;
params32 = (struct draw_text_params32 *)((char *)params + offset); params32->flags = params->flags; params32->rect = params->rect; params32->count = params->count; params32->hdc = HandleToUlong( params->hdc ); - - ret = Wow64KiUserCallbackDispatcher( NtUserDrawText, params32, size - offset, &ret_ptr, &ret_len ); - return NtCallbackReturn( ret_ptr, ret_len, ret ); + return dispatch_callback( NtUserDrawText, params32, size - offset ); }
static NTSTATUS WINAPI wow64_NtUserFreeCachedClipboardData( void *arg, ULONG size ) diff --git a/include/ntuser.h b/include/ntuser.h index e78ac3d03c2..31b93ef36e9 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -200,6 +200,11 @@ struct draw_text_params UINT flags; WCHAR str[1]; }; +struct draw_text_result +{ + int height; + RECT rect; +};
/* NtUserFreeCachedClipboardData params */ struct free_cached_data_params