Index: trunk/src/VBox/HostServices/SharedFolders/VBoxSharedFoldersSvc.cpp
===================================================================
--- trunk/src/VBox/HostServices/SharedFolders/VBoxSharedFoldersSvc.cpp	(revision 77847)
+++ trunk/src/VBox/HostServices/SharedFolders/VBoxSharedFoldersSvc.cpp	(revision 77848)
@@ -98,4 +98,6 @@
 static STAMPROFILE g_StatQueryMapInfo;
 static STAMPROFILE g_StatQueryFeatures;
+static STAMPROFILE g_StatCopyFile;
+static STAMPROFILE g_StatCopyFileFail;
 static STAMPROFILE g_StatCopyFilePart;
 static STAMPROFILE g_StatCopyFilePartFail;
@@ -1504,4 +1506,32 @@
         }
 
+        case SHFL_FN_COPY_FILE:
+        {
+            pStat     = &g_StatCopyFile;
+            pStatFail = &g_StatCopyFileFail;
+
+            /* Validate input: */
+            ASSERT_GUEST_STMT_BREAK(cParms == SHFL_CPARMS_COPY_FILE, rc = VERR_WRONG_PARAMETER_COUNT);
+            ASSERT_GUEST_STMT_BREAK(paParms[0].type == VBOX_HGCM_SVC_PARM_32BIT, rc = VERR_WRONG_PARAMETER_TYPE); /* i32RootSrc  */
+            ASSERT_GUEST_STMT_BREAK(paParms[1].type == VBOX_HGCM_SVC_PARM_PTR, rc = VERR_WRONG_PARAMETER_TYPE);   /* pStrPathSrc */
+            PCSHFLSTRING pStrPathSrc = (PCSHFLSTRING)paParms[1].u.pointer.addr;
+            ASSERT_GUEST_STMT_BREAK(ShflStringIsValidIn(pStrPathSrc, paParms[1].u.pointer.size,
+                                                        RT_BOOL(pClient->fu32Flags & SHFL_CF_UTF8)),
+                                    rc = VERR_INVALID_PARAMETER);
+            ASSERT_GUEST_STMT_BREAK(paParms[2].type == VBOX_HGCM_SVC_PARM_32BIT, rc = VERR_WRONG_PARAMETER_TYPE); /* i32RootDst  */
+            ASSERT_GUEST_STMT_BREAK(paParms[3].type == VBOX_HGCM_SVC_PARM_PTR, rc = VERR_WRONG_PARAMETER_TYPE);   /* pStrPathDst */
+            PCSHFLSTRING pStrPathDst = (PCSHFLSTRING)paParms[3].u.pointer.addr;
+            ASSERT_GUEST_STMT_BREAK(ShflStringIsValidIn(pStrPathDst, paParms[3].u.pointer.size,
+                                                        RT_BOOL(pClient->fu32Flags & SHFL_CF_UTF8)),
+                                    rc = VERR_INVALID_PARAMETER);
+            ASSERT_GUEST_STMT_BREAK(paParms[4].type == VBOX_HGCM_SVC_PARM_32BIT, rc = VERR_WRONG_PARAMETER_TYPE); /* f32Flags */
+            ASSERT_GUEST_STMT_BREAK(paParms[4].u.uint32 == 0, rc = VERR_INVALID_FLAGS);
+
+            /* Execute the function: */
+            rc = vbsfCopyFile(pClient, paParms[0].u.uint32, pStrPathSrc, paParms[2].u.uint64, pStrPathDst, paParms[3].u.uint32);
+            break;
+        }
+
+
         case SHFL_FN_COPY_FILE_PART:
         {
@@ -1531,5 +1561,4 @@
             break;
         }
-
 
         default:
@@ -1841,4 +1870,6 @@
              HGCMSvcHlpStamRegister(g_pHelpers, &g_StatQueryMapInfo,              STAMTYPE_PROFILE, STAMVISIBILITY_ALWAYS, STAMUNIT_CALLS, "SHFL_FN_QUERY_MAP_INFO",                    "/HGCM/VBoxSharedFolders/FnQueryMapInfo");
              HGCMSvcHlpStamRegister(g_pHelpers, &g_StatQueryFeatures,             STAMTYPE_PROFILE, STAMVISIBILITY_ALWAYS, STAMUNIT_CALLS, "SHFL_FN_QUERY_FEATURES",                    "/HGCM/VBoxSharedFolders/FnQueryFeatures");
