Index: /trunk/include/VBox/GuestHost/SharedClipboard-transfers.h
===================================================================
--- /trunk/include/VBox/GuestHost/SharedClipboard-transfers.h	(revision 81219)
+++ /trunk/include/VBox/GuestHost/SharedClipboard-transfers.h	(revision 81220)
@@ -643,41 +643,4 @@
     SHCLAREAID                   m_uID;
 };
-
-int SharedClipboardPathSanitizeFilename(char *pszPath, size_t cbPath);
-int SharedClipboardPathSanitize(char *pszPath, size_t cbPath);
-
-PSHCLROOTLIST SharedClipboardTransferRootListAlloc(void);
-void SharedClipboardTransferRootListFree(PSHCLROOTLIST pRootList);
-
-PSHCLROOTLISTHDR SharedClipboardTransferRootListHdrDup(PSHCLROOTLISTHDR pRoots);
-int SharedClipboardTransferRootListHdrInit(PSHCLROOTLISTHDR pRoots);
-void SharedClipboardTransferRootListHdrDestroy(PSHCLROOTLISTHDR pRoots);
-
-int SharedClipboardTransferRootListEntryCopy(PSHCLROOTLISTENTRY pDst, PSHCLROOTLISTENTRY pSrc);
-int SharedClipboardTransferRootListEntryInit(PSHCLROOTLISTENTRY pRootListEntry);
-void SharedClipboardTransferRootListEntryDestroy(PSHCLROOTLISTENTRY pRootListEntry);
-PSHCLROOTLISTENTRY SharedClipboardTransferRootListEntryDup(PSHCLROOTLISTENTRY pRootListEntry);
-
-int SharedClipboardTransferListHdrAlloc(PSHCLLISTHDR *ppListHdr);
-void SharedClipboardTransferListHdrFree(PSHCLLISTHDR pListHdr);
-PSHCLLISTHDR SharedClipboardTransferListHdrDup(PSHCLLISTHDR pListHdr);
-int SharedClipboardTransferListHdrInit(PSHCLLISTHDR pListHdr);
-void SharedClipboardTransferListHdrDestroy(PSHCLLISTHDR pListHdr);
-void SharedClipboardTransferListHdrFree(PSHCLLISTHDR pListHdr);
-void SharedClipboardTransferListHdrReset(PSHCLLISTHDR pListHdr);
-bool SharedClipboardTransferListHdrIsValid(PSHCLLISTHDR pListHdr);
-
-int SharedClipboardTransferListOpenParmsCopy(PSHCLLISTOPENPARMS pDst, PSHCLLISTOPENPARMS pSrc);
-PSHCLLISTOPENPARMS SharedClipboardTransferListOpenParmsDup(PSHCLLISTOPENPARMS pParms);
-int SharedClipboardTransferListOpenParmsInit(PSHCLLISTOPENPARMS pParms);
-void SharedClipboardTransferListOpenParmsDestroy(PSHCLLISTOPENPARMS pParms);
-
-int SharedClipboardTransferListEntryAlloc(PSHCLLISTENTRY *ppListEntry);
-void SharedClipboardTransferListEntryFree(PSHCLLISTENTRY pListEntry);
-int SharedClipboardTransferListEntryCopy(PSHCLLISTENTRY pDst, PSHCLLISTENTRY pSrc);
-PSHCLLISTENTRY SharedClipboardTransferListEntryDup(PSHCLLISTENTRY pListEntry);
-int SharedClipboardTransferListEntryInit(PSHCLLISTENTRY pListEntry);
-void SharedClipboardTransferListEntryDestroy(PSHCLLISTENTRY pListEntry);
-bool SharedClipboardTransferListEntryIsValid(PSHCLLISTENTRY pListEntry);
 
 /**
@@ -1105,4 +1068,44 @@
 bool SharedClipboardTransferListHandleIsValid(PSHCLTRANSFER pTransfer, SHCLLISTHANDLE hList);
 
+int SharedClipboardPathSanitizeFilename(char *pszPath, size_t cbPath);
+int SharedClipboardPathSanitize(char *pszPath, size_t cbPath);
+
+PSHCLROOTLIST SharedClipboardTransferRootListAlloc(void);
+void SharedClipboardTransferRootListFree(PSHCLROOTLIST pRootList);
+
+PSHCLROOTLISTHDR SharedClipboardTransferRootListHdrDup(PSHCLROOTLISTHDR pRoots);
+int SharedClipboardTransferRootListHdrInit(PSHCLROOTLISTHDR pRoots);
+void SharedClipboardTransferRootListHdrDestroy(PSHCLROOTLISTHDR pRoots);
+
+int SharedClipboardTransferRootListEntryCopy(PSHCLROOTLISTENTRY pDst, PSHCLROOTLISTENTRY pSrc);
+int SharedClipboardTransferRootListEntryInit(PSHCLROOTLISTENTRY pRootListEntry);
+void SharedClipboardTransferRootListEntryDestroy(PSHCLROOTLISTENTRY pRootListEntry);
+PSHCLROOTLISTENTRY SharedClipboardTransferRootListEntryDup(PSHCLROOTLISTENTRY pRootListEntry);
+
+int SharedClipboardTransferListHandleInfoInit(PSHCLLISTHANDLEINFO pInfo);
+void SharedClipboardTransferListHandleInfoDestroy(PSHCLLISTHANDLEINFO pInfo);
+
+int SharedClipboardTransferListHdrAlloc(PSHCLLISTHDR *ppListHdr);
+void SharedClipboardTransferListHdrFree(PSHCLLISTHDR pListHdr);
+PSHCLLISTHDR SharedClipboardTransferListHdrDup(PSHCLLISTHDR pListHdr);
+int SharedClipboardTransferListHdrInit(PSHCLLISTHDR pListHdr);
+void SharedClipboardTransferListHdrDestroy(PSHCLLISTHDR pListHdr);
+void SharedClipboardTransferListHdrFree(PSHCLLISTHDR pListHdr);
+void SharedClipboardTransferListHdrReset(PSHCLLISTHDR pListHdr);
+bool SharedClipboardTransferListHdrIsValid(PSHCLLISTHDR pListHdr);
+
+int SharedClipboardTransferListOpenParmsCopy(PSHCLLISTOPENPARMS pDst, PSHCLLISTOPENPARMS pSrc);
+PSHCLLISTOPENPARMS SharedClipboardTransferListOpenParmsDup(PSHCLLISTOPENPARMS pParms);
+int SharedClipboardTransferListOpenParmsInit(PSHCLLISTOPENPARMS pParms);
+void SharedClipboardTransferListOpenParmsDestroy(PSHCLLISTOPENPARMS pParms);
+
+int SharedClipboardTransferListEntryAlloc(PSHCLLISTENTRY *ppListEntry);
+void SharedClipboardTransferListEntryFree(PSHCLLISTENTRY pListEntry);
+int SharedClipboardTransferListEntryCopy(PSHCLLISTENTRY pDst, PSHCLLISTENTRY pSrc);
+PSHCLLISTENTRY SharedClipboardTransferListEntryDup(PSHCLLISTENTRY pListEntry);
+int SharedClipboardTransferListEntryInit(PSHCLLISTENTRY pListEntry);
+void SharedClipboardTransferListEntryDestroy(PSHCLLISTENTRY pListEntry);
+bool SharedClipboardTransferListEntryIsValid(PSHCLLISTENTRY pListEntry);
+
 int SharedClipboardTransferSetInterface(PSHCLTRANSFER pTransfer, PSHCLPROVIDERCREATIONCTX pCreationCtx);
 int SharedClipboardTransferRootsSet(PSHCLTRANSFER pTransfer, const char *pszRoots, size_t cbRoots);
Index: /trunk/src/VBox/Additions/common/VBoxGuest/lib/VBoxGuestR3LibClipboard.cpp
===================================================================
--- /trunk/src/VBox/Additions/common/VBoxGuest/lib/VBoxGuestR3LibClipboard.cpp	(revision 81219)
+++ /trunk/src/VBox/Additions/common/VBoxGuest/lib/VBoxGuestR3LibClipboard.cpp	(revision 81220)
@@ -774,5 +774,6 @@
     Msg.pvFilter.SetPtr(pOpenParms->pszFilter, pOpenParms->cbFilter);
     Msg.cbPath.SetUInt32(pOpenParms->cbPath);
-    Msg.pvFilter.SetPtr(pOpenParms->pszPath, pOpenParms->cbPath);
+    Msg.pvPath.SetPtr(pOpenParms->pszPath, pOpenParms->cbPath);
+    Msg.uHandle.SetUInt64(0);
 
     int rc = VbglR3HGCMCall(&Msg.hdr, sizeof(Msg));
@@ -1776,4 +1777,6 @@
 
     int rc;
+
+    bool fErrorSent = false; /* Whether an error has been reported back to the host already. */
 
     switch (idMsg)
