Overwatch 2 verifies that every kernel callback that is run, lives in user32. Introduce a callback in user32 that just forwards to the other modules' callbacks.
I don't know what to call this kind of callback, I just called it "user32 callback" for now because it's going through user32 but that's not really a good name.
It also sadly necessitates a private __wine export from user32, unless someone has a better idea for how to register the callbacks with user32.
-- v2: user32: Remove NtUserDriverCallback* kernel callbacks. winex11.drv: Convert kernel callbacks to user32 callbacks. winemac.drv: Convert kernel callbacks to user32 callbacks. wineandroid.drv: Convert kernel callbacks to user32 callbacks. winevulkan: Convert kernel callbacks to user32 callbacks. user.exe16: Convert kernel callbacks to user32 callbacks. user32: Add user32 callback infrastructure.
From: Torge Matthies tmatthies@codeweavers.com
Signed-off-by: Torge Matthies tmatthies@codeweavers.com --- dlls/user32/user32.spec | 5 +++++ dlls/user32/user_main.c | 35 +++++++++++++++++++++++++++++++++++ dlls/wow64win/user.c | 24 ++++++++++++++++++++++++ include/ntuser.h | 22 ++++++++++++++++++++++ 4 files changed, 86 insertions(+)
diff --git a/dlls/user32/user32.spec b/dlls/user32/user32.spec index 1bf3ebdc90d..73b810bc035 100644 --- a/dlls/user32/user32.spec +++ b/dlls/user32/user32.spec @@ -831,3 +831,8 @@ @ varargs wsprintfW(wstr wstr) @ stdcall wvsprintfA(ptr str ptr) @ stdcall wvsprintfW(ptr wstr ptr) + +################################################################ +# Wine internal extensions + +@ cdecl __wine_set_user32_callback_table(long ptr long) diff --git a/dlls/user32/user_main.c b/dlls/user32/user_main.c index 963f07b70ef..0de165ec68c 100644 --- a/dlls/user32/user_main.c +++ b/dlls/user32/user_main.c @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
+#include "ntstatus.h" +#define WIN32_NO_STATUS #include "user_private.h" #include "controls.h" #include "imm.h" @@ -192,6 +194,23 @@ static NTSTATUS WINAPI User32UnpackDDEMessage( const struct unpack_dde_message_p return TRUE; }
+struct dispatch_callback_table +{ + ULONG num_callbacks; + const user32_callback_func *callbacks; +} user32_callback_tables[user32_callback_destination_count]; + +static NTSTATUS WINAPI User32DispatchCallback( const struct user32_callback_params *params, ULONG size ) +{ + struct dispatch_callback_table *table; + if (!params || size < sizeof(*params) || params->destination >= user32_callback_destination_count) + return STATUS_INVALID_PARAMETER; + table = &user32_callback_tables[params->destination]; + if (!table || params->id >= table->num_callbacks) + return STATUS_INVALID_PARAMETER; + return table->callbacks[params->id]( params->args, params->len ); +} + static const void *kernel_callback_table[NtUserCallCount] = { User32CallEnumDisplayMonitor, @@ -212,9 +231,25 @@ static const void *kernel_callback_table[NtUserCallCount] = User32PostDDEMessage, User32RenderSsynthesizedFormat, User32UnpackDDEMessage, + User32DispatchCallback, };
+/********************************************************************** + * __wine_set_user32_callback_table (user32.@) + */ +BOOL CDECL __wine_set_user32_callback_table( enum user32_callback_destination destination, + const user32_callback_func *callbacks, ULONG count ) +{ + if (destination >= user32_callback_destination_count || !callbacks || + user32_callback_tables[destination].callbacks) + return FALSE; + user32_callback_tables[destination].num_callbacks = count; + user32_callback_tables[destination].callbacks = callbacks; + return TRUE; +} + + /*********************************************************************** * USER initialisation routine */ diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index 041285fa37f..3c598113b6e 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -328,6 +328,14 @@ struct unpack_dde_message_params32 char data[1]; };
+struct user32_callback_params32 +{ + enum user32_callback_destination destination; + ULONG id; + ULONG args; + ULONG len; +}; + static MSG *msg_32to64( MSG *msg, const MSG32 *msg32 ) { if (!msg32) return NULL; @@ -986,6 +994,21 @@ static NTSTATUS WINAPI wow64_NtUserUnpackDDEMessage( void *arg, ULONG size ) return TRUE; }
+static NTSTATUS WINAPI wow64_NtUserDispatchCallback( void *arg, ULONG size ) +{ + struct user32_callback_params *params = arg; + struct user32_callback_params32 params32; + + if (!params || size < sizeof(*params) || (ULONG)(ULONG_PTR)params->args != (ULONG_PTR)params->args) + return STATUS_INVALID_PARAMETER; + + params32.destination = params->destination; + params32.id = params->id; + params32.args = (ULONG)(ULONG_PTR)params->args; + params32.len = params->len; + return dispatch_callback( NtUserDispatchCallback, ¶ms32, sizeof(params32) ); +} + static NTSTATUS WINAPI wow64_NtUserCallFreeIcon( void *arg, ULONG size ) { return dispatch_callback( NtUserCallFreeIcon, arg, size ); @@ -1079,6 +1102,7 @@ user_callback user_callbacks[] = wow64_NtUserPostDDEMessage, wow64_NtUserRenderSynthesizedFormat, wow64_NtUserUnpackDDEMessage, + wow64_NtUserDispatchCallback, /* win16 hooks */ wow64_NtUserCallFreeIcon, wow64_NtUserThunkLock, diff --git a/include/ntuser.h b/include/ntuser.h index d724ccad103..a60dd98f1d3 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -46,6 +46,7 @@ enum NtUserPostDDEMessage, NtUserRenderSynthesizedFormat, NtUserUnpackDDEMessage, + NtUserDispatchCallback, /* win16 hooks */ NtUserCallFreeIcon, NtUserThunkLock, @@ -267,6 +268,27 @@ struct unpack_dde_message_params char data[1]; };
+enum user32_callback_destination +{ + user32_callback_destination_user16, + user32_callback_destination_vulkan, + user32_callback_destination_driver, + user32_callback_destination_count +}; + +struct user32_callback_params +{ + enum user32_callback_destination destination; + ULONG id; + void *args; + ULONG len; +}; + +typedef NTSTATUS (WINAPI *user32_callback_func)( void *args, ULONG len ); + +extern BOOL CDECL __wine_set_user32_callback_table( enum user32_callback_destination destination, + const user32_callback_func *callbacks, ULONG count ); + /* process DPI awareness contexts */ #define NTUSER_DPI_UNAWARE 0x00006010 #define NTUSER_DPI_SYSTEM_AWARE 0x00006011
From: Torge Matthies tmatthies@codeweavers.com
Signed-off-by: Torge Matthies tmatthies@codeweavers.com --- dlls/user.exe16/message.c | 12 +++++++++--- dlls/win32u/cursoricon.c | 6 +++++- dlls/win32u/message.c | 10 ++++++++-- dlls/wow64win/user.c | 13 ------------- include/ntuser.h | 3 --- 5 files changed, 22 insertions(+), 22 deletions(-)
diff --git a/dlls/user.exe16/message.c b/dlls/user.exe16/message.c index 9af217bf5f1..c83bb88f857 100644 --- a/dlls/user.exe16/message.c +++ b/dlls/user.exe16/message.c @@ -2600,9 +2600,15 @@ static DWORD WINAPI User16ThunkLock( DWORD *param, ULONG size ) }
+static const user32_callback_func user32_callback_table[] = +{ + (user32_callback_func)User16CallFreeIcon, + (user32_callback_func)User16ThunkLock +}; + + void register_wow_handlers(void) { - void **callback_table = NtCurrentTeb()->Peb->KernelCallbackTable; static const struct wow_handlers16 handlers16 = { button_proc16, @@ -2617,8 +2623,8 @@ void register_wow_handlers(void) call_dialog_proc_Ato16, };
- callback_table[NtUserCallFreeIcon] = User16CallFreeIcon; - callback_table[NtUserThunkLock] = User16ThunkLock; + __wine_set_user32_callback_table( user32_callback_destination_user16, user32_callback_table, + ARRAY_SIZE(user32_callback_table) );
NtUserEnableThunkLock( TRUE );
diff --git a/dlls/win32u/cursoricon.c b/dlls/win32u/cursoricon.c index 31fc97bc7cd..c6169640f64 100644 --- a/dlls/win32u/cursoricon.c +++ b/dlls/win32u/cursoricon.c @@ -294,7 +294,11 @@ static BOOL free_icon_handle( HICON handle ) } if (!IS_INTRESOURCE( obj->resname )) free( obj->resname ); free( obj ); - if (param) KeUserModeCallback( NtUserCallFreeIcon, ¶m, sizeof(param), &ret_ptr, &ret_len ); + if (param) + { + struct user32_callback_params cbparams = { user32_callback_destination_user16, 0, ¶m, sizeof(param) }; + KeUserModeCallback( NtUserDispatchCallback, &cbparams, sizeof(cbparams), &ret_ptr, &ret_len ); + } user_driver->pDestroyCursorIcon( handle ); return TRUE; } diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index caffd837c8b..be94630bcd7 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -2112,7 +2112,10 @@ static DWORD wait_message( DWORD count, const HANDLE *handles, DWORD timeout, DW ULONG ret_len;
if (enable_thunk_lock) - lock = KeUserModeCallback( NtUserThunkLock, NULL, 0, &ret_ptr, &ret_len ); + { + struct user32_callback_params cbparams = { user32_callback_destination_user16, 1, NULL, 0 }; + lock = KeUserModeCallback( NtUserDispatchCallback, &cbparams, sizeof(cbparams), &ret_ptr, &ret_len ); + }
ret = user_driver->pMsgWaitForMultipleObjectsEx( count, handles, get_nt_timeout( &time, timeout ), mask, flags ); @@ -2125,7 +2128,10 @@ static DWORD wait_message( DWORD count, const HANDLE *handles, DWORD timeout, DW if ((mask & QS_INPUT) == QS_INPUT) get_user_thread_info()->message_count = 0;
if (enable_thunk_lock) - KeUserModeCallback( NtUserThunkLock, &lock, sizeof(lock), &ret_ptr, &ret_len ); + { + struct user32_callback_params cbparams = { user32_callback_destination_user16, 1, &lock, sizeof(lock) }; + KeUserModeCallback( NtUserDispatchCallback, &cbparams, sizeof(cbparams), &ret_ptr, &ret_len ); + }
return ret; } diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index 3c598113b6e..f35b3d3b98a 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -1009,16 +1009,6 @@ static NTSTATUS WINAPI wow64_NtUserDispatchCallback( void *arg, ULONG size ) return dispatch_callback( NtUserDispatchCallback, ¶ms32, sizeof(params32) ); }
-static NTSTATUS WINAPI wow64_NtUserCallFreeIcon( void *arg, ULONG size ) -{ - return dispatch_callback( NtUserCallFreeIcon, 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 ) { FIXME( "\n" ); @@ -1103,9 +1093,6 @@ user_callback user_callbacks[] = wow64_NtUserRenderSynthesizedFormat, wow64_NtUserUnpackDDEMessage, wow64_NtUserDispatchCallback, - /* win16 hooks */ - wow64_NtUserCallFreeIcon, - wow64_NtUserThunkLock, /* Vulkan support */ wow64_NtUserCallVulkanDebugReportCallback, wow64_NtUserCallVulkanDebugUtilsCallback, diff --git a/include/ntuser.h b/include/ntuser.h index a60dd98f1d3..a7171d17202 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -47,9 +47,6 @@ enum NtUserRenderSynthesizedFormat, NtUserUnpackDDEMessage, NtUserDispatchCallback, - /* win16 hooks */ - NtUserCallFreeIcon, - NtUserThunkLock, /* Vulkan support */ NtUserCallVulkanDebugReportCallback, NtUserCallVulkanDebugUtilsCallback,
From: Torge Matthies tmatthies@codeweavers.com
Signed-off-by: Torge Matthies tmatthies@codeweavers.com --- dlls/winevulkan/loader.c | 13 ++++++++----- dlls/winevulkan/vulkan.c | 8 ++++---- dlls/wow64win/user.c | 15 --------------- include/ntuser.h | 3 --- 4 files changed, 12 insertions(+), 27 deletions(-)
diff --git a/dlls/winevulkan/loader.c b/dlls/winevulkan/loader.c index d6fe9fe078f..505a72ea81c 100644 --- a/dlls/winevulkan/loader.c +++ b/dlls/winevulkan/loader.c @@ -597,10 +597,14 @@ static BOOL WINAPI call_vulkan_debug_utils_callback( struct wine_vk_debug_utils_ return params->user_callback(params->severity, params->message_types, ¶ms->data, params->user_data); }
-BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, void *reserved) +static const user32_callback_func user32_callback_table[] = { - void **kernel_callback_table; + (user32_callback_func)call_vulkan_debug_report_callback, + (user32_callback_func)call_vulkan_debug_utils_callback +};
+BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, void *reserved) +{ TRACE("%p, %lu, %p\n", hinst, reason, reserved);
switch (reason) @@ -609,9 +613,8 @@ BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, void *reserved) hinstance = hinst; DisableThreadLibraryCalls(hinst);
- kernel_callback_table = NtCurrentTeb()->Peb->KernelCallbackTable; - kernel_callback_table[NtUserCallVulkanDebugReportCallback] = call_vulkan_debug_report_callback; - kernel_callback_table[NtUserCallVulkanDebugUtilsCallback] = call_vulkan_debug_utils_callback; + __wine_set_user32_callback_table( user32_callback_destination_vulkan, user32_callback_table, + ARRAY_SIZE(user32_callback_table) ); break; } return TRUE; diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index 0edc1ae492d..0cd2334d398 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -114,6 +114,7 @@ static VkBool32 debug_utils_callback_conversion(VkDebugUtilsMessageSeverityFlagB void *user_data) { struct wine_vk_debug_utils_params params; + struct user32_callback_params cbparams = { user32_callback_destination_vulkan, 0, ¶ms, sizeof(params) }; VkDebugUtilsObjectNameInfoEXT *object_name_infos; struct wine_debug_utils_messenger *object; void *ret_ptr; @@ -166,8 +167,7 @@ static VkBool32 debug_utils_callback_conversion(VkDebugUtilsMessageSeverityFlagB params.data.pObjects = object_name_infos;
/* applications should always return VK_FALSE */ - result = KeUserModeCallback( NtUserCallVulkanDebugUtilsCallback, ¶ms, sizeof(params), - &ret_ptr, &ret_len ); + result = KeUserModeCallback( NtUserDispatchCallback, &cbparams, sizeof(cbparams), &ret_ptr, &ret_len );
free(object_name_infos);
@@ -178,6 +178,7 @@ static VkBool32 debug_report_callback_conversion(VkDebugReportFlagsEXT flags, Vk uint64_t object_handle, size_t location, int32_t code, const char *layer_prefix, const char *message, void *user_data) { struct wine_vk_debug_report_params params; + struct user32_callback_params cbparams = { user32_callback_destination_vulkan, 0, ¶ms, sizeof(params) }; struct wine_debug_report_callback *object; void *ret_ptr; ULONG ret_len; @@ -207,8 +208,7 @@ static VkBool32 debug_report_callback_conversion(VkDebugReportFlagsEXT flags, Vk if (!params.object_handle) params.object_type = VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT;
- return KeUserModeCallback( NtUserCallVulkanDebugReportCallback, ¶ms, sizeof(params), - &ret_ptr, &ret_len ); + return KeUserModeCallback( NtUserDispatchCallback, &cbparams, sizeof(cbparams), &ret_ptr, &ret_len ); }
static void wine_vk_physical_device_free(struct wine_phys_dev *phys_dev) diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index f35b3d3b98a..e4676e8b706 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -1009,18 +1009,6 @@ static NTSTATUS WINAPI wow64_NtUserDispatchCallback( void *arg, ULONG size ) return dispatch_callback( NtUserDispatchCallback, ¶ms32, sizeof(params32) ); }
-static NTSTATUS WINAPI wow64_NtUserCallVulkanDebugReportCallback( void *arg, ULONG size ) -{ - FIXME( "\n" ); - return 0; -} - -static NTSTATUS WINAPI wow64_NtUserCallVulkanDebugUtilsCallback( void *arg, ULONG size ) -{ - FIXME( "\n" ); - return 0; -} - static NTSTATUS WINAPI wow64_NtUserDriverCallbackFirst0( void *arg, ULONG size ) { return dispatch_callback( NtUserDriverCallbackFirst + 0, arg, size ); @@ -1093,9 +1081,6 @@ user_callback user_callbacks[] = wow64_NtUserRenderSynthesizedFormat, wow64_NtUserUnpackDDEMessage, wow64_NtUserDispatchCallback, - /* Vulkan support */ - wow64_NtUserCallVulkanDebugReportCallback, - wow64_NtUserCallVulkanDebugUtilsCallback, /* Driver-specific callbacks */ wow64_NtUserDriverCallbackFirst0, wow64_NtUserDriverCallbackFirst1, diff --git a/include/ntuser.h b/include/ntuser.h index a7171d17202..7497d46b36c 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -47,9 +47,6 @@ enum NtUserRenderSynthesizedFormat, NtUserUnpackDDEMessage, NtUserDispatchCallback, - /* Vulkan support */ - NtUserCallVulkanDebugReportCallback, - NtUserCallVulkanDebugUtilsCallback, /* Driver-specific callbacks */ NtUserDriverCallbackFirst, NtUserDriverCallbackLast = NtUserDriverCallbackFirst + 9,
From: Torge Matthies tmatthies@codeweavers.com
Signed-off-by: Torge Matthies tmatthies@codeweavers.com --- dlls/wineandroid.drv/device.c | 4 +++- dlls/wineandroid.drv/dllmain.c | 10 ++++++++-- dlls/wineandroid.drv/unixlib.h | 6 ------ 3 files changed, 11 insertions(+), 9 deletions(-)
diff --git a/dlls/wineandroid.drv/device.c b/dlls/wineandroid.drv/device.c index b7292b5faf1..12e7cde7dc5 100644 --- a/dlls/wineandroid.drv/device.c +++ b/dlls/wineandroid.drv/device.c @@ -1180,7 +1180,9 @@ void start_android_device(void) { void *ret_ptr; ULONG ret_len; - thread = ULongToHandle( KeUserModeCallback( client_start_device, NULL, 0, &ret_ptr, &ret_len )); + struct user32_callback_params cbparams = { user32_callback_destination_driver, 0, NULL, 0 }; + NTSTATUS ret = KeUserModeCallback( NtUserDispatchCallback, &cbparams, sizeof(cbparams), &ret_ptr, &ret_len ); + thread = ULongToHandle( ret ); }
diff --git a/dlls/wineandroid.drv/dllmain.c b/dlls/wineandroid.drv/dllmain.c index b10491a22d8..fd9c7006009 100644 --- a/dlls/wineandroid.drv/dllmain.c +++ b/dlls/wineandroid.drv/dllmain.c @@ -113,6 +113,12 @@ static void CALLBACK register_window_callback( ULONG_PTR arg1, ULONG_PTR arg2, U }
+static user32_callback_func user32_callback_table[] = +{ + android_start_device +}; + + /*********************************************************************** * dll initialisation routine */ @@ -131,8 +137,8 @@ BOOL WINAPI DllMain( HINSTANCE inst, DWORD reason, LPVOID reserved ) params.register_window_callback = register_window_callback; if (ANDROID_CALL( init, ¶ms )) return FALSE;
- callback_table = NtCurrentTeb()->Peb->KernelCallbackTable; - callback_table[client_start_device] = android_start_device; + __wine_set_user32_callback_table( user32_callback_destination_driver, user32_callback_table, + ARRAY_SIZE(user32_callback_table) );
return TRUE; } diff --git a/dlls/wineandroid.drv/unixlib.h b/dlls/wineandroid.drv/unixlib.h index 98da6528fd5..5a5a8895061 100644 --- a/dlls/wineandroid.drv/unixlib.h +++ b/dlls/wineandroid.drv/unixlib.h @@ -54,9 +54,3 @@ struct register_window_params UINT_PTR arg2; UINT_PTR arg3; }; - - -enum -{ - client_start_device = NtUserDriverCallbackFirst, -};
From: Torge Matthies tmatthies@codeweavers.com
Signed-off-by: Torge Matthies tmatthies@codeweavers.com --- dlls/wineandroid.drv/dllmain.c | 2 +- dlls/winemac.drv/dllmain.c | 9 +++------ dlls/winemac.drv/macdrv_main.c | 3 ++- dlls/winemac.drv/unixlib.h | 6 ++---- 4 files changed, 8 insertions(+), 12 deletions(-)
diff --git a/dlls/wineandroid.drv/dllmain.c b/dlls/wineandroid.drv/dllmain.c index fd9c7006009..0a168061f67 100644 --- a/dlls/wineandroid.drv/dllmain.c +++ b/dlls/wineandroid.drv/dllmain.c @@ -113,7 +113,7 @@ static void CALLBACK register_window_callback( ULONG_PTR arg1, ULONG_PTR arg2, U }
-static user32_callback_func user32_callback_table[] = +static const user32_callback_func user32_callback_table[] = { android_start_device }; diff --git a/dlls/winemac.drv/dllmain.c b/dlls/winemac.drv/dllmain.c index 083c539dd26..f9056683590 100644 --- a/dlls/winemac.drv/dllmain.c +++ b/dlls/winemac.drv/dllmain.c @@ -367,8 +367,7 @@ cleanup: return 0; }
-typedef NTSTATUS (WINAPI *kernel_callback)(void *params, ULONG size); -static const kernel_callback kernel_callbacks[] = +static const user32_callback_func user32_callback_table[] = { macdrv_app_icon, macdrv_app_quit_request, @@ -379,8 +378,6 @@ static const kernel_callback kernel_callbacks[] = macdrv_ime_set_text, };
-C_ASSERT(NtUserDriverCallbackFirst + ARRAYSIZE(kernel_callbacks) == client_func_last); -
static BOOL process_attach(void) { @@ -416,8 +413,8 @@ static BOOL process_attach(void)
if (MACDRV_CALL(init, ¶ms)) return FALSE;
- callback_table = NtCurrentTeb()->Peb->KernelCallbackTable; - memcpy( callback_table + NtUserDriverCallbackFirst, kernel_callbacks, sizeof(kernel_callbacks) ); + __wine_set_user32_callback_table( user32_callback_destination_driver, user32_callback_table, + ARRAY_SIZE(user32_callback_table) ); return TRUE; }
diff --git a/dlls/winemac.drv/macdrv_main.c b/dlls/winemac.drv/macdrv_main.c index 2350ec61b21..67b6bb383e7 100644 --- a/dlls/winemac.drv/macdrv_main.c +++ b/dlls/winemac.drv/macdrv_main.c @@ -614,7 +614,8 @@ NTSTATUS macdrv_client_func(enum macdrv_client_funcs id, const void *params, ULO { void *ret_ptr; ULONG ret_len; - return KeUserModeCallback(id, params, size, &ret_ptr, &ret_len); + struct user32_callback_params cbparams = { user32_callback_destination_driver, id, params, size }; + return KeUserModeCallback(NtUserDispatchCallback, &cbparams, sizeof(cbparams), &ret_ptr, &ret_len); }
diff --git a/dlls/winemac.drv/unixlib.h b/dlls/winemac.drv/unixlib.h index 5fe19a94fee..c21615571d6 100644 --- a/dlls/winemac.drv/unixlib.h +++ b/dlls/winemac.drv/unixlib.h @@ -98,10 +98,10 @@ struct quit_result_params int result; };
-/* driver client callbacks exposed with KernelCallbackTable interface */ +/* driver client callbacks exposed with NtUserDispatchCallback interface */ enum macdrv_client_funcs { - client_func_app_icon = NtUserDriverCallbackFirst, + client_func_app_icon, client_func_app_quit_request, client_func_dnd_query_drag, client_func_dnd_query_drop, @@ -197,5 +197,3 @@ static inline void *param_ptr(UINT64 param) { return (void *)(UINT_PTR)param; } - -C_ASSERT(client_func_last <= NtUserDriverCallbackLast + 1);
From: Torge Matthies tmatthies@codeweavers.com
Signed-off-by: Torge Matthies tmatthies@codeweavers.com --- dlls/winex11.drv/dllmain.c | 10 +++------- dlls/winex11.drv/unixlib.h | 4 +--- dlls/winex11.drv/x11drv_main.c | 3 ++- 3 files changed, 6 insertions(+), 11 deletions(-)
diff --git a/dlls/winex11.drv/dllmain.c b/dlls/winex11.drv/dllmain.c index 8ed0e40d1ac..a069aca42a3 100644 --- a/dlls/winex11.drv/dllmain.c +++ b/dlls/winex11.drv/dllmain.c @@ -46,8 +46,7 @@ static NTSTATUS WINAPI x11drv_callback( void *arg, ULONG size ) return callback_funcs[params->id]( params->arg ); }
-typedef NTSTATUS (WINAPI *kernel_callback)( void *params, ULONG size ); -static const kernel_callback kernel_callbacks[] = +static const user32_callback_func user32_callback_table[] = { x11drv_callback, x11drv_dnd_enter_event, @@ -58,9 +57,6 @@ static const kernel_callback kernel_callbacks[] = x11drv_systray_change_owner, };
-C_ASSERT( NtUserDriverCallbackFirst + ARRAYSIZE(kernel_callbacks) == client_func_last ); - - BOOL WINAPI DllMain( HINSTANCE instance, DWORD reason, void *reserved ) { void **callback_table; @@ -80,8 +76,8 @@ BOOL WINAPI DllMain( HINSTANCE instance, DWORD reason, void *reserved )
if (X11DRV_CALL( init, ¶ms )) return FALSE;
- callback_table = NtCurrentTeb()->Peb->KernelCallbackTable; - memcpy( callback_table + NtUserDriverCallbackFirst, kernel_callbacks, sizeof(kernel_callbacks) ); + __wine_set_user32_callback_table( user32_callback_destination_driver, user32_callback_table, + ARRAY_SIZE(user32_callback_table) ); return TRUE; }
diff --git a/dlls/winex11.drv/unixlib.h b/dlls/winex11.drv/unixlib.h index e8b243d67a1..960f51b89f3 100644 --- a/dlls/winex11.drv/unixlib.h +++ b/dlls/winex11.drv/unixlib.h @@ -80,7 +80,7 @@ struct xim_preedit_state_params /* driver client callbacks exposed with KernelCallbackTable interface */ enum x11drv_client_funcs { - client_func_callback = NtUserDriverCallbackFirst, + client_func_callback, client_func_dnd_enter_event, client_func_dnd_position_event, client_func_dnd_post_drop, @@ -90,8 +90,6 @@ enum x11drv_client_funcs client_func_last };
-C_ASSERT( client_func_last <= NtUserDriverCallbackLast + 1 ); - /* simplified interface for client callbacks requiring only a single UINT parameter */ enum client_callback { diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c index 497e270ee8a..411241f320e 100644 --- a/dlls/winex11.drv/x11drv_main.c +++ b/dlls/winex11.drv/x11drv_main.c @@ -1313,7 +1313,8 @@ NTSTATUS x11drv_client_func( enum x11drv_client_funcs id, const void *params, UL { void *ret_ptr; ULONG ret_len; - return KeUserModeCallback( id, params, size, &ret_ptr, &ret_len ); + struct user32_callback_params cbparams = { user32_callback_destination_driver, id, params, size }; + return KeUserModeCallback( NtUserDispatchCallback, &cbparams, sizeof(cbparams), &ret_ptr, &ret_len ); }
From: Torge Matthies tmatthies@codeweavers.com
Signed-off-by: Torge Matthies tmatthies@codeweavers.com --- dlls/wow64win/user.c | 61 -------------------------------------------- include/ntuser.h | 3 --- 2 files changed, 64 deletions(-)
diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index e4676e8b706..0753f66b30e 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -1009,56 +1009,6 @@ static NTSTATUS WINAPI wow64_NtUserDispatchCallback( void *arg, ULONG size ) return dispatch_callback( NtUserDispatchCallback, ¶ms32, sizeof(params32) ); }
-static NTSTATUS WINAPI wow64_NtUserDriverCallbackFirst0( void *arg, ULONG size ) -{ - return dispatch_callback( NtUserDriverCallbackFirst + 0, arg, size ); -} - -static NTSTATUS WINAPI wow64_NtUserDriverCallbackFirst1( void *arg, ULONG size ) -{ - return dispatch_callback( NtUserDriverCallbackFirst + 1, arg, size ); -} - -static NTSTATUS WINAPI wow64_NtUserDriverCallbackFirst2( void *arg, ULONG size ) -{ - return dispatch_callback( NtUserDriverCallbackFirst + 2, arg, size ); -} - -static NTSTATUS WINAPI wow64_NtUserDriverCallbackFirst3( void *arg, ULONG size ) -{ - return dispatch_callback( NtUserDriverCallbackFirst + 3, arg, size ); -} - -static NTSTATUS WINAPI wow64_NtUserDriverCallbackFirst4( void *arg, ULONG size ) -{ - return dispatch_callback( NtUserDriverCallbackFirst + 4, arg, size ); -} - -static NTSTATUS WINAPI wow64_NtUserDriverCallbackFirst5( void *arg, ULONG size ) -{ - return dispatch_callback( NtUserDriverCallbackFirst + 5, arg, size ); -} - -static NTSTATUS WINAPI wow64_NtUserDriverCallbackFirst6( void *arg, ULONG size ) -{ - return dispatch_callback( NtUserDriverCallbackFirst + 6, arg, size ); -} - -static NTSTATUS WINAPI wow64_NtUserDriverCallbackFirst7( void *arg, ULONG size ) -{ - return dispatch_callback( NtUserDriverCallbackFirst + 7, arg, size ); -} - -static NTSTATUS WINAPI wow64_NtUserDriverCallbackFirst8( void *arg, ULONG size ) -{ - return dispatch_callback( NtUserDriverCallbackFirst + 8, arg, size ); -} - -static NTSTATUS WINAPI wow64_NtUserDriverCallbackFirst9( void *arg, ULONG size ) -{ - return dispatch_callback( NtUserDriverCallbackFirst + 9, arg, size ); -} - user_callback user_callbacks[] = { /* user32 callbacks */ @@ -1081,17 +1031,6 @@ user_callback user_callbacks[] = wow64_NtUserRenderSynthesizedFormat, wow64_NtUserUnpackDDEMessage, wow64_NtUserDispatchCallback, - /* Driver-specific callbacks */ - wow64_NtUserDriverCallbackFirst0, - wow64_NtUserDriverCallbackFirst1, - wow64_NtUserDriverCallbackFirst2, - wow64_NtUserDriverCallbackFirst3, - wow64_NtUserDriverCallbackFirst4, - wow64_NtUserDriverCallbackFirst5, - wow64_NtUserDriverCallbackFirst6, - wow64_NtUserDriverCallbackFirst7, - wow64_NtUserDriverCallbackFirst8, - wow64_NtUserDriverCallbackFirst9, };
C_ASSERT( ARRAYSIZE(user_callbacks) == NtUserCallCount ); diff --git a/include/ntuser.h b/include/ntuser.h index 7497d46b36c..18b212d7527 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -47,9 +47,6 @@ enum NtUserRenderSynthesizedFormat, NtUserUnpackDDEMessage, NtUserDispatchCallback, - /* Driver-specific callbacks */ - NtUserDriverCallbackFirst, - NtUserDriverCallbackLast = NtUserDriverCallbackFirst + 9, NtUserCallCount };