Index: /trunk/include/VBox/GuestHost/DragAndDrop.h
===================================================================
--- /trunk/include/VBox/GuestHost/DragAndDrop.h	(revision 50829)
+++ /trunk/include/VBox/GuestHost/DragAndDrop.h	(revision 50830)
@@ -36,4 +36,7 @@
 int DnDPathSanitizeFilename(char *pszPath, size_t cbPath);
 int DnDPathSanitize(char *pszPath, size_t cbPath);
+
+/** Keep the original paths, don't convert paths to relative ones. */
+#define DNDURILIST_FLAGS_ABSOLUTE_PATHS         RT_BIT(0)
 
 class DnDURIObject
@@ -120,5 +123,7 @@
 protected:
 
-    /** List of all top-level file/directory entries. */
+    /** List of all top-level file/directory entries.
+     *  Note: All paths are kept internally as UNIX paths for
+     *        easier conversion/handling!  */
     RTCList<RTCString>     m_lstRoot;
     /** List of all URI objects added. */
Index: /trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxDnDDropTarget.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxDnDDropTarget.cpp	(revision 50829)
+++ /trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxDnDDropTarget.cpp	(revision 50830)
@@ -453,11 +453,14 @@
                         if (RT_SUCCESS(rc))
                         {
+                            cchFiles += 1; /* Add string termination. */
                             uint32_t cbFiles = cchFiles * sizeof(char);
-                            Assert(cbFiles);
+
+                            LogFlowFunc(("cFiles=%u, cchFiles=%RU32, cbFiles=%RU32, pszFiles=0x%p\n",
+                                         cFiles, cchFiles, cbFiles, pszFiles));
 
                             /* Translate the list into URI elements. */
                             DnDURIList lstURI;
-                            rc = lstURI.AppendNativePathsFromList(pszFiles, cbFiles, 
-                                                                  0 /* Flags */);
+                            rc = lstURI.AppendNativePathsFromList(pszFiles, cbFiles,
+                                                                  DNDURILIST_FLAGS_ABSOLUTE_PATHS);
                             if (RT_SUCCESS(rc))
                             {
@@ -494,5 +497,5 @@
 
                 /*
-                 * Third stage: Release access to the storage medium again.
+                 * Third stage: Unlock + release access to the storage medium again.
                  */
                 switch (mFormatEtc.tymed)
@@ -508,10 +511,10 @@
             }
 
+            /* Release storage medium again. */
+            ReleaseStgMedium(&stgMed);
+
             /* Signal waiters. */
             mDroppedRc = rc;
             RTSemEventSignal(hEventDrop);
-
-            /* Release storage medium again. */
-            ReleaseStgMedium(&stgMed);
         }
     }
Index: /trunk/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibDragAndDrop.cpp
===================================================================
--- /trunk/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibDragAndDrop.cpp	(revision 50829)
+++ /trunk/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibDragAndDrop.cpp	(revision 50830)
@@ -1082,5 +1082,5 @@
 
 static int vbglR3DnDGHProcessURIMessages(uint32_t u32ClientId,
-                                         void *pvData, uint32_t cbData)
+                                         const void *pvData, uint32_t cbData)
 {
     AssertPtrReturn(pvData, VERR_INVALID_POINTER);
Index: /trunk/src/VBox/GuestHost/DragAndDrop/DnDURIList.cpp
===================================================================
--- /trunk/src/VBox/GuestHost/DragAndDrop/DnDURIList.cpp	(revision 50829)
+++ /trunk/src/VBox/GuestHost/DragAndDrop/DnDURIList.cpp	(revision 50830)
@@ -430,5 +430,8 @@
             {
                 Assert(pszFileName >= pszFilePath);
-                char *pszRoot = &pszFilePath[pszFileName - pszFilePath];
+                size_t cbBase = (fFlags & DNDURILIST_FLAGS_ABSOLUTE_PATHS)
+                              ? 0 /* Use start of path as root. */
+                              : pszFileName - pszFilePath;
+                char *pszRoot = &pszFilePath[cbBase];
                 m_lstRoot.append(pszRoot);
 #ifdef DEBUG_andy
@@ -436,6 +439,5 @@
                              pszFilePath, pszFileName, pszRoot));
 #endif
-                rc = appendPathRecursive(pszFilePath,
-                                         pszFileName - pszFilePath,
+                rc = appendPathRecursive(pszFilePath, cbBase,
                                          fFlags);
             }
@@ -551,4 +553,7 @@
     {
         const char *pszCurRoot = m_lstRoot.at(i).c_str();
+#ifdef DEBUG_andy
+        LogFlowFunc(("pszCurRoot=%s\n", pszCurRoot));
+#endif
         if (strBasePath.isNotEmpty())
         {
