Index: /trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxClipboard.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxClipboard.cpp	(revision 26741)
+++ /trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxClipboard.cpp	(revision 26742)
@@ -6,5 +6,5 @@
 
 /*
- * Copyright (C) 2006-2007 Sun Microsystems, Inc.
+ * Copyright (C) 2006-2010 Sun Microsystems, Inc.
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -22,7 +22,7 @@
 
 #include "VBoxTray.h"
+#include "helpers.h"
+
 #include <VBox/HostServices/VBoxClipboardSvc.h>
-#include "helpers.h"
-#include <iprt/asm.h>
 #include <strsafe.h>
 
@@ -46,226 +46,25 @@
 } VBOXCLIPBOARDCONTEXT;
 
-
 static char gachWindowClassName[] = "VBoxSharedClipboardClass";
 
 
-#define VBOX_INIT_CALL(__a, __b, __c) do {                                                             \
-    (__a)->hdr.result      = VINF_SUCCESS;                                                             \
-    (__a)->hdr.u32ClientID = (__c)->u32ClientID;                                                       \
-    (__a)->hdr.u32Function = (__b);                                                                    \
-    (__a)->hdr.cParms      = (sizeof (*(__a)) - sizeof ((__a)->hdr)) / sizeof (HGCMFunctionParameter); \
-} while (0)
-
-
-//static bool vboxClipboardIsSameAsLastSent (VBOXCLIPBOARDCONTEXT *pCtx, uint32_t u32Format,
-//                                           void *pv, uint32_t cb)
-//{
-//    uint64_t u64CRC = RTCrc64 (pv, cb);
-//
-//    if (   pCtx->u32LastSentFormat == u32Format
-//        && pCtx->u64LastSentCRC64 == u64CRC)
-//    {
-//        return true;
-//    }
-//
-//    pCtx->u64LastSentCRC64 = u64CRC;
-//    pCtx->u32LastSentFormat = u32Format;
-//
-//    return false;
-//}
-
-static int vboxClipboardConnect (VBOXCLIPBOARDCONTEXT *pCtx)
-{
-    VBoxGuestHGCMConnectInfo info;
-
-    RT_ZERO (info);
-
-    info.Loc.type = VMMDevHGCMLoc_LocalHost_Existing;
-
-    memcpy (info.Loc.u.host.achName, "VBoxSharedClipboard", sizeof ("VBoxSharedClipboard"));
-
-    DWORD cbReturned;
-
-    if (DeviceIoControl (pCtx->pEnv->hDriver,
-                         VBOXGUEST_IOCTL_HGCM_CONNECT,
-                         &info, sizeof (info),
-                         &info, sizeof (info),
-                         &cbReturned,
-                         NULL))
-    {
-        if (info.result == VINF_SUCCESS)
-        {
-            pCtx->u32ClientID = info.u32ClientID;
-        }
+static int vboxClipboardChanged(VBOXCLIPBOARDCONTEXT *pCtx)
+{
+    AssertPtr(pCtx);
+
+    /* Query list of available formats and report to host. */
+    int rc = VINF_SUCCESS;
+    if (FALSE == OpenClipboard(pCtx->hwnd))
+    {
+        rc = RTErrConvertFromWin32(GetLastError());
     }
     else
     {
-        info.result = VERR_NOT_SUPPORTED;
-    }
-
-    return info.result;
-}
-
-static void vboxClipboardDisconnect (VBOXCLIPBOARDCONTEXT *pCtx)
-{
-    if (pCtx->u32ClientID == 0)
-    {
-        return;
-    }
-
-    VBoxGuestHGCMDisconnectInfo info;
-
-    RT_ZERO (info);
-
-    info.u32ClientID = pCtx->u32ClientID;
-
-    DWORD cbReturned;
-
-    DeviceIoControl (pCtx->pEnv->hDriver,
-                     VBOXGUEST_IOCTL_HGCM_DISCONNECT,
-                     &info, sizeof (info),
-                     &info, sizeof (info),
-                     &cbReturned,
-                     NULL);
-
-    return;
-}
-
-
-static void VBoxHGCMParmUInt32Set (HGCMFunctionParameter *pParm, uint32_t u32)
-{
-    pParm->type = VMMDevHGCMParmType_32bit;
-    pParm->u.value32 = u32;
-}
-
-static int VBoxHGCMParmUInt32Get (HGCMFunctionParameter *pParm, uint32_t *pu32)
-{
-    if (pParm->type == VMMDevHGCMParmType_32bit)
-    {
-        *pu32 = pParm->u.value32;
-        return VINF_SUCCESS;
-    }
-
-    return VERR_INVALID_PARAMETER;
-}
-
-static void VBoxHGCMParmPtrSet (HGCMFunctionParameter *pParm, void *pv, uint32_t cb)
-{
-    pParm->type                    = VMMDevHGCMParmType_LinAddr;
-    pParm->u.Pointer.size          = cb;
-    pParm->u.Pointer.u.linearAddr  = (uintptr_t)pv;
-}
-
-
-static int vboxCall (HANDLE hDriver, void *pvData, unsigned cbData)
-{
-    DWORD cbReturned;
-
-    if (DeviceIoControl (hDriver,
-                         VBOXGUEST_IOCTL_HGCM_CALL(cbData),
-                         pvData, cbData,
-                         pvData, cbData,
-                         &cbReturned,
-                         NULL))
-    {
-        return VINF_SUCCESS;
-    }
-
-    return VERR_NOT_SUPPORTED;
-}
-
-static int vboxClipboardReportFormats (VBOXCLIPBOARDCONTEXT *pCtx, uint32_t u32Formats)
-{
-    VBoxClipboardFormats parms;
-
-    VBOX_INIT_CALL(&parms, VBOX_SHARED_CLIPBOARD_FN_FORMATS, pCtx);
-
-    VBoxHGCMParmUInt32Set (&parms.formats, u32Formats);
-
-    int rc = vboxCall (pCtx->pEnv->hDriver, &parms, sizeof (parms));
-
-    if (RT_SUCCESS (rc))
-    {
-        rc = parms.hdr.result;
-    }
-
-    return rc;
-}
-
-static int vboxClipboardReadData (VBOXCLIPBOARDCONTEXT *pCtx, uint32_t u32Format, void *pv, uint32_t cb, uint32_t *pcbActual)
-{
-    VBoxClipboardReadData parms;
-
-    VBOX_INIT_CALL(&parms, VBOX_SHARED_CLIPBOARD_FN_READ_DATA, pCtx);
-
-    VBoxHGCMParmUInt32Set (&parms.format, u32Format);
-    VBoxHGCMParmPtrSet    (&parms.ptr, pv, cb);
-    VBoxHGCMParmUInt32Set (&parms.size, 0);
-
-    int rc = vboxCall (pCtx->pEnv->hDriver, &parms, sizeof (parms));
-
-    if (RT_SUCCESS (rc))
-    {
-        rc = parms.hdr.result;
-
-        if (RT_SUCCESS (rc))
-        {
-            uint32_t u32Size;
-
-            rc = VBoxHGCMParmUInt32Get (&parms.size, &u32Size);
-
-            Log (("vboxClipboardReadData: actual size = %d, rc = %d\n", u32Size, rc));
-
-            if (RT_SUCCESS (rc))
-            {
-                if (pcbActual)
-                {
-                    *pcbActual = u32Size;
-                }
-            }
-        }
-    }
-
-    return rc;
-}
-
-static int vboxClipboardWriteData (VBOXCLIPBOARDCONTEXT *pCtx, uint32_t u32Format,
-                                  void *pv, uint32_t cb)
-{
-//    if (vboxClipboardIsSameAsLastSent (pCtx, u32Format, pv, cb))
-//    {
-//        Log (("vboxClipboardWriteData: The data to be sent are the same as the last sent.\n"));
-//        return VINF_SUCCESS;
-//    }
-
-    VBoxClipboardWriteData parms;
-
-    VBOX_INIT_CALL(&parms, VBOX_SHARED_CLIPBOARD_FN_WRITE_DATA, pCtx);
-
-    VBoxHGCMParmUInt32Set (&parms.format, u32Format);
-    VBoxHGCMParmPtrSet (&parms.ptr, pv, cb);
-
-    int rc = vboxCall (pCtx->pEnv->hDriver, &parms, sizeof (parms));
-
-    if (RT_SUCCESS (rc))
-    {
-        rc = parms.hdr.result;
-    }
-
-    return rc;
-}
-
-static void vboxClipboardChanged (VBOXCLIPBOARDCONTEXT *pCtx)
-{
-    /* Query list of available formats and report to host. */
-    if (OpenClipboard (pCtx->hwnd))
-    {
         uint32_t u32Formats = 0;
-
         UINT format = 0;
 
         while ((format = EnumClipboardFormats (format)) != 0)
         {
-            Log (("vboxClipboardChanged: format 0x%08X\n", format));
+            Log (("vboxClipboardChanged: format = 0x%08X\n", format));
             switch (format)
             {
@@ -286,5 +85,4 @@
 
                         int cActual = GetClipboardFormatName(format, szFormatName, sizeof(szFormatName)/sizeof (TCHAR));
-
                         if (cActual)
                         {
@@ -300,7 +98,7 @@
 
         CloseClipboard ();
-
-        vboxClipboardReportFormats (pCtx, u32Formats);
-    }
+        rc = VbglR3ClipboardReportFormats(pCtx->u32ClientID, u32Formats);
+    }
+    return rc;
 }
 
@@ -330,5 +128,5 @@
                 {
                     /* Pass the message further. */
-                    rc = SendMessage (pCtx->hwndNextInChain, WM_CHANGECBCHAIN, wParam, lParam);
+                    rc = SendMessage(pCtx->hwndNextInChain, WM_CHANGECBCHAIN, wParam, lParam);
                 }
             }
@@ -342,9 +140,9 @@
             {
                 /* Clipboard was updated by another application. */
-                vboxClipboardChanged (pCtx);
+                vboxClipboardChanged(pCtx); /** @todo r=andy Check for return code! */
             }
 
             /* Pass the message to next windows in the clipboard chain. */
-            rc = SendMessage (pCtx->hwndNextInChain, msg, wParam, lParam);
+            rc = SendMessage(pCtx->hwndNextInChain, msg, wParam, lParam);
         } break;
 
