[User32] Support WM_COPYGLOBALDATA
authorjimtabor <james.tabor@reactos.org>
Wed, 13 Mar 2019 17:16:52 +0000 (12:16 -0500)
committerjimtabor <james.tabor@reactos.org>
Wed, 13 Mar 2019 17:16:52 +0000 (12:16 -0500)
Implement support for WM_COPYGLOBALDATA. Needs more tests.

Tested DropTest from CORE-15836.

win32ss/user/user32/windows/defwnd.c
win32ss/user/user32/windows/message.c

index ad2bbbb..baa31e7 100644 (file)
@@ -748,6 +748,12 @@ User32DefWindowProc(HWND hWnd,
             break;
         }
 
+        case WM_COPYGLOBALDATA:
+        {
+            TRACE("WM_COPYGLOBALDATA hGlobal %p Size %d Flags 0x%x\n",lParam,wParam,GlobalFlags((HGLOBAL)lParam));
+            return lParam;
+        }
+
 /* Move to Win32k !*/
         case WM_SHOWWINDOW:
             if (!lParam) break; // Call when it is necessary.
index 57f15d8..a96b799 100644 (file)
@@ -392,6 +392,13 @@ MsgiUMToKMMessage(PMSG UMMsg, PMSG KMMsg, BOOL Posted)
         }
         break;
 
+      case WM_COPYGLOBALDATA:
+        {
+           KMMsg->lParam = (LPARAM)GlobalLock((HGLOBAL)UMMsg->lParam);;
+           TRACE("WM_COPYGLOBALDATA get data ptr %p\n",KMMsg->lParam);
+        }
+        break;
+
       default:
         break;
     }
@@ -408,6 +415,11 @@ MsgiUMToKMCleanup(PMSG UMMsg, PMSG KMMsg)
       case WM_COPYDATA:
         HeapFree(GetProcessHeap(), 0, (LPVOID) KMMsg->lParam);
         break;
+      case WM_COPYGLOBALDATA:
+        TRACE("WM_COPYGLOBALDATA cleanup return\n");
+        GlobalUnlock((HGLOBAL)UMMsg->lParam);
+        GlobalFree((HGLOBAL)UMMsg->lParam);
+        break;
       default:
         break;
     }
@@ -452,6 +464,18 @@ MsgiKMToUMMessage(PMSG KMMsg, PMSG UMMsg)
         }
         break;
 
+      case WM_COPYGLOBALDATA:
+        {
+           PVOID Data;
+           HGLOBAL hGlobal = GlobalAlloc(GHND | GMEM_SHARE, KMMsg->wParam);
+           Data = GlobalLock(hGlobal);
+           if (Data) RtlCopyMemory(Data, (PVOID)KMMsg->lParam, KMMsg->wParam);
+           GlobalUnlock(hGlobal);
+           TRACE("WM_COPYGLOBALDATA to User hGlobal %p\n",hGlobal);
+           UMMsg->lParam = (LPARAM)hGlobal;
+        }
+        break;
+
       default:
         break;
     }
@@ -465,7 +489,7 @@ MsgiKMToUMCleanup(PMSG KMMsg, PMSG UMMsg)
   switch (KMMsg->message)
     {
       case WM_DDE_EXECUTE:
-#ifdef TODO
+#ifdef TODO // Kept as historic.
         HeapFree(GetProcessHeap(), 0, (LPVOID) KMMsg->lParam);
         GlobalUnlock((HGLOBAL) UMMsg->lParam);
 #endif
@@ -2935,6 +2959,11 @@ User32CallWindowProcFromKernel(PVOID Arguments, ULONG ArgumentLength)
             TRACE("WM_CREATE CB %p lParam %p\n",CallbackArgs, KMMsg.lParam);
             break;
         }
+        case WM_NCCREATE:
+        {
+            TRACE("WM_NCCREATE CB %p lParam %p\n",CallbackArgs, KMMsg.lParam);
+            break;
+        }
         case WM_SYSTIMER:
         {
             TRACE("WM_SYSTIMER %p\n",KMMsg.hwnd);