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.
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..d4043ef3e52 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)params->args != (ULONG_PTR)params->args) + return STATUS_INVALID_PARAMETER; + + params32.destination = params->destination; + params32.id = params->id; + params32.args = (ULONG)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 d4043ef3e52..b3d0444c5e3 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 b3d0444c5e3..bd9b77f50f8 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 bd9b77f50f8..67a6971c05e 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 };
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=125498
Your paranoid android.
=== debian11 (32 bit report) ===
ntoskrnl.exe: ntoskrnl.c:1707: Test succeeded inside todo block: got error 997 driver_pnp.c:737: Test failed: expected IRP_MN_REMOVE_DEVICE