Alexandre Julliard : ntdll: Implement KiUserCallbackDispatcher().

Alexandre Julliard julliard at winehq.org
Tue Aug 17 16:26:51 CDT 2021


Module: wine
Branch: master
Commit: b56a4b3efc39ab3c8e6dfced188b5bcc9eb7c2fc
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=b56a4b3efc39ab3c8e6dfced188b5bcc9eb7c2fc

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Aug 17 11:55:39 2021 +0200

ntdll: Implement KiUserCallbackDispatcher().

Signed-off-by: Alexandre Julliard <julliard at 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;




More information about the wine-cvs mailing list