win32u: Use platform-independent layout for ntuser_thread_info.

This commit is contained in:
Jacek Caban 2022-07-30 03:09:47 +02:00 committed by Alexandre Julliard
parent 149e750240
commit 1e9390e558
14 changed files with 56 additions and 46 deletions

View file

@ -235,7 +235,7 @@ static DWORD convert_candidatelist_AtoW(
static struct coinit_spy *get_thread_coinit_spy(void) static struct coinit_spy *get_thread_coinit_spy(void)
{ {
return NtUserGetThreadInfo()->client_imm; return (struct coinit_spy *)(UINT_PTR)NtUserGetThreadInfo()->client_imm;
} }
static void imm_couninit_thread(BOOL cleanup) static void imm_couninit_thread(BOOL cleanup)
@ -299,7 +299,7 @@ static ULONG WINAPI InitializeSpy_Release(IInitializeSpy *iface)
if (!ref) if (!ref)
{ {
HeapFree(GetProcessHeap(), 0, spy); HeapFree(GetProcessHeap(), 0, spy);
NtUserGetThreadInfo()->client_imm = NULL; NtUserGetThreadInfo()->client_imm = 0;
} }
return ref; return ref;
} }
@ -373,7 +373,7 @@ static void imm_coinit_thread(void)
spy->ref = 1; spy->ref = 1;
spy->cookie.QuadPart = 0; spy->cookie.QuadPart = 0;
spy->apt_flags = 0; spy->apt_flags = 0;
NtUserGetThreadInfo()->client_imm = spy; NtUserGetThreadInfo()->client_imm = (UINT_PTR)spy;
} }
@ -440,7 +440,7 @@ static void IMM_FreeThreadData(void)
{ {
struct coinit_spy *spy; struct coinit_spy *spy;
free_input_context_data(NtUserGetThreadInfo()->default_imc); free_input_context_data(UlongToHandle(NtUserGetThreadInfo()->default_imc));
if ((spy = get_thread_coinit_spy())) if ((spy = get_thread_coinit_spy()))
IInitializeSpy_Release(&spy->IInitializeSpy_iface); IInitializeSpy_Release(&spy->IInitializeSpy_iface);
} }

View file

@ -60,10 +60,15 @@ static inline void *unpack_ptr( ULONGLONG ptr64 )
return (void *)(ULONG_PTR)ptr64; return (void *)(ULONG_PTR)ptr64;
} }
static struct wm_char_mapping_data *get_wmchar_data(void)
{
return (struct wm_char_mapping_data *)(UINT_PTR)NtUserGetThreadInfo()->wmchar_data;
}
/* check for pending WM_CHAR message with DBCS trailing byte */ /* check for pending WM_CHAR message with DBCS trailing byte */
static inline BOOL get_pending_wmchar( MSG *msg, UINT first, UINT last, BOOL remove ) static inline BOOL get_pending_wmchar( MSG *msg, UINT first, UINT last, BOOL remove )
{ {
struct wm_char_mapping_data *data = NtUserGetThreadInfo()->wmchar_data; struct wm_char_mapping_data *data = get_wmchar_data();
if (!data || !data->get_msg.message) return FALSE; if (!data || !data->get_msg.message) return FALSE;
if ((first || last) && (first > WM_CHAR || last < WM_CHAR)) return FALSE; if ((first || last) && (first > WM_CHAR || last < WM_CHAR)) return FALSE;
@ -119,7 +124,7 @@ BOOL map_wparam_AtoW( UINT message, WPARAM *wparam, enum wm_char_mapping mapping
*/ */
if (mapping != WMCHAR_MAP_NOMAPPING) if (mapping != WMCHAR_MAP_NOMAPPING)
{ {
struct wm_char_mapping_data *data = NtUserGetThreadInfo()->wmchar_data; struct wm_char_mapping_data *data = get_wmchar_data();
BYTE low = LOBYTE(*wparam); BYTE low = LOBYTE(*wparam);
cp = get_input_codepage(); cp = get_input_codepage();
@ -152,7 +157,7 @@ BOOL map_wparam_AtoW( UINT message, WPARAM *wparam, enum wm_char_mapping mapping
{ {
if (!(data = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*data) ))) if (!(data = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*data) )))
return FALSE; return FALSE;
NtUserGetThreadInfo()->wmchar_data = data; NtUserGetThreadInfo()->wmchar_data = (UINT_PTR)data;
} }
TRACE( "storing lead byte %02x mapping %u\n", low, mapping ); TRACE( "storing lead byte %02x mapping %u\n", low, mapping );
data->lead_byte[mapping] = low; data->lead_byte[mapping] = low;
@ -210,11 +215,11 @@ static void map_wparam_WtoA( MSG *msg, BOOL remove )
len = WideCharToMultiByte( cp, 0, wch, 1, (LPSTR)ch, 2, NULL, NULL ); len = WideCharToMultiByte( cp, 0, wch, 1, (LPSTR)ch, 2, NULL, NULL );
if (len == 2) /* DBCS char */ if (len == 2) /* DBCS char */
{ {
struct wm_char_mapping_data *data = NtUserGetThreadInfo()->wmchar_data; struct wm_char_mapping_data *data = get_wmchar_data();
if (!data) if (!data)
{ {
if (!(data = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*data) ))) return; if (!(data = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*data) ))) return;
NtUserGetThreadInfo()->wmchar_data = data; NtUserGetThreadInfo()->wmchar_data = (UINT_PTR)data;
} }
if (remove) if (remove)
{ {

View file

@ -240,7 +240,7 @@ static void thread_detach(void)
WDML_NotifyThreadDetach(); WDML_NotifyThreadDetach();
NtUserCallNoParam( NtUserThreadDetach ); NtUserCallNoParam( NtUserThreadDetach );
HeapFree( GetProcessHeap(), 0, thread_info->wmchar_data ); HeapFree( GetProcessHeap(), 0, (void *)(UINT_PTR)thread_info->wmchar_data );
} }

