Index: /trunk/include/VBox/GuestHost/SharedClipboard-transfers.h
===================================================================
--- /trunk/include/VBox/GuestHost/SharedClipboard-transfers.h	(revision 82477)
+++ /trunk/include/VBox/GuestHost/SharedClipboard-transfers.h	(revision 82478)
@@ -86,5 +86,5 @@
 
 /** Specifies an invalid Shared Clipboard list handle. */
-#define SHCLLISTHANDLE_INVALID        ((SHCLLISTHANDLE)~0LL)
+#define SHCLLISTHANDLE_INVALID        ((SHCLLISTHANDLE)UINT64_MAX)
 
 /** A Shared Clipboard object handle. */
@@ -94,5 +94,5 @@
 
 /** Specifies an invalid Shared Clipboard object handle. */
-#define SHCLOBJHANDLE_INVALID         ((SHCLOBJHANDLE)~0LL)
+#define SHCLOBJHANDLE_INVALID         ((SHCLOBJHANDLE)UINT64_MAX)
 
 /** @} */
@@ -101,64 +101,42 @@
  *  @{
  */
-
 /** No flags. Initialization value. */
-#define SHCL_OBJ_CF_NONE                  (0x00000000)
-
+#define SHCL_OBJ_CF_NONE                    UINT32_C(0x00000000)
+
+#if 0 /* These probably won't be needed either */
 /** Lookup only the object, do not return a handle. All other flags are ignored. */
-#define SHCL_OBJ_CF_LOOKUP                (0x00000001)
-
+#define SHCL_OBJ_CF_LOOKUP                  UINT32_C(0x00000001)
 /** Create/open a directory. */
-#define SHCL_OBJ_CF_DIRECTORY             (0x00000004)
+#define SHCL_OBJ_CF_DIRECTORY               UINT32_C(0x00000004)
+#endif
 
 /** Read/write requested access for the object. */
-#define SHCL_OBJ_CF_ACCESS_MASK_RW          (0x00001000)
-
+#define SHCL_OBJ_CF_ACCESS_MASK_RW          UINT32_C(0x00001000)
 /** No access requested. */
-#define SHCL_OBJ_CF_ACCESS_NONE             (0x00000000)
+#define SHCL_OBJ_CF_ACCESS_NONE             UINT32_C(0x00000000)
 /** Read access requested. */
-#define SHCL_OBJ_CF_ACCESS_READ             (0x00001000)
+#define SHCL_OBJ_CF_ACCESS_READ             UINT32_C(0x00001000)
 
 /** Requested share access for the object. */
-#define SHCL_OBJ_CF_ACCESS_MASK_DENY        (0x0000C000)
-
+#define SHCL_OBJ_CF_ACCESS_MASK_DENY        UINT32_C(0x00008000)
 /** Allow any access. */
-#define SHCL_OBJ_CF_ACCESS_DENYNONE         (0x00000000)
-/** Do not allow read. */
-#define SHCL_OBJ_CF_ACCESS_DENYREAD         (0x00004000)
+#define SHCL_OBJ_CF_ACCESS_DENYNONE         UINT32_C(0x00000000)
 /** Do not allow write. */
-#define SHCL_OBJ_CF_ACCESS_DENYWRITE        (0x00008000)
-/** Do not allow access. */
-#define SHCL_OBJ_CF_ACCESS_DENYALL          (SHCL_OBJ_CF_ACCESS_DENYREAD | SHCL_OBJ_CF_ACCESS_DENYWRITE)
+#define SHCL_OBJ_CF_ACCESS_DENYWRITE        UINT32_C(0x00008000)
 
 /** Requested access to attributes of the object. */
-#define SHCL_OBJ_CF_ACCESS_MASK_ATTR        (0x00030000)
-
+#define SHCL_OBJ_CF_ACCESS_MASK_ATTR        UINT32_C(0x00010000)
 /** No access requested. */
-#define SHCL_OBJ_CF_ACCESS_ATTR_NONE        (0x00000000)
+#define SHCL_OBJ_CF_ACCESS_ATTR_NONE        UINT32_C(0x00000000)
 /** Read access requested. */
-#define SHCL_OBJ_CF_ACCESS_ATTR_READ        (0x00010000)
-
+#define SHCL_OBJ_CF_ACCESS_ATTR_READ        UINT32_C(0x00010000)
+
+/** Valid bits. */
+#define SHCL_OBJ_CF_VALID_MASK              UINT32_C(0x00018000)
 /** @} */
 
-/** Result of an open request.
- *  Along with handle value the result code
- *  identifies what has happened while
- *  trying to open the object.
- */
-typedef enum _SHCLCREATERESULT
-{
-    SHCL_CREATERESULT_NONE,
-    /** Specified path does not exist. */
-    SHCL_CREATERESULT_PATH_NOT_FOUND,
-    /** Path to file exists, but the last component does not. */
-    SHCL_CREATERESULT_FILE_NOT_FOUND,
-    /** Blow the type up to 32-bit. */
-    SHCL_CREATERESULT_32BIT_HACK = 0x7fffffff
-} SHCLCREATERESULT;
-AssertCompile(SHCL_CREATERESULT_NONE == 0);
-AssertCompileSize(SHCLCREATERESULT, 4);
-
 /**
  * The available additional information in a SHCLFSOBJATTR object.
+ * @sa RTFSOBJATTRADD
  */
 typedef enum _SHCLFSOBJATTRADD
@@ -191,6 +169,7 @@
 /**
  * Shared Clipboard filesystem object attributes.
- */
-#pragma pack(1)
+ *
+ * @sa RTFSOBJATTR
+ */
 typedef struct _SHCLFSOBJATTR
 {
@@ -263,8 +242,10 @@
             RTFOFF          cb;
         } EASize;
+
+        /** Padding the structure to a multiple of 8 bytes. */
+        uint64_t au64Padding[5];
     } u;
 } SHCLFSOBJATTR;
