Index: /trunk/src/VBox/Devices/Storage/DrvHostBase-darwin.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostBase-darwin.cpp	(revision 64251)
+++ /trunk/src/VBox/Devices/Storage/DrvHostBase-darwin.cpp	(revision 64252)
@@ -208,2 +208,60 @@
 }
 
+
+DECLHIDDEN(int) drvHostBasePollerWakeupOs(PDRVHOSTBASE pThis)
+{
+    return RTSemEventSignal(pThis->EventPoller);
+}
+
+
+DECLHIDDEN(void) drvHostBaseDestructOs(PDRVHOSTBASE pThis)
+{
+    if (pThis->EventPoller != NULL)
+    {
+        RTSemEventDestroy(pThis->EventPoller);
+        pThis->EventPoller = NULL;
+    }
+
+    /*
+     * The unclaiming doesn't seem to mean much, the DVD is actually
+     * remounted when we release exclusive access. I'm not quite sure
+     * if I should put the unclaim first or not...
+     *
+     * Anyway, that it's automatically remounted very good news for us,
+     * because that means we don't have to mess with that ourselves. Of
+     * course there is the unlikely scenario that we've succeeded in claiming
+     * and umount the DVD but somehow failed to gain exclusive scsi access...
+     */
+    if (pThis->ppScsiTaskDI)
+    {
+        LogFlow(("%s-%d: releasing exclusive scsi access!\n", pDrvIns->pReg->szName, pDrvIns->iInstance));
+        (*pThis->ppScsiTaskDI)->ReleaseExclusiveAccess(pThis->ppScsiTaskDI);
+        (*pThis->ppScsiTaskDI)->Release(pThis->ppScsiTaskDI);
+        pThis->ppScsiTaskDI = NULL;
+    }
+    if (pThis->pDADisk)
+    {
+        LogFlow(("%s-%d: unclaiming the disk!\n", pDrvIns->pReg->szName, pDrvIns->iInstance));
+        DADiskUnclaim(pThis->pDADisk);
+        CFRelease(pThis->pDADisk);
+        pThis->pDADisk = NULL;
+    }
+    if (pThis->ppMMCDI)
+    {
+        LogFlow(("%s-%d: releasing the MMC object!\n", pDrvIns->pReg->szName, pDrvIns->iInstance));
+        (*pThis->ppMMCDI)->Release(pThis->ppMMCDI);
+        pThis->ppMMCDI = NULL;
+    }
+    if (pThis->MasterPort != IO_OBJECT_NULL)
+    {
+        mach_port_deallocate(mach_task_self(), pThis->MasterPort);
+        pThis->MasterPort = IO_OBJECT_NULL;
+    }
+    if (pThis->pDASession)
+    {
+        LogFlow(("%s-%d: releasing the DA session!\n", pDrvIns->pReg->szName, pDrvIns->iInstance));
+        CFRelease(pThis->pDASession);
+        pThis->pDASession = NULL;
+    }
+}
+
Index: /trunk/src/VBox/Devices/Storage/DrvHostBase-freebsd.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostBase-freebsd.cpp	(revision 64251)
+++ /trunk/src/VBox/Devices/Storage/DrvHostBase-freebsd.cpp	(revision 64252)
@@ -208,2 +208,25 @@
 }
 
+
+DECLHIDDEN(int) drvHostBasePollerWakeupOs(PDRVHOSTBASE pThis)
+{
+    return RTSemEventSignal(pThis->EventPoller);
+}
+
+
+DECLHIDDEN(void) drvHostBaseDestructOs(PDRVHOSTBASE pThis)
+{
+    if (pThis->EventPoller != NULL)
+    {
+        RTSemEventDestroy(pThis->EventPoller);
+        pThis->EventPoller = NULL;
+    }
+
+    if (pThis->hFileDevice != NIL_RTFILE)
+    {
+        int rc = RTFileClose(pThis->hFileDevice);
+        AssertRC(rc);
+        pThis->hFileDevice = NIL_RTFILE;
+    }
+}
+
Index: /trunk/src/VBox/Devices/Storage/DrvHostBase-linux.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostBase-linux.cpp	(revision 64251)
+++ /trunk/src/VBox/Devices/Storage/DrvHostBase-linux.cpp	(revision 64252)
@@ -181,2 +181,31 @@
 }
 
+
+DECLHIDDEN(int) drvHostBasePollerWakeupOs(PDRVHOSTBASE pThis)
+{
+    return RTSemEventSignal(pThis->EventPoller);
+}
+
+
+DECLHIDDEN(void) drvHostBaseDestructOs(PDRVHOSTBASE pThis)
+{
+    if (pThis->pbDoubleBuffer)
+    {
+        RTMemFree(pThis->pbDoubleBuffer);
+        pThis->pbDoubleBuffer = NULL;
+    }
+
+    if (pThis->EventPoller != NULL)
+    {
+        RTSemEventDestroy(pThis->EventPoller);
+        pThis->EventPoller = NULL;
+    }
+
+    if (pThis->hFileDevice != NIL_RTFILE)
+    {
+        int rc = RTFileClose(pThis->hFileDevice);
+        AssertRC(rc);
+        pThis->hFileDevice = NIL_RTFILE;
+    }
+}
+
Index: /trunk/src/VBox/Devices/Storage/DrvHostBase-solaris.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostBase-solaris.cpp	(revision 64251)
+++ /trunk/src/VBox/Devices/Storage/DrvHostBase-solaris.cpp	(revision 64252)
@@ -201,2 +201,38 @@
 }
 
