Jacek Caban : wow64win: Add initial user callbacks support.
Alexandre Julliard
julliard at winehq.org
Thu Aug 11 15:26:18 CDT 2022
Module: wine
Branch: master
Commit: 701932a6ce7175c78d16f49079fecd1d64df5f2e
URL: https://gitlab.winehq.org/wine/wine/-/commit/701932a6ce7175c78d16f49079fecd1d64df5f2e
Author: Jacek Caban <jacek at codeweavers.com>
Date: Sat Jul 30 15:44:58 2022 +0200
wow64win: Add initial user callbacks support.
---
dlls/wow64win/syscall.c | 4 +-
dlls/wow64win/user.c | 226 +++++++++++++++++++++++++++++++++++++++
dlls/wow64win/wow64win_private.h | 5 +
include/ntuser.h | 2 +-
4 files changed, 235 insertions(+), 2 deletions(-)
diff --git a/dlls/wow64win/syscall.c b/dlls/wow64win/syscall.c
index 0be70421b74..20ea054ff7c 100644
--- a/dlls/wow64win/syscall.c
+++ b/dlls/wow64win/syscall.c
@@ -53,6 +53,8 @@ SYSTEM_SERVICE_TABLE sdwhwin32 =
BOOL WINAPI DllMain( HINSTANCE inst, DWORD reason, void *reserved )
{
- if (reason == DLL_PROCESS_ATTACH) LdrDisableThreadCalloutsForDll( inst );
+ if (reason != DLL_PROCESS_ATTACH) return TRUE;
+ LdrDisableThreadCalloutsForDll( inst );
+ NtCurrentTeb()->Peb->KernelCallbackTable = user_callbacks;
return TRUE;
}
diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c
index c69c8fd6d6c..1f4acc04e2a 100644
--- a/dlls/wow64win/user.c
+++ b/dlls/wow64win/user.c
@@ -189,6 +189,232 @@ static struct client_menu_name32 *client_menu_name_64to32( const struct client_m
return name32;
}
+static NTSTATUS dispatch_callback( ULONG id, void *args, ULONG len )
+{
+ void *ret_ptr;
+ ULONG ret_len;
+ NTSTATUS status = Wow64KiUserCallbackDispatcher( id, args, len, &ret_ptr, &ret_len );
+ return NtCallbackReturn( ret_ptr, ret_len, status );
+}
+
+static NTSTATUS WINAPI wow64_NtUserCallEnumDisplayMonitor( void *arg, ULONG size )
+{
+ FIXME( "\n" );
+ return 0;
+}
+
+static NTSTATUS WINAPI wow64_NtUserCallSendAsyncCallback( void *arg, ULONG size )
+{
+ FIXME( "\n" );
+ return 0;
+}
+
+static NTSTATUS WINAPI wow64_NtUserCallWinEventHook( void *arg, ULONG size )
+{
+ FIXME( "\n" );
+ return 0;
+}
+
+static NTSTATUS WINAPI wow64_NtUserCallWinProc( void *arg, ULONG size )
+{
+ FIXME( "\n" );
+ return 0;
+}
+
+static NTSTATUS WINAPI wow64_NtUserCallWindowsHook( void *arg, ULONG size )
+{
+ FIXME( "\n" );
+ return 0;
+}
+
+static NTSTATUS WINAPI wow64_NtUserCopyImage( void *arg, ULONG size )
+{
+ FIXME( "\n" );
+ return 0;
+}
+
+static NTSTATUS WINAPI wow64_NtUserDrawScrollBar( void *arg, ULONG size )
+{
+ FIXME( "\n" );
+ return 0;
+}
+
+static NTSTATUS WINAPI wow64_NtUserDrawText( void *arg, ULONG size )
+{
+ FIXME( "\n" );
+ return 0;
+}
+
+static NTSTATUS WINAPI wow64_NtUserFreeCachedClipboardData( void *arg, ULONG size )
+{
+ FIXME( "\n" );
+ return 0;
+}
+
+static NTSTATUS WINAPI wow64_NtUserImmProcessKey( void *arg, ULONG size )
+{
+ FIXME( "\n" );
+ return 0;
+}
+
+static NTSTATUS WINAPI wow64_NtUserImmTranslateMessage( void *arg, ULONG size )
+{
+ FIXME( "\n" );
+ return 0;
+}
+
+static NTSTATUS WINAPI wow64_NtUserInitBuiltinClasses( void *arg, ULONG size )
+{
+ return dispatch_callback( NtUserInitBuiltinClasses, arg, size );
+}
+
+static NTSTATUS WINAPI wow64_NtUserLoadDriver( void *arg, ULONG size )
+{
+ return dispatch_callback( NtUserLoadDriver, arg, size );
+}
+
+static NTSTATUS WINAPI wow64_NtUserLoadImage( void *arg, ULONG size )
+{
+ FIXME( "\n" );
+ return 0;
+}
+
+static NTSTATUS WINAPI wow64_NtUserLoadSysMenu( void *arg, ULONG size )
+{
+ return dispatch_callback( NtUserLoadSysMenu, arg, size );
+}
+
+static NTSTATUS WINAPI wow64_NtUserPostDDEMessage( void *arg, ULONG size )
+{
+ FIXME( "\n" );
+ return 0;
+}
+
+static NTSTATUS WINAPI wow64_NtUserRenderSynthesizedFormat( void *arg, ULONG size )
+{
+ return dispatch_callback( NtUserRenderSynthesizedFormat, arg, size );
+}
+
+static NTSTATUS WINAPI wow64_NtUserUnpackDDEMessage( void *arg, ULONG size )
+{
+ FIXME( "\n" );
+ return 0;
+}
+
+static NTSTATUS WINAPI wow64_NtUserCallFreeIcon( void *arg, ULONG size )
+{
+ return dispatch_callback( NtUserCallFreeIcon, arg, size );
+}
+
+static NTSTATUS WINAPI wow64_NtUserThunkLock( void *arg, ULONG size )
+{
+ return dispatch_callback( NtUserThunkLock, arg, size );
+}
+
+static NTSTATUS WINAPI wow64_NtUserCallVulkanDebugReportCallback( void *arg, ULONG size )
+{
+ FIXME( "\n" );
+ return 0;
+}
+
+static NTSTATUS WINAPI wow64_NtUserCallVulkanDebugUtilsCallback( void *arg, ULONG size )
+{
+ FIXME( "\n" );
+ return 0;
+}
+
+static NTSTATUS WINAPI wow64_NtUserDriverCallbackFirst0( void *arg, ULONG size )
+{
+ return dispatch_callback( NtUserDriverCallbackFirst + 0, arg, size );
+}
+
+static NTSTATUS WINAPI wow64_NtUserDriverCallbackFirst1( void *arg, ULONG size )
+{
+ return dispatch_callback( NtUserDriverCallbackFirst + 1, arg, size );
+}
+
+static NTSTATUS WINAPI wow64_NtUserDriverCallbackFirst2( void *arg, ULONG size )
+{
+ return dispatch_callback( NtUserDriverCallbackFirst + 2, arg, size );
+}
+
+static NTSTATUS WINAPI wow64_NtUserDriverCallbackFirst3( void *arg, ULONG size )
+{
+ return dispatch_callback( NtUserDriverCallbackFirst + 3, arg, size );
+}
+
+static NTSTATUS WINAPI wow64_NtUserDriverCallbackFirst4( void *arg, ULONG size )
+{
+ return dispatch_callback( NtUserDriverCallbackFirst + 4, arg, size );
+}
+
+static NTSTATUS WINAPI wow64_NtUserDriverCallbackFirst5( void *arg, ULONG size )
+{
+ return dispatch_callback( NtUserDriverCallbackFirst + 5, arg, size );
+}
+
+static NTSTATUS WINAPI wow64_NtUserDriverCallbackFirst6( void *arg, ULONG size )
+{
+ return dispatch_callback( NtUserDriverCallbackFirst + 6, arg, size );
+}
+
+static NTSTATUS WINAPI wow64_NtUserDriverCallbackFirst7( void *arg, ULONG size )
+{
+ return dispatch_callback( NtUserDriverCallbackFirst + 7, arg, size );
+}
+
+static NTSTATUS WINAPI wow64_NtUserDriverCallbackFirst8( void *arg, ULONG size )
+{
+ return dispatch_callback( NtUserDriverCallbackFirst + 8, arg, size );
+}
+
+static NTSTATUS WINAPI wow64_NtUserDriverCallbackFirst9( void *arg, ULONG size )
+{
+ return dispatch_callback( NtUserDriverCallbackFirst + 9, arg, size );
+}
+
+user_callback user_callbacks[] =
+{
+ /* user32 callbacks */
+ wow64_NtUserCallEnumDisplayMonitor,
+ wow64_NtUserCallSendAsyncCallback,
+ wow64_NtUserCallWinEventHook,
+ wow64_NtUserCallWinProc,
+ wow64_NtUserCallWindowsHook,
+ wow64_NtUserCopyImage,
+ wow64_NtUserDrawScrollBar,
+ wow64_NtUserDrawText,
+ wow64_NtUserFreeCachedClipboardData,
+ wow64_NtUserImmProcessKey,
+ wow64_NtUserImmTranslateMessage,
+ wow64_NtUserInitBuiltinClasses,
+ wow64_NtUserLoadDriver,
+ wow64_NtUserLoadImage,
+ wow64_NtUserLoadSysMenu,
+ wow64_NtUserPostDDEMessage,
+ wow64_NtUserRenderSynthesizedFormat,
+ wow64_NtUserUnpackDDEMessage,
+ /* win16 hooks */
+ wow64_NtUserCallFreeIcon,
+ wow64_NtUserThunkLock,
+ /* Vulkan support */
+ wow64_NtUserCallVulkanDebugReportCallback,
+ wow64_NtUserCallVulkanDebugUtilsCallback,
+ /* Driver-specific callbacks */
+ wow64_NtUserDriverCallbackFirst0,
+ wow64_NtUserDriverCallbackFirst1,
+ wow64_NtUserDriverCallbackFirst2,
+ wow64_NtUserDriverCallbackFirst3,
+ wow64_NtUserDriverCallbackFirst4,
+ wow64_NtUserDriverCallbackFirst5,
+ wow64_NtUserDriverCallbackFirst6,
+ wow64_NtUserDriverCallbackFirst7,
+ wow64_NtUserDriverCallbackFirst8,
+ wow64_NtUserDriverCallbackFirst9,
+};
+
+C_ASSERT( ARRAYSIZE(user_callbacks) == NtUserCallCount );
+
NTSTATUS WINAPI wow64_NtUserActivateKeyboardLayout( UINT *args )
{
HKL layout = get_handle( &args );
diff --git a/dlls/wow64win/wow64win_private.h b/dlls/wow64win/wow64win_private.h
index cf0b2b62e5f..643875c69ce 100644
--- a/dlls/wow64win/wow64win_private.h
+++ b/dlls/wow64win/wow64win_private.h
@@ -27,7 +27,12 @@
ALL_WIN32_SYSCALLS
#undef SYSCALL_ENTRY
+typedef NTSTATUS (WINAPI *user_callback)( void *params, ULONG size );
+extern user_callback user_callbacks[] DECLSPEC_HIDDEN;
+
void * WINAPI Wow64AllocateTemp( SIZE_T size );
+NTSTATUS WINAPI Wow64KiUserCallbackDispatcher( ULONG id, void *args, ULONG len,
+ void **ret_ptr, ULONG *ret_len );
struct object_attr64
{
diff --git a/include/ntuser.h b/include/ntuser.h
index 5b7d66a2a4e..f5555056078 100644
--- a/include/ntuser.h
+++ b/include/ntuser.h
@@ -54,7 +54,7 @@ enum
NtUserCallVulkanDebugUtilsCallback,
/* Driver-specific callbacks */
NtUserDriverCallbackFirst,
- NtUserDriverCallbackLast = NtUserDriverCallbackFirst + 10,
+ NtUserDriverCallbackLast = NtUserDriverCallbackFirst + 9,
NtUserCallCount
};
More information about the wine-cvs
mailing list