[YAROTOWS] Reintegrate the branch. For a brighter future.
[reactos.git] / reactos / subsystems / win32 / win32k / ntuser / clipboard.c
index 3d1f1af..4d79962 100644 (file)
@@ -7,7 +7,7 @@
  *                   Pablo Borobia <pborobia@gmail.com>
  */
 
-#include <w32k.h>
+#include <win32k.h>
 
 #define NDEBUG
 #include <debug.h>
@@ -17,9 +17,9 @@
 
 PTHREADINFO      ClipboardThread;
 PTHREADINFO      ClipboardOwnerThread;
-PWINDOW_OBJECT  ClipboardWindow;
-PWINDOW_OBJECT  ClipboardViewerWindow;
-PWINDOW_OBJECT  ClipboardOwnerWindow;
+PWND  ClipboardWindow;
+PWND  ClipboardViewerWindow;
+PWND  ClipboardOwnerWindow;
 BOOL            sendDrawClipboardMsg;
 BOOL            recentlySetClipboard;
 BOOL            delayedRender;
@@ -38,7 +38,7 @@ DWORD synthesizedDataSize;
 /* return the pointer to the prev window of the finded window,
    if NULL does not exists in the chain */
 PCLIPBOARDCHAINELEMENT FASTCALL
-IntIsWindowInChain(PWINDOW_OBJECT window)
+IntIsWindowInChain(PWND window)
 {
     PCLIPBOARDCHAINELEMENT wce = WindowsChain;
 
@@ -60,14 +60,14 @@ VOID FASTCALL printChain(VOID)
     PCLIPBOARDCHAINELEMENT wce2 = WindowsChain;
     while (wce2)
     {
-        DPRINT1("chain: %p\n", wce2->window->hSelf);
+        DPRINT1("chain: %p\n", wce2->window->head.h);
         wce2 = wce2->next;
     }
 }
 
 /* the new window always have to be the first in the chain */
 PCLIPBOARDCHAINELEMENT FASTCALL