+
+DECLHIDDEN(int) drvHostBasePollerWakeupOs(PDRVHOSTBASE pThis)
+{
+    return RTSemEventSignal(pThis->EventPoller);
+}
+
+
+DECLHIDDEN(void) drvHostBaseDestructOs(PDRVHOSTBASE pThis)
+{
+    if (pThis->EventPoller != NULL)
+    {
+        RTSemEventDestroy(pThis->EventPoller);
+        pThis->EventPoller = NULL;
+    }
+
+    if (pThis->hFileDevice != NIL_RTFILE)
+    {
+        int rc = RTFileClose(pThis->hFileDevice);
+        AssertRC(rc);
+        pThis->hFileDevice = NIL_RTFILE;
+    }
+
+    if (pThis->hFileRawDevice != NIL_RTFILE)
+    {
+        int rc = RTFileClose(pThis->hFileRawDevice);
+        AssertRC(rc);
+        pThis->hFileRawDevice = NIL_RTFILE;
+    }
+
+    if (pThis->pszRawDeviceOpen)
+    {
+        RTStrFree(pThis->pszRawDeviceOpen);
+        pThis->pszRawDeviceOpen = NULL;
+    }
+}
+
Index: /trunk/src/VBox/Devices/Storage/DrvHostBase-win.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostBase-win.cpp	(revision 64251)
+++ /trunk/src/VBox/Devices/Storage/DrvHostBase-win.cpp	(revision 64252)
@@ -239,2 +239,35 @@
 }
 
+
+DECLHIDDEN(int) drvHostBasePollerWakeupOs(PDRVHOSTBASE pThis)
+{
+    if (pThis->hwndDeviceChange)
+        PostMessage(pThis->hwndDeviceChange, WM_CLOSE, 0, 0); /* default win proc will destroy the window */
+
+    return VINF_SUCCESS;
+}
+
+
+DECLHIDDEN(void) drvHostBaseDestructOs(PDRVHOSTBASE pThis)
+{
+    if (pThis->EventPoller != NULL)
+    {
+        RTSemEventDestroy(pThis->EventPoller);
+        pThis->EventPoller = NULL;
+    }
+
+    if (pThis->hwndDeviceChange)
+    {
+        if (SetWindowLongPtr(pThis->hwndDeviceChange, GWLP_USERDATA, 0) == (LONG_PTR)pThis)
+            PostMessage(pThis->hwndDeviceChange, WM_CLOSE, 0, 0); /* default win proc will destroy the window */
+        pThis->hwndDeviceChange = NULL;
+    }
+
+    if (pThis->hFileDevice != NIL_RTFILE)
+    {
+        int rc = RTFileClose(pThis->hFileDevice);
+        AssertRC(rc);
+        pThis->hFileDevice = NIL_RTFILE;
+    }
+}
+
Index: /trunk/src/VBox/Devices/Storage/DrvHostBase.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostBase.cpp	(revision 64251)
+++ /trunk/src/VBox/Devices/Storage/DrvHostBase.cpp	(revision 64252)
@@ -1369,10 +1369,5 @@
         do
         {
-#ifdef RT_OS_WINDOWS
-            if (pThis->hwndDeviceChange)
-                PostMessage(pThis->hwndDeviceChange, WM_CLOSE, 0, 0); /* default win proc will destroy the window */
-#else
-            RTSemEventSignal(pThis->EventPoller);
-#endif
+            drvHostBasePollerWakeupOs(pThis);
             rc = RTThreadWait(pThis->ThreadPoller, 100, NULL);
         } while (cTimes-- > 0 && rc == VERR_TIMEOUT);
@@ -1404,84 +1399,5 @@
      * Cleanup the other resources.
      */
