ntdll: Share KiUserCallbackDispatcher implementation across platforms.
This commit is contained in:
parent
3031f15784
commit
d89037a826
7 changed files with 54 additions and 91 deletions
|
@ -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
|
* raise_status
|
||||||
*
|
*
|
||||||
|
|
|
@ -49,6 +49,7 @@ extern UINT_PTR page_size;
|
||||||
|
|
||||||
/* exceptions */
|
/* exceptions */
|
||||||
extern LONG call_vectored_handlers( EXCEPTION_RECORD *rec, CONTEXT *context );
|
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 void DECLSPEC_NORETURN raise_status( NTSTATUS status, EXCEPTION_RECORD *rec );
|
||||||
extern LONG WINAPI call_unhandled_exception_filter( PEXCEPTION_POINTERS eptr );
|
extern LONG WINAPI call_unhandled_exception_filter( PEXCEPTION_POINTERS eptr );
|
||||||
|
|
||||||
|
|
|
@ -575,24 +575,6 @@ __ASM_GLOBAL_FUNC( KiUserApcDispatcher,
|
||||||
/*******************************************************************
|
/*******************************************************************
|
||||||
* KiUserCallbackDispatcher (NTDLL.@)
|
* 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_GLOBAL_FUNC( KiUserCallbackDispatcher,
|
||||||
__ASM_SEH(".seh_custom 0xee,0x01\n\t") /* MSFT_OP_MACHINE_FRAME */
|
__ASM_SEH(".seh_custom 0xee,0x01\n\t") /* MSFT_OP_MACHINE_FRAME */
|
||||||
"nop\n\t"
|
"nop\n\t"
|
||||||
|
@ -606,7 +588,12 @@ __ASM_GLOBAL_FUNC( KiUserCallbackDispatcher,
|
||||||
"ldr r0, [sp]\n\t" /* args */
|
"ldr r0, [sp]\n\t" /* args */
|
||||||
"ldr r1, [sp, #0x04]\n\t" /* len */
|
"ldr r1, [sp, #0x04]\n\t" /* len */
|
||||||
"ldr r2, [sp, #0x08]\n\t" /* id */
|
"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" )
|
"udf #1" )
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -605,24 +605,6 @@ __ASM_GLOBAL_FUNC( KiUserApcDispatcher,
|
||||||
/*******************************************************************
|
/*******************************************************************
|
||||||
* KiUserCallbackDispatcher (NTDLL.@)
|
* 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_GLOBAL_FUNC( KiUserCallbackDispatcher,
|
||||||
__ASM_SEH(".seh_pushframe\n\t")
|
__ASM_SEH(".seh_pushframe\n\t")
|
||||||
"nop\n\t"
|
"nop\n\t"
|
||||||
|
@ -632,7 +614,12 @@ __ASM_GLOBAL_FUNC( KiUserCallbackDispatcher,
|
||||||
__ASM_SEH(".seh_endprologue\n\t")
|
__ASM_SEH(".seh_endprologue\n\t")
|
||||||
"ldr x0, [sp]\n\t" /* args */
|
"ldr x0, [sp]\n\t" /* args */
|
||||||
"ldp w1, w2, [sp, #0x08]\n\t" /* len, id */
|
"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" )
|
"brk #1" )
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1716,24 +1716,6 @@ __ASM_GLOBAL_FUNC( "#KiUserApcDispatcher",
|
||||||
/*******************************************************************
|
/*******************************************************************
|
||||||
* KiUserCallbackDispatcher (NTDLL.@)
|
* 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_GLOBAL_FUNC( "#KiUserCallbackDispatcher",
|
||||||
__ASM_SEH(".seh_pushframe\n\t")
|
__ASM_SEH(".seh_pushframe\n\t")
|
||||||
"nop\n\t"
|
"nop\n\t"
|
||||||
|
@ -1743,7 +1725,12 @@ __ASM_GLOBAL_FUNC( "#KiUserCallbackDispatcher",
|
||||||
__ASM_SEH(".seh_endprologue\n\t")
|
__ASM_SEH(".seh_endprologue\n\t")
|
||||||
"ldr x0, [sp]\n\t" /* args */
|
"ldr x0, [sp]\n\t" /* args */
|
||||||
"ldp w1, w2, [sp, #0x08]\n\t" /* len, id */
|
"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" )
|
"brk #1" )
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -294,21 +294,9 @@ __ASM_STDCALL_FUNC( KiUserApcDispatcher, 20,
|
||||||
*/
|
*/
|
||||||
void WINAPI KiUserCallbackDispatcher( ULONG id, void *args, ULONG len )
|
void WINAPI KiUserCallbackDispatcher( ULONG id, void *args, ULONG len )
|
||||||
{
|
{
|
||||||
NTSTATUS status;
|
NTSTATUS status = dispatch_user_callback( args, len, id );
|
||||||
|
status = NtCallbackReturn( NULL, 0, status );
|
||||||
__TRY
|
for (;;) RtlRaiseStatus( status );
|
||||||
{
|
|
||||||
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 );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -691,24 +691,6 @@ __ASM_GLOBAL_FUNC( KiUserApcDispatcher,
|
||||||
/*******************************************************************
|
/*******************************************************************
|
||||||
* KiUserCallbackDispatcher (NTDLL.@)
|
* 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_GLOBAL_FUNC( KiUserCallbackDispatcher,
|
||||||
__ASM_SEH(".seh_pushframe\n\t")
|
__ASM_SEH(".seh_pushframe\n\t")
|
||||||
__ASM_SEH(".seh_stackalloc 0x30\n\t")
|
__ASM_SEH(".seh_stackalloc 0x30\n\t")
|
||||||
|
@ -720,7 +702,14 @@ __ASM_GLOBAL_FUNC( KiUserCallbackDispatcher,
|
||||||
"movq 0x20(%rsp),%rcx\n\t" /* args */
|
"movq 0x20(%rsp),%rcx\n\t" /* args */
|
||||||
"movl 0x28(%rsp),%edx\n\t" /* len */
|
"movl 0x28(%rsp),%edx\n\t" /* len */
|
||||||
"movl 0x2c(%rsp),%r8d\n\t" /* id */
|
"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" )
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
|
|
Loading…
Add table
Reference in a new issue