diff --git a/dlls/ntdll/signal_arm64ec.c b/dlls/ntdll/signal_arm64ec.c index fc92a453b56..75b4c71bc9c 100644 --- a/dlls/ntdll/signal_arm64ec.c +++ b/dlls/ntdll/signal_arm64ec.c @@ -1694,10 +1694,35 @@ void WINAPI KiUserApcDispatcher( CONTEXT *context, ULONG_PTR arg1, ULONG_PTR arg /******************************************************************* * KiUserCallbackDispatcher (NTDLL.@) */ -void WINAPI KiUserCallbackDispatcher( ULONG id, void *args, ULONG len ) +void WINAPI dispatch_callback( void *args, ULONG len, ULONG id ) { - FIXME( "not implemented\n" ); + NTSTATUS status; + + __TRY + { + NTSTATUS (WINAPI *func)(void *, ULONG) = ((void **)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" + __ASM_SEH(".seh_stackalloc 0x20\n\t") + "nop\n\t" + __ASM_SEH(".seh_save_reg lr, 0x18\n\t") + __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" + "brk #1" ) /**************************************************************************