Index: /trunk/src/VBox/Devices/Storage/DevATA.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DevATA.cpp	(revision 261)
+++ /trunk/src/VBox/Devices/Storage/DevATA.cpp	(revision 262)
@@ -5407,5 +5407,13 @@
             {
                 AssertMsgFailed(("Failed to attach LUN#%d. rc=%Vrc\n", pIf->iLUN, rc));
-                return PDMDEV_SET_ERROR(pDevIns, rc, N_("PIIX3 cannot attach drive."));
+                switch (rc)
+                {
+                    case VERR_ACCESS_DENIED:
+                        /* Error already catched by DrvHostBase */
+                        return rc;
+                    default:
+                        return PDMDevHlpVMSetError(pDevIns, rc, RT_SRC_POS, N_(
+                               "PIIX3 cannot attach drive to the %s"), s_apszDescs[i][j]);
+                }
             }
             cbTotalBuffer += pIf->cbIOBuffer;
Index: /trunk/src/VBox/Devices/Storage/DrvHostBase.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostBase.cpp	(revision 261)
+++ /trunk/src/VBox/Devices/Storage/DrvHostBase.cpp	(revision 262)
@@ -93,4 +93,5 @@
 #include <iprt/assert.h>
 #include <iprt/file.h>
+#include <iprt/path.h>
 #include <iprt/string.h>
 #include <iprt/thread.h>
@@ -1199,7 +1200,28 @@
     if (VBOX_FAILURE(rc))
     {
+        char pszPathReal[256];
+        char *pszDevice = pThis->pszDevice;
+        if (RT_SUCCESS(RTPathReal(pszDevice, pszPathReal, sizeof(pszPathReal))))
+            pszDevice = pszPathReal;
         AssertMsgFailed(("Could not open host device %s, rc=%Vrc\n", pThis->pszDevice, rc));
         pThis->FileDevice = NIL_RTFILE;
-        return rc;
+        switch (rc)
+        {
+            case VERR_ACCESS_DENIED:
+                return PDMDrvHlpVMSetError(pDrvIns, rc, RT_SRC_POS,
+#ifdef __LINUX__
+                        N_("Cannot open host device '%s' for %s access. Check the permissions "
+                           "of that device ('/bin/ls -l %s'): Most probably you need to be member "
+                           "of the device group. Make sure that you logout/login after changing "
+                           "the group settings of the current user"),
+#else
+                        N_("Cannot open host device '%s' for %s access. Check the permissions "
+                           "of that device"),
+#endif
+                       pszPathReal, pThis->fReadOnlyConfig ? "readonly" : "read/write",
+                       pszPathReal);
+            default:
+                return rc;
+        }
     }
 #ifdef __WIN__
Index: /trunk/src/VBox/Devices/Storage/VBoxHDD.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/VBoxHDD.cpp	(revision 261)
+++ /trunk/src/VBox/Devices/Storage/VBoxHDD.cpp	(revision 262)
@@ -4199,4 +4199,6 @@
     LogFlow(("vdiConstruct:\n"));
     PVDIDISK pData = PDMINS2DATA(pDrvIns, PVDIDISK);
+    char *pszName;      /**< The path of the disk image file. */
+    bool fReadOnly;     /**< True if the media is readonly. */
 
     /*
@@ -4249,5 +4251,4 @@
          * Read the image configuration.
          */
-        char *pszName;
         int rc = CFGMR3QueryStringAlloc(pCurNode, "Path", &pszName);
         if (VBOX_FAILURE(rc))
@@ -4289,5 +4290,4 @@
      * Validate and read top level configuration.
      */
-    char *pszName;
     int rc = CFGMR3QueryStringAlloc(pCfgHandle, "Path", &pszName);
     if (VBOX_FAILURE(rc))
@@ -4295,6 +4295,4 @@
                                 N_("VHDD: Configuration error: Querying \"Path\" as string failed"));
 
-    /** True if the media is readonly. */
-    bool fReadOnly;
     rc = CFGMR3QueryBool(pCfgHandle, "ReadOnly", &fReadOnly);
     if (rc == VERR_CFGM_VALUE_NOT_FOUND)
@@ -4320,4 +4318,10 @@
     pszName = NULL;
 #endif
+
+    if (rc == VERR_ACCESS_DENIED)
+        /* This should never happen here since this case is covered by Console::PowerUp */
+        return PDMDrvHlpVMSetError(pDrvIns, rc, RT_SRC_POS,
+                                   N_("Cannot open virtual disk image '%s' for %s access"),
+                                   pszName, fReadOnly ? "readonly" : "read/write");
 
     return rc;