View file

@ -95,7 +95,7 @@ HWND get_hwnd_message_parent(void)
struct ntuser_thread_info *thread_info = NtUserGetThreadInfo(); struct ntuser_thread_info *thread_info = NtUserGetThreadInfo();
if (!thread_info->msg_window) GetDesktopWindow(); /* trigger creation */ if (!thread_info->msg_window) GetDesktopWindow(); /* trigger creation */
return thread_info->msg_window; return UlongToHandle( thread_info->msg_window );
} }
@ -109,8 +109,8 @@ BOOL is_desktop_window( HWND hwnd )
struct ntuser_thread_info *thread_info = NtUserGetThreadInfo(); struct ntuser_thread_info *thread_info = NtUserGetThreadInfo();
if (!hwnd) return FALSE; if (!hwnd) return FALSE;
if (hwnd == thread_info->top_window) return TRUE; if (hwnd == UlongToHandle( thread_info->top_window )) return TRUE;
if (hwnd == thread_info->msg_window) return TRUE; if (hwnd == UlongToHandle( thread_info->msg_window )) return TRUE;
if (!HIWORD(hwnd) || HIWORD(hwnd) == 0xffff) if (!HIWORD(hwnd) || HIWORD(hwnd) == 0xffff)
{ {
@ -582,7 +582,7 @@ HWND WINAPI GetDesktopWindow(void)
{ {
struct ntuser_thread_info *thread_info = NtUserGetThreadInfo(); struct ntuser_thread_info *thread_info = NtUserGetThreadInfo();
if (thread_info->top_window) return thread_info->top_window; if (thread_info->top_window) return UlongToHandle( thread_info->top_window );
return NtUserGetDesktopWindow(); return NtUserGetDesktopWindow();
} }

View file

@ -785,7 +785,7 @@ static BOOL nodrv_CreateWindow( HWND hwnd )
HWND parent = NtUserGetAncestor( hwnd, GA_PARENT ); HWND parent = NtUserGetAncestor( hwnd, GA_PARENT );
/* HWND_MESSAGE windows don't need a graphics driver */ /* HWND_MESSAGE windows don't need a graphics driver */
if (!parent || parent == NtUserGetThreadInfo()->msg_window) return TRUE; if (!parent || parent == UlongToHandle( NtUserGetThreadInfo()->msg_window )) return TRUE;
if (warned++) return FALSE; if (warned++) return FALSE;
ERR_(winediag)( "Application tried to create a window, but no driver could be loaded.\n" ); ERR_(winediag)( "Application tried to create a window, but no driver could be loaded.\n" );

View file

@ -212,8 +212,9 @@ UINT WINAPI NtUserAssociateInputContext( HWND hwnd, HIMC ctx, ULONG flags )
HIMC get_default_input_context(void) HIMC get_default_input_context(void)
{ {
struct ntuser_thread_info *thread_info = NtUserGetThreadInfo(); struct ntuser_thread_info *thread_info = NtUserGetThreadInfo();
if (!thread_info->default_imc) thread_info->default_imc = NtUserCreateInputContext( 0 ); if (!thread_info->default_imc)
return thread_info->default_imc; thread_info->default_imc = HandleToUlong( NtUserCreateInputContext( 0 ));
return UlongToHandle( thread_info->default_imc );
} }
HIMC get_window_input_context( HWND hwnd ) HIMC get_window_input_context( HWND hwnd )
@ -390,7 +391,7 @@ void cleanup_imm_thread(void)
thread_info->imm_thread_data = NULL; thread_info->imm_thread_data = NULL;
} }
NtUserDestroyInputContext( thread_info->client_info.default_imc ); NtUserDestroyInputContext( UlongToHandle( thread_info->client_info.default_imc ));
} }
BOOL WINAPI ImmProcessKey( HWND hwnd, HKL hkl, UINT vkey, LPARAM key_data, DWORD unknown ) BOOL WINAPI ImmProcessKey( HWND hwnd, HKL hkl, UINT vkey, LPARAM key_data, DWORD unknown )

