Jacek Caban : win32u: Use NtUserCallMessage for passing packed winproc result.

Alexandre Julliard julliard at winehq.org
Sat Aug 13 14:19:16 CDT 2022


Module: wine
Branch: master
Commit: 40dbc84913a7767b7d7db1b93811e19a41f55c8d
URL:    https://gitlab.winehq.org/wine/wine/-/commit/40dbc84913a7767b7d7db1b93811e19a41f55c8d

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Aug 12 13:01:38 2022 +0200

win32u: Use NtUserCallMessage for passing packed winproc result.

---

 dlls/user32/message.c        |  2 +-
 dlls/user32/winproc.c        |  9 +++------
 dlls/win32u/message.c        | 39 +++++++++++++++++++++++++++++++--------
 dlls/win32u/sysparams.c      |  6 +++---
 dlls/win32u/win32u_private.h |  2 +-
 include/ntuser.h             | 13 +++++++------
 6 files changed, 46 insertions(+), 25 deletions(-)

diff --git a/dlls/user32/message.c b/dlls/user32/message.c
index 2cbdd761fe9..f6431e0c28a 100644
--- a/dlls/user32/message.c
+++ b/dlls/user32/message.c
@@ -700,7 +700,7 @@ BOOL WINAPI SendMessageCallbackW( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpa
  */
 BOOL WINAPI ReplyMessage( LRESULT result )
 {
-    return NtUserReplyMessage( result, NULL );
+    return NtUserReplyMessage( result );
 }
 
 
diff --git a/dlls/user32/winproc.c b/dlls/user32/winproc.c
index cc59a290ca5..2c0aaf03da5 100644
--- a/dlls/user32/winproc.c
+++ b/dlls/user32/winproc.c
@@ -1236,7 +1236,6 @@ BOOL WINAPI User32CallWindowProc( struct win_proc_params *params, ULONG size )
         char stack_buffer[128];
         void *buffer;
         LRESULT result;
-        MSG msg;
 
         if (size > sizeof(*params))
         {
@@ -1253,13 +1252,11 @@ BOOL WINAPI User32CallWindowProc( struct win_proc_params *params, ULONG size )
             return 0;
         params->result = &result;
 
-        msg.hwnd    = params->hwnd;
-        msg.message = params->msg;
-        msg.wParam  = params->wparam;
-        msg.lParam  = params->lparam;
+
         dispatch_win_proc_params( params );
 
-        NtUserReplyMessage( result, &msg );
+        NtUserMessageCall( params->hwnd, params->msg, params->wparam, params->lparam,
+                           (void *)result, NtUserWinProcResult, FALSE );
         if (buffer != stack_buffer && buffer != params + 1)
             HeapFree( GetProcessHeap(), 0, buffer );
     }
diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c
index 746238bfc5c..6506a201559 100644
--- a/dlls/win32u/message.c
+++ b/dlls/win32u/message.c
@@ -1069,18 +1069,37 @@ static void reply_message( struct received_message_info *info, LRESULT result, M
  *
  * Send a reply to a sent message and update thread receive info.
  */
-BOOL reply_message_result( LRESULT result, MSG *msg )
+BOOL reply_message_result( LRESULT result )
 {
     struct user_thread_info *thread_info = get_user_thread_info();
     struct received_message_info *info = thread_info->receive_info;
 
     if (!info) return FALSE;
-    reply_message( info, result, msg );
-    if (msg)
-    {
-        thread_info->receive_info = info->prev;
-        thread_info->client_info.receive_flags = info->prev ? info->prev->flags : ISMEX_NOSEND;
-    }
+    reply_message( info, result, NULL );
+    return TRUE;
+}
+
+/***********************************************************************
+ *           reply_winproc_result
+ *
+ * Send a reply to a sent message and update thread receive info.
+ */
+static BOOL reply_winproc_result( LRESULT result, HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam )
+{
+    struct user_thread_info *thread_info = get_user_thread_info();
+    struct received_message_info *info = thread_info->receive_info;
+    MSG msg;
+
+    if (!info) return FALSE;
+
+    msg.hwnd = hwnd;
+    msg.message = message;
+    msg.wParam = wparam;
+    msg.lParam = lparam;
+    reply_message( info, result, &msg );
+
+    thread_info->receive_info = info->prev;
+    thread_info->client_info.receive_flags = info->prev ? info->prev->flags : ISMEX_NOSEND;
     return TRUE;
 }
 
@@ -1877,7 +1896,8 @@ static int peek_message( MSG *msg, HWND hwnd, UINT first, UINT last, UINT flags,
                                    info.msg.lParam, (info.type != MSG_ASCII), FALSE,
                                    WMCHAR_MAP_RECVMESSAGE, needs_unpack, buffer, size );
         if (thread_info->receive_info == &info)
-            reply_message_result( result, &info.msg );
+            reply_winproc_result( result, info.msg.hwnd, info.msg.message,
+                                  info.msg.wParam, info.msg.lParam );
 
         /* if some PM_QS* flags were specified, only handle sent messages from now on */
         if (HIWORD(flags) && !changed_mask) flags = PM_QS_SENDMESSAGE | LOWORD(flags);
@@ -2965,6 +2985,9 @@ LRESULT WINAPI NtUserMessageCall( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpa
     case NtUserClipboardWindowProc:
         return user_driver->pClipboardWindowProc( hwnd, msg, wparam, lparam );
 
+    case NtUserWinProcResult:
+        return reply_winproc_result( (LRESULT)result_info, hwnd, msg, wparam, lparam );
+
     case NtUserGetDispatchParams:
         if (!hwnd) return FALSE;
         if (init_window_call_params( result_info, hwnd, msg, wparam, lparam,
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c
index 33ff35eb21a..99495349246 100644
--- a/dlls/win32u/sysparams.c
+++ b/dlls/win32u/sysparams.c
@@ -5027,6 +5027,9 @@ ULONG_PTR WINAPI NtUserCallOneParam( ULONG_PTR arg, ULONG code )
     case NtUserCallOneParam_MessageBeep:
         return message_beep( arg );
 
+    case NtUserCallOneParam_ReplyMessage:
+        return reply_message_result( arg );
+
     case NtUserCallOneParam_SetCaretBlinkTime:
         return set_caret_blink_time( arg );
 
@@ -5063,9 +5066,6 @@ ULONG_PTR WINAPI NtUserCallTwoParam( ULONG_PTR arg1, ULONG_PTR arg2, ULONG code
     case NtUserCallTwoParam_MonitorFromRect:
         return HandleToUlong( monitor_from_rect( (const RECT *)arg1, arg2, get_thread_dpi() ));
 
-    case NtUserCallTwoParam_ReplyMessage:
-        return reply_message_result( arg1, (MSG *)arg2 );
-
     case NtUserCallTwoParam_SetCaretPos:
         return set_caret_pos( arg1, arg2 );
 
diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h
index fbd6c4fccad..ba6479a5426 100644
--- a/dlls/win32u/win32u_private.h
+++ b/dlls/win32u/win32u_private.h
@@ -300,7 +300,7 @@ extern void track_mouse_menu_bar( HWND hwnd, INT ht, int x, int y ) DECLSPEC_HID
 
 /* message.c */
 extern BOOL kill_system_timer( HWND hwnd, UINT_PTR id ) DECLSPEC_HIDDEN;
-extern BOOL reply_message_result( LRESULT result, MSG *msg ) DECLSPEC_HIDDEN;
+extern BOOL reply_message_result( LRESULT result ) DECLSPEC_HIDDEN;
 extern NTSTATUS send_hardware_message( HWND hwnd, const INPUT *input, const RAWINPUT *rawinput,
                                        UINT flags ) DECLSPEC_HIDDEN;
 extern LRESULT send_internal_message_timeout( DWORD dest_pid, DWORD dest_tid, UINT msg, WPARAM wparam,
diff --git a/include/ntuser.h b/include/ntuser.h
index f5555056078..053f60b8d1e 100644
--- a/include/ntuser.h
+++ b/include/ntuser.h
@@ -300,6 +300,7 @@ enum
     NtUserSpyGetMsgName       = 0x3002,
     NtUserSpyEnter            = 0x0303,
     NtUserSpyExit             = 0x0304,
+    NtUserWinProcResult       = 0x0305,
 };
 
 /* NtUserThunkedMenuItemInfo codes */
@@ -941,6 +942,7 @@ enum
     NtUserCallOneParam_IsWindowRectFullScreen,
     NtUserCallOneParam_MessageBeep,
     NtUserCallOneParam_RealizePalette,
+    NtUserCallOneParam_ReplyMessage,
     NtUserCallOneParam_SetCaretBlinkTime,
     NtUserCallOneParam_SetProcessDefaultLayout,
     /* temporary exports */
@@ -1051,6 +1053,11 @@ static inline UINT NtUserRealizePalette( HDC hdc )
     return NtUserCallOneParam( HandleToUlong(hdc), NtUserCallOneParam_RealizePalette );
 }
 
+static inline BOOL NtUserReplyMessage( LRESULT result )
+{
+    return NtUserCallOneParam( result, NtUserCallOneParam_ReplyMessage );
+}
+
 static inline UINT NtUserSetProcessDefaultLayout( DWORD layout )
 {
     return NtUserCallOneParam( layout, NtUserCallOneParam_SetProcessDefaultLayout );
@@ -1063,7 +1070,6 @@ enum
     NtUserCallTwoParam_GetMonitorInfo,
     NtUserCallTwoParam_GetSystemMetricsForDpi,
     NtUserCallTwoParam_MonitorFromRect,
-    NtUserCallTwoParam_ReplyMessage,
     NtUserCallTwoParam_SetCaretPos,
     NtUserCallTwoParam_SetIconParam,
     NtUserCallTwoParam_UnhookWindowsHook,
@@ -1094,11 +1100,6 @@ static inline HMONITOR NtUserMonitorFromRect( const RECT *rect, DWORD flags )
     return UlongToHandle( ret );
 }
 
-static inline BOOL NtUserReplyMessage( LRESULT result, MSG *msg )
-{
-    return NtUserCallTwoParam( result, (UINT_PTR)msg, NtUserCallTwoParam_ReplyMessage );
-}
-
 static inline BOOL NtUserSetCaretPos( int x, int y )
 {
     return NtUserCallTwoParam( x, y, NtUserCallTwoParam_SetCaretPos );




More information about the wine-cvs mailing list