Index: /trunk/src/VBox/HostServices/SharedClipboard/VBoxClipboard.h
===================================================================
--- /trunk/src/VBox/HostServices/SharedClipboard/VBoxClipboard.h	(revision 19840)
+++ /trunk/src/VBox/HostServices/SharedClipboard/VBoxClipboard.h	(revision 19841)
@@ -51,4 +51,9 @@
 
     struct {
+        VBOXHGCMCALLHANDLE callHandle;
+        VBOXHGCMSVCPARM *paParms;
+    } asyncRead;
+
+    struct {
          void *pv;
          uint32_t cb;
@@ -68,4 +73,8 @@
 
 void vboxSvcClipboardReportMsg (VBOXCLIPBOARDCLIENTDATA *pClient, uint32_t u32Msg, uint32_t u32Formats);
+
+/** Complete a request from the guest for clipboard data that we decided
+ * to handle asynchronously. */
+void vboxSvcClipboardCompleteReadData(VBOXHGCMCALLHANDLE callHandle, VBOXHGCMSVCPARM *paParms, int rc, uint32_t cbActual);
 
 
Index: /trunk/src/VBox/HostServices/SharedClipboard/service.cpp
===================================================================
--- /trunk/src/VBox/HostServices/SharedClipboard/service.cpp	(revision 19840)
+++ /trunk/src/VBox/HostServices/SharedClipboard/service.cpp	(revision 19841)
@@ -495,8 +495,12 @@
                         else
                         {
+                            pClient->asyncRead.callHandle = callHandle;
+                            pClient->asyncRead.paParms = paParms;
                             rc = vboxClipboardReadData (pClient, u32Format, pv, cb, &cbActual);
                         }
 
-                        if (RT_SUCCESS (rc))
+                        if (rc == VINF_HGCM_ASYNC_EXECUTE)
+                            fAsynchronousProcessing = true;
+                        else if (RT_SUCCESS (rc))
                         {
                             VBoxHGCMParmUInt32Set (&paParms[2], cbActual);
@@ -574,4 +578,10 @@
         g_pHelpers->pfnCallComplete (callHandle, rc);
     }
+}
+
+void vboxSvcClipboardCompleteReadData(VBOXHGCMCALLHANDLE callHandle, VBOXHGCMSVCPARM *paParms, int rc, uint32_t cbActual)
+{
+    VBoxHGCMParmUInt32Set (&paParms[2], cbActual);
+    g_pHelpers->pfnCallComplete (callHandle, rc);
 }
 
