Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/guestctrl/UIGuestControlFileModel.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/guestctrl/UIGuestControlFileModel.cpp	(revision 71831)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/guestctrl/UIGuestControlFileModel.cpp	(revision 71832)
@@ -116,4 +116,6 @@
             if (item->isUpDirectory())
                 return QIcon(":/arrow_up_10px_x2.png");
+            else if(item->isDriveItem())
+                return QIcon(":/hd_32px.png");
             else
                 return QIcon(":/sf_32px.png");
@@ -256,3 +258,2 @@
     return true;
 }
-
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/guestctrl/UIGuestControlFileTable.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/guestctrl/UIGuestControlFileTable.cpp	(revision 71831)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/guestctrl/UIGuestControlFileTable.cpp	(revision 71832)
@@ -171,4 +171,5 @@
 
 const QChar UIPathOperations::delimiter = QChar('/');
+const QChar UIPathOperations::dosDelimiter = QChar('\\');
 
 /* static */ QString UIPathOperations::removeMultipleDelimiters(const QString &path)
@@ -193,6 +194,5 @@
 }
 
-/* static */ QString UIPathOperations::addTrailingDelimiters
-(const QString &path)
+/* static */ QString UIPathOperations::addTrailingDelimiters(const QString &path)
 {
     if (path.isNull() || path.isEmpty())
@@ -209,4 +209,11 @@
         return QString(path);
     QString newPath(path);
+
+    if (doesPathStartWithDriveLetter(newPath))
+    {
+        if (newPath.at(newPath.length() - 1) != delimiter)
+            newPath += delimiter;
+        return newPath;
+    }
     if (newPath.at(0) != delimiter)
         newPath.insert(0, delimiter);
@@ -216,5 +223,7 @@
 /* static */ QString UIPathOperations::sanitize(const QString &path)
 {
-    return addStartDelimiter(removeTrailingDelimiters(removeMultipleDelimiters(path)));
+    //return addStartDelimiter(removeTrailingDelimiters(removeMultipleDelimiters(path)));
+    QString newPath = addStartDelimiter(removeTrailingDelimiters(removeMultipleDelimiters(path))).replace(dosDelimiter, delimiter);
+    return newPath;
 }
 
@@ -270,5 +279,21 @@
 {
     QStringList pathList = path.split(UIPathOperations::delimiter, QString::SkipEmptyParts);
+    if (!pathList.isEmpty() && doesPathStartWithDriveLetter(pathList[0]))
+    {
+        pathList[0] = addTrailingDelimiters(pathList[0]);
+    }
     return pathList;
+}
+
+/* static */ bool UIPathOperations::doesPathStartWithDriveLetter(const QString &path)
+{
+    if (path.length() < 2)
+        return false;
+    /* search for ':' with the path: */
+    if (!path[0].isLetter())
+        return false;
+    if (path[1] != ':')
+        return false;
+    return true;
 }
 
@@ -545,4 +570,5 @@
     , m_isTargetADirectory(false)
     , m_type(type)
+    , m_isDriveItem(false)
 {
 }
@@ -693,4 +719,14 @@
 {
     m_isTargetADirectory = flag;
+}
+
+void UIFileTableItem::setIsDriveItem(bool flag)
+{
+    m_isDriveItem = flag;
+}
+
+bool UIFileTableItem::isDriveItem() const
+{
+    return m_isDriveItem;
 }
 
@@ -972,5 +1008,6 @@
     if (m_pRootItem)
         reset();
-
+    determineDriveLetters();
+    /* Root item: */
     const QString startPath("/");
     QList<QVariant> headData;
@@ -983,8 +1020,25 @@
     startItem->setPath(startPath);
     m_pRootItem->appendChild(startItem);
-
     startItem->setIsOpened(false);
-    /* Read the root directory and get the list: */
-    readDirectory(startPath, startItem, true);
+    if (m_driveLetterList.isEmpty())
+    {
+        /* Read the root directory and get the list: */
+        readDirectory(startPath, startItem, true);
+    }
+    else
+    {
+        for (int i = 0; i < m_driveLetterList.size(); ++i)
+        {
+            QList<QVariant> data;
+
+            data << m_driveLetterList[i] << 4096 << QDateTime() << "";
+            UIFileTableItem* driveItem = new UIFileTableItem(data, startItem, FileObjectType_Directory);
+            driveItem->setPath(m_driveLetterList[i]);
+            startItem->appendChild(driveItem);
+            driveItem->setIsOpened(false);
+            driveItem->setIsDriveItem(true);
+            startItem->setIsOpened(true);
+        }
+    }
     m_pView->setRootIndex(m_pModel->rootIndex());
     m_pModel->signalUpdate();
@@ -995,4 +1049,6 @@
                                                 UIFileTableItem *parent, bool isDirectoryMap, bool isStartDir)
 {
+    if (parent)
+
     /* Make sure we have a ".." item within directories, and make sure it is not there for the start dir: */
     if (isDirectoryMap)
@@ -1244,7 +1300,5 @@
     if (comboLocation == currentDirectoryPath())
         return;
-
-    QStringList pathList = comboLocation.split(UIPathOperations::delimiter, QString::SkipEmptyParts);
-    goIntoDirectory(pathList);
+    goIntoDirectory(UIPathOperations::pathTrail(comboLocation));
 }
 
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/guestctrl/UIGuestControlFileTable.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/guestctrl/UIGuestControlFileTable.h	(revision 71831)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/guestctrl/UIGuestControlFileTable.h	(revision 71832)
@@ -147,6 +147,11 @@
     static QString constructNewItemPath(const QString &previousPath, const QString &newBaseName);
     /** Split the path and return it as a QStringList, top most being the 0th element. No delimiters */