View file

@ -173,7 +173,7 @@ HWND get_hwnd_message_parent(void)
struct ntuser_thread_info *thread_info = NtUserGetThreadInfo(); struct ntuser_thread_info *thread_info = NtUserGetThreadInfo();
if (!thread_info->msg_window) get_desktop_window(); /* trigger creation */ if (!thread_info->msg_window) get_desktop_window(); /* trigger creation */
return thread_info->msg_window; return UlongToHandle( thread_info->msg_window );
} }
/*********************************************************************** /***********************************************************************
@ -225,8 +225,8 @@ BOOL is_desktop_window( HWND hwnd )
struct ntuser_thread_info *thread_info = NtUserGetThreadInfo(); struct ntuser_thread_info *thread_info = NtUserGetThreadInfo();
if (!hwnd) return FALSE; if (!hwnd) return FALSE;
if (hwnd == thread_info->top_window) return TRUE; if (hwnd == UlongToHandle( thread_info->top_window )) return TRUE;
if (hwnd == thread_info->msg_window) return TRUE; if (hwnd == UlongToHandle( thread_info->msg_window )) return TRUE;
if (!HIWORD(hwnd) || HIWORD(hwnd) == 0xffff) if (!HIWORD(hwnd) || HIWORD(hwnd) == 0xffff)
{ {
@ -4930,15 +4930,18 @@ static WND *create_window_handle( HWND parent, HWND owner, UNICODE_STRING *name,
if (name->Buffer == (const WCHAR *)DESKTOP_CLASS_ATOM) if (name->Buffer == (const WCHAR *)DESKTOP_CLASS_ATOM)
{ {
if (!thread_info->top_window) thread_info->top_window = full_parent ? full_parent : handle; if (!thread_info->top_window)
else assert( full_parent == thread_info->top_window ); thread_info->top_window = HandleToUlong( full_parent ? full_parent : handle );
if (full_parent && !user_driver->pCreateDesktopWindow( thread_info->top_window )) else assert( full_parent == UlongToHandle( thread_info->top_window ));
if (full_parent &&
!user_driver->pCreateDesktopWindow( UlongToHandle( thread_info->top_window )))
ERR( "failed to create desktop window\n" ); ERR( "failed to create desktop window\n" );
register_builtin_classes(); register_builtin_classes();
} }
else /* HWND_MESSAGE parent */ else /* HWND_MESSAGE parent */
{ {
if (!thread_info->msg_window && !full_parent) thread_info->msg_window = handle; if (!thread_info->msg_window && !full_parent)
thread_info->msg_window = HandleToUlong( handle );
} }
} }