-#pragma pack()
-AssertCompileSize(SHCLFSOBJATTR, 44);
+AssertCompileSize(SHCLFSOBJATTR, 48);
 /** Pointer to a Shared Clipboard filesystem object attributes structure. */
 typedef SHCLFSOBJATTR *PSHCLFSOBJATTR;
@@ -274,6 +255,7 @@
 /**
  * Shared Clipboard file system object information structure.
- */
-#pragma pack(1)
+ *
+ * @sa RTFSOBJINFO
+ */
 typedef struct _SHCLFSOBJINFO
 {
@@ -311,6 +293,5 @@
 
 } SHCLFSOBJINFO;
-#pragma pack()
-AssertCompileSize(SHCLFSOBJINFO, 92);
+AssertCompileSize(SHCLFSOBJINFO, 96);
 /** Pointer to a Shared Clipboard filesystem object information structure. */
 typedef SHCLFSOBJINFO *PSHCLFSOBJINFO;
@@ -319,5 +300,4 @@
 typedef const SHCLFSOBJINFO *PCSHCLFSOBJINFO;
 
-#pragma pack(1)
 /**
  * Structure for keeping object open/create parameters.
@@ -337,5 +317,4 @@
     SHCLFSOBJINFO    ObjInfo;
 } SHCLOBJOPENCREATEPARMS, *PSHCLOBJOPENCREATEPARMS;
-#pragma pack()
 
 /**
@@ -537,7 +516,8 @@
 
 /**
- * Class for maintaining a Shared Clipboard area
- * on the host or guest. This will contain all received files & directories
- * for a single Shared Clipboard operation.
+ * Class for maintaining a Shared Clipboard area on the host or guest.
+ *
+ * This will contain all received files & directories for a single Shared
+ * Clipboard operation.
  *
  * In case of a failed Shared Clipboard operation this class can also
@@ -632,7 +612,4 @@
     SHCLTRANSFEROBJSTATE State;
 } SHCLTRANSFEROBJ, *PSHCLTRANSFEROBJ;
-
-/** Defines a transfer ID. */
-typedef uint16_t SHCLTRANSFERID;
 
 /**
@@ -743,5 +720,5 @@
  * This is handed in to the provider implementation callbacks.
  */
