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; 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 ); size -= FIELD_OFFSET( struct draw_text_params, str );
ret = DrawTextW( params->hdc, params->str, size / sizeof(WCHAR), &params->rect, params->flags ); result.rect = params->rect;
return NtCallbackReturn( &params->rect, sizeof(params->rect), ret ); 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 ) 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 ) INT WINAPI DrawTextW( HDC hdc, const WCHAR *str, INT count, RECT *rect, UINT flags )
{ {
struct draw_text_params *params; struct draw_text_params *params;
struct draw_text_result *result;
ULONG ret_len, size; ULONG ret_len, size;
void *ret_ptr; NTSTATUS status;
int ret; int ret = 0;
if (count == -1) count = wcslen( str ); if (count == -1) count = wcslen( str );
size = FIELD_OFFSET( struct draw_text_params, str[count] ); 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->rect = *rect;
params->flags = flags; params->flags = flags;
if (count) memcpy( params->str, str, count * sizeof(WCHAR) ); 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 ); free( params );
return ret; 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_params *params = arg;
struct draw_text_params32 *params32; struct draw_text_params32 *params32;
ULONG offset = offsetof( struct draw_text_params, str ) - offsetof( struct draw_text_params32, str ); 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 = (struct draw_text_params32 *)((char *)params + offset);
params32->flags = params->flags; params32->flags = params->flags;
params32->rect = params->rect; params32->rect = params->rect;
params32->count = params->count; params32->count = params->count;
params32->hdc = HandleToUlong( params->hdc ); params32->hdc = HandleToUlong( params->hdc );
return dispatch_callback( NtUserDrawText, params32, size - offset );
ret = Wow64KiUserCallbackDispatcher( NtUserDrawText, params32, size - offset, &ret_ptr, &ret_len );
return NtCallbackReturn( ret_ptr, ret_len, ret );
} }
static NTSTATUS WINAPI wow64_NtUserFreeCachedClipboardData( void *arg, ULONG size ) static NTSTATUS WINAPI wow64_NtUserFreeCachedClipboardData( void *arg, ULONG size )

View file

@ -200,6 +200,11 @@ struct draw_text_params
UINT flags; UINT flags;
WCHAR str[1]; WCHAR str[1];
}; };
struct draw_text_result
{
int height;
RECT rect;
};
/* NtUserFreeCachedClipboardData params */ /* NtUserFreeCachedClipboardData params */
struct free_cached_data_params struct free_cached_data_params