+             HGCMSvcHlpStamRegister(g_pHelpers, &g_StatCopyFile,                  STAMTYPE_PROFILE, STAMVISIBILITY_ALWAYS, STAMUNIT_CALLS, "SHFL_FN_COPY_FILE successes",               "/HGCM/VBoxSharedFolders/FnCopyFile");
+             HGCMSvcHlpStamRegister(g_pHelpers, &g_StatCopyFileFail,              STAMTYPE_PROFILE, STAMVISIBILITY_ALWAYS, STAMUNIT_CALLS, "SHFL_FN_COPY_FILE failures",                "/HGCM/VBoxSharedFolders/FnCopyFileFail");
              HGCMSvcHlpStamRegister(g_pHelpers, &g_StatCopyFilePart,              STAMTYPE_PROFILE, STAMVISIBILITY_ALWAYS, STAMUNIT_CALLS, "SHFL_FN_COPY_FILE_PART successes",          "/HGCM/VBoxSharedFolders/FnCopyFilePart");
              HGCMSvcHlpStamRegister(g_pHelpers, &g_StatCopyFilePartFail,          STAMTYPE_PROFILE, STAMVISIBILITY_ALWAYS, STAMUNIT_CALLS, "SHFL_FN_COPY_FILE_PART failures",           "/HGCM/VBoxSharedFolders/FnCopyFilePartFail");
Index: trunk/src/VBox/HostServices/SharedFolders/vbsf.cpp
===================================================================
--- trunk/src/VBox/HostServices/SharedFolders/vbsf.cpp	(revision 77847)
+++ trunk/src/VBox/HostServices/SharedFolders/vbsf.cpp	(revision 77848)
@@ -121,5 +121,5 @@
 }
 
-static int vbsfBuildFullPath(SHFLCLIENTDATA *pClient, SHFLROOT root, PSHFLSTRING pPath,
+static int vbsfBuildFullPath(SHFLCLIENTDATA *pClient, SHFLROOT root, PCSHFLSTRING pPath,
                              uint32_t cbPath, char **ppszFullPath, uint32_t *pcbFullPathRoot,
                              bool fWildCard = false, bool fPreserveLastComponent = false)
@@ -1368,5 +1368,7 @@
 }
 
-/** Implements SHFL_FN_COPY_FILE_PART (wrapping RTFileCopyPart).   */
+/**
+ * Implements SHFL_FN_COPY_FILE_PART (wrapping RTFileCopyPart).
+ */
 int vbsfCopyFilePart(SHFLCLIENTDATA *pClient, SHFLROOT idRootSrc, SHFLHANDLE hFileSrc, uint64_t offSrc,
                      SHFLROOT idRootDst, SHFLHANDLE hFileDst, uint64_t offDst, uint64_t *pcbToCopy, uint32_t fFlags)
@@ -1392,4 +1394,7 @@
         if (RT_SUCCESS(rc))
         {
+            /*
+             * Do the job.
+             */
             rc = RTFileCopyPart(pHandleSrc->file.Handle, offSrc, pHandleDst->file.Handle, offDst, cbToCopy, 0, &cbTotal);
             *pcbToCopy = cbTotal;
@@ -2292,4 +2297,45 @@
 }
 