-    typedef struct _SHCLPROVIDERCTX
+typedef struct _SHCLPROVIDERCTX
 {
     /** Pointer to the related Shared Clipboard transfer. */
@@ -752,5 +729,5 @@
 
 /** @todo r=bird: These macros must go as they do no lend themselves to writing
- *        sane documentation.  Use the DECLCALLBACK macro instead, as you
+ *        sane documentation.  Use the DECLCALLBACKMEMBER macro instead, as you
  *        probably do not need the function and function pointer typedefs.
  *
@@ -913,12 +890,10 @@
     /** The node member for using this struct in a RTList. */
     RTLISTNODE               Node;
-    /** Critical section for serializing access. */
-    RTCRITSECT               CritSect;
     /** The transfer's state (for SSM, later). */
     SHCLTRANSFERSTATE        State;
+    /** Absolute path to root entries. */
+    char                    *pszPathRootAbs;
     /** Timeout (in ms) for waiting of events. Default is 30s. */
     RTMSINTERVAL             uTimeoutMs;
-    /** Absolute path to root entries. */
-    char                    *pszPathRootAbs;
     /** Maximum data chunk size (in bytes) to transfer. Default is 64K. */
     uint32_t                 cbMaxChunkSize;
@@ -961,4 +936,6 @@
     /** Contains thread-related attributes. */
     SHCLTRANSFERTHREAD       Thread;
+    /** Critical section for serializing access. */
+    RTCRITSECT               CritSect;
 } SHCLTRANSFER, *PSHCLTRANSFER;
 
Index: /trunk/src/VBox/GuestHost/SharedClipboard/clipboard-transfers.cpp
===================================================================
--- /trunk/src/VBox/GuestHost/SharedClipboard/clipboard-transfers.cpp	(revision 82477)
+++ /trunk/src/VBox/GuestHost/SharedClipboard/clipboard-transfers.cpp	(revision 82478)
@@ -34,5 +34,5 @@
 static int shClTransferThreadDestroy(PSHCLTRANSFER pTransfer, RTMSINTERVAL uTimeoutMs);
 static PSHCLTRANSFER shClTransferCtxGetTransferInternal(PSHCLTRANSFERCTX pTransferCtx, uint32_t uIdx);
-static int shClConvertFileCreateFlags(bool fWritable, unsigned fShClFlags, RTFMODE fMode, SHCLOBJHANDLE handleInitial, uint64_t *pfOpen);
+static int shClConvertFileCreateFlags(uint32_t fShClFlags, uint64_t *pfOpen);
 static int shClTransferResolvePathAbs(PSHCLTRANSFER pTransfer, const char *pszPath, uint32_t fFlags, char **ppszResolved);
 
@@ -796,25 +796,21 @@
  * @param   phObj               Where to store the handle of transfer object opened on success.
  */
-int ShClTransferObjOpen(PSHCLTRANSFER pTransfer, PSHCLOBJOPENCREATEPARMS pOpenCreateParms,
-                        PSHCLOBJHANDLE phObj)
+int ShClTransferObjOpen(PSHCLTRANSFER pTransfer, PSHCLOBJOPENCREATEPARMS pOpenCreateParms, PSHCLOBJHANDLE phObj)
 {
     AssertPtrReturn(pTransfer,        VERR_INVALID_POINTER);
     AssertPtrReturn(pOpenCreateParms, VERR_INVALID_POINTER);
     AssertPtrReturn(phObj,            VERR_INVALID_POINTER);
-
-    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);
 
-    if (pTransfer->cObjHandles == pTransfer->cMaxObjHandles)
+    if (pTransfer->cObjHandles >= pTransfer->cMaxObjHandles)
         return VERR_SHCLPB_MAX_OBJECTS_REACHED;
 
     LogFlowFunc(("pszPath=%s, fCreate=0x%x\n", pOpenCreateParms->pszPath, pOpenCreateParms->fCreate));
 
+    int rc;
     if (pTransfer->State.enmSource == SHCLSOURCE_LOCAL)
     {
-        PSHCLOBJHANDLEINFO pInfo
-            = (PSHCLOBJHANDLEINFO)RTMemAllocZ(sizeof(SHCLOBJHANDLEINFO));
+        PSHCLOBJHANDLEINFO pInfo = (PSHCLOBJHANDLEINFO)RTMemAllocZ(sizeof(SHCLOBJHANDLEINFO));
         if (pInfo)
         {
@@ -822,13 +818,6 @@
             if (RT_SUCCESS(rc))
             {
-
-                /* Only if this is a read transfer (locally) we're able to actually write to files
-                 * (we're reading from the source). */
-                const bool fWritable = pTransfer->State.enmDir == SHCLTRANSFERDIR_FROM_REMOTE;
-
                 uint64_t fOpen;
-                rc = shClConvertFileCreateFlags(fWritable,
-                                                pOpenCreateParms->fCreate, pOpenCreateParms->ObjInfo.Attr.fMode,
-                                                SHCLOBJHANDLE_INVALID, &fOpen);
+                rc = shClConvertFileCreateFlags(pOpenCreateParms->fCreate, &fOpen);
                 if (RT_SUCCESS(rc))
                 {
@@ -839,9 +828,7 @@
                         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));
+                            LogRel(("Shared Clipboard: Error opening file '%s': rc=%Rrc\n", pInfo->pszPathLocalAbs, rc));
                     }
                 }