@@ -2094,6 +2097,16 @@
         {
             rc = VbglR3ClipboardEventGetNext(idMsg, cParms, pCmdCtx, pEvent);
+            if (RT_FAILURE(rc))
+                fErrorSent = true;
             break;
         }
+    }
+
+    if (   !fErrorSent
+        && RT_FAILURE(rc))
+    {
+        /* Report error back to the host. */
+        int rc2 = VbglR3ClipboardWriteError(pCmdCtx->uClientID, rc);
+        AssertRC(rc2);
     }
 
@@ -2158,6 +2171,5 @@
         int rc2 = VbglR3ClipboardWriteError(pCtx->uClientID, rc);
         AssertRC(rc2);
-
-   }
+    }
 
     LogFlowFuncLeaveRC(rc);
Index: /trunk/src/VBox/GuestHost/SharedClipboard/clipboard-transfers.cpp
===================================================================
--- /trunk/src/VBox/GuestHost/SharedClipboard/clipboard-transfers.cpp	(revision 81219)
+++ /trunk/src/VBox/GuestHost/SharedClipboard/clipboard-transfers.cpp	(revision 81220)
@@ -168,4 +168,24 @@
 {
     return SharedClipboardTransferListEntryDup(pRootListEntry);
+}
+
+/**
+ * Initializes an list handle info structure.
+ *
+ * @returns VBox status code.
+ * @param   pInfo               List handle info structure to initialize.
+ */
+int SharedClipboardTransferListHandleInfoInit(PSHCLLISTHANDLEINFO pInfo)
+{
+    AssertPtrReturn(pInfo, VERR_INVALID_POINTER);
+
+    pInfo->hList   = SHCLLISTHANDLE_INVALID;
+    pInfo->enmType = SHCLOBJTYPE_INVALID;
+
+    pInfo->pszPathLocalAbs = NULL;
+
+    RT_ZERO(pInfo->u);
+
+    return VINF_SUCCESS;
 }
 
