[USER32] Small fixes for messages carrying pointers
authorGiannis Adamopoulos <gadamopoulos@reactos.org>
Sat, 24 Feb 2018 18:26:24 +0000 (20:26 +0200)
committerGiannis Adamopoulos <gadamopoulos@reactos.org>
Mon, 26 Feb 2018 14:51:59 +0000 (16:51 +0200)
SendNotifyMessageW: It doesn't support messages with pointers so there is no need to call MsgiUMToKMMessage
SendMessageTimeoutW, SendMessageTimeoutA: These two do support marshaling pointers so they need to use MsgiUMToKMMessage.
This is actually a bug that happens only in the rare case where we send a WM_COPYDATA with a timeout.

win32ss/user/user32/windows/message.c

index d9b32d2..57f15d8 100644 (file)
@@ -2587,7 +2587,7 @@ SendMessageTimeoutA(
   UINT uTimeout,
   PDWORD_PTR lpdwResult)
 {
-  MSG AnsiMsg, UcMsg;
+  MSG AnsiMsg, UcMsg, KMMsg;
   LRESULT Result;
   DOSENDMESSAGE dsm;
 
@@ -2618,14 +2618,21 @@ SendMessageTimeoutA(
       return FALSE;
   }
 
+  if (!MsgiUMToKMMessage(&UcMsg, &KMMsg, FALSE))
+  {
+      MsgiAnsiToUnicodeCleanup(&UcMsg, &AnsiMsg);
+      return FALSE;
+  }
+
   Result = NtUserMessageCall( hWnd,
-                              UcMsg.message,
-                              UcMsg.wParam,
-                              UcMsg.lParam,
+                              KMMsg.message,
+                              KMMsg.wParam,
+                              KMMsg.lParam,
                              (ULONG_PTR)&dsm,
                               FNID_SENDMESSAGEWTOOPTION,
                               TRUE);
 
+  MsgiUMToKMCleanup(&UcMsg, &KMMsg);
   MsgiAnsiToUnicodeReply(&UcMsg, &AnsiMsg, &Result);
 
   if (lpdwResult) *lpdwResult = dsm.Result;
@@ -2652,6 +2659,7 @@ SendMessageTimeoutW(
 {
   LRESULT Result;
   DOSENDMESSAGE dsm;
+  MSG UMMsg, KMMsg;
 
   if ( Msg & ~WM_MAXIMUM || fuFlags & ~(SMTO_NOTIMEOUTIFNOTHUNG|SMTO_ABORTIFHUNG|SMTO_BLOCK))
   {
@@ -2667,14 +2675,28 @@ SendMessageTimeoutW(
   dsm.uTimeout = uTimeout;
   dsm.Result = 0;
 
+  UMMsg.hwnd = hWnd;
+  UMMsg.message = Msg;
+  UMMsg.wParam = wParam;
+  UMMsg.lParam = lParam;
+  UMMsg.time = 0;
+  UMMsg.pt.x = 0;
+  UMMsg.pt.y = 0;
+  if (! MsgiUMToKMMessage(&UMMsg, &KMMsg, TRUE))
+  {
+     return FALSE;
+  }
+
   Result = NtUserMessageCall( hWnd,
-                              Msg,
-                              wParam,
-                              lParam,
+                              KMMsg.message,
+                              KMMsg.wParam,
+                              KMMsg.lParam,
                              (ULONG_PTR)&dsm,
                               FNID_SENDMESSAGEWTOOPTION,
                               FALSE);
 
+  MsgiUMToKMCleanup(&UMMsg, &KMMsg);
+
   if (lpdwResult) *lpdwResult = dsm.Result;
 
   SPY_ExitMessage(SPY_RESULT_OK, hWnd, Msg, Result, wParam, lParam);
@@ -2731,7 +2753,6 @@ SendNotifyMessageW(
   WPARAM wParam,
   LPARAM lParam)
 {
-  MSG UMMsg, KMMsg;
   LRESULT Result;
 
   if (is_pointer_message(Msg))
@@ -2740,27 +2761,14 @@ SendNotifyMessageW(
      return FALSE;
   }
 
-  UMMsg.hwnd = hWnd;
-  UMMsg.message = Msg;
-  UMMsg.wParam = wParam;
-  UMMsg.lParam = lParam;
-  UMMsg.time = 0;
-  UMMsg.pt.x = 0;
-  UMMsg.pt.y = 0;
-  if (! MsgiUMToKMMessage(&UMMsg, &KMMsg, TRUE))
-  {
-     return FALSE;
-  }
   Result = NtUserMessageCall( hWnd,
-                              KMMsg.message,
-                              KMMsg.wParam,
-                              KMMsg.lParam,
+                              Msg,
+                              wParam,
+                              lParam,
                               0,
                               FNID_SENDNOTIFYMESSAGE,
                               FALSE);
 
-  MsgiUMToKMCleanup(&UMMsg, &KMMsg);
-
   return Result;
 }