View file

@ -399,7 +399,7 @@ HWND get_desktop_window(void)
{ {
struct ntuser_thread_info *thread_info = NtUserGetThreadInfo(); struct ntuser_thread_info *thread_info = NtUserGetThreadInfo();
if (thread_info->top_window) return thread_info->top_window; if (thread_info->top_window) return UlongToHandle( thread_info->top_window );
SERVER_START_REQ( get_desktop_window ) SERVER_START_REQ( get_desktop_window )
@ -407,8 +407,8 @@ HWND get_desktop_window(void)
req->force = 0; req->force = 0;
if (!wine_server_call( req )) if (!wine_server_call( req ))
{ {
thread_info->top_window = wine_server_ptr_handle( reply->top_window ); thread_info->top_window = reply->top_window;
thread_info->msg_window = wine_server_ptr_handle( reply->msg_window ); thread_info->msg_window = reply->msg_window;
} }
} }
SERVER_END_REQ; SERVER_END_REQ;
@ -489,18 +489,19 @@ HWND get_desktop_window(void)
req->force = 1; req->force = 1;
if (!wine_server_call( req )) if (!wine_server_call( req ))
{ {
thread_info->top_window = wine_server_ptr_handle( reply->top_window ); thread_info->top_window = reply->top_window;
thread_info->msg_window = wine_server_ptr_handle( reply->msg_window ); thread_info->msg_window = reply->msg_window;
} }
} }
SERVER_END_REQ; SERVER_END_REQ;
} }
if (!thread_info->top_window || !user_driver->pCreateDesktopWindow( thread_info->top_window )) if (!thread_info->top_window ||
!user_driver->pCreateDesktopWindow( UlongToHandle( thread_info->top_window )))
ERR_(win)( "failed to create desktop window\n" ); ERR_(win)( "failed to create desktop window\n" );
register_builtin_classes(); register_builtin_classes();
return thread_info->top_window; return UlongToHandle( thread_info->top_window );
} }
static HANDLE get_winstations_dir_handle(void) static HANDLE get_winstations_dir_handle(void)

View file