@@ -872,7 +859,5 @@
     {
         if (pTransfer->ProviderIface.pfnObjOpen)
-        {
             rc = pTransfer->ProviderIface.pfnObjOpen(&pTransfer->ProviderCtx, pOpenCreateParms, phObj);
-        }
         else
             rc = VERR_NOT_SUPPORTED;
@@ -3012,61 +2997,18 @@
  *
  * @returns IPRT status code.
- * @param  fWritable            Whether the object is writable.
- * @param  fShClFlags           Shared clipboard create flags.
- * @param  fMode                File attributes.
- * @param  handleInitial        Initial handle.
- * @retval pfOpen               Where to store the IPRT creation / open flags.
+ * @param       fShClFlags  Shared clipboard create flags.
+ * @param[out]  pfOpen      Where to store the RTFILE_O_XXX flags for
+ *                          RTFileOpen.
  *
  * @sa Initially taken from vbsfConvertFileOpenFlags().
  */
-static int shClConvertFileCreateFlags(bool fWritable, unsigned fShClFlags, RTFMODE fMode,
-                                      SHCLOBJHANDLE handleInitial, uint64_t *pfOpen)
-{
+static int shClConvertFileCreateFlags(uint32_t fShClFlags, uint64_t *pfOpen)
+{
+    AssertMsgReturnStmt(!(fShClFlags & ~SHCL_OBJ_CF_VALID_MASK), ("%#x4\n", fShClFlags), *pfOpen = 0, VERR_INVALID_FLAGS);
+
     uint64_t fOpen = 0;
-    int rc = VINF_SUCCESS;
-
-    if (   (fMode & RTFS_DOS_MASK) != 0
-        && (fMode & RTFS_UNIX_MASK) == 0)
-    {
-        /* A DOS/Windows guest, make RTFS_UNIX_* from RTFS_DOS_*.
-         * @todo this is based on rtFsModeNormalize/rtFsModeFromDos.
-         *       May be better to use RTFsModeNormalize here.
-         */
-        fMode |= RTFS_UNIX_IRUSR | RTFS_UNIX_IRGRP | RTFS_UNIX_IROTH;
-        /* x for directories. */
-        if (fMode & RTFS_DOS_DIRECTORY)
-            fMode |= RTFS_TYPE_DIRECTORY | RTFS_UNIX_IXUSR | RTFS_UNIX_IXGRP | RTFS_UNIX_IXOTH;
-        /* writable? */
-        if (!(fMode & RTFS_DOS_READONLY))
-            fMode |= RTFS_UNIX_IWUSR | RTFS_UNIX_IWGRP | RTFS_UNIX_IWOTH;
-
-        /* Set the requested mode using only allowed bits. */
-        fOpen |= ((fMode & RTFS_UNIX_MASK) << RTFILE_O_CREATE_MODE_SHIFT) & RTFILE_O_CREATE_MODE_MASK;
-    }
-    else
-    {
-        /* Old linux and solaris additions did not initialize the Info.Attr.fMode field
-         * and it contained random bits from stack. Detect this using the handle field value
-         * passed from the guest: old additions set it (incorrectly) to 0, new additions
-         * set it to SHCLOBJHANDLE_INVALID(~0).
-         */
-        if (handleInitial == 0)
-        {
-            /* Old additions. Do nothing, use default mode. */
-        }
-        else
-        {
-            /* New additions or Windows additions. Set the requested mode using only allowed bits.
-             * Note: Windows guest set RTFS_UNIX_MASK bits to 0, which means a default mode
-             *       will be set in fOpen.
-             */
-            fOpen |= ((fMode & RTFS_UNIX_MASK) << RTFILE_O_CREATE_MODE_SHIFT) & RTFILE_O_CREATE_MODE_MASK;
-        }
-    }
-
-    switch ((fShClFlags & SHCL_OBJ_CF_ACCESS_MASK_RW))
-    {
-        default:
-            RT_FALL_THROUGH();
+
+    switch (fShClFlags & SHCL_OBJ_CF_ACCESS_MASK_RW)
+    {
         case SHCL_OBJ_CF_ACCESS_NONE:
         {
@@ -3087,10 +3029,11 @@
             break;
         }
-    }
-
-    switch ((fShClFlags & SHCL_OBJ_CF_ACCESS_MASK_ATTR))
-    {
+
         default:
-            RT_FALL_THROUGH();
+            AssertFailedReturn(VERR_IPE_NOT_REACHED_DEFAULT_CASE);
+    }
+
+    switch (fShClFlags & SHCL_OBJ_CF_ACCESS_MASK_ATTR)
+    {
         case SHCL_OBJ_CF_ACCESS_ATTR_NONE:
         {
@@ -3106,10 +3049,12 @@
             break;
         }
+
+        default:
+            AssertFailedReturn(VERR_IPE_NOT_REACHED_DEFAULT_CASE);
     }
 
     /* Sharing mask */
-    switch ((fShClFlags & SHCL_OBJ_CF_ACCESS_MASK_DENY))
-    {
-        default:
+    switch (fShClFlags & SHCL_OBJ_CF_ACCESS_MASK_DENY)
+    {
         case SHCL_OBJ_CF_ACCESS_DENYNONE:
             fOpen |= RTFILE_O_DENY_NONE;
@@ -3117,9 +3062,4 @@
             break;
 
-        case SHCL_OBJ_CF_ACCESS_DENYREAD:
-            fOpen |= RTFILE_O_DENY_READ;
-            LogFlowFunc(("SHCL_OBJ_CF_ACCESS_DENYREAD\n"));
-            break;
-
         case SHCL_OBJ_CF_ACCESS_DENYWRITE:
             fOpen |= RTFILE_O_DENY_WRITE;
@@ -3127,20 +3067,12 @@
             break;
 
-        case SHCL_OBJ_CF_ACCESS_DENYALL:
-            fOpen |= RTFILE_O_DENY_ALL;
-            LogFlowFunc(("SHCL_OBJ_CF_ACCESS_DENYALL\n"));
-            break;
-    }
-
-    if (RT_SUCCESS(rc))
-    {
-        if (!fWritable)
-            fOpen &= ~RTFILE_O_WRITE;
-
-        *pfOpen = fOpen;
-    }
-
-    LogFlowFuncLeaveRC(rc);
-    return rc;
+        default:
+            AssertFailedReturn(VERR_IPE_NOT_REACHED_DEFAULT_CASE);
+    }
+
+    *pfOpen = fOpen;
+
+    LogFlowFuncLeaveRC(VINF_SUCCESS);
+    return VINF_SUCCESS;
 }
 
Index: /trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-transfers.cpp
===================================================================
--- /trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-transfers.cpp	(revision 82477)
+++ /trunk/src/VBox/HostServices/SharedClipboard/VBoxSharedClipboardSvc-transfers.cpp	(revision 82478)
@@ -1370,5 +1370,5 @@
             if (!pTransfer)
             {
-                LogFunc(("Transfer with ID %RU32 not found\n", uTransferID));
+                LogFunc(("Transfer with ID %RU16 not found\n", uTransferID));
                 rc = VERR_SHCLPB_TRANSFER_ID_NOT_FOUND;
             }
@@ -1615,6 +1615,5 @@
         case VBOX_SHCL_GUEST_FN_OBJ_OPEN:
         {
-            if (cParms != VBOX_SHCL_CPARMS_OBJ_OPEN)
-                break;
+            ASSERT_GUEST_STMT_BREAK(cParms == VBOX_SHCL_CPARMS_OBJ_OPEN, VERR_WRONG_PARAMETER_COUNT);
 
             SHCLOBJOPENCREATEPARMS openCreateParms;
@@ -1622,7 +1621,8 @@
 
             uint32_t cbPath;
-            rc = HGCMSvcGetU32(&paParms[2], &cbPath);
-            if (RT_SUCCESS(rc))
-            {
+            rc = HGCMSvcGetU32(&paParms[2], &cbPath); /** @todo r=bird: This is an pointless parameter. */
+            if (RT_SUCCESS(rc))
+            {
+                /** @todo r=bird: This is the wrong way of getting a string!   */
                 rc = HGCMSvcGetPv(&paParms[3], (void **)&openCreateParms.pszPath, &openCreateParms.cbPath);
                 if (cbPath != openCreateParms.cbPath)
