1
0
Fork 0
mirror of synced 2025-03-07 03:53:26 +01:00

user32: Return result through NtCallbackReturn for the draw text callback.

This commit is contained in:
Alexandre Julliard 2024-01-18 15:04:41 +01:00
parent ee106102c5
commit a9e42169ca
4 changed files with 22 additions and 14 deletions

View file

@ -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), &params->rect, params->flags );
return NtCallbackReturn( &params->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 )

View file

@ -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;
}

View file

@ -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 )

View file

@ -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