Index: /trunk/src/VBox/Devices/Storage/DrvHostBase-darwin.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostBase-darwin.cpp	(revision 64277)
+++ /trunk/src/VBox/Devices/Storage/DrvHostBase-darwin.cpp	(revision 64278)
@@ -209,4 +209,61 @@
 
 
+DECLHIDDEN(int) drvHostBaseDoLockOs(PDRVHOSTBASE pThis, bool fLock)
+{
+    uint8_t abCmd[16] =
+    {
+        SCSI_PREVENT_ALLOW_MEDIUM_REMOVAL, 0, 0, 0, fLock, 0,
+        0,0,0,0,0,0,0,0,0,0
+    };
+    return drvHostBaseScsiCmdOs(pThis, abCmd, 6, PDMMEDIATXDIR_NONE, NULL, NULL, NULL, 0, 0);
+}
+
+
+DECLHIDDEN(int) drvHostBaseEjectOs(PDRVHOSTBASE pThis)
+{
+    uint8_t abCmd[16] =
+    {
+        SCSI_START_STOP_UNIT, 0, 0, 0, 2 /*eject+stop*/, 0,
+        0,0,0,0,0,0,0,0,0,0
+    };
+    return drvHostBaseScsiCmdOs(pThis, abCmd, 6, PDMMEDIATXDIR_NONE, NULL, NULL, NULL, 0, 0);
+}
+
+
+DECLHIDDEN(int) drvHostBaseQueryMediaStatusOs(PDRVHOSTBASE pThis, bool *pfMediaChanged, bool *pfMediaPresent)
+{
+    AssertReturn(pThis->ppScsiTaskDI, VERR_INTERNAL_ERROR);
+
+    /*
+     * Issue a TEST UNIT READY request.
+     */
+    *pfMediaChanged = false;
+    *pfMediaPresent = false;
+    uint8_t abCmd[16] = { SCSI_TEST_UNIT_READY, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
+    uint8_t abSense[32];
+    int rc = drvHostBaseScsiCmdOs(pThis, abCmd, 6, PDMMEDIATXDIR_NONE, NULL, NULL, abSense, sizeof(abSense), 0);
+    if (RT_SUCCESS(rc))
+        *pfMediaPresent = true;
+    else if (   rc == VERR_UNRESOLVED_ERROR
+             && abSense[2] == 6 /* unit attention */
+             && (   (abSense[12] == 0x29 && abSense[13] < 5 /* reset */)
+                 || (abSense[12] == 0x2a && abSense[13] == 0 /* parameters changed */)                        //???
+                 || (abSense[12] == 0x3f && abSense[13] == 0 /* target operating conditions have changed */)  //???
+                 || (abSense[12] == 0x3f && abSense[13] == 2 /* changed operating definition */)              //???
+                 || (abSense[12] == 0x3f && abSense[13] == 3 /* inquiry parameters changed */)
+                 || (abSense[12] == 0x3f && abSense[13] == 5 /* device identifier changed */)
+                 )
+            )
+    {
+        *pfMediaPresent = false;
+        *pfMediaChanged = true;
+        rc = VINF_SUCCESS;
+        /** @todo check this media change stuff on Darwin. */
+    }
+
+    return rc;
+}
+
+
 DECLHIDDEN(int) drvHostBasePollerWakeupOs(PDRVHOSTBASE pThis)
 {
Index: /trunk/src/VBox/Devices/Storage/DrvHostBase-freebsd.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostBase-freebsd.cpp	(revision 64277)
+++ /trunk/src/VBox/Devices/Storage/DrvHostBase-freebsd.cpp	(revision 64278)
@@ -209,4 +209,59 @@
 
 
+DECLHIDDEN(int) drvHostBaseDoLockOs(PDRVHOSTBASE pThis, bool fLock)
+{
+    uint8_t abCmd[16] =
+    {
+        SCSI_PREVENT_ALLOW_MEDIUM_REMOVAL, 0, 0, 0, fLock, 0,
+        0,0,0,0,0,0,0,0,0,0
+    };
+    return drvHostBaseScsiCmdOs(pThis, abCmd, 6, PDMMEDIATXDIR_NONE, NULL, NULL, NULL, 0, 0);
+}
+
+
+DECLHIDDEN(int) drvHostBaseEjectOs(PDRVHOSTBASE pThis)
+{
+    uint8_t abCmd[16] =
+    {
+        SCSI_START_STOP_UNIT, 0, 0, 0, 2 /*eject+stop*/, 0,
+        0,0,0,0,0,0,0,0,0,0
+    };
+    return drvHostBaseScsiCmdOs(pThis, abCmd, 6, PDMMEDIATXDIR_NONE, NULL, NULL, NULL, 0, 0);
+}
+
+
+DECLHIDDEN(int) drvHostBaseQueryMediaStatusOs(PDRVHOSTBASE pThis, bool *pfMediaChanged, bool *pfMediaPresent)
+{
+    /*
+     * Issue a TEST UNIT READY request.
+     */
+    *pfMediaChanged = false;
+    *pfMediaPresent = false;
+    uint8_t abCmd[16] = { SCSI_TEST_UNIT_READY, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
+    uint8_t abSense[32];
+    int rc = drvHostBaseScsiCmdOs(pThis, abCmd, 6, PDMMEDIATXDIR_NONE, NULL, NULL, abSense, sizeof(abSense), 0);
+    if (RT_SUCCESS(rc))
+        *pfMediaPresent = true;
+    else if (   rc == VERR_UNRESOLVED_ERROR
+             && abSense[2] == 6 /* unit attention */
+             && (   (abSense[12] == 0x29 && abSense[13] < 5 /* reset */)
+                 || (abSense[12] == 0x2a && abSense[13] == 0 /* parameters changed */)                        //???
+                 || (abSense[12] == 0x3f && abSense[13] == 0 /* target operating conditions have changed */)  //???
+                 || (abSense[12] == 0x3f && abSense[13] == 2 /* changed operating definition */)              //???
+                 || (abSense[12] == 0x3f && abSense[13] == 3 /* inquiry parameters changed */)
+                 || (abSense[12] == 0x3f && abSense[13] == 5 /* device identifier changed */)
+                 )
+            )
+    {
+        *pfMediaPresent = false;
+        *pfMediaChanged = true;
+        rc = VINF_SUCCESS;
+        /** @todo check this media change stuff on Darwin. */
+    }
+
+    return rc;
+}
+
+
 DECLHIDDEN(int) drvHostBasePollerWakeupOs(PDRVHOSTBASE pThis)
 {
Index: /trunk/src/VBox/Devices/Storage/DrvHostBase-linux.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostBase-linux.cpp	(revision 64277)
+++ /trunk/src/VBox/Devices/Storage/DrvHostBase-linux.cpp	(revision 64278)
@@ -182,4 +182,49 @@
 
 
+DECLHIDDEN(int) drvHostBaseDoLockOs(PDRVHOSTBASE pThis, bool fLock)
+{
+    int rc = ioctl(RTFileToNative(pThis->hFileDevice), CDROM_LOCKDOOR, (int)fLock);
+    if (rc < 0)
+    {
+        if (errno == EBUSY)
+            rc = VERR_ACCESS_DENIED;
+        else if (errno == EDRIVE_CANT_DO_THIS)
+            rc = VERR_NOT_SUPPORTED;
+        else
+            rc = RTErrConvertFromErrno(errno);
+    }
+
+    return rc;
+}
+
+
+DECLHIDDEN(int) drvHostBaseEjectOs(PDRVHOSTBASE pThis)
+{
+    int rc = ioctl(RTFileToNative(pThis->hFileDevice), CDROMEJECT, 0);
+    if (rc < 0)
+    {
+        if (errno == EBUSY)
+            rc = VERR_PDM_MEDIA_LOCKED;
+        else if (errno == ENOSYS)
+            rc = VERR_NOT_SUPPORTED;
+        else
+            rc = RTErrConvertFromErrno(errno);
+    }
+
+    return rc;
+}
+
+
+DECLHIDDEN(int) drvHostBaseQueryMediaStatusOs(PDRVHOSTBASE pThis, bool *pfMediaChanged, bool *pfMediaPresent)
+{
+    *pfMediaPresent = ioctl(RTFileToNative(pThis->hFileDevice), CDROM_DRIVE_STATUS, CDSL_CURRENT) == CDS_DISC_OK;
+    *pfMediaChanged = false;
+    if (pThis->fMediaPresent != *pfMediaPresent)
+        *pfMediaChanged = ioctl(RTFileToNative(pThis->hFileDevice), CDROM_MEDIA_CHANGED, CDSL_CURRENT) == 1;
+
+    return VINF_SUCCESS;
+}
+
+
 DECLHIDDEN(int) drvHostBasePollerWakeupOs(PDRVHOSTBASE pThis)
 {
Index: /trunk/src/VBox/Devices/Storage/DrvHostBase-solaris.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostBase-solaris.cpp	(revision 64277)
+++ /trunk/src/VBox/Devices/Storage/DrvHostBase-solaris.cpp	(revision 64278)
@@ -202,4 +202,60 @@
 
 
+DECLHIDDEN(int) drvHostBaseDoLockOs(PDRVHOSTBASE pThis, bool fLock)
+{
+    int rc = ioctl(RTFileToNative(pThis->hFileRawDevice), fLock ? DKIOCLOCK : DKIOCUNLOCK, 0);
+    if (rc < 0)
+    {
+        if (errno == EBUSY)
+            rc = VERR_ACCESS_DENIED;
+        else if (errno == ENOTSUP || errno == ENOSYS)
+            rc = VERR_NOT_SUPPORTED;
+        else
+            rc = RTErrConvertFromErrno(errno);
+    }
+
+    return rc;
+}
+
+
+DECLHIDDEN(int) drvHostBaseEjectOs(PDRVHOSTBASE pThis)
+{
+    int rc = ioctl(RTFileToNative(pThis->hFileRawDevice), DKIOCEJECT, 0);
+    if (rc < 0)
+    {
+        if (errno == EBUSY)
+            rc = VERR_PDM_MEDIA_LOCKED;
+        else if (errno == ENOSYS || errno == ENOTSUP)
+            rc = VERR_NOT_SUPPORTED;
+        else if (errno == ENODEV)
+            rc = VERR_PDM_MEDIA_NOT_MOUNTED;
+        else
+            rc = RTErrConvertFromErrno(errno);
+    }
+
+    return rc;
+}
+
+
+DECLHIDDEN(int) drvHostBaseQueryMediaStatusOs(PDRVHOSTBASE pThis, bool *pfMediaChanged, bool *pfMediaPresent)
+{
+    *pfMediaPresent = false;
+    *pfMediaChanged = false;
+
+    /* Need to pass the previous state and DKIO_NONE for the first time. */
+    static dkio_state s_DeviceState = DKIO_NONE;
+    dkio_state PreviousState = s_DeviceState;
+    int rc = ioctl(RTFileToNative(pThis->hFileRawDevice), DKIOCSTATE, &s_DeviceState);
+    if (rc == 0)
+    {
+        *pfMediaPresent = (s_DeviceState == DKIO_INSERTED);
+        if (PreviousState != s_DeviceState)
+            *pfMediaChanged = true;
+    }
+
+    return VINF_SUCCESS;
+}
+
+
 DECLHIDDEN(int) drvHostBasePollerWakeupOs(PDRVHOSTBASE pThis)
 {
Index: /trunk/src/VBox/Devices/Storage/DrvHostBase-win.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostBase-win.cpp	(revision 64277)
+++ /trunk/src/VBox/Devices/Storage/DrvHostBase-win.cpp	(revision 64278)
@@ -240,4 +240,51 @@
 
 
+DECLHIDDEN(int) drvHostBaseDoLockOs(PDRVHOSTBASE pThis, bool fLock)
+{
+    PREVENT_MEDIA_REMOVAL PreventMediaRemoval = {fLock};
+    DWORD cbReturned;
+    int rc;
+    if (DeviceIoControl((HANDLE)RTFileToNative(pThis->hFileDevice), IOCTL_STORAGE_MEDIA_REMOVAL,
+                        &PreventMediaRemoval, sizeof(PreventMediaRemoval),
+                        NULL, 0, &cbReturned,
+                        NULL))
+        rc = VINF_SUCCESS;
+    else
+        /** @todo figure out the return codes for already locked. */
+        rc = RTErrConvertFromWin32(GetLastError());
+
+    return rc;
+}
+
+
+DECLHIDDEN(int) drvHostBaseEjectOs(PDRVHOSTBASE pThis)
+{
+    int rc = VINF_SUCCESS;
+    RTFILE hFileDevice = pThis->hFileDevice;
+    if (hFileDevice == NIL_RTFILE) /* obsolete crap */
+        rc = RTFileOpen(&hFileDevice, pThis->pszDeviceOpen, RTFILE_O_READ | RTFILE_O_OPEN | RTFILE_O_DENY_NONE);
+    if (RT_SUCCESS(rc))
+    {
+        /* do ioctl */
+        DWORD cbReturned;
+        if (DeviceIoControl((HANDLE)RTFileToNative(hFileDevice), IOCTL_STORAGE_EJECT_MEDIA,
+                            NULL, 0,
+                            NULL, 0, &cbReturned,
+                            NULL))
+            rc = VINF_SUCCESS;
+        else
+            rc = RTErrConvertFromWin32(GetLastError());
+
+        /* clean up handle */
+        if (hFileDevice != pThis->hFileDevice)
+            RTFileClose(hFileDevice);
+    }
+    else
+        AssertMsgFailed(("Failed to open '%s' for ejecting this tray.\n",  rc));
+
+    return rc;
+}
+
+
 DECLHIDDEN(int) drvHostBasePollerWakeupOs(PDRVHOSTBASE pThis)
 {
Index: /trunk/src/VBox/Devices/Storage/DrvHostBase.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostBase.cpp	(revision 64277)
+++ /trunk/src/VBox/Devices/Storage/DrvHostBase.cpp	(revision 64278)
@@ -1434,8 +1434,9 @@
  * @returns VBox status code.
  * @param   pDrvIns         Driver instance.
+ * @param   pszCfgValid     Pointer to a string ofvalid CFGM options.
  * @param   pCfg            Configuration handle.
  * @param   enmType         Device type.
  */
-int DRVHostBaseInitData(PPDMDRVINS pDrvIns, PCFGMNODE pCfg, PDMMEDIATYPE enmType)
+int DRVHostBaseInitData(PPDMDRVINS pDrvIns, PCFGMNODE pCfg, const char *pszCfgValid, PDMMEDIATYPE enmType)
 {
     PDRVHOSTBASE pThis = PDMINS_2_DATA(pDrvIns, PDRVHOSTBASE);
@@ -1491,4 +1492,10 @@
     pThis->IMount.pfnUnlock                 = drvHostBaseUnlock;
     pThis->IMount.pfnIsLocked               = drvHostBaseIsLocked;
+
+    if (!CFGMR3AreValuesValid(pCfg, pszCfgValid))
+    {
+        pThis->fAttachFailError = true;
+        return VERR_PDM_DRVINS_UNKNOWN_CFG_VALUES;
+    }
 
     /*
Index: /trunk/src/VBox/Devices/Storage/DrvHostBase.h
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostBase.h	(revision 64277)
+++ /trunk/src/VBox/Devices/Storage/DrvHostBase.h	(revision 64278)
@@ -185,5 +185,5 @@
 
 
-int DRVHostBaseInitData(PPDMDRVINS pDrvIns, PCFGMNODE pCfg, PDMMEDIATYPE enmType);
+int DRVHostBaseInitData(PPDMDRVINS pDrvIns, PCFGMNODE pCfg, const char *pszCfgValid, PDMMEDIATYPE enmType);
 int DRVHostBaseInitFinish(PDRVHOSTBASE pThis);
 int DRVHostBaseMediaPresent(PDRVHOSTBASE pThis);
@@ -197,5 +197,8 @@
 DECLHIDDEN(int) drvHostBaseWriteOs(PDRVHOSTBASE pThis, uint64_t off, const void *pvBuf, size_t cbWrite);
 DECLHIDDEN(int) drvHostBaseFlushOs(PDRVHOSTBASE pThis);
-
+DECLHIDDEN(int) drvHostBaseDoLockOs(PDRVHOSTBASE pThis, bool fLock);
+DECLHIDDEN(int) drvHostBaseEjectOs(PDRVHOSTBASE pThis);
+
+DECLHIDDEN(int) drvHostBaseQueryMediaStatusOs(PDRVHOSTBASE pThis, bool *pfMediaChanged, bool *pfMediaPresent);
 DECLHIDDEN(int) drvHostBasePollerWakeupOs(PDRVHOSTBASE pThis);
 DECLHIDDEN(void) drvHostBaseDestructOs(PDRVHOSTBASE pThis);
Index: /trunk/src/VBox/Devices/Storage/DrvHostDVD.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostDVD.cpp	(revision 64277)
+++ /trunk/src/VBox/Devices/Storage/DrvHostDVD.cpp	(revision 64278)
@@ -152,5 +152,5 @@
         /* Unlock drive if necessary. */
         if (pThis->fLocked)
-            drvHostDvdDoLock(pThis, false);
+            drvHostBaseDoLockOs(pThis, false);
 
         if (fEject)
@@ -159,66 +159,5 @@
              * Eject the disc.
              */
-#if defined(RT_OS_DARWIN) || defined(RT_OS_FREEBSD)
-            uint8_t abCmd[16] =
-            {
-                SCSI_START_STOP_UNIT, 0, 0, 0, 2 /*eject+stop*/, 0,
-                0,0,0,0,0,0,0,0,0,0
-            };
-            rc = drvHostBaseScsiCmdOs(pThis, abCmd, 6, PDMMEDIATXDIR_NONE, NULL, NULL, NULL, 0, 0);
-
-#elif defined(RT_OS_LINUX)
-            rc = ioctl(RTFileToNative(pThis->hFileDevice), CDROMEJECT, 0);
-            if (rc < 0)
-            {
-                if (errno == EBUSY)
-                    rc = VERR_PDM_MEDIA_LOCKED;
-                else if (errno == ENOSYS)
-                    rc = VERR_NOT_SUPPORTED;
-                else
-                    rc = RTErrConvertFromErrno(errno);
-            }
-
-#elif defined(RT_OS_SOLARIS)
-            rc = ioctl(RTFileToNative(pThis->hFileRawDevice), DKIOCEJECT, 0);
-            if (rc < 0)
-            {
-                if (errno == EBUSY)
-                    rc = VERR_PDM_MEDIA_LOCKED;
-                else if (errno == ENOSYS || errno == ENOTSUP)
-                    rc = VERR_NOT_SUPPORTED;
-                else if (errno == ENODEV)
-                    rc = VERR_PDM_MEDIA_NOT_MOUNTED;
-                else
-                    rc = RTErrConvertFromErrno(errno);
-            }
-
-#elif defined(RT_OS_WINDOWS)
-            RTFILE hFileDevice = pThis->hFileDevice;
-            if (hFileDevice == NIL_RTFILE) /* obsolete crap */
-                rc = RTFileOpen(&hFileDevice, pThis->pszDeviceOpen, RTFILE_O_READ | RTFILE_O_OPEN | RTFILE_O_DENY_NONE);
-            if (RT_SUCCESS(rc))
-            {
-                /* do ioctl */
-                DWORD cbReturned;
-                if (DeviceIoControl((HANDLE)RTFileToNative(hFileDevice), IOCTL_STORAGE_EJECT_MEDIA,
-                                    NULL, 0,
-                                    NULL, 0, &cbReturned,
-                                    NULL))
-                    rc = VINF_SUCCESS;
-                else
-                    rc = RTErrConvertFromWin32(GetLastError());
-
-                /* clean up handle */
-                if (hFileDevice != pThis->hFileDevice)
-                    RTFileClose(hFileDevice);
-            }
-            else
-                AssertMsgFailed(("Failed to open '%s' for ejecting this tray.\n",  rc));
-
-
-#else
-            AssertMsgFailed(("Eject is not implemented!\n"));
-            rc = VINF_SUCCESS;
-#endif
+            rc = drvHostBaseEjectOs(pThis);
         }
 
@@ -249,55 +188,5 @@
 static DECLCALLBACK(int) drvHostDvdDoLock(PDRVHOSTBASE pThis, bool fLock)
 {
-#if defined(RT_OS_DARWIN) || defined(RT_OS_FREEBSD)
-    uint8_t abCmd[16] =
-    {
-        SCSI_PREVENT_ALLOW_MEDIUM_REMOVAL, 0, 0, 0, fLock, 0,
-        0,0,0,0,0,0,0,0,0,0
-    };
-    int rc = drvHostBaseScsiCmdOs(pThis, abCmd, 6, PDMMEDIATXDIR_NONE, NULL, NULL, NULL, 0, 0);
-
-#elif defined(RT_OS_LINUX)
-    int rc = ioctl(RTFileToNative(pThis->hFileDevice), CDROM_LOCKDOOR, (int)fLock);
-    if (rc < 0)
-    {
-        if (errno == EBUSY)
-            rc = VERR_ACCESS_DENIED;
-        else if (errno == EDRIVE_CANT_DO_THIS)
-            rc = VERR_NOT_SUPPORTED;
-        else
-            rc = RTErrConvertFromErrno(errno);
-    }
-
-#elif defined(RT_OS_SOLARIS)
-    int rc = ioctl(RTFileToNative(pThis->hFileRawDevice), fLock ? DKIOCLOCK : DKIOCUNLOCK, 0);
-    if (rc < 0)
-    {
-        if (errno == EBUSY)
-            rc = VERR_ACCESS_DENIED;
-        else if (errno == ENOTSUP || errno == ENOSYS)
-            rc = VERR_NOT_SUPPORTED;
-        else
-            rc = RTErrConvertFromErrno(errno);
-    }
-
-#elif defined(RT_OS_WINDOWS)
-
-    PREVENT_MEDIA_REMOVAL PreventMediaRemoval = {fLock};
-    DWORD cbReturned;
-    int rc;
-    if (DeviceIoControl((HANDLE)RTFileToNative(pThis->hFileDevice), IOCTL_STORAGE_MEDIA_REMOVAL,
-                        &PreventMediaRemoval, sizeof(PreventMediaRemoval),
-                        NULL, 0, &cbReturned,
-                        NULL))
-        rc = VINF_SUCCESS;
-    else
-        /** @todo figure out the return codes for already locked. */
-        rc = RTErrConvertFromWin32(GetLastError());
-
-#else
-    AssertMsgFailed(("Lock/Unlock is not implemented!\n"));
-    int rc = VINF_SUCCESS;
-
-#endif
+    int rc = drvHostBaseDoLockOs(pThis, fLock);
 
     LogFlow(("drvHostDvdDoLock(, fLock=%RTbool): returns %Rrc\n", fLock, rc));
@@ -315,59 +204,7 @@
      * Poll for media change.
      */
-#if defined(RT_OS_DARWIN) || defined(RT_OS_FREEBSD)
-#ifdef RT_OS_DARWIN
-    AssertReturn(pThis->ppScsiTaskDI, VERR_INTERNAL_ERROR);
-#endif
-
-    /*
-     * Issue a TEST UNIT READY request.
-     */
-    bool fMediaChanged = false;
-    bool fMediaPresent = false;
-    uint8_t abCmd[16] = { SCSI_TEST_UNIT_READY, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
-    uint8_t abSense[32];
-    int rc2 = drvHostBaseScsiCmdOs(pThis, abCmd, 6, PDMMEDIATXDIR_NONE, NULL, NULL, abSense, sizeof(abSense), 0);
-    if (RT_SUCCESS(rc2))
-        fMediaPresent = true;
-    else if (   rc2 == VERR_UNRESOLVED_ERROR
-             && abSense[2] == 6 /* unit attention */
-             && (   (abSense[12] == 0x29 && abSense[13] < 5 /* reset */)
-                 || (abSense[12] == 0x2a && abSense[13] == 0 /* parameters changed */)                        //???
-                 || (abSense[12] == 0x3f && abSense[13] == 0 /* target operating conditions have changed */)  //???
-                 || (abSense[12] == 0x3f && abSense[13] == 2 /* changed operating definition */)              //???
-                 || (abSense[12] == 0x3f && abSense[13] == 3 /* inquiry parameters changed */)
-                 || (abSense[12] == 0x3f && abSense[13] == 5 /* device identifier changed */)
-                 )
-            )
-    {
-        fMediaPresent = false;
-        fMediaChanged = true;
-        /** @todo check this media change stuff on Darwin. */
-    }
-
-#elif defined(RT_OS_LINUX)
-    bool fMediaPresent = ioctl(RTFileToNative(pThis->hFileDevice), CDROM_DRIVE_STATUS, CDSL_CURRENT) == CDS_DISC_OK;
-    bool fMediaChanged = false;
-    if (pThis->fMediaPresent != fMediaPresent)
-        fMediaChanged = ioctl(RTFileToNative(pThis->hFileDevice), CDROM_MEDIA_CHANGED, CDSL_CURRENT) == 1;
-
-#elif defined(RT_OS_SOLARIS)
     bool fMediaPresent = false;
     bool fMediaChanged = false;
-
-    /* Need to pass the previous state and DKIO_NONE for the first time. */
-    static dkio_state s_DeviceState = DKIO_NONE;
-    dkio_state PreviousState = s_DeviceState;
-    int rc2 = ioctl(RTFileToNative(pThis->hFileRawDevice), DKIOCSTATE, &s_DeviceState);
-    if (rc2 == 0)
-    {
-        fMediaPresent = (s_DeviceState == DKIO_INSERTED);
-        if (PreviousState != s_DeviceState)
-            fMediaChanged = true;
-    }
-
-#else
-# error "Unsupported platform."
-#endif
+    drvHostBaseQueryMediaStatusOs(pThis, &fMediaChanged, &fMediaPresent);
 
     RTCritSectEnter(&pThis->CritSect);
@@ -460,57 +297,47 @@
      * Init instance data.
      */
-    int rc = DRVHostBaseInitData(pDrvIns, pCfg, PDMMEDIATYPE_DVD);
+    int rc = DRVHostBaseInitData(pDrvIns, pCfg, "Path\0Interval\0Locked\0BIOSVisible\0AttachFailError\0Passthrough\0",
+                                 PDMMEDIATYPE_DVD);
     if (RT_SUCCESS(rc))
     {
         /*
-         * Validate configuration.
+         * Override stuff.
          */
-        if (CFGMR3AreValuesValid(pCfg, "Path\0Interval\0Locked\0BIOSVisible\0AttachFailError\0Passthrough\0"))
+#ifdef RT_OS_LINUX
+        pThis->pbDoubleBuffer = (uint8_t *)RTMemAlloc(SCSI_MAX_BUFFER_SIZE);
+        if (!pThis->pbDoubleBuffer)
+            return VERR_NO_MEMORY;
+#endif
+
+        bool fPassthrough;
+        rc = CFGMR3QueryBool(pCfg, "Passthrough", &fPassthrough);
+        if (RT_SUCCESS(rc) && fPassthrough)
         {
-            /*
-             * Override stuff.
-             */
-#ifdef RT_OS_LINUX
-            pThis->pbDoubleBuffer = (uint8_t *)RTMemAlloc(SCSI_MAX_BUFFER_SIZE);
-            if (!pThis->pbDoubleBuffer)
-                return VERR_NO_MEMORY;
+            pThis->IMedia.pfnSendCmd = drvHostDvdSendCmd;
+            /* Passthrough requires opening the device in R/W mode. */
+            pThis->fReadOnlyConfig = false;
+#ifdef VBOX_WITH_SUID_WRAPPER  /* Solaris setuid for Passthrough mode. */
+            rc = solarisCheckUserAuth();
+            if (RT_FAILURE(rc))
+            {
+                Log(("DVD: solarisCheckUserAuth failed. Permission denied!\n"));
+                return rc;
+            }
+#endif /* VBOX_WITH_SUID_WRAPPER */
+        }
+
+        pThis->IMount.pfnUnmount = drvHostDvdUnmount;
+        pThis->pfnDoLock         = drvHostDvdDoLock;
+#ifdef USE_MEDIA_POLLING
+        if (!fPassthrough)
+            pThis->pfnPoll       = drvHostDvdPoll;
+        else
+            pThis->pfnPoll       = NULL;
 #endif
 
-            bool fPassthrough;
-            rc = CFGMR3QueryBool(pCfg, "Passthrough", &fPassthrough);
-            if (RT_SUCCESS(rc) && fPassthrough)
-            {
-                pThis->IMedia.pfnSendCmd = drvHostDvdSendCmd;
-                /* Passthrough requires opening the device in R/W mode. */
-                pThis->fReadOnlyConfig = false;
-#ifdef VBOX_WITH_SUID_WRAPPER  /* Solaris setuid for Passthrough mode. */
-                rc = solarisCheckUserAuth();
-                if (RT_FAILURE(rc))
-                {
-                    Log(("DVD: solarisCheckUserAuth failed. Permission denied!\n"));
-                    return rc;
-                }
-#endif /* VBOX_WITH_SUID_WRAPPER */
-            }
-
-            pThis->IMount.pfnUnmount = drvHostDvdUnmount;
-            pThis->pfnDoLock         = drvHostDvdDoLock;
-#ifdef USE_MEDIA_POLLING
-            if (!fPassthrough)
-                pThis->pfnPoll       = drvHostDvdPoll;
-            else
-                pThis->pfnPoll       = NULL;
-#endif
-
-            /*
-             * 2nd init part.
-             */
-            rc = DRVHostBaseInitFinish(pThis);
-        }
-        else
-        {
-            pThis->fAttachFailError = true;
-            rc = VERR_PDM_DRVINS_UNKNOWN_CFG_VALUES;
-        }
+        /*
+         * 2nd init part.
+         */
+        rc = DRVHostBaseInitFinish(pThis);
     }
     if (RT_FAILURE(rc))
Index: /trunk/src/VBox/Devices/Storage/DrvHostFloppy.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostFloppy.cpp	(revision 64277)
+++ /trunk/src/VBox/Devices/Storage/DrvHostFloppy.cpp	(revision 64278)
@@ -116,30 +116,21 @@
      * Init instance data.
      */
-    int rc = DRVHostBaseInitData(pDrvIns, pCfg, PDMMEDIATYPE_FLOPPY_1_44);
+    int rc = DRVHostBaseInitData(pDrvIns, pCfg, "Path\0ReadOnly\0Interval\0Locked\0BIOSVisible\0",
+                                 PDMMEDIATYPE_FLOPPY_1_44);
     if (RT_SUCCESS(rc))
     {
         /*
-         * Validate configuration.
+         * Override stuff.
          */
-        if (CFGMR3AreValuesValid(pCfg, "Path\0ReadOnly\0Interval\0Locked\0BIOSVisible\0"))
-        {
-            /*
-             * Override stuff.
-             */
 #ifdef RT_OS_LINUX
-            pThis->Base.pfnPoll         = drvHostFloppyPoll;
+        pThis->Base.pfnPoll         = drvHostFloppyPoll;
 #endif
 
-            /*
-             * 2nd init part.
-             */
-            rc = DRVHostBaseInitFinish(&pThis->Base);
-        }
-        else
-        {
-            pThis->Base.fAttachFailError = true;
-            rc = VERR_PDM_DRVINS_UNKNOWN_CFG_VALUES;
-        }
+        /*
+         * 2nd init part.
+         */
+        rc = DRVHostBaseInitFinish(&pThis->Base);
     }
+
     if (RT_FAILURE(rc))
     {
