Index: /trunk/include/VBox/GuestHost/SharedClipboard-win.h
===================================================================
--- /trunk/include/VBox/GuestHost/SharedClipboard-win.h	(revision 81258)
+++ /trunk/include/VBox/GuestHost/SharedClipboard-win.h	(revision 81259)
@@ -355,6 +355,6 @@
     /** Number of bytes already processed. */
     uint64_t                       m_cbProcessed;
-    /** Whether we already notified the parent of completion or not. */
-    bool                           m_fNotifiedComplete;
+    /** Whether this object already is in completed state or not. */
+    bool                           m_fIsComplete;
 };
 
Index: /trunk/src/VBox/GuestHost/SharedClipboard/ClipboardDataObjectImpl-win.cpp
===================================================================
--- /trunk/src/VBox/GuestHost/SharedClipboard/ClipboardDataObjectImpl-win.cpp	(revision 81258)
+++ /trunk/src/VBox/GuestHost/SharedClipboard/ClipboardDataObjectImpl-win.cpp	(revision 81259)
@@ -649,6 +649,9 @@
     }
 
-    if (FAILED(hr))
+    if (   FAILED(hr)
+        && hr != DV_E_FORMATETC) /* Can happen if the caller queries unknown / unhandled formats. */
+    {
         LogRel(("Shared Clipboard: Error returning data from data object (%Rhrc)\n", hr));
+    }
 
     LogFlowFunc(("hr=%Rhrc\n", hr));
Index: /trunk/src/VBox/GuestHost/SharedClipboard/ClipboardStreamImpl-win.cpp
===================================================================
--- /trunk/src/VBox/GuestHost/SharedClipboard/ClipboardStreamImpl-win.cpp	(revision 81258)
+++ /trunk/src/VBox/GuestHost/SharedClipboard/ClipboardStreamImpl-win.cpp	(revision 81259)
@@ -55,5 +55,5 @@
     , m_objInfo(*pObjInfo)
     , m_cbProcessed(0)