+/**
+ * Implements SHFL_FN_COPY_FILE (wrapping RTFileCopy).
+ */
+int vbsfCopyFile(SHFLCLIENTDATA *pClient, SHFLROOT idRootSrc, PCSHFLSTRING pStrPathSrc,
+                 SHFLROOT idRootDst, PCSHFLSTRING pStrPathDst, uint32_t fFlags)
+{
+    AssertPtrReturn(pClient, VERR_INVALID_PARAMETER);
+    if (pClient->fu32Flags & SHFL_CF_UTF8)
+        LogFunc(("pClient %p, idRootSrc %#RX32, '%.*s', idRootSrc %#RX32, '%.*s', fFlags %#x\n", pClient, idRootSrc,
+                 pStrPathSrc->u16Length, pStrPathSrc->String.ach, idRootDst, pStrPathDst->u16Length, pStrPathDst->String.ach, fFlags));
+    else
+        LogFunc(("pClient %p, idRootSrc %#RX32, '%.*ls', idRootSrc %#RX32, '%.*ls', fFlags %#x\n", pClient,
+                 idRootSrc, pStrPathSrc->u16Length / sizeof(RTUTF16), pStrPathSrc->String.ach,
+                 idRootDst, pStrPathDst->u16Length / sizeof(RTUTF16), pStrPathDst->String.ach, fFlags));
+
+    /*
+     * Build host paths.
+     */
+    char *pszPathSrc = NULL;
+    int rc = vbsfBuildFullPath(pClient, idRootSrc, pStrPathSrc, pStrPathSrc->u16Size + SHFLSTRING_HEADER_SIZE, &pszPathSrc, NULL);
+    if (RT_SUCCESS(rc))
+    {
+        char *pszPathDst = NULL;
+        rc = vbsfBuildFullPath(pClient, idRootDst, pStrPathDst, pStrPathDst->u16Size + SHFLSTRING_HEADER_SIZE, &pszPathDst, NULL);
+        if (RT_SUCCESS(rc))
+        {
+            /*
+             * Do the job.
+             */
+            rc = RTFileCopy(pszPathSrc, pszPathDst);
+
+            vbsfFreeFullPath(pszPathDst);
+        }
+        vbsfFreeFullPath(pszPathSrc);
+    }
+
+    RT_NOREF(fFlags);
+    LogFunc(("returns %Rrc\n", rc));
+    return rc;
+}
+
 #ifdef UNITTEST
 /** Unit test the SHFL_FN_SYMLINK API.  Located here as a form of API
Index: trunk/src/VBox/HostServices/SharedFolders/vbsf.h
===================================================================
--- trunk/src/VBox/HostServices/SharedFolders/vbsf.h	(revision 77847)
+++ trunk/src/VBox/HostServices/SharedFolders/vbsf.h	(revision 77848)
@@ -42,4 +42,6 @@
 int vbsfRemove(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLSTRING *pPath, uint32_t cbPath, uint32_t flags);
 int vbsfRename(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLSTRING *pSrc, SHFLSTRING *pDest, uint32_t flags);
+int vbsfCopyFile(SHFLCLIENTDATA *pClient, SHFLROOT idRootSrc, PCSHFLSTRING pStrPathSrc,
+                 SHFLROOT idRootDst, PCSHFLSTRING pStrPathDst, uint32_t fFlags);
 int vbsfDirList(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLHANDLE Handle, SHFLSTRING *pPath, uint32_t flags, uint32_t *pcbBuffer, uint8_t *pBuffer, uint32_t *pIndex, uint32_t *pcFiles);
 int vbsfFileInfo(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLHANDLE Handle, uint32_t flags, uint32_t *pcbBuffer, uint8_t *pBuffer);
Index: trunk/src/VBox/HostServices/SharedFolders/vbsfpath.cpp
===================================================================
--- trunk/src/VBox/HostServices/SharedFolders/vbsfpath.cpp	(revision 77847)
+++ trunk/src/VBox/HostServices/SharedFolders/vbsfpath.cpp	(revision 77848)
@@ -429,5 +429,5 @@
 
 int vbsfPathGuestToHost(SHFLCLIENTDATA *pClient, SHFLROOT hRoot,
-                        PSHFLSTRING pGuestString, uint32_t cbGuestString,
+                        PCSHFLSTRING pGuestString, uint32_t cbGuestString,
                         char **ppszHostPath, uint32_t *pcbHostPathRoot,
                         uint32_t fu32Options,
@@ -472,21 +472,19 @@
         /* UTF-8 */
         cbGuestPath = pGuestString->u16Length;
-        pchGuestPath = (char *)&pGuestString->String.utf8[0];
+        pchGuestPath = pGuestString->String.ach;
     }
     else
     {
         /* UTF-16 */
-        uint32_t cwcSrc;
-        PRTUTF16 pwszSrc;
 
 #ifdef RT_OS_DARWIN /* Misplaced hack! See todo! */
-        cwcSrc = 0;
-        pwszSrc = NULL;
+        uint32_t cwcSrc  = 0;
+        PRTUTF16 pwszSrc = NULL;
         rc = vbsfNormalizeStringDarwin(&pGuestString->String.ucs2[0],
                                        pGuestString->u16Length / sizeof(RTUTF16),
                                        &pwszSrc, &cwcSrc);
 #else
-        cwcSrc  = pGuestString->u16Length / sizeof(RTUTF16);
-        pwszSrc = &pGuestString->String.ucs2[0];
+        uint32_t  const cwcSrc  = pGuestString->u16Length / sizeof(RTUTF16);
+        PCRTUTF16 const pwszSrc = &pGuestString->String.ucs2[0];
 #endif
 
Index: trunk/src/VBox/HostServices/SharedFolders/vbsfpath.h
===================================================================
--- trunk/src/VBox/HostServices/SharedFolders/vbsfpath.h	(revision 77847)
+++ trunk/src/VBox/HostServices/SharedFolders/vbsfpath.h	(revision 77848)
@@ -44,5 +44,5 @@
  */
 int vbsfPathGuestToHost(SHFLCLIENTDATA *pClient, SHFLROOT hRoot,
-                        PSHFLSTRING pGuestString, uint32_t cbGuestString,
+                        PCSHFLSTRING pGuestString, uint32_t cbGuestString,
                         char **ppszHostPath, uint32_t *pcbHostPathRoot,
                         uint32_t fu32Options, uint32_t *pfu32PathFlags);