-    QStringList pathTrail(const QString &path);
+    static QStringList pathTrail(const QString &path);
     static const QChar delimiter;
+    static const QChar dosDelimiter;
+
+    /** Try to guess if the path starts with DOS style drive letters */
+    static bool doesPathStartWithDriveLetter(const QString &path);
+
 };
 
@@ -203,8 +208,11 @@
     QString name() const;
 
+    void setIsDriveItem(bool flag);
+    bool isDriveItem() const;
+
 private:
 
     QList<UIFileTableItem*>         m_childItems;
-    /** Used to find children by path */
+    /** Used to find children by name */
     QMap<QString, UIFileTableItem*> m_childMap;
     /** It is required that m_itemData[0] is name (QString) of the file object */
@@ -219,5 +227,6 @@
     bool             m_isTargetADirectory;
     FileObjectType   m_type;
-
+    /** True if only this item represents a DOS style drive letter item */
+    bool             m_isDriveItem;
 };
 
@@ -267,4 +276,7 @@
     virtual QString  fsObjectPropertyString() = 0;
     virtual void     showProperties() = 0;
+    /** For non-windows system does nothing and for windows systems populates m_driveLetterList with
+     *  drive letters */
+    virtual void     determineDriveLetters() = 0;
     static QString   fileTypeString(FileObjectType type);
     void             goIntoDirectory(const QModelIndex &itemIndex);
@@ -285,4 +297,7 @@
     QAction                 *m_pPaste;
     UIPropertiesDialog      *m_pPropertiesDialog;
+    /** Stores the drive letters the file system has (for windows system). For non-windows
+     *  systems this is empty and for windows system it should at least contain C:/ */
+    QStringList m_driveLetterList;
 
 protected slots:
@@ -336,5 +351,5 @@
     QVector<QAction*> m_selectionDependentActions;
     /** The absolue path list of the file objects which user has chosen to cut/copy. this
-      * list will be cleaned after a paste operation or overwritten by a subsequent cut/copy */
+     *  list will be cleaned after a paste operation or overwritten by a subsequent cut/copy */
     QStringList       m_copyCutBuffer;
     friend class UIGuestControlFileModel;
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/guestctrl/UIGuestFileTable.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/guestctrl/UIGuestFileTable.cpp	(revision 71831)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/guestctrl/UIGuestFileTable.cpp	(revision 71832)
@@ -178,5 +178,5 @@
     flag.push_back(KDirectoryOpenFlag_None);
 
-    directory = m_comGuestSession.DirectoryOpen(strPath, /*aFilter*/ "", flag);
+    directory = m_comGuestSession.DirectoryOpen(UIPathOperations::sanitize(strPath), /*aFilter*/ "", flag);
     if (!m_comGuestSession.isOk())
     {
@@ -204,5 +204,4 @@
                 continue;
             item->setPath(UIPathOperations::mergePaths(strPath, fsInfo.GetName()));
-
             if (fsObjectType == FileObjectType_Directory)
             {
@@ -269,5 +268,5 @@
     }
     QStringList pathList = userHome.split(UIPathOperations::delimiter, QString::SkipEmptyParts);
-    goIntoDirectory(pathList);
+    goIntoDirectory(UIPathOperations::pathTrail(userHome));
 }
 
@@ -555,4 +554,23 @@
 }
 
+void UIGuestFileTable::determineDriveLetters()
+{
+    if (m_comGuestSession.isNull())
+        return;
+    KPathStyle pathStyle = m_comGuestSession.GetPathStyle();
+    if (pathStyle != KPathStyle_DOS)
+        return;
+
+    /** @todo Currently API lacks a way to query windows drive letters.
+     *  so we enumarate them by using CGuestSession::DirectoryExists() */
+    for (int i = 'A'; i <= 'Z'; ++i)
+    {
+        QString path((char)i);
+        path += ":/";
+        bool exists = m_comGuestSession.DirectoryExists(path, false /* aFollowSymlinks */);
+        if (exists)
+            m_driveLetterList.push_back(path);
+    }
+}
+
 #include "UIGuestFileTable.moc"
-
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/guestctrl/UIGuestFileTable.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/guestctrl/UIGuestFileTable.h	(revision 71831)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/guestctrl/UIGuestFileTable.h	(revision 71832)
@@ -49,4 +49,5 @@
     virtual QString fsObjectPropertyString() /* override */;
     virtual void  showProperties() /* override */;
+    virtual void determineDriveLetters() /* override */;
 
 private:
@@ -63,3 +64,2 @@
 
 #endif /* !___UIGuestControlFileTable_h___ */
-
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/guestctrl/UIHostFileTable.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/guestctrl/UIHostFileTable.cpp	(revision 71831)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/guestctrl/UIHostFileTable.cpp	(revision 71832)
@@ -227,6 +227,5 @@
 
     QString userHome = UIPathOperations::sanitize(QDir::homePath());
-    QStringList pathList = userHome.split(UIPathOperations::delimiter, QString::SkipEmptyParts);
-    goIntoDirectory(pathList);
+    goIntoDirectory(UIPathOperations::pathTrail(userHome));
 }
 
@@ -382,4 +381,7 @@
 }
 
+void UIHostFileTable::determineDriveLetters()
+{
+}
+
 #include "UIHostFileTable.moc"
-
Index: /trunk/src/VBox/Frontends/VirtualBox/src/runtime/guestctrl/UIHostFileTable.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/runtime/guestctrl/UIHostFileTable.h	(revision 71831)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/runtime/guestctrl/UIHostFileTable.h	(revision 71832)
@@ -43,4 +43,5 @@
     virtual QString fsObjectPropertyString() /* override */;
     virtual void  showProperties() /* override */;
+    virtual void determineDriveLetters() /* override */;
 
 private:
@@ -50,3 +51,2 @@
 
 #endif /* !___UIGuestControlFileTable_h___ */
-
