Jacek Caban : win32u: Set user callbacks from user32 DllMain.
Alexandre Julliard
julliard at winehq.org
Thu Feb 17 15:33:59 CST 2022
Module: wine
Branch: master
Commit: e557f48cdf6ef1eafe468829ec9298a3eb6ac80b
URL: https://source.winehq.org/git/wine.git/?a=commit;h=e557f48cdf6ef1eafe468829ec9298a3eb6ac80b
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Feb 17 15:42:36 2022 +0100
win32u: Set user callbacks from user32 DllMain.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/user32/user_main.c | 11 +++++++
dlls/win32u/driver.c | 12 ++------
dlls/win32u/ntuser_private.h | 9 ++++++
dlls/win32u/palette.c | 11 +------
dlls/win32u/region.c | 7 +----
dlls/win32u/sysparams.c | 2 ++
dlls/win32u/win32u_private.h | 9 ------
dlls/win32u/wrappers.c | 73 +-------------------------------------------
include/ntuser.h | 1 +
9 files changed, 28 insertions(+), 107 deletions(-)
diff --git a/dlls/user32/user_main.c b/dlls/user32/user_main.c
index c2ec561a800..a91db57cdb4 100644
--- a/dlls/user32/user_main.c
+++ b/dlls/user32/user_main.c
@@ -208,6 +208,14 @@ static void dpiaware_init(void)
}
}
+static const struct user_callbacks user_funcs =
+{
+ GetDesktopWindow,
+ GetWindowRect,
+ RedrawWindow,
+ SendMessageTimeoutW,
+ WindowFromDC,
+};
static const void *kernel_callback_table[NtUserCallCount] =
{
@@ -223,6 +231,9 @@ static BOOL process_attach(void)
{
NtCurrentTeb()->Peb->KernelCallbackTable = kernel_callback_table;
+ /* FIXME: should not be needed */
+ NtUserCallOneParam( (UINT_PTR)&user_funcs, NtUserSetCallbacks );
+
dpiaware_init();
register_desktop_class();
diff --git a/dlls/win32u/driver.c b/dlls/win32u/driver.c
index b3a3e70f83f..5e6cee33bc6 100644
--- a/dlls/win32u/driver.c
+++ b/dlls/win32u/driver.c
@@ -24,21 +24,13 @@
#endif
#include <assert.h>
-#include <stdarg.h>
-#include <string.h>
-#include <stdio.h>
#include <pthread.h>
#include "ntstatus.h"
#define WIN32_NO_STATUS
-#include "windef.h"
-#include "winbase.h"
-#include "wingdi.h"
-#include "winreg.h"
-#include "wine/winbase16.h"
-#include "winuser.h"
-
#include "ntgdi_private.h"
+#include "ntuser_private.h"
+#include "wine/winbase16.h"
#include "wine/list.h"
#include "wine/debug.h"
diff --git a/dlls/win32u/ntuser_private.h b/dlls/win32u/ntuser_private.h
index fec04d94948..f0e0f8835bf 100644
--- a/dlls/win32u/ntuser_private.h
+++ b/dlls/win32u/ntuser_private.h
@@ -24,6 +24,15 @@
#include "ntuser.h"
+struct user_callbacks
+{
+ HWND (WINAPI *pGetDesktopWindow)(void);
+ BOOL (WINAPI *pGetWindowRect)( HWND hwnd, LPRECT rect );
+ BOOL (WINAPI *pRedrawWindow)( HWND, const RECT*, HRGN, UINT );
+ LRESULT (WINAPI *pSendMessageTimeoutW)( HWND, UINT, WPARAM, LPARAM, UINT, UINT, PDWORD_PTR );
+ HWND (WINAPI *pWindowFromDC)( HDC );
+};
+
/* this is the structure stored in TEB->Win32ClientInfo */
/* no attempt is made to keep the layout compatible with the Windows one */
struct user_thread_info
diff --git a/dlls/win32u/palette.c b/dlls/win32u/palette.c
index 3aeda89851f..1c2f2c70434 100644
--- a/dlls/win32u/palette.c
+++ b/dlls/win32u/palette.c
@@ -27,17 +27,8 @@
#pragma makedep unix
#endif
-#include <stdarg.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "windef.h"
-#include "winbase.h"
-#include "winerror.h"
-#include "wingdi.h"
-#include "winuser.h"
-
#include "ntgdi_private.h"
+#include "ntuser_private.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(palette);
diff --git a/dlls/win32u/region.c b/dlls/win32u/region.c
index 86554f21e1c..17eae861cbf 100644
--- a/dlls/win32u/region.c
+++ b/dlls/win32u/region.c
@@ -99,13 +99,8 @@ SOFTWARE.
#endif
#include <assert.h>
-#include <stdarg.h>
-#include <stdlib.h>
-#include <string.h>
-#include "windef.h"
-#include "winbase.h"
-#include "wingdi.h"
#include "ntgdi_private.h"
+#include "ntuser_private.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(region);
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c
index c9885f89d87..7af1e20f008 100644
--- a/dlls/win32u/sysparams.c
+++ b/dlls/win32u/sysparams.c
@@ -4544,6 +4544,8 @@ ULONG_PTR WINAPI NtUserCallOneParam( ULONG_PTR arg, ULONG code )
return get_entry( &entry_DESKPATTERN, 256, (WCHAR *)arg );
case NtUserIncrementKeyStateCounter:
return InterlockedAdd( &global_key_state_counter, arg );
+ case NtUserSetCallbacks:
+ return (UINT_PTR)InterlockedExchangePointer( (void **)&user_callbacks, (void *)arg );
default:
FIXME( "invalid code %u\n", code );
return 0;
diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h
index c3419d83858..3017b7e6a72 100644
--- a/dlls/win32u/win32u_private.h
+++ b/dlls/win32u/win32u_private.h
@@ -30,15 +30,6 @@
#include "wine/unixlib.h"
#include "wine/debug.h"
-struct user_callbacks
-{
- HWND (WINAPI *pGetDesktopWindow)(void);
- BOOL (WINAPI *pGetWindowRect)( HWND hwnd, LPRECT rect );
- BOOL (WINAPI *pRedrawWindow)( HWND, const RECT*, HRGN, UINT );
- LRESULT (WINAPI *pSendMessageTimeoutW)( HWND, UINT, WPARAM, LPARAM, UINT, UINT, PDWORD_PTR );
- HWND (WINAPI *pWindowFromDC)( HDC );
-};
-
extern const struct user_callbacks *user_callbacks DECLSPEC_HIDDEN;
struct unix_funcs
diff --git a/dlls/win32u/wrappers.c b/dlls/win32u/wrappers.c
index 2823eae9fe1..922e5a26b00 100644
--- a/dlls/win32u/wrappers.c
+++ b/dlls/win32u/wrappers.c
@@ -947,79 +947,8 @@ void CDECL __wine_set_display_driver( struct user_driver_funcs *funcs, UINT vers
return unix_funcs->set_display_driver( funcs, version );
}
-static void *get_user_proc( const char *name, BOOL force_load )
-{
- ANSI_STRING name_str;
- FARPROC proc = NULL;
- static HMODULE user32;
-
- if (!user32)
- {
- UNICODE_STRING str;
- NTSTATUS status;
- RtlInitUnicodeString( &str, L"user32.dll" );
- status = force_load
- ? LdrLoadDll( NULL, 0, &str, &user32 )
- : LdrGetDllHandle( NULL, 0, &str, &user32 );
- if (status < 0) return NULL;
- }
- RtlInitAnsiString( &name_str, name );
- LdrGetProcedureAddress( user32, &name_str, 0, (void**)&proc );
- return proc;
-}
-
-static HWND WINAPI call_GetDesktopWindow(void)
-{
- static HWND (WINAPI *pGetDesktopWindow)(void);
- if (!pGetDesktopWindow)
- pGetDesktopWindow = get_user_proc( "GetDesktopWindow", TRUE );
- return pGetDesktopWindow ? pGetDesktopWindow() : NULL;
-}
-
-static BOOL WINAPI call_GetWindowRect( HWND hwnd, LPRECT rect )
-{
- static BOOL (WINAPI *pGetWindowRect)( HWND hwnd, LPRECT rect );
- if (!pGetWindowRect)
- pGetWindowRect = get_user_proc( "GetWindowRect", FALSE );
- return pGetWindowRect && pGetWindowRect( hwnd, rect );
-}
-
-static BOOL WINAPI call_RedrawWindow( HWND hwnd, const RECT *rect, HRGN rgn, UINT flags )
-{
- static BOOL (WINAPI *pRedrawWindow)( HWND, const RECT*, HRGN, UINT );
- if (!pRedrawWindow)
- pRedrawWindow = get_user_proc( "RedrawWindow", FALSE );
- return pRedrawWindow && pRedrawWindow( hwnd, rect, rgn, flags );
-}
-
-static LRESULT WINAPI call_SendMessageTimeoutW( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam,
- UINT flags, UINT timeout, PDWORD_PTR res_ptr )
-{
- static LRESULT (WINAPI *pSendMessageTimeoutW)( HWND, UINT, WPARAM, LPARAM, UINT, UINT, PDWORD_PTR );
- if (!pSendMessageTimeoutW) pSendMessageTimeoutW = get_user_proc( "SendMessageTimeoutW", FALSE );
- if (!pSendMessageTimeoutW) return 0;
- return pSendMessageTimeoutW( hwnd, msg, wparam, lparam, flags, timeout, res_ptr );
-}
-
-static HWND WINAPI call_WindowFromDC( HDC hdc )
-{
- static HWND (WINAPI *pWindowFromDC)( HDC );
- if (!pWindowFromDC)
- pWindowFromDC = get_user_proc( "WindowFromDC", FALSE );
- return pWindowFromDC ? pWindowFromDC( hdc ) : NULL;
-}
-
-static const struct user_callbacks user_funcs =
-{
- call_GetDesktopWindow,
- call_GetWindowRect,
- call_RedrawWindow,
- call_SendMessageTimeoutW,
- call_WindowFromDC,
-};
-
extern void wrappers_init( unixlib_handle_t handle )
{
- const void *args = &user_funcs;
+ const void *args;
if (!__wine_unix_call( handle, 1, &args )) unix_funcs = args;
}
diff --git a/include/ntuser.h b/include/ntuser.h
index 6e4183b1e14..6e941c29c6d 100644
--- a/include/ntuser.h
+++ b/include/ntuser.h
@@ -85,6 +85,7 @@ enum
NtUserFlushWindowSurfaces,
NtUserGetDeskPattern,
NtUserIncrementKeyStateCounter,
+ NtUserSetCallbacks,
};
/* NtUserCallTwoParam codes, not compatible with Windows */
More information about the wine-cvs
mailing list