-#ifdef RT_OS_WINDOWS
-    if (pThis->hwndDeviceChange)
-    {
-        if (SetWindowLongPtr(pThis->hwndDeviceChange, GWLP_USERDATA, 0) == (LONG_PTR)pThis)
-            PostMessage(pThis->hwndDeviceChange, WM_CLOSE, 0, 0); /* default win proc will destroy the window */
-        pThis->hwndDeviceChange = NULL;
-    }
-#else
-    if (pThis->EventPoller != NULL)
-    {
-        RTSemEventDestroy(pThis->EventPoller);
-        pThis->EventPoller = NULL;
-    }
-#endif
-
-#ifdef RT_OS_DARWIN
-    /*
-     * The unclaiming doesn't seem to mean much, the DVD is actually
-     * remounted when we release exclusive access. I'm not quite sure
-     * if I should put the unclaim first or not...
-     *
-     * Anyway, that it's automatically remounted very good news for us,
-     * because that means we don't have to mess with that ourselves. Of
-     * course there is the unlikely scenario that we've succeeded in claiming
-     * and umount the DVD but somehow failed to gain exclusive scsi access...
-     */
-    if (pThis->ppScsiTaskDI)
-    {
-        LogFlow(("%s-%d: releasing exclusive scsi access!\n", pDrvIns->pReg->szName, pDrvIns->iInstance));
-        (*pThis->ppScsiTaskDI)->ReleaseExclusiveAccess(pThis->ppScsiTaskDI);
-        (*pThis->ppScsiTaskDI)->Release(pThis->ppScsiTaskDI);
-        pThis->ppScsiTaskDI = NULL;
-    }
-    if (pThis->pDADisk)
-    {
-        LogFlow(("%s-%d: unclaiming the disk!\n", pDrvIns->pReg->szName, pDrvIns->iInstance));
-        DADiskUnclaim(pThis->pDADisk);
-        CFRelease(pThis->pDADisk);
-        pThis->pDADisk = NULL;
-    }
-    if (pThis->ppMMCDI)
-    {
-        LogFlow(("%s-%d: releasing the MMC object!\n", pDrvIns->pReg->szName, pDrvIns->iInstance));
-        (*pThis->ppMMCDI)->Release(pThis->ppMMCDI);
-        pThis->ppMMCDI = NULL;
-    }
-    if (pThis->MasterPort != IO_OBJECT_NULL)
-    {
-        mach_port_deallocate(mach_task_self(), pThis->MasterPort);
-        pThis->MasterPort = IO_OBJECT_NULL;
-    }
-    if (pThis->pDASession)
-    {
-        LogFlow(("%s-%d: releasing the DA session!\n", pDrvIns->pReg->szName, pDrvIns->iInstance));
-        CFRelease(pThis->pDASession);
-        pThis->pDASession = NULL;
-    }
-#else
-    if (pThis->hFileDevice != NIL_RTFILE)
-    {
-        int rc = RTFileClose(pThis->hFileDevice);
-        AssertRC(rc);
-        pThis->hFileDevice = NIL_RTFILE;
-    }
-#endif
-
-#ifdef RT_OS_SOLARIS
-    if (pThis->hFileRawDevice != NIL_RTFILE)
-    {
-        int rc = RTFileClose(pThis->hFileRawDevice);
-        AssertRC(rc);
-        pThis->hFileRawDevice = NIL_RTFILE;
-    }
-
-    if (pThis->pszRawDeviceOpen)
-    {
-        RTStrFree(pThis->pszRawDeviceOpen);
-        pThis->pszRawDeviceOpen = NULL;
-    }
-#endif
+    drvHostBaseDestructOs(pThis);
 
     if (pThis->pszDevice)
Index: /trunk/src/VBox/Devices/Storage/DrvHostBase.h
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostBase.h	(revision 64251)
+++ /trunk/src/VBox/Devices/Storage/DrvHostBase.h	(revision 64252)
@@ -23,4 +23,5 @@
 #include <iprt/critsect.h>
 #include <iprt/log.h>
+#include <iprt/semaphore.h>
 #include <VBox/cdefs.h>
 #include <VBox/vmm/pdmdrv.h>
@@ -197,4 +198,7 @@
 DECLHIDDEN(int) drvHostBaseFlushOs(PDRVHOSTBASE pThis);
 
+DECLHIDDEN(int) drvHostBasePollerWakeupOs(PDRVHOSTBASE pThis);
+DECLHIDDEN(void) drvHostBaseDestructOs(PDRVHOSTBASE pThis);
+
 /** Makes a PDRVHOSTBASE out of a PPDMIMOUNT. */
 #define PDMIMOUNT_2_DRVHOSTBASE(pInterface)        ( (PDRVHOSTBASE)((uintptr_t)pInterface - RT_OFFSETOF(DRVHOSTBASE, IMount)) )
Index: /trunk/src/VBox/Devices/Storage/DrvHostDVD.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostDVD.cpp	(revision 64251)
+++ /trunk/src/VBox/Devices/Storage/DrvHostDVD.cpp	(revision 64252)
@@ -442,13 +442,4 @@
 static DECLCALLBACK(void) drvHostDvdDestruct(PPDMDRVINS pDrvIns)
 {
-#ifdef RT_OS_LINUX
-    PDRVHOSTBASE pThis = PDMINS_2_DATA(pDrvIns, PDRVHOSTBASE);
-
-    if (pThis->pbDoubleBuffer)
-    {
-        RTMemFree(pThis->pbDoubleBuffer);
-        pThis->pbDoubleBuffer = NULL;
-    }
-#endif
     return DRVHostBaseDestruct(pDrvIns);
 }