-    , m_fNotifiedComplete(false)
+    , m_fIsComplete(false)
 {
     AssertPtr(m_pTransfer);
@@ -113,10 +113,4 @@
     if (lCount == 0)
     {
-        if (  !m_fNotifiedComplete
-            && m_pParent)
-        {
-            m_pParent->OnTransferComplete();
-        }
-
         delete this;
         return 0;
@@ -173,5 +167,6 @@
         return STG_E_INVALIDPOINTER;
 
-    if (nBytesToRead == 0)
+    if (   nBytesToRead == 0
+        || m_fIsComplete)
     {
         if (nBytesRead)
@@ -212,6 +207,4 @@
         const uint64_t cbSize   = (uint64_t)m_objInfo.cbObject;
         const uint32_t cbToRead = RT_MIN(cbSize - m_cbProcessed, nBytesToRead);
-
-        bool fComplete = false;
 
         if (RT_SUCCESS(rc))
@@ -229,7 +222,7 @@
 
             /* Transfer complete? Make sure to close the object again. */
-            fComplete = m_cbProcessed == cbSize;
-
-            if (fComplete)
+            m_fIsComplete = m_cbProcessed == cbSize;
+
+            if (m_fIsComplete)
             {
                 if (m_pTransfer->ProviderIface.pfnObjClose)
@@ -240,8 +233,5 @@
 
                 if (m_pParent)
-                {
                     m_pParent->OnTransferComplete();
-                    m_fNotifiedComplete = true;
-                }
             }
         }
Index: /trunk/src/VBox/GuestHost/SharedClipboard/clipboard-transfers.cpp
===================================================================
--- /trunk/src/VBox/GuestHost/SharedClipboard/clipboard-transfers.cpp	(revision 81258)
+++ /trunk/src/VBox/GuestHost/SharedClipboard/clipboard-transfers.cpp	(revision 81259)
@@ -766,5 +766,5 @@
 {
     PSHCLOBJHANDLEINFO pIt;
-    RTListForEach(&pTransfer->lstObj, pIt, SHCLOBJHANDLEINFO, Node)
+    RTListForEach(&pTransfer->lstObj, pIt, SHCLOBJHANDLEINFO, Node) /** @todo Slooow ...but works for now. */
     {
         if (pIt->hObj == hObj)
@@ -792,4 +792,7 @@
     int rc = VINF_SUCCESS;
 
+    AssertMsgReturn(pTransfer->pszPathRootAbs, ("Transfer has no root path set\n"), VERR_INVALID_PARAMETER);
+    AssertMsgReturn(pOpenCreateParms->pszPath, ("No path in open/create params set\n"), VERR_INVALID_PARAMETER);
+
     LogFlowFunc(("pszPath=%s, fCreate=0x%x\n", pOpenCreateParms->pszPath, pOpenCreateParms->fCreate));
 
@@ -797,5 +800,5 @@
     {
         PSHCLOBJHANDLEINFO pInfo
-            = (PSHCLOBJHANDLEINFO)RTMemAlloc(sizeof(SHCLOBJHANDLEINFO));
+            = (PSHCLOBJHANDLEINFO)RTMemAllocZ(sizeof(SHCLOBJHANDLEINFO));
         if (pInfo)
         {
@@ -811,11 +814,14 @@
                 if (RT_SUCCESS(rc))
                 {
-                    char *pszPathAbs = RTStrAPrintf2("%s/%s", pTransfer->pszPathRootAbs, pOpenCreateParms->pszPath);
-                    if (pszPathAbs)
+                    pInfo->pszPathLocalAbs = RTStrAPrintf2("%s/%s", pTransfer->pszPathRootAbs, pOpenCreateParms->pszPath);
+                    if (pInfo->pszPathLocalAbs)
                     {
-                        LogFlowFunc(("%s\n", pszPathAbs));
-
-                        rc = RTFileOpen(&pInfo->u.Local.hFile, pszPathAbs, fOpen);
-                        RTStrFree(pszPathAbs);
+                        rc = RTFileOpen(&pInfo->u.Local.hFile, pInfo->pszPathLocalAbs, fOpen);
+                        if (RT_SUCCESS(rc))
+                        {
+                            LogRel2(("Shared Clipboard: Opened file '%s'\n", pInfo->pszPathLocalAbs));
+                        }
+                        else
+                            LogRel(("Shared Clipboard: Error opening file '%s', rc=%Rrc\n", pInfo->pszPathLocalAbs, rc));
                     }
                     else
@@ -910,4 +916,6 @@
 
             RTListNodeRemove(&pInfo->Node);
+
+            ShClTransferObjHandleInfoDestroy(pInfo);
 
             RTMemFree(pInfo);
@@ -2863,8 +2871,8 @@
 
 /**
- * Converts Shared Clipboard create flags (see SharedClipboard-uri.) into IPRT create flags.
+ * Converts Shared Clipboard create flags (see SharedClipboard-transfers.h) into IPRT create flags.
  *
  * @returns IPRT status code.
- * @param  fWritable            Whether the shared folder is writable
+ * @param  fWritable            Whether the object is writable.
  * @param  fShClFlags           Shared clipboard create flags.
  * @param  fMode                File attributes.
Index: /trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-transfers.cpp
===================================================================
--- /trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-transfers.cpp	(revision 81258)
+++ /trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-transfers.cpp	(revision 81259)
@@ -2140,5 +2140,5 @@
             {
                 LogRel2(("Shared Clipboard: Reported status %s (rc=%Rrc) of transfer %RU32 to guest\n",
-                         ShClGuestMsgToStr(uStatus), rcTransfer, pTransfer->State.uID));
+                         ShClTransferStatusToStr(uStatus), rcTransfer, pTransfer->State.uID));
 
                 if (puEvent)
@@ -2269,5 +2269,5 @@
                                         else
                                             LogRel(("Shared Clipboard: Guest reported status %s (error %Rrc) while starting transfer %RU32\n",
-                                                    ShClGuestMsgToStr(pReply->u.TransferStatus.uStatus),
+                                                    ShClTransferStatusToStr(pReply->u.TransferStatus.uStatus),
                                                     pReply->rc, pTransfer->State.uID));
                                     }
