Module: wine Branch: master Commit: d89037a826ae5cd7d006e2f98b1a6a33d9afa084 URL: https://gitlab.winehq.org/wine/wine/-/commit/d89037a826ae5cd7d006e2f98b1a6a3...
Author: Alexandre Julliard julliard@winehq.org Date: Mon Jan 22 11:06:41 2024 +0100
ntdll: Share KiUserCallbackDispatcher implementation across platforms.
---
dlls/ntdll/exception.c | 24 ++++++++++++++++++++++++ dlls/ntdll/ntdll_misc.h | 1 + dlls/ntdll/signal_arm.c | 25 ++++++------------------- dlls/ntdll/signal_arm64.c | 25 ++++++------------------- dlls/ntdll/signal_arm64ec.c | 25 ++++++------------------- dlls/ntdll/signal_i386.c | 18 +++--------------- dlls/ntdll/signal_x86_64.c | 27 ++++++++------------------- 7 files changed, 54 insertions(+), 91 deletions(-)
diff --git a/dlls/ntdll/exception.c b/dlls/ntdll/exception.c index 7a230237f0c..1691680d3c6 100644 --- a/dlls/ntdll/exception.c +++ b/dlls/ntdll/exception.c @@ -185,6 +185,30 @@ LONG call_vectored_handlers( EXCEPTION_RECORD *rec, CONTEXT *context ) }
+/******************************************************************* + * dispatch_user_callback + * + * Implementation of KiUserCallbackDispatcher. + */ +NTSTATUS WINAPI dispatch_user_callback( void *args, ULONG len, ULONG id ) +{ + NTSTATUS status; + + __TRY + { + KERNEL_CALLBACK_PROC func = NtCurrentTeb()->Peb->KernelCallbackTable[id]; + status = func( args, len ); + } + __EXCEPT_ALL + { + ERR( "ignoring exception\n" ); + status = STATUS_SUCCESS; + } + __ENDTRY + return status; +} + + /******************************************************************* * raise_status * diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h index a7967a6c242..11cf2b39e1a 100644 --- a/dlls/ntdll/ntdll_misc.h +++ b/dlls/ntdll/ntdll_misc.h @@ -49,6 +49,7 @@ extern UINT_PTR page_size;
/* exceptions */ extern LONG call_vectored_handlers( EXCEPTION_RECORD *rec, CONTEXT *context ); +extern NTSTATUS WINAPI dispatch_user_callback( void *args, ULONG len, ULONG id ); extern void DECLSPEC_NORETURN raise_status( NTSTATUS status, EXCEPTION_RECORD *rec ); extern LONG WINAPI call_unhandled_exception_filter( PEXCEPTION_POINTERS eptr );
diff --git a/dlls/ntdll/signal_arm.c b/dlls/ntdll/signal_arm.c index f29d7f0ba6f..0b711481e98 100644 --- a/dlls/ntdll/signal_arm.c +++ b/dlls/ntdll/signal_arm.c @@ -575,24 +575,6 @@ __ASM_GLOBAL_FUNC( KiUserApcDispatcher, /******************************************************************* * KiUserCallbackDispatcher (NTDLL.@) */ -void WINAPI dispatch_callback( void *args, ULONG len, ULONG id ) -{ - NTSTATUS status; - - __TRY - { - KERNEL_CALLBACK_PROC func = NtCurrentTeb()->Peb->KernelCallbackTable[id]; - status = NtCallbackReturn( NULL, 0, func( args, len )); - } - __EXCEPT_ALL - { - ERR_(seh)( "ignoring exception\n" ); - status = NtCallbackReturn( 0, 0, 0 ); - } - __ENDTRY - - RtlRaiseStatus( status ); -} __ASM_GLOBAL_FUNC( KiUserCallbackDispatcher, __ASM_SEH(".seh_custom 0xee,0x01\n\t") /* MSFT_OP_MACHINE_FRAME */ "nop\n\t" @@ -606,7 +588,12 @@ __ASM_GLOBAL_FUNC( KiUserCallbackDispatcher, "ldr r0, [sp]\n\t" /* args */ "ldr r1, [sp, #0x04]\n\t" /* len */ "ldr r2, [sp, #0x08]\n\t" /* id */ - "bl " __ASM_NAME("dispatch_callback") "\n\t" + "bl " __ASM_NAME("dispatch_user_callback") "\n\t" + "mov r2, r0\n\t" /* status */ + "mov r1, #0\n\t" /* ret_len */ + "mov r0, r1\n\t" /* ret_ptr */ + "bl " __ASM_NAME("NtCallbackReturn") "\n\t" + "bl " __ASM_NAME("RtlRaiseStatus") "\n\t" "udf #1" )
diff --git a/dlls/ntdll/signal_arm64.c b/dlls/ntdll/signal_arm64.c index 2fd56ed5ddc..a731dc77795 100644 --- a/dlls/ntdll/signal_arm64.c +++ b/dlls/ntdll/signal_arm64.c @@ -605,24 +605,6 @@ __ASM_GLOBAL_FUNC( KiUserApcDispatcher, /******************************************************************* * KiUserCallbackDispatcher (NTDLL.@) */ -void WINAPI dispatch_callback( void *args, ULONG len, ULONG id ) -{ - NTSTATUS status; - - __TRY - { - KERNEL_CALLBACK_PROC func = NtCurrentTeb()->Peb->KernelCallbackTable[id]; - status = NtCallbackReturn( NULL, 0, func( args, len )); - } - __EXCEPT_ALL - { - ERR_(seh)( "ignoring exception\n" ); - status = NtCallbackReturn( 0, 0, 0 ); - } - __ENDTRY - - RtlRaiseStatus( status ); -} __ASM_GLOBAL_FUNC( KiUserCallbackDispatcher, __ASM_SEH(".seh_pushframe\n\t") "nop\n\t" @@ -632,7 +614,12 @@ __ASM_GLOBAL_FUNC( KiUserCallbackDispatcher, __ASM_SEH(".seh_endprologue\n\t") "ldr x0, [sp]\n\t" /* args */ "ldp w1, w2, [sp, #0x08]\n\t" /* len, id */ - "bl " __ASM_NAME("dispatch_callback") "\n\t" + "bl " __ASM_NAME("dispatch_user_callback") "\n\t" + "mov x2, x0\n\t" /* status */ + "mov x1, #0\n\t" /* ret_len */ + "mov x0, x1\n\t" /* ret_ptr */ + "bl " __ASM_NAME("NtCallbackReturn") "\n\t" + "bl " __ASM_NAME("RtlRaiseStatus") "\n\t" "brk #1" )
diff --git a/dlls/ntdll/signal_arm64ec.c b/dlls/ntdll/signal_arm64ec.c index 9953ab8e60d..1974ed63dd9 100644 --- a/dlls/ntdll/signal_arm64ec.c +++ b/dlls/ntdll/signal_arm64ec.c @@ -1716,24 +1716,6 @@ __ASM_GLOBAL_FUNC( "#KiUserApcDispatcher", /******************************************************************* * KiUserCallbackDispatcher (NTDLL.@) */ -void WINAPI dispatch_callback( void *args, ULONG len, ULONG id ) -{ - NTSTATUS status; - - __TRY - { - KERNEL_CALLBACK_PROC func = NtCurrentTeb()->Peb->KernelCallbackTable[id]; - status = NtCallbackReturn( NULL, 0, func( args, len )); - } - __EXCEPT_ALL - { - ERR_(seh)( "ignoring exception\n" ); - status = NtCallbackReturn( 0, 0, 0 ); - } - __ENDTRY - - RtlRaiseStatus( status ); -} __ASM_GLOBAL_FUNC( "#KiUserCallbackDispatcher", __ASM_SEH(".seh_pushframe\n\t") "nop\n\t" @@ -1743,7 +1725,12 @@ __ASM_GLOBAL_FUNC( "#KiUserCallbackDispatcher", __ASM_SEH(".seh_endprologue\n\t") "ldr x0, [sp]\n\t" /* args */ "ldp w1, w2, [sp, #0x08]\n\t" /* len, id */ - "bl " __ASM_NAME("dispatch_callback") "\n\t" + "bl " __ASM_NAME("dispatch_user_callback") "\n\t" + "mov x2, x0\n\t" /* status */ + "mov x1, #0\n\t" /* ret_len */ + "mov x0, x1\n\t" /* ret_ptr */ + "bl " __ASM_NAME("NtCallbackReturn") "\n\t" + "bl " __ASM_NAME("RtlRaiseStatus") "\n\t" "brk #1" )
diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c index c4aaba5e0a8..865faa93ea9 100644 --- a/dlls/ntdll/signal_i386.c +++ b/dlls/ntdll/signal_i386.c @@ -294,21 +294,9 @@ __ASM_STDCALL_FUNC( KiUserApcDispatcher, 20, */ void WINAPI KiUserCallbackDispatcher( ULONG id, void *args, ULONG len ) { - NTSTATUS status; - - __TRY - { - KERNEL_CALLBACK_PROC func = NtCurrentTeb()->Peb->KernelCallbackTable[id]; - status = NtCallbackReturn( NULL, 0, func( args, len )); - } - __EXCEPT_ALL - { - ERR_(seh)( "ignoring exception\n" ); - status = NtCallbackReturn( 0, 0, 0 ); - } - __ENDTRY - - RtlRaiseStatus( status ); + NTSTATUS status = dispatch_user_callback( args, len, id ); + status = NtCallbackReturn( NULL, 0, status ); + for (;;) RtlRaiseStatus( status ); }
diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c index 9c6049552b2..c56552a74a7 100644 --- a/dlls/ntdll/signal_x86_64.c +++ b/dlls/ntdll/signal_x86_64.c @@ -691,24 +691,6 @@ __ASM_GLOBAL_FUNC( KiUserApcDispatcher, /******************************************************************* * KiUserCallbackDispatcher (NTDLL.@) */ -void WINAPI dispatch_callback( void *args, ULONG len, ULONG id ) -{ - NTSTATUS status; - - __TRY - { - KERNEL_CALLBACK_PROC func = NtCurrentTeb()->Peb->KernelCallbackTable[id]; - status = NtCallbackReturn( NULL, 0, func( args, len )); - } - __EXCEPT_ALL - { - ERR_(seh)( "ignoring exception\n" ); - status = NtCallbackReturn( 0, 0, 0 ); - } - __ENDTRY - - RtlRaiseStatus( status ); -} __ASM_GLOBAL_FUNC( KiUserCallbackDispatcher, __ASM_SEH(".seh_pushframe\n\t") __ASM_SEH(".seh_stackalloc 0x30\n\t") @@ -720,7 +702,14 @@ __ASM_GLOBAL_FUNC( KiUserCallbackDispatcher, "movq 0x20(%rsp),%rcx\n\t" /* args */ "movl 0x28(%rsp),%edx\n\t" /* len */ "movl 0x2c(%rsp),%r8d\n\t" /* id */ - "call " __ASM_NAME("dispatch_callback") ) + "call " __ASM_NAME("dispatch_user_callback") "\n\t" + "xorq %rcx,%rcx\n\t" /* ret_ptr */ + "xorl %edx,%edx\n\t" /* ret_len */ + "movl %eax,%r8d\n\t" /* status */ + "call " __ASM_NAME("NtCallbackReturn") "\n\t" + "movl %eax,%ecx\n\t" /* status */ + "call " __ASM_NAME("RtlRaiseStatus") "\n\t" + "int3" )
/**************************************************************************