@ -245,7 +245,7 @@ static inline BOOL is_in_desktop_process(void)
static inline DWORD current_client_id(void) static inline DWORD current_client_id(void)
{ {
DWORD client_id = PtrToUlong( NtUserGetThreadInfo()->driver_data ); DWORD client_id = NtUserGetThreadInfo()->driver_data;
return client_id ? client_id : GetCurrentProcessId(); return client_id ? client_id : GetCurrentProcessId();
} }
@ -1137,7 +1137,7 @@ NTSTATUS android_dispatch_ioctl( void *arg )
if (in_size >= sizeof(*header)) if (in_size >= sizeof(*header))
{ {
irp->IoStatus.Information = 0; irp->IoStatus.Information = 0;
NtUserGetThreadInfo()->driver_data = UlongToHandle( params->client_id ); NtUserGetThreadInfo()->driver_data = params->client_id;
irp->IoStatus.u.Status = func( irp->AssociatedIrp.SystemBuffer, in_size, irp->IoStatus.u.Status = func( irp->AssociatedIrp.SystemBuffer, in_size,
irpsp->Parameters.DeviceIoControl.OutputBufferLength, irpsp->Parameters.DeviceIoControl.OutputBufferLength,
&irp->IoStatus.Information ); &irp->IoStatus.Information );

View file

@ -117,7 +117,7 @@ static inline RECT rect_from_cgrect(CGRect cgrect)
static inline struct macdrv_thread_data *macdrv_thread_data(void) static inline struct macdrv_thread_data *macdrv_thread_data(void)
{ {
return NtUserGetThreadInfo()->driver_data; return (struct macdrv_thread_data *)(UINT_PTR)NtUserGetThreadInfo()->driver_data;
} }

View file

@ -536,7 +536,7 @@ struct macdrv_thread_data *macdrv_init_thread_data(void)
macdrv_compute_keyboard_layout(data); macdrv_compute_keyboard_layout(data);
set_queue_display_fd(macdrv_get_event_queue_fd(data->queue)); set_queue_display_fd(macdrv_get_event_queue_fd(data->queue));
NtUserGetThreadInfo()->driver_data = data; NtUserGetThreadInfo()->driver_data = (UINT_PTR)data;
NtUserActivateKeyboardLayout(data->active_keyboard_layout, 0); NtUserActivateKeyboardLayout(data->active_keyboard_layout, 0);
return data; return data;

View file

@ -393,7 +393,7 @@ extern struct x11drv_thread_data *x11drv_init_thread_data(void) DECLSPEC_HIDDEN;
static inline struct x11drv_thread_data *x11drv_thread_data(void) static inline struct x11drv_thread_data *x11drv_thread_data(void)
{ {
return NtUserGetThreadInfo()->driver_data; return (struct x11drv_thread_data *)(UINT_PTR)NtUserGetThreadInfo()->driver_data;
} }
/* retrieve the thread display, or NULL if not created yet */ /* retrieve the thread display, or NULL if not created yet */

View file

@ -734,7 +734,7 @@ void X11DRV_ThreadDetach(void)
XCloseDisplay( data->display ); XCloseDisplay( data->display );
free( data ); free( data );
/* clear data in case we get re-entered from user32 before the thread is truly dead */ /* clear data in case we get re-entered from user32 before the thread is truly dead */
NtUserGetThreadInfo()->driver_data = NULL; NtUserGetThreadInfo()->driver_data = 0;
} }
} }
@ -795,7 +795,7 @@ struct x11drv_thread_data *x11drv_init_thread_data(void)
if (TRACE_ON(synchronous)) XSynchronize( data->display, True ); if (TRACE_ON(synchronous)) XSynchronize( data->display, True );
set_queue_display_fd( data->display ); set_queue_display_fd( data->display );
NtUserGetThreadInfo()->driver_data = data; NtUserGetThreadInfo()->driver_data = (UINT_PTR)data;
if (use_xim) X11DRV_SetupXIM(); if (use_xim) X11DRV_SetupXIM();

View file

@ -61,19 +61,19 @@ enum
/* TEB thread info, not compatible with Windows */ /* TEB thread info, not compatible with Windows */
struct ntuser_thread_info struct ntuser_thread_info
{ {
void *driver_data; /* driver-specific data */ UINT64 driver_data; /* driver-specific data */
DWORD message_time; /* value for GetMessageTime */ DWORD message_time; /* value for GetMessageTime */
DWORD message_pos; /* value for GetMessagePos */ DWORD message_pos; /* value for GetMessagePos */
ULONG_PTR message_extra; /* value for GetMessageExtraInfo */ UINT64 message_extra; /* value for GetMessageExtraInfo */
INPUT_MESSAGE_SOURCE msg_source; /* Message source for current message */ INPUT_MESSAGE_SOURCE msg_source; /* Message source for current message */
WORD recursion_count; /* SendMessage recursion counter */ WORD recursion_count; /* SendMessage recursion counter */
UINT receive_flags; /* currently received message flags */ UINT receive_flags; /* currently received message flags */
HWND top_window; /* desktop window */ UINT top_window; /* desktop window */
HWND msg_window; /* HWND_MESSAGE parent window */ UINT msg_window; /* HWND_MESSAGE parent window */
DPI_AWARENESS dpi_awareness; /* DPI awareness */ DPI_AWARENESS dpi_awareness; /* DPI awareness */
HIMC default_imc; /* default input context */ UINT default_imc; /* default input context */
void *client_imm; /* client IMM thread info */ UINT64 client_imm; /* client IMM thread info */
struct wm_char_mapping_data *wmchar_data; /* Data for WM_CHAR mappings */ UINT64 wmchar_data; /* client data for WM_CHAR mappings */
}; };
static inline struct ntuser_thread_info *NtUserGetThreadInfo(void) static inline struct ntuser_thread_info *NtUserGetThreadInfo(void)