@@ -1214,4 +1234,7 @@
     pTransfer->State.enmSource = enmSource;
 
+    LogFlowFunc(("uID=%RU32, enmDir=%RU32, enmSource=%RU32\n",
+                 pTransfer->State.uID, pTransfer->State.enmDir, pTransfer->State.enmSource));
+
     int rc = SharedClipboardEventSourceCreate(&pTransfer->Events, pTransfer->State.uID);
     if (RT_SUCCESS(rc))
@@ -1259,5 +1282,5 @@
  * @param   hList               List handle of the list to get handle info for.
  */
-inline PSHCLLISTHANDLEINFO sharedClipboardTransferListGet(PSHCLTRANSFER pTransfer, SHCLLISTHANDLE hList)
+inline PSHCLLISTHANDLEINFO sharedClipboardTransferListGetByHandle(PSHCLTRANSFER pTransfer, SHCLLISTHANDLE hList)
 {
     PSHCLLISTHANDLEINFO pIt;
@@ -1303,56 +1326,63 @@
     if (pTransfer->State.enmSource == SHCLSOURCE_LOCAL)
     {
+        LogFlowFunc(("pszPath=%s\n", pOpenParms->pszPath));
+
         PSHCLLISTHANDLEINFO pInfo
             = (PSHCLLISTHANDLEINFO)RTMemAlloc(sizeof(SHCLLISTHANDLEINFO));
         if (pInfo)
         {
-            LogFlowFunc(("pszPath=%s\n", pOpenParms->pszPath));
-
-            RTFSOBJINFO objInfo;
-            rc = RTPathQueryInfo(pOpenParms->pszPath, &objInfo, RTFSOBJATTRADD_NOTHING);
+            rc = SharedClipboardTransferListHandleInfoInit(pInfo);
             if (RT_SUCCESS(rc))
             {
-                switch (pInfo->enmType)
+                RTFSOBJINFO objInfo;
+                rc = RTPathQueryInfo(pOpenParms->pszPath, &objInfo, RTFSOBJATTRADD_NOTHING);
+                if (RT_SUCCESS(rc))
                 {
-                    case SHCLOBJTYPE_DIRECTORY:
+                    if (RTFS_IS_DIRECTORY(objInfo.Attr.fMode))
                     {
                         rc = RTDirOpen(&pInfo->u.Local.hDir, pOpenParms->pszPath);
-                        break;
+                        if (RT_SUCCESS(rc))
+                            pInfo->enmType = SHCLOBJTYPE_DIRECTORY;
+
                     }
-
-                    case SHCLOBJTYPE_FILE:
+                    else if (RTFS_IS_FILE(objInfo.Attr.fMode))
                     {
                         rc = RTFileOpen(&pInfo->u.Local.hFile, pOpenParms->pszPath,
                                         RTFILE_O_OPEN | RTFILE_O_READ | RTFILE_O_DENY_WRITE);
-                        break;
+                        if (RT_SUCCESS(rc))
+                            pInfo->enmType = SHCLOBJTYPE_FILE;
                     }
-
-                    default:
+                    else
                         rc = VERR_NOT_SUPPORTED;
-                        break;
+
+                    if (RT_SUCCESS(rc))
+                    {
+                        pInfo->hList = sharedClipboardTransferListHandleNew(pTransfer);
+
+                        RTListAppend(&pTransfer->lstList, &pInfo->Node);
+                    }
+                    else
+                    {
+                        if (RTFS_IS_DIRECTORY(objInfo.Attr.fMode))
+                        {
+                            if (RTDirIsValid(pInfo->u.Local.hDir))
+                                RTDirClose(pInfo->u.Local.hDir);
+                        }
+                        else if (RTFS_IS_FILE(objInfo.Attr.fMode))
+                        {
+                            if (RTFileIsValid(pInfo->u.Local.hFile))
+                                RTFileClose(pInfo->u.Local.hFile);
+                        }
+                    }
                 }
 
-                if (RT_SUCCESS(rc))
-                {
-                    pInfo->hList = sharedClipboardTransferListHandleNew(pTransfer);
-
-                    RTListAppend(&pTransfer->lstList, &pInfo->Node);
-                }
-                else
-                {
-                    if (RTFS_IS_DIRECTORY(objInfo.Attr.fMode))
-                    {
-                        if (RTDirIsValid(pInfo->u.Local.hDir))
-                            RTDirClose(pInfo->u.Local.hDir);
-                    }
-                    else if (RTFS_IS_FILE(objInfo.Attr.fMode))
-                    {
-                        if (RTFileIsValid(pInfo->u.Local.hFile))
-                            RTFileClose(pInfo->u.Local.hFile);
-                    }
-
-                    RTMemFree(pInfo);
-                    pInfo = NULL;
-                }
+                if (RT_FAILURE(rc))
+                    SharedClipboardTransferListHandleInfoDestroy(pInfo);
+            }
+
+            if (RT_FAILURE(rc))
+            {
+                RTMemFree(pInfo);
+                pInfo = NULL;
             }
         }
@@ -1397,5 +1427,5 @@
     if (pTransfer->State.enmSource == SHCLSOURCE_LOCAL)
     {
-        PSHCLLISTHANDLEINFO pInfo = sharedClipboardTransferListGet(pTransfer, hList);
+        PSHCLLISTHANDLEINFO pInfo = sharedClipboardTransferListGetByHandle(pTransfer, hList);
         if (pInfo)
         {
@@ -1633,5 +1663,5 @@
     if (pTransfer->State.enmSource == SHCLSOURCE_LOCAL)
     {
-        PSHCLLISTHANDLEINFO pInfo = sharedClipboardTransferListGet(pTransfer, hList);
+        PSHCLLISTHANDLEINFO pInfo = sharedClipboardTransferListGetByHandle(pTransfer, hList);
         if (pInfo)
         {
@@ -1647,5 +1677,5 @@
                         {
                             rc = sharedClipboardTransferListHdrFromDir(pHdr,
-                                                                          pszPathRel, pszPathRel, pszPathRel);
+                                                                       pszPathRel, pszPathRel, pszPathRel);
                             RTStrFree(pszPathRel);
                         }
@@ -1737,5 +1767,5 @@
     if (pTransfer->State.enmSource == SHCLSOURCE_LOCAL)
     {
-        PSHCLLISTHANDLEINFO pInfo = sharedClipboardTransferListGet(pTransfer, hList);
+        PSHCLLISTHANDLEINFO pInfo = sharedClipboardTransferListGetByHandle(pTransfer, hList);
         if (pInfo)
         {
@@ -1888,5 +1918,5 @@
     if (pTransfer->State.enmSource == SHCLSOURCE_LOCAL)
     {
-        fIsValid = sharedClipboardTransferListGet(pTransfer, hList) != NULL;
+        fIsValid = sharedClipboardTransferListGetByHandle(pTransfer, hList) != NULL;
     }
     else if (pTransfer->State.enmSource == SHCLSOURCE_REMOTE)
Index: /trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-transfers.cpp
===================================================================
--- /trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-transfers.cpp	(revision 81219)
+++ /trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-transfers.cpp	(revision 81220)
@@ -885,22 +885,19 @@
         rc = HGCMSvcGetU32(&paParms[1], &pOpenParms->fList);
         if (RT_SUCCESS(rc))
-            rc = HGCMSvcGetU32(&paParms[2], &cbPath);
-        if (RT_SUCCESS(rc))
-        {
-            rc = HGCMSvcGetStr(&paParms[3], &pOpenParms->pszPath, &pOpenParms->cbPath);
+            rc = HGCMSvcGetU32(&paParms[2], &cbFilter);
+        if (RT_SUCCESS(rc))
+        {
+            rc = HGCMSvcGetStr(&paParms[3], &pOpenParms->pszFilter, &pOpenParms->cbFilter);
+            AssertReturn(cbFilter == pOpenParms->cbFilter, VERR_INVALID_PARAMETER);
+        }
+        if (RT_SUCCESS(rc))
+            rc = HGCMSvcGetU32(&paParms[4], &cbPath);
+        if (RT_SUCCESS(rc))
+        {
+            rc = HGCMSvcGetStr(&paParms[5], &pOpenParms->pszPath, &pOpenParms->cbPath);
             AssertReturn(cbPath == pOpenParms->cbPath, VERR_INVALID_PARAMETER);
         }
-        if (RT_SUCCESS(rc))
-            rc = HGCMSvcGetU32(&paParms[4], &cbFilter);
-        if (RT_SUCCESS(rc))
-        {
-            rc = HGCMSvcGetStr(&paParms[5], &pOpenParms->pszFilter, &pOpenParms->cbFilter);
-            AssertReturn(cbFilter == pOpenParms->cbFilter, VERR_INVALID_PARAMETER);
-        }
-
-        if (RT_SUCCESS(rc))
-        {
-            /** @todo Some more validation. */
-        }
+
+        /** @todo Some more validation. */
     }
     else
@@ -1862,5 +1859,5 @@
             rc = shclSvcTransferGetError(cParms,paParms, &rcGuest);
             if (RT_SUCCESS(rc))
-                LogRel(("Shared Clipboard: Transfer error: %Rrc\n", rcGuest));
+                LogRel(("Shared Clipboard: Transfer error from guest: %Rrc\n", rcGuest));
             break;
         }
