Index: /trunk/src/VBox/HostServices/SharedFolders/vbsf.cpp
===================================================================
--- /trunk/src/VBox/HostServices/SharedFolders/vbsf.cpp	(revision 65278)
+++ /trunk/src/VBox/HostServices/SharedFolders/vbsf.cpp	(revision 65279)
@@ -147,4 +147,5 @@
  *
  * @returns iprt status code
+ * @param  fWritable  whether the shared folder is writable
  * @param  fShflFlags shared folder create flags
  * @param  fMode      file attributes
@@ -152,5 +153,5 @@
  * @retval pfOpen     iprt create flags
  */
-static int vbsfConvertFileOpenFlags(unsigned fShflFlags, RTFMODE fMode, SHFLHANDLE handleInitial, uint32_t *pfOpen)
+static int vbsfConvertFileOpenFlags(bool fWritable, unsigned fShflFlags, RTFMODE fMode, SHFLHANDLE handleInitial, uint32_t *pfOpen)
 {
     uint32_t fOpen = 0;
@@ -368,4 +369,7 @@
     if (RT_SUCCESS(rc))
     {
+        if (!fWritable)
+            fOpen &= ~RTFILE_O_WRITE;
+
         *pfOpen = fOpen;
     }
@@ -378,4 +382,5 @@
  * @returns IPRT status code
  * @param  pClient               Data structure describing the client accessing the shared folder
+ * @param  root                  The index of the shared folder in the table of mappings.
  * @param  pszPath               Path to the file or folder on the host.
  * @param  pParms @a CreateFlags Creation or open parameters, see include/VBox/shflsvc.h
@@ -388,5 +393,5 @@
  * @retval pParms @a Info        On success the parameters of the file opened or created
  */
-static int vbsfOpenFile(SHFLCLIENTDATA *pClient, const char *pszPath, SHFLCREATEPARMS *pParms)
+static int vbsfOpenFile(SHFLCLIENTDATA *pClient, SHFLROOT root, const char *pszPath, SHFLCREATEPARMS *pParms)
 {
     LogFlow(("vbsfOpenFile: pszPath = %s, pParms = %p\n", pszPath, pParms));
@@ -400,5 +405,11 @@
     static int cErrors;
 
-    int rc = vbsfConvertFileOpenFlags(pParms->CreateFlags, pParms->Info.Attr.fMode, pParms->Handle, &fOpen);
+    /* is the guest allowed to write to this share? */
+    bool fWritable;
+    int rc = vbsfMappingsQueryWritable(pClient, root, &fWritable);
+    if (RT_FAILURE(rc))
+        fWritable = false;
+
+    rc = vbsfConvertFileOpenFlags(fWritable, pParms->CreateFlags, pParms->Info.Attr.fMode, pParms->Handle, &fOpen);
     if (RT_SUCCESS(rc))
     {
@@ -878,5 +889,5 @@
                 else
                 {
-                    rc = vbsfOpenFile(pClient, pszFullPath, pParms);
+                    rc = vbsfOpenFile(pClient, root, pszFullPath, pParms);
                 }
             }
