From: Rémi Bernon rbernon@codeweavers.com
Based on a patch from Torge Matthies. --- dlls/user.exe16/message.c | 7 ++----- dlls/win32u/message.c | 14 +++++--------- dlls/win32u/sysparams.c | 4 ++-- dlls/win32u/win32u_private.h | 2 +- dlls/wow64win/user.c | 7 ------- include/ntuser.h | 7 +++---- 6 files changed, 13 insertions(+), 28 deletions(-)
diff --git a/dlls/user.exe16/message.c b/dlls/user.exe16/message.c index fb4950c6121..ab973c4ae7a 100644 --- a/dlls/user.exe16/message.c +++ b/dlls/user.exe16/message.c @@ -2583,7 +2583,7 @@ HWND create_window16( CREATESTRUCTW *cs, LPCWSTR className, HINSTANCE instance, }
-static NTSTATUS WINAPI User16ThunkLock( void *args, ULONG size ) +static NTSTATUS WINAPI thunk_lock_callback( void *args, ULONG size ) { const struct thunk_lock_params *params = args; DWORD locks = params->locks; @@ -2595,7 +2595,6 @@ static NTSTATUS WINAPI User16ThunkLock( void *args, ULONG size )
void register_wow_handlers(void) { - KERNEL_CALLBACK_PROC *callback_table = NtCurrentTeb()->Peb->KernelCallbackTable; static const struct wow_handlers16 handlers16 = { button_proc16, @@ -2610,9 +2609,7 @@ void register_wow_handlers(void) call_dialog_proc_Ato16, };
- callback_table[NtUserThunkLock] = User16ThunkLock; - - NtUserEnableThunkLock( TRUE ); + NtUserEnableThunkLock( thunk_lock_callback );
UserRegisterWowHandlers( &handlers16, &wow_handlers32 ); } diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index faed9182d4f..18c34442660 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -3055,14 +3055,11 @@ static DWORD wait_message( DWORD count, const HANDLE *handles, DWORD timeout, DW void *ret_ptr; ULONG ret_len;
- if (enable_thunk_lock) + if (!KeUserDispatchCallback( ¶ms.dispatch, sizeof(params), &ret_ptr, &ret_len ) && + ret_len == sizeof(params.locks)) { - if (!KeUserModeCallback( NtUserThunkLock, ¶ms, sizeof(params), &ret_ptr, &ret_len ) && - ret_len == sizeof(params.locks)) - { - params.locks = *(DWORD *)ret_ptr; - params.restore = TRUE; - } + params.locks = *(DWORD *)ret_ptr; + params.restore = TRUE; }
if (user_driver->pProcessEvents( mask )) ret = count - 1; @@ -3081,8 +3078,7 @@ static DWORD wait_message( DWORD count, const HANDLE *handles, DWORD timeout, DW if (ret == WAIT_TIMEOUT && !count && !timeout) NtYieldExecution(); if (ret == count - 1) get_user_thread_info()->last_driver_time = NtGetTickCount();
- if (enable_thunk_lock) - KeUserModeCallback( NtUserThunkLock, ¶ms, sizeof(params), &ret_ptr, &ret_len ); + KeUserDispatchCallback( ¶ms.dispatch, sizeof(params), &ret_ptr, &ret_len );
return ret; } diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 3cb9c7758cb..1106c265402 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -148,7 +148,7 @@ static INT64 last_query_display_time; static pthread_mutex_t display_lock = PTHREAD_MUTEX_INITIALIZER;
BOOL decorated_mode = TRUE; -BOOL enable_thunk_lock = FALSE; +UINT64 thunk_lock_callback = 0;
#define VIRTUAL_HMONITOR ((HMONITOR)(UINT_PTR)(0x10000 + 1)) static struct monitor virtual_monitor = @@ -6461,7 +6461,7 @@ ULONG_PTR WINAPI NtUserCallOneParam( ULONG_PTR arg, ULONG code ) return set_dce_flags( UlongToHandle(arg), DCHF_ENABLEDC );
case NtUserCallOneParam_EnableThunkLock: - enable_thunk_lock = arg; + thunk_lock_callback = arg; return 0;
case NtUserCallOneParam_EnumClipboardFormats: diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h index 8a84c16208d..2058d0332f7 100644 --- a/dlls/win32u/win32u_private.h +++ b/dlls/win32u/win32u_private.h @@ -159,7 +159,7 @@ extern void track_scroll_bar( HWND hwnd, int scrollbar, POINT pt );
/* sysparams.c */ extern BOOL decorated_mode; -extern BOOL enable_thunk_lock; +extern UINT64 thunk_lock_callback; extern HBRUSH get_55aa_brush(void); extern DWORD get_dialog_base_units(void); extern LONG get_char_dimensions( HDC hdc, TEXTMETRICW *metric, int *height ); diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index f60db58e181..f4b8ca13036 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -1450,11 +1450,6 @@ static NTSTATUS WINAPI wow64_NtUserCallDispatchCallback( void *arg, ULONG size ) return dispatch_callback( NtUserCallDispatchCallback, arg, size ); }
-static NTSTATUS WINAPI wow64_NtUserThunkLock( void *arg, ULONG size ) -{ - return dispatch_callback( NtUserThunkLock, arg, size ); -} - static NTSTATUS WINAPI wow64_NtUserCallVulkanDebugReportCallback( void *arg, ULONG size ) { return dispatch_callback( NtUserCallVulkanDebugReportCallback, arg, size ); @@ -1543,8 +1538,6 @@ ntuser_callback user_callbacks[] = wow64_NtUserPostDDEMessage, wow64_NtUserRenderSynthesizedFormat, wow64_NtUserUnpackDDEMessage, - /* win16 hooks */ - wow64_NtUserThunkLock, /* Vulkan support */ wow64_NtUserCallVulkanDebugReportCallback, wow64_NtUserCallVulkanDebugUtilsCallback, diff --git a/include/ntuser.h b/include/ntuser.h index da7c2e53594..f46435eb57b 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -61,8 +61,6 @@ enum NtUserPostDDEMessage, NtUserRenderSynthesizedFormat, NtUserUnpackDDEMessage, - /* win16 hooks */ - NtUserThunkLock, /* Vulkan support */ NtUserCallVulkanDebugReportCallback, NtUserCallVulkanDebugUtilsCallback, @@ -955,13 +953,14 @@ static inline WORD NtUserEnableDC( HDC hdc )
struct thunk_lock_params { + struct dispatch_callback_params dispatch; BOOL restore; DWORD locks; };
-static inline void NtUserEnableThunkLock( BOOL enable ) +static inline void NtUserEnableThunkLock( ntuser_callback thunk_lock_callback ) { - NtUserCallOneParam( enable, NtUserCallOneParam_EnableThunkLock ); + NtUserCallOneParam( (UINT_PTR)thunk_lock_callback, NtUserCallOneParam_EnableThunkLock ); }
static inline UINT NtUserEnumClipboardFormats( UINT format )