-IntAddWindowToChain(PWINDOW_OBJECT window)
+IntAddWindowToChain(PWND window)
 {
     PCLIPBOARDCHAINELEMENT wce = NULL;
 
@@ -75,7 +75,7 @@ IntAddWindowToChain(PWINDOW_OBJECT window)
     {
         wce = WindowsChain;
 
-        wce = ExAllocatePool(PagedPool, sizeof(CLIPBOARDCHAINELEMENT));
+        wce = ExAllocatePoolWithTag(PagedPool, sizeof(CLIPBOARDCHAINELEMENT), USERTAG_CLIPBOARD);
         if (wce == NULL)
         {
             SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
@@ -96,7 +96,7 @@ exit_addChain:
 }
 
 PCLIPBOARDCHAINELEMENT FASTCALL
-IntRemoveWindowFromChain(PWINDOW_OBJECT window)
+IntRemoveWindowFromChain(PWND window)
 {
     PCLIPBOARDCHAINELEMENT wce = WindowsChain;
        PCLIPBOARDCHAINELEMENT *link = &WindowsChain;
@@ -167,7 +167,7 @@ intAddFormatedData(UINT format, HANDLE hData, DWORD size)
 {
     PCLIPBOARDELEMENT ce = NULL;
 
-    ce = ExAllocatePool(PagedPool, sizeof(CLIPBOARDELEMENT));
+    ce = ExAllocatePoolWithTag(PagedPool, sizeof(CLIPBOARDELEMENT), USERTAG_CLIPBOARD);
     if (ce == NULL)
     {
         SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
@@ -243,34 +243,62 @@ IntEmptyClipboardData(VOID)
 /*==============================================================*/
 
 HANDLE FASTCALL
-renderBITMAPfromDIB(LPBYTE hDIB)
+renderBITMAPfromDIB(LPBYTE pDIB)
 {
     HDC hdc;
     HBITMAP hbitmap;
-    unsigned int offset;
-    BITMAPINFOHEADER *ih;
+    PBITMAPINFO pBmi, pConvertedBmi = NULL;
+    NTSTATUS Status ;
+       UINT offset = 0; /* Stupid compiler */
+
+       pBmi = (BITMAPINFO*)pDIB;
 
     //hdc = UserGetDCEx(NULL, NULL, DCX_USESTYLE);
     hdc = UserGetDCEx(ClipboardWindow, NULL, DCX_USESTYLE);
 
-    ih = (BITMAPINFOHEADER *)hDIB;
-
-    offset = sizeof(BITMAPINFOHEADER) + ((ih->biBitCount <= 8) ? (sizeof(RGBQUAD) * (1 << ih->biBitCount)) : 0);
-
-    hbitmap = NtGdiCreateDIBitmapInternal(hdc,
-                                          ih->biWidth,
-                                          ih->biHeight,
-                                          CBM_INIT,
-                                          (LPBYTE)ih+offset,
-                                          (LPBITMAPINFO)ih,
-                                          DIB_RGB_COLORS,
-                                          ih->biBitCount,
-                                          ih->biSizeImage,
-                                          0,
-                                          0);
+    /* Probe it */
+    _SEH2_TRY
+    {
+        ProbeForRead(&pBmi->bmiHeader.biSize, sizeof(DWORD), 1);
+               ProbeForRead(pBmi, pBmi->bmiHeader.biSize, 1);
+               ProbeForRead(pBmi, DIB_BitmapInfoSize(pBmi, DIB_RGB_COLORS), 1);
+               pConvertedBmi = DIB_ConvertBitmapInfo(pBmi, DIB_RGB_COLORS);
+               if(!pConvertedBmi)
+               {
+                       Status = STATUS_INVALID_PARAMETER;
+               }
+               else
+               {
+                       offset = DIB_BitmapInfoSize((BITMAPINFO*)pBmi, DIB_RGB_COLORS);
+                       ProbeForRead(pDIB + offset, pConvertedBmi->bmiHeader.biSizeImage, 1);
+               }
+    }
+    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+    {
+        Status = _SEH2_GetExceptionCode();
+    }
+    _SEH2_END
+
+    if(!NT_SUCCESS(Status))
+    {
+        UserReleaseDC(ClipboardWindow, hdc, FALSE);
+        return NULL;
+    }
+
+    hbitmap = GreCreateDIBitmapInternal(hdc,
+                                        pConvertedBmi->bmiHeader.biWidth,
+                                        pConvertedBmi->bmiHeader.biHeight,
+                                        CBM_INIT,
+                                        pDIB+offset,
+                                        pConvertedBmi,
+                                        DIB_RGB_COLORS,
+                                        0,
+                                        0);
     //UserReleaseDC(NULL, hdc, FALSE);
     UserReleaseDC(ClipboardWindow, hdc, FALSE);
 
+       DIB_FreeConvertedBitmapInfo(pConvertedBmi, pBmi);
+
     return hbitmap;
 }
 
@@ -345,7 +373,7 @@ intIsClipboardOpenByMe(VOID)
 
 /* IntClipboardFreeWindow it's called when a window was destroyed */
 VOID FASTCALL
-IntClipboardFreeWindow(PWINDOW_OBJECT window)
+IntClipboardFreeWindow(PWND window)
 {
     /* called from co_UserFreeWindow in window.c */
     /* check if clipboard is not locked by this window, if yes, unlock it */
@@ -377,7 +405,7 @@ BOOL APIENTRY
 NtUserOpenClipboard(HWND hWnd, DWORD Unknown1)
 {
 
-    PWINDOW_OBJECT Window;
+    PWND Window;
     BOOL ret = FALSE;
 
     UserEnterExclusive();
@@ -392,7 +420,7 @@ NtUserOpenClipboard(HWND hWnd, DWORD Unknown1)
         {
             if  (ClipboardOwnerWindow)
             {
-                if (ClipboardOwnerWindow->hSelf == hWnd)
+                if (ClipboardOwnerWindow->head.h == hWnd)
                 {
                     ret = TRUE;
                 }
@@ -485,7 +513,7 @@ NtUserGetOpenClipboardWindow(VOID)
 
     if (ClipboardWindow)
     {
-        ret = ClipboardWindow->hSelf;
+        ret = ClipboardWindow->head.h;
     }
 
     UserLeave();
@@ -498,7 +526,7 @@ NtUserChangeClipboardChain(HWND hWndRemove, HWND hWndNewNext)
 {
     BOOL ret = FALSE;
     PCLIPBOARDCHAINELEMENT w = NULL;
-    PWINDOW_OBJECT removeWindow;
+    PWND removeWindow;
     UserEnterExclusive();
 
     removeWindow = UserGetWindowObject(hWndRemove);
@@ -521,9 +549,9 @@ NtUserChangeClipboardChain(HWND hWndRemove, HWND hWndNewNext)
         // then they do the chain
 
         /* WindowsChain->window may be NULL */
-        LPARAM lparam = WindowsChain->window == NULL ? 0 : (LPARAM)WindowsChain->window->hSelf;
-        DPRINT1("Message: WM_CHANGECBCHAIN to %p", WindowsChain->window->hSelf);
-        co_IntSendMessage(WindowsChain->window->hSelf, WM_CHANGECBCHAIN, (WPARAM)hWndRemove, lparam);
+        LPARAM lparam = WindowsChain->window == NULL ? 0 : (LPARAM)WindowsChain->window->head.h;
+        DPRINT1("Message: WM_CHANGECBCHAIN to %p", WindowsChain->window->head.h);
+        co_IntSendMessage(WindowsChain->window->head.h, WM_CHANGECBCHAIN, (WPARAM)hWndRemove, lparam);
     }
 
     UserLeave();
@@ -572,8 +600,8 @@ NtUserEmptyClipboard(VOID)
 
     if (ret && ClipboardOwnerWindow)
     {
-        DPRINT("Clipboard: WM_DESTROYCLIPBOARD to %p", ClipboardOwnerWindow->hSelf);
-        co_IntSendMessage( ClipboardOwnerWindow->hSelf, WM_DESTROYCLIPBOARD, 0, 0);
+        DPRINT("Clipboard: WM_DESTROYCLIPBOARD to %p", ClipboardOwnerWindow->head.h);
+        co_IntSendMessage( ClipboardOwnerWindow->head.h, WM_DESTROYCLIPBOARD, 0, 0);
     }
 
     UserLeave();
@@ -603,8 +631,8 @@ NtUserGetClipboardData(UINT uFormat, PVOID pBuffer)
                     /* tell owner what data needs to be rendered */
                     if (ClipboardOwnerWindow)
                     {
-                        ASSERT(ClipboardOwnerWindow->hSelf);
-                        co_IntSendMessage(ClipboardOwnerWindow->hSelf, WM_RENDERFORMAT, (WPARAM)uFormat, 0);
+                        ASSERT(ClipboardOwnerWindow->head.h);
+                        co_IntSendMessage(ClipboardOwnerWindow->head.h, WM_RENDERFORMAT, (WPARAM)uFormat, 0);
                         data = intIsFormatAvailable(uFormat);
                         ASSERT(data->size);
                         ret = (HANDLE)(ULONG_PTR)data->size;
@@ -754,7 +782,7 @@ NtUserGetClipboardOwner(VOID)
 
     if (ClipboardOwnerWindow)
     {
-        ret = ClipboardOwnerWindow->hSelf;
+        ret = ClipboardOwnerWindow->head.h;
     }
 
     UserLeave();
@@ -771,7 +799,7 @@ NtUserGetClipboardViewer(VOID)
 
     if (WindowsChain)
     {
-        ret = WindowsChain->window->hSelf;
+        ret = WindowsChain->window->head.h;
     }
 
     UserLeave();
@@ -889,7 +917,7 @@ NtUserSetClipboardData(UINT uFormat, HANDLE hMem, DWORD size)
 
             if (!canSinthesize(uFormat))
             {
-                hCBData = ExAllocatePool(PagedPool, size);
+                hCBData = ExAllocatePoolWithTag(PagedPool, size, USERTAG_CLIPBOARD);
                 memcpy(hCBData, hMem, size);
                 intAddFormatedData(uFormat, hCBData, size);
                 DPRINT1("Data stored\n");
@@ -949,7 +977,6 @@ NtUserSetClipboardData(UINT uFormat, HANDLE hMem, DWORD size)
                     // because pallette information may change
 
                     HDC hdc;
-                    INT ret;
                     BITMAP bm;
                     BITMAPINFO bi;
                     SURFACE *psurf;
@@ -975,14 +1002,14 @@ NtUserSetClipboardData(UINT uFormat, HANDLE hMem, DWORD size)
                     bi.bmiHeader.biYPelsPerMeter = 0;
                     bi.bmiHeader.biClrUsed = 0;
 
-                    ret = NtGdiGetDIBitsInternal(hdc, hMem, 0, bm.bmHeight,  NULL, &bi, DIB_RGB_COLORS, 0, 0);
+                    NtGdiGetDIBitsInternal(hdc, hMem, 0, bm.bmHeight,  NULL, &bi, DIB_RGB_COLORS, 0, 0);
 
                     size = bi.bmiHeader.biSizeImage + sizeof(BITMAPINFOHEADER);
 
-                    hCBData = ExAllocatePool(PagedPool, size);
+                    hCBData = ExAllocatePoolWithTag(PagedPool, size, USERTAG_CLIPBOARD);
                     memcpy(hCBData, &bi, sizeof(BITMAPINFOHEADER));
 
-                    ret = NtGdiGetDIBitsInternal(hdc, hMem, 0, bm.bmHeight, (LPBYTE)hCBData + sizeof(BITMAPINFOHEADER), &bi, DIB_RGB_COLORS, 0, 0);
+                    NtGdiGetDIBitsInternal(hdc, hMem, 0, bm.bmHeight, (LPBYTE)hCBData + sizeof(BITMAPINFOHEADER), &bi, DIB_RGB_COLORS, 0, 0);
 
                     UserReleaseDC(NULL, hdc, FALSE);
 
@@ -1038,7 +1065,7 @@ NtUserSetClipboardViewer(HWND hWndNewViewer)
 {
     HWND ret = NULL;
     PCLIPBOARDCHAINELEMENT newWC = NULL;
-    PWINDOW_OBJECT window;
+    PWND window;
 
     UserEnterExclusive();
 
@@ -1054,7 +1081,7 @@ NtUserSetClipboardViewer(HWND hWndNewViewer)
                 if (newWC->next)
                 {
                     // return the next HWND available window in the chain
-                    ret = newWC->next->window->hSelf;
+                    ret = newWC->next->window->head.h;
                 }
             }
         }
@@ -1133,7 +1160,7 @@ IntIncrementSequenceNumber(VOID)
     PWINSTATION_OBJECT WinStaObj;
 
     pti = PsGetCurrentThreadWin32Thread();
-    WinStaObj = pti->Desktop->WindowStation;
+    WinStaObj = pti->rpdesk->rpwinstaParent;
 
     WinStaObj->Clipboard->ClipboardSequenceNumber++;
 }