Module: wine Branch: master Commit: b56a4b3efc39ab3c8e6dfced188b5bcc9eb7c2fc URL: https://source.winehq.org/git/wine.git/?a=commit;h=b56a4b3efc39ab3c8e6dfced1...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Aug 17 11:55:39 2021 +0200
ntdll: Implement KiUserCallbackDispatcher().
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntdll/loader.c | 2 +- dlls/ntdll/ntdll.spec | 2 +- dlls/ntdll/ntdll_misc.h | 1 + dlls/ntdll/signal_arm.c | 11 +++++++++++ dlls/ntdll/signal_arm64.c | 11 +++++++++++ dlls/ntdll/signal_i386.c | 11 +++++++++++ dlls/ntdll/signal_x86_64.c | 13 +++++++++++++ dlls/ntdll/tests/wow64.c | 2 +- dlls/ntdll/unix/loader.c | 4 +++- dlls/ntdll/unix/unix_private.h | 3 ++- 10 files changed, 55 insertions(+), 5 deletions(-)
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c index 9f126249c01..48e826fe888 100644 --- a/dlls/ntdll/loader.c +++ b/dlls/ntdll/loader.c @@ -3767,7 +3767,7 @@ static void init_wow64( CONTEXT *context ) SET_INIT_BLOCK( LdrInitializeThunk ); SET_INIT_BLOCK( LdrSystemDllInitBlock ); SET_INIT_BLOCK( RtlUserThreadStart ); - /* SET_INIT_BLOCK( KiUserCallbackDispatcher ); */ + SET_INIT_BLOCK( KiUserCallbackDispatcher ); /* SET_INIT_BLOCK( RtlpQueryProcessDebugInformationRemote ); */ /* SET_INIT_BLOCK( RtlpFreezeTimeBias ); */ /* LdrSystemDllInitBlock.ntdll_handle */ diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index 46403b3f4a1..1bff52a299d 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -68,7 +68,7 @@ # @ stub KiIntSystemCall @ stdcall -norelay KiRaiseUserExceptionDispatcher() @ stdcall -norelay KiUserApcDispatcher(ptr long long long ptr) -@ stub KiUserCallbackDispatcher +@ stdcall -norelay KiUserCallbackDispatcher(long ptr long) @ stdcall -norelay KiUserExceptionDispatcher(ptr ptr) # @ stub LdrAccessOutOfProcessResource @ stdcall LdrAccessResource(long ptr ptr ptr) diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h index 1e93692fe12..ab6fa5bc0ae 100644 --- a/dlls/ntdll/ntdll_misc.h +++ b/dlls/ntdll/ntdll_misc.h @@ -51,6 +51,7 @@ extern LONG WINAPI call_unhandled_exception_filter( PEXCEPTION_POINTERS eptr ) D extern void WINAPI LdrInitializeThunk(CONTEXT*,ULONG_PTR,ULONG_PTR,ULONG_PTR) DECLSPEC_HIDDEN; extern NTSTATUS WINAPI KiUserExceptionDispatcher(EXCEPTION_RECORD*,CONTEXT*) DECLSPEC_HIDDEN; extern void WINAPI KiUserApcDispatcher(CONTEXT*,ULONG_PTR,ULONG_PTR,ULONG_PTR,PNTAPCFUNC) DECLSPEC_HIDDEN; +extern void WINAPI KiUserCallbackDispatcher(ULONG,void*,ULONG) DECLSPEC_HIDDEN;
#if defined(__x86_64__) || defined(__arm__) || defined(__aarch64__) extern RUNTIME_FUNCTION *lookup_function_info( ULONG_PTR pc, ULONG_PTR *base, LDR_DATA_TABLE_ENTRY **module ) DECLSPEC_HIDDEN; diff --git a/dlls/ntdll/signal_arm.c b/dlls/ntdll/signal_arm.c index 64870674d1f..0ef210a0331 100644 --- a/dlls/ntdll/signal_arm.c +++ b/dlls/ntdll/signal_arm.c @@ -206,6 +206,17 @@ void WINAPI KiUserApcDispatcher( CONTEXT *context, ULONG_PTR ctx, ULONG_PTR arg1 }
+/******************************************************************* + * KiUserCallbackDispatcher (NTDLL.@) + */ +void WINAPI KiUserCallbackDispatcher( ULONG id, void *args, ULONG len ) +{ + NTSTATUS (WINAPI *func)(void *, ULONG) = ((void **)NtCurrentTeb()->Peb->KernelCallbackTable)[id]; + + RtlRaiseStatus( NtCallbackReturn( NULL, 0, func( args, len ))); +} + + /*********************************************************************** * RtlUnwind (NTDLL.@) */ diff --git a/dlls/ntdll/signal_arm64.c b/dlls/ntdll/signal_arm64.c index dc18599e4f6..290639b676b 100644 --- a/dlls/ntdll/signal_arm64.c +++ b/dlls/ntdll/signal_arm64.c @@ -565,6 +565,17 @@ void WINAPI KiUserApcDispatcher( CONTEXT *context, ULONG_PTR arg1, ULONG_PTR arg }
+/******************************************************************* + * KiUserCallbackDispatcher (NTDLL.@) + */ +void WINAPI KiUserCallbackDispatcher( ULONG id, void *args, ULONG len ) +{ + NTSTATUS (WINAPI *func)(void *, ULONG) = ((void **)NtCurrentTeb()->Peb->KernelCallbackTable)[id]; + + RtlRaiseStatus( NtCallbackReturn( NULL, 0, func( args, len ))); +} + + /*********************************************************************** * Definitions for Win32 unwind tables */ diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c index 59d9e1d0df9..479accaf63c 100644 --- a/dlls/ntdll/signal_i386.c +++ b/dlls/ntdll/signal_i386.c @@ -247,6 +247,17 @@ void WINAPI KiUserApcDispatcher( CONTEXT *context, ULONG_PTR ctx, ULONG_PTR arg1 }
+/******************************************************************* + * KiUserCallbackDispatcher (NTDLL.@) + */ +void WINAPI KiUserCallbackDispatcher( ULONG id, void *args, ULONG len ) +{ + NTSTATUS (WINAPI *func)(void *, ULONG) = ((void **)NtCurrentTeb()->Peb->KernelCallbackTable)[id]; + + RtlRaiseStatus( NtCallbackReturn( NULL, 0, func( args, len ))); +} + + /*********************************************************************** * save_fpu * diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c index de0eca6c11c..ef32eba68b7 100644 --- a/dlls/ntdll/signal_x86_64.c +++ b/dlls/ntdll/signal_x86_64.c @@ -625,6 +625,19 @@ __ASM_GLOBAL_FUNC( KiUserApcDispatcher, "int3")
+/******************************************************************* + * KiUserCallbackDispatcher (NTDLL.@) + * + * FIXME: not binary compatible + */ +void WINAPI KiUserCallbackDispatcher( ULONG id, void *args, ULONG len ) +{ + NTSTATUS (WINAPI *func)(void *, ULONG) = ((void **)NtCurrentTeb()->Peb->KernelCallbackTable)[id]; + + RtlRaiseStatus( NtCallbackReturn( NULL, 0, func( args, len ))); +} + + static ULONG64 get_int_reg( CONTEXT *context, int reg ) { return *(&context->Rax + reg); diff --git a/dlls/ntdll/tests/wow64.c b/dlls/ntdll/tests/wow64.c index 90692e66c25..be2f2138933 100644 --- a/dlls/ntdll/tests/wow64.c +++ b/dlls/ntdll/tests/wow64.c @@ -1043,7 +1043,7 @@ static void test_init_block(void) CHECK_FUNC( block64[3], "LdrInitializeThunk" ); CHECK_FUNC( block64[4], "KiUserExceptionDispatcher" ); CHECK_FUNC( block64[5], "KiUserApcDispatcher" ); - todo_wine CHECK_FUNC( block64[6], "KiUserCallbackDispatcher" ); + CHECK_FUNC( block64[6], "KiUserCallbackDispatcher" ); CHECK_FUNC( block64[7], "RtlUserThreadStart" ); CHECK_FUNC( block64[8], "RtlpQueryProcessDebugInformationRemote" ); todo_wine ok( block64[9] == (ULONG_PTR)ntdll, "got %p for ntdll %p\n", diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c index 5edc845009f..a8e145de16e 100644 --- a/dlls/ntdll/unix/loader.c +++ b/dlls/ntdll/unix/loader.c @@ -105,8 +105,9 @@ static const char so_dir[] = "";
void (WINAPI *pDbgUiRemoteBreakin)( void *arg ) = NULL; NTSTATUS (WINAPI *pKiRaiseUserExceptionDispatcher)(void) = NULL; -void (WINAPI *pKiUserApcDispatcher)(CONTEXT*,ULONG_PTR,ULONG_PTR,ULONG_PTR,PNTAPCFUNC) = NULL; NTSTATUS (WINAPI *pKiUserExceptionDispatcher)(EXCEPTION_RECORD*,CONTEXT*) = NULL; +void (WINAPI *pKiUserApcDispatcher)(CONTEXT*,ULONG_PTR,ULONG_PTR,ULONG_PTR,PNTAPCFUNC) = NULL; +void (WINAPI *pKiUserCallbackDispatcher)(ULONG,void*,ULONG) = NULL; void (WINAPI *pLdrInitializeThunk)(CONTEXT*,void**,ULONG_PTR,ULONG_PTR) = NULL; void (WINAPI *pRtlUserThreadStart)( PRTL_THREAD_START_ROUTINE entry, void *arg ) = NULL; void (WINAPI *p__wine_ctrl_routine)(void*); @@ -832,6 +833,7 @@ static void load_ntdll_functions( HMODULE module ) GET_FUNC( KiRaiseUserExceptionDispatcher ); GET_FUNC( KiUserExceptionDispatcher ); GET_FUNC( KiUserApcDispatcher ); + GET_FUNC( KiUserCallbackDispatcher ); GET_FUNC( LdrInitializeThunk ); GET_FUNC( LdrSystemDllInitBlock ); GET_FUNC( RtlUserThreadStart ); diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h index 18c58a6431e..df5316d2917 100644 --- a/dlls/ntdll/unix/unix_private.h +++ b/dlls/ntdll/unix/unix_private.h @@ -92,8 +92,9 @@ static const LONG teb_offset = 0x2000; /* callbacks to PE ntdll from the Unix side */ extern void (WINAPI *pDbgUiRemoteBreakin)( void *arg ) DECLSPEC_HIDDEN; extern NTSTATUS (WINAPI *pKiRaiseUserExceptionDispatcher)(void) DECLSPEC_HIDDEN; -extern void (WINAPI *pKiUserApcDispatcher)(CONTEXT*,ULONG_PTR,ULONG_PTR,ULONG_PTR,PNTAPCFUNC) DECLSPEC_HIDDEN; extern NTSTATUS (WINAPI *pKiUserExceptionDispatcher)(EXCEPTION_RECORD*,CONTEXT*) DECLSPEC_HIDDEN; +extern void (WINAPI *pKiUserApcDispatcher)(CONTEXT*,ULONG_PTR,ULONG_PTR,ULONG_PTR,PNTAPCFUNC) DECLSPEC_HIDDEN; +extern void (WINAPI *pKiUserCallbackDispatcher)(ULONG,void*,ULONG) DECLSPEC_HIDDEN; extern void (WINAPI *pLdrInitializeThunk)(CONTEXT*,void**,ULONG_PTR,ULONG_PTR) DECLSPEC_HIDDEN; extern void (WINAPI *pRtlUserThreadStart)( PRTL_THREAD_START_ROUTINE entry, void *arg ) DECLSPEC_HIDDEN; extern void (WINAPI *p__wine_ctrl_routine)(void *) DECLSPEC_HIDDEN;