@@ -358,9 +156,7 @@
             /* Insert the requested clipboard format data into the clipboard. */
             uint32_t u32Format = 0;
-
             UINT format = (UINT)wParam;
 
-            Log (("vboxClipboardProcessMsg: WM_RENDERFORMAT, format %x\n", format));
-
+            Log (("vboxClipboardProcessMsg: WM_RENDERFORMAT, format = %x\n", format));
             switch (format)
             {
@@ -394,27 +190,28 @@
             {
                 /* Unsupported clipboard format is requested. */
-                EmptyClipboard ();
+                Log(("vboxClipboardProcessMsg: Unsupported clipboard format requested: %ld\n", u32Format));
+                EmptyClipboard();
             }
             else
             {
-                const uint32_t cbPrealloc = 4096;
+                const uint32_t cbPrealloc = 4096; /* @todo r=andy Make it dynamic for supporting larger text buffers! */
                 uint32_t cb = 0;
 
                 /* Preallocate a buffer, most of small text transfers will fit into it. */
-                HANDLE hMem = GlobalAlloc (GMEM_DDESHARE | GMEM_MOVEABLE, cbPrealloc);
-                Log(("hMem %p\n", hMem));
+                HANDLE hMem = GlobalAlloc(GMEM_DDESHARE | GMEM_MOVEABLE, cbPrealloc);
+                Log(("vboxClipboardProcessMsg: Preallocated handle hMem = %p\n", hMem));
 
                 if (hMem)
                 {
-                    void *pMem = GlobalLock (hMem);
-                    Log(("pMem %p, GlobalSize %d\n", pMem, GlobalSize (hMem)));
+                    void *pMem = GlobalLock(hMem);
+                    Log(("vboxClipboardProcessMsg: Locked pMem = %p, GlobalSize = %ld\n", pMem, GlobalSize(hMem)));
 
                     if (pMem)
                     {
                         /* Read the host data to the preallocated buffer. */
-                        int vboxrc = vboxClipboardReadData (pCtx, u32Format, pMem, cbPrealloc, &cb);
-                        Log(("vboxClipboardReadData vboxrc %d\n",  vboxrc));
-
-                        if (RT_SUCCESS (vboxrc))
+                        int vboxrc = VbglR3ClipboardReadData(pCtx->u32ClientID, u32Format, pMem, cbPrealloc, &cb);
+                        Log(("vboxClipboardProcessMsg: VbglR3ClipboardReadData returned with rc = %Rrc\n",  vboxrc));
+
+                        if (RT_SUCCESS(vboxrc))
                         {
                             if (cb == 0)
@@ -424,20 +221,20 @@
                                  * the clipboard empty code path.
                                  */
-                                GlobalUnlock (hMem);
-                                GlobalFree (hMem);
+                                GlobalUnlock(hMem);
+                                GlobalFree(hMem);
                                 hMem = NULL;
                             }
                             else if (cb > cbPrealloc)
                             {
-                                GlobalUnlock (hMem);
+                                GlobalUnlock(hMem);
 
                                 /* The preallocated buffer is too small, adjust the size. */
-                                hMem = GlobalReAlloc (hMem, cb, 0);
-                                Log(("hMem %p\n", hMem));
+                                hMem = GlobalReAlloc(hMem, cb, 0);
+                                Log(("vboxClipboardProcessMsg: Reallocated hMem = %p\n", hMem));
 
                                 if (hMem)
                                 {
-                                    pMem = GlobalLock (hMem);
-                                    Log(("pMem %p, GlobalSize %d\n", pMem, GlobalSize (hMem)));
+                                    pMem = GlobalLock(hMem);
+                                    Log(("vboxClipboardProcessMsg: Locked pMem = %p, GlobalSize = %ld\n", pMem, GlobalSize(hMem)));
 
                                     if (pMem)
@@ -445,6 +242,6 @@
                                         /* Read the host data to the preallocated buffer. */
                                         uint32_t cbNew = 0;
-                                        vboxrc = vboxClipboardReadData (pCtx, u32Format, pMem, cb, &cbNew);
-                                        Log(("vboxClipboardReadData vboxrc %d, cb = %d, cbNew = %d\n", vboxrc, cb, cbNew));
+                                        vboxrc = VbglR3ClipboardReadData(pCtx->u32ClientID, u32Format, pMem, cb, &cbNew);
+                                        Log(("VbglR3ClipboardReadData returned with rc = %Rrc, cb = %d, cbNew = %d\n", vboxrc, cb, cbNew));
 
                                         if (RT_SUCCESS (vboxrc) && cbNew <= cb)
@@ -454,6 +251,6 @@
                                         else
                                         {
-                                            GlobalUnlock (hMem);
-                                            GlobalFree (hMem);
+                                            GlobalUnlock(hMem);
+                                            GlobalFree(hMem);
                                             hMem = NULL;
                                         }
@@ -461,5 +258,5 @@
                                     else
                                     {
-                                        GlobalFree (hMem);
+                                        GlobalFree(hMem);
                                         hMem = NULL;
                                     }
@@ -476,10 +273,10 @@
                                 {
                                     size_t cbActual = 0;
-                                    HRESULT hrc = StringCbLengthW ((LPWSTR)pMem, cb, &cbActual);
+                                    HRESULT hrc = StringCbLengthW((LPWSTR)pMem, cb, &cbActual);
                                     if (FAILED (hrc))
                                     {
                                         /* Discard invalid data. */
-                                        GlobalUnlock (hMem);
-                                        GlobalFree (hMem);
+                                        GlobalUnlock(hMem);
+                                        GlobalFree(hMem);
                                         hMem = NULL;
                                     }
@@ -496,8 +293,8 @@
                             if (hMem)
                             {
-                                GlobalUnlock (hMem);
-
-                                hMem = GlobalReAlloc (hMem, cb, 0);
-                                Log(("hMem %p\n", hMem));
+                                GlobalUnlock(hMem);
+
+                                hMem = GlobalReAlloc(hMem, cb, 0);
+                                Log(("vboxClipboardProcessMsg: Reallocated hMem = %p\n", hMem));
 
                                 if (hMem)
@@ -507,5 +304,5 @@
                                      */
                                     HANDLE hClip = SetClipboardData (format, hMem);
-                                    Log(("WM_RENDERFORMAT hClip %p\n", hClip));
+                                    Log(("vboxClipboardProcessMsg: WM_RENDERFORMAT hClip = %p\n", hClip));
 
                                     if (hClip)
@@ -522,5 +319,5 @@
                         if (hMem)
                         {
-                            GlobalUnlock (hMem);
+                            GlobalUnlock(hMem);
                         }
                     }
@@ -528,10 +325,10 @@
                     if (hMem)
                     {
-                        GlobalFree (hMem);
+                        GlobalFree(hMem);
                     }
                 }
 
                 /* Something went wrong. */
-                EmptyClipboard ();
+                EmptyClipboard();
             }
         } break;
@@ -545,5 +342,4 @@
             {
                 EmptyClipboard();
-
                 CloseClipboard();
             }
@@ -555,5 +351,9 @@
             uint32_t u32Formats = (uint32_t)lParam;
 
-            if (OpenClipboard (hwnd))
+            if (FALSE == OpenClipboard (hwnd))
+            {
+                Log(("vboxClipboardProcessMsg: WM_USER: Failed to open clipboard! Last error = %ld\n", GetLastError()));
+            }
+            else
             {
                 EmptyClipboard();
@@ -563,14 +363,12 @@
                 if (u32Formats & VBOX_SHARED_CLIPBOARD_FMT_UNICODETEXT)
                 {
-                    Log(("window proc WM_USER: VBOX_SHARED_CLIPBOARD_FMT_UNICODETEXT\n"));
-
-                    hClip = SetClipboardData (CF_UNICODETEXT, NULL);
+                    Log(("vboxClipboardProcessMsg: WM_USER: VBOX_SHARED_CLIPBOARD_FMT_UNICODETEXT\n"));
+                    hClip = SetClipboardData(CF_UNICODETEXT, NULL);
                 }
 
                 if (u32Formats & VBOX_SHARED_CLIPBOARD_FMT_BITMAP)
                 {
-                    Log(("window proc WM_USER: VBOX_SHARED_CLIPBOARD_FMT_BITMAP\n"));
-
-                    hClip = SetClipboardData (CF_DIB, NULL);
+                    Log(("vboxClipboardProcessMsg: WM_USER: VBOX_SHARED_CLIPBOARD_FMT_BITMAP\n"));
+                    hClip = SetClipboardData(CF_DIB, NULL);
                 }
 
@@ -578,18 +376,13 @@
                 {
                     UINT format = RegisterClipboardFormat ("HTML Format");
-                    Log(("window proc WM_USER: VBOX_SHARED_CLIPBOARD_FMT_HTML 0x%04X\n", format));
+                    Log(("vboxClipboardProcessMsg: WM_USER: VBOX_SHARED_CLIPBOARD_FMT_HTML 0x%04X\n", format));
                     if (format != 0)
                     {
-                        hClip = SetClipboardData (format, NULL);
+                        hClip = SetClipboardData(format, NULL);
                     }
                 }
 
                 CloseClipboard();
-
-                Log(("window proc WM_USER: hClip %p, err %d\n", hClip, GetLastError ()));
-            }
-            else
-            {
-                Log(("window proc WM_USER: failed to open clipboard\n"));
+                Log(("vboxClipboardProcessMsg: WM_USER: hClip = %p, err = %ld\n", hClip, GetLastError ()));
             }
         } break;
@@ -602,21 +395,22 @@
             HANDLE hClip = NULL;
 
-            if (OpenClipboard (hwnd))
-            {
+            if (FALSE == OpenClipboard(hwnd))
+            {
+            }
+            else
+            {
+                int vboxrc;
                 if (u32Formats & VBOX_SHARED_CLIPBOARD_FMT_BITMAP)
                 {
-                    hClip = GetClipboardData (CF_DIB);
+                    hClip = GetClipboardData(CF_DIB);
 
                     if (hClip != NULL)
                     {
-                        LPVOID lp = GlobalLock (hClip);
-
+                        LPVOID lp = GlobalLock(hClip);
                         if (lp != NULL)
                         {
-                            Log(("CF_DIB\n"));
-
-                            vboxClipboardWriteData (pCtx, VBOX_SHARED_CLIPBOARD_FMT_BITMAP,
-                                                    lp, GlobalSize (hClip));
-
+                            Log(("vboxClipboardProcessMsg: WM_USER + 1: CF_DIB\n"));
+                            vboxrc = VbglR3ClipboardWriteData(pCtx->u32ClientID, VBOX_SHARED_CLIPBOARD_FMT_BITMAP,
+                                                              lp, GlobalSize(hClip));
                             GlobalUnlock(hClip);
                         }
@@ -637,9 +431,7 @@
                         if (uniString != NULL)
                         {
-                            Log(("CF_UNICODETEXT\n"));
-
-                            vboxClipboardWriteData (pCtx, VBOX_SHARED_CLIPBOARD_FMT_UNICODETEXT,
-                                                    uniString, (lstrlenW (uniString) + 1) * 2);
-
+                            Log(("vboxClipboardProcessMsg: WM_USER + 1: CF_UNICODETEXT\n"));
+                            vboxrc = VbglR3ClipboardWriteData(pCtx->u32ClientID, VBOX_SHARED_CLIPBOARD_FMT_UNICODETEXT,
+                                                              uniString, (lstrlenW(uniString) + 1) * 2);
                             GlobalUnlock(hClip);
                         }
@@ -653,9 +445,7 @@
                 {
                     UINT format = RegisterClipboardFormat ("HTML Format");
-
                     if (format != 0)
                     {
                         hClip = GetClipboardData (format);
-
                         if (hClip != NULL)
                         {
@@ -664,9 +454,7 @@
                             if (lp != NULL)
                             {
-                                Log(("CF_HTML\n"));
-
-                                vboxClipboardWriteData (pCtx, VBOX_SHARED_CLIPBOARD_FMT_HTML,
-                                                        lp, GlobalSize (hClip));
-
+                                Log(("vboxClipboardProcessMsg: WM_USER + 1: CF_HTML\n"));
+                                vboxrc = VbglR3ClipboardWriteData(pCtx->u32ClientID, VBOX_SHARED_CLIPBOARD_FMT_HTML,
+                                                                  lp, GlobalSize(hClip));
                                 GlobalUnlock(hClip);
                             }
@@ -685,5 +473,5 @@
             {
                 /* Requested clipboard format is not available, send empty data. */
-                vboxClipboardWriteData (pCtx, 0, NULL, 0);
+                VbglR3ClipboardWriteData(pCtx->u32ClientID, 0, NULL, 0);
             }
         } break;
@@ -702,6 +490,4 @@
 static int vboxClipboardInit (VBOXCLIPBOARDCONTEXT *pCtx)
 {
-    int rc = VINF_SUCCESS;
-
     /* Register the Window Class. */
     WNDCLASS wc;
@@ -720,4 +506,5 @@
     pCtx->atomWindowClass = RegisterClass (&wc);
 
+    int rc = VINF_SUCCESS;
     if (pCtx->atomWindowClass == 0)
     {
@@ -745,4 +532,5 @@
     }
 
+    Log(("vboxClipboardInit returned with rc = %Rrc\n", rc));
     return rc;
 }
@@ -775,10 +563,7 @@
 }
 
-int VBoxClipboardInit (const VBOXSERVICEENV *pEnv, void **ppInstance, bool *pfStartThread)
-{
-    int rc = VINF_SUCCESS;
-
+int VBoxClipboardInit(const VBOXSERVICEENV *pEnv, void **ppInstance, bool *pfStartThread)
+{
     Log (("VboxClipboardInit\n"));
-
     if (gCtx.pEnv)
     {
@@ -788,15 +573,10 @@
 
     RT_ZERO (gCtx);
-
     gCtx.pEnv = pEnv;
 
-    rc = vboxClipboardConnect (&gCtx);
-
+    int rc = VbglR3ClipboardConnect(&gCtx.u32ClientID);
     if (RT_SUCCESS (rc))
     {
-        rc = vboxClipboardInit (&gCtx);
-
-        Log (("vboxClipboardInit: rc = %d\n", rc));
-
+        rc = vboxClipboardInit(&gCtx);
         if (RT_SUCCESS (rc))
         {
@@ -804,154 +584,93 @@
             *pfStartThread = true;
         }
+        else
+        {
+            VbglR3ClipboardDisconnect(gCtx.u32ClientID);
+        }
     }
 
     if (RT_SUCCESS (rc))
-    {
         *ppInstance = &gCtx;
-    }
-    else
-    {
-        vboxClipboardDisconnect (&gCtx);
-    }
-
     return rc;
 }
 
-unsigned __stdcall VBoxClipboardThread (void *pInstance)
-{
+unsigned __stdcall VBoxClipboardThread(void *pInstance)
+{
+    Log(("VBoxClipboardThread\n"));
+
     VBOXCLIPBOARDCONTEXT *pCtx = (VBOXCLIPBOARDCONTEXT *)pInstance;
-
-    Log(("VBoxClipboardThread\n"));
-
-    /* Open the new driver instance to not interfere with other callers. */
-    HANDLE hDriver = CreateFile(VBOXGUEST_DEVICE_NAME,
-                                GENERIC_READ | GENERIC_WRITE,
-                                FILE_SHARE_READ | FILE_SHARE_WRITE,
-                                NULL,
-                                OPEN_EXISTING,
-                                FILE_ATTRIBUTE_NORMAL,
-                                NULL);
+    AssertPtr(pCtx);
 
     /* The thread waits for incoming messages from the host. */
     for (;;)
     {
-        VBoxClipboardGetHostMsg parms;
-
-        VBOX_INIT_CALL(&parms, VBOX_SHARED_CLIPBOARD_FN_GET_HOST_MSG, pCtx);
-
-        VBoxHGCMParmUInt32Set (&parms.msg, 0);
-        VBoxHGCMParmUInt32Set (&parms.formats, 0);
-
-        DWORD cbReturned;
-
-        if (!DeviceIoControl (hDriver,
-                              VBOXGUEST_IOCTL_HGCM_CALL(sizeof (parms)),
-                              &parms, sizeof (parms),
-                              &parms, sizeof (parms),
-                              &cbReturned,
-                              NULL))
-        {
-            Log(("Failed to call the driver for host message.\n"));
-
+        uint32_t u32Msg;
+        uint32_t u32Formats;
+        int rc = VbglR3ClipboardGetHostMsg(pCtx->u32ClientID, &u32Msg, &u32Formats);
+        if (RT_FAILURE(rc))
+        {
+            Log(("VBoxClipboardThread: Failed to call the driver for host message! rc = %Rrc\n", rc));
+            if (rc == VERR_INTERRUPTED)
+            {
+                /* Wait for termination event. */
+                WaitForSingleObject(pCtx->pEnv->hStopEvent, INFINITE);
+                break;
+            }
             /* Wait a bit before retrying. */
+            AssertPtr(pCtx->pEnv);
             if (WaitForSingleObject(pCtx->pEnv->hStopEvent, 1000) == WAIT_OBJECT_0)
             {
                 break;
             }
-
             continue;
+       }
+        else
+        {
+            Log(("VBoxClipboardThread: VbglR3ClipboardGetHostMsg u32Msg = %ld, u32Formats = %ld\n", u32Msg, u32Formats));
+            switch (u32Msg)
+            {
+                case VBOX_SHARED_CLIPBOARD_HOST_MSG_FORMATS:
+                {
+                    /* The host has announced available clipboard formats.
+                     * Forward the information to the window, so it can later
+                     * respond to WM_RENDERFORMAT message. */
+                    ::PostMessage (pCtx->hwnd, WM_USER, 0, u32Formats);
+                } break;
+
+                case VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA:
+                {
+                    /* The host needs data in the specified format. */
+                    ::PostMessage (pCtx->hwnd, WM_USER + 1, 0, u32Formats);
+                } break;
+
+                case VBOX_SHARED_CLIPBOARD_HOST_MSG_QUIT:
+                {
+                    /* The host is terminating. */
+                    rc = VERR_INTERRUPTED;
+                } break;
+
+                default:
+                {
+                    Log(("VBoxClipboardThread: Unsupported message from host! Message = %ld\n", u32Msg));
+                }
+            }
         }
-
-        int rc = parms.hdr.result;
-
-        if (RT_SUCCESS (rc))
-        {
-            uint32_t u32Msg;
-            uint32_t u32Formats;
-
-            rc = VBoxHGCMParmUInt32Get (&parms.msg, &u32Msg);
-
-            if (RT_SUCCESS (rc))
-            {
-                rc = VBoxHGCMParmUInt32Get (&parms.formats, &u32Formats);
-
-                if (RT_SUCCESS (rc))
-                {
-                    Log(("vboxClipboardHostEvent u32Msg %d, u32Formats %d\n", u32Msg, u32Formats));
-
-                    switch (u32Msg)
-                    {
-                        case VBOX_SHARED_CLIPBOARD_HOST_MSG_FORMATS:
-                        {
-                            /* The host has announced available clipboard formats.
-                             * Forward the information to the window, so it can later
-                             * respond to WM_RENDERFORMAT message.
-                             */
-                            ::PostMessage (pCtx->hwnd, WM_USER, 0, u32Formats);
-                        } break;
-                        case VBOX_SHARED_CLIPBOARD_HOST_MSG_READ_DATA:
-                        {
-                            /* The host needs data in the specified format.
-                             */
-                            ::PostMessage (pCtx->hwnd, WM_USER + 1, 0, u32Formats);
-                        } break;
-                        case VBOX_SHARED_CLIPBOARD_HOST_MSG_QUIT:
-                        {
-                            /* The host is terminating.
-                             */
-                            rc = VERR_INTERRUPTED;
-                        } break;
-                        default:
-                        {
-                            Log(("Unsupported message from host!!!\n"));
-                        }
-                    }
-                }
-            }
-        }
-
-        if (rc == VERR_INTERRUPTED)
-        {
-            /* Wait for termination event. */
-            WaitForSingleObject(pCtx->pEnv->hStopEvent, INFINITE);
-            break;
-        }
-
-        if (RT_FAILURE (rc))
-        {
-            /* Wait a bit before retrying. */
-            if (WaitForSingleObject(pCtx->pEnv->hStopEvent, 1000) == WAIT_OBJECT_0)
-            {
-                break;
-            }
-
-            continue;
-        }
-
-        Log(("processed host event rc = %d\n", rc));
-    }
-
-    CloseHandle (hDriver);
-
+    }
     return 0;
 }
 
-void VBoxClipboardDestroy (const VBOXSERVICEENV *pEnv, void *pInstance)
+void VBoxClipboardDestroy(const VBOXSERVICEENV *pEnv, void *pInstance)
 {
     VBOXCLIPBOARDCONTEXT *pCtx = (VBOXCLIPBOARDCONTEXT *)pInstance;
-
     if (pCtx != &gCtx)
     {
-        Log(("VBoxClipboardDestroy: invalid instance %p (our %p)!!!\n", pCtx, &gCtx));
-
+        Log(("VBoxClipboardDestroy: invalid instance %p (our = %p)!\n", pCtx, &gCtx));
         pCtx = &gCtx;
     }
 
     vboxClipboardDestroy (pCtx);
-
-    vboxClipboardDisconnect (pCtx);
-
+    VbglR3ClipboardDisconnect(pCtx->u32ClientID);
     memset (pCtx, 0, sizeof (*pCtx));
-
     return;
 }
+
