Index: /trunk/src/VBox/Devices/Storage/DrvHostBase-darwin.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostBase-darwin.cpp	(revision 64250)
+++ /trunk/src/VBox/Devices/Storage/DrvHostBase-darwin.cpp	(revision 64251)
@@ -154,2 +154,56 @@
 }
 
+
+DECLHIDDEN(int) drvHostBaseReadOs(PDRVHOSTBASE pThis, uint64_t off, void *pvBuf, size_t cbRead)
+{
+    int rc = VINF_SUCCESS;
+
+    if (    pThis->ppScsiTaskDI
+        &&  pThis->cbBlock)
+    {
+        /*
+         * Issue a READ(12) request.
+         */
+        do
+        {
+            const uint32_t  LBA       = off / pThis->cbBlock;
+            AssertReturn(!(off % pThis->cbBlock), VERR_INVALID_PARAMETER);
+            uint32_t        cbRead32  =   cbRead > SCSI_MAX_BUFFER_SIZE
+                                        ? SCSI_MAX_BUFFER_SIZE
+                                        : (uint32_t)cbRead;
+            const uint32_t  cBlocks   = cbRead32 / pThis->cbBlock;
+            AssertReturn(!(cbRead % pThis->cbBlock), VERR_INVALID_PARAMETER);
+            uint8_t         abCmd[16] =
+            {
+                SCSI_READ_12, 0,
+                RT_BYTE4(LBA),     RT_BYTE3(LBA),     RT_BYTE2(LBA),     RT_BYTE1(LBA),
+                RT_BYTE4(cBlocks), RT_BYTE3(cBlocks), RT_BYTE2(cBlocks), RT_BYTE1(cBlocks),
+                0, 0, 0, 0, 0
+            };
+            rc = drvHostBaseScsiCmdOs(pThis, abCmd, 12, PDMMEDIATXDIR_FROM_DEVICE, pvBuf, &cbRead32, NULL, 0, 0);
+
+            off    += cbRead32;
+            cbRead -= cbRead32;
+            pvBuf   = (uint8_t *)pvBuf + cbRead32;
+        } while ((cbRead > 0) && RT_SUCCESS(rc));
+    }
+    else
+        rc = VERR_MEDIA_NOT_PRESENT;
+
+    return rc;
+}
+
+
+DECLHIDDEN(int) drvHostBaseWriteOs(PDRVHOSTBASE pThis, uint64_t off, const void *pvBuf, size_t cbWrite)
+{
+    RT_NOREF4(pThis, off, pvBuf, cbWrite);
+    return VERR_WRITE_PROTECT;
+}
+
+
+DECLHIDDEN(int) drvHostBaseFlushOs(PDRVHOSTBASE pThis)
+{
+    RT_NOREF1(pThis);
+    return VINF_SUCCESS;
+}
+
Index: /trunk/src/VBox/Devices/Storage/DrvHostBase-freebsd.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostBase-freebsd.cpp	(revision 64250)
+++ /trunk/src/VBox/Devices/Storage/DrvHostBase-freebsd.cpp	(revision 64251)
@@ -155,2 +155,55 @@
 }
 
+
+DECLHIDDEN(int) drvHostBaseReadOs(PDRVHOSTBASE pThis, uint64_t off, void *pvBuf, size_t cbRead)
+{
+    int rc = VINF_SUCCESS;
+
+    if (pThis->cbBlock)
+    {
+        /*
+         * Issue a READ(12) request.
+         */
+        do
+        {
+            const uint32_t  LBA       = off / pThis->cbBlock;
+            AssertReturn(!(off % pThis->cbBlock), VERR_INVALID_PARAMETER);
+            uint32_t        cbRead32  =   cbRead > SCSI_MAX_BUFFER_SIZE
+                                        ? SCSI_MAX_BUFFER_SIZE
+                                        : (uint32_t)cbRead;
+            const uint32_t  cBlocks   = cbRead32 / pThis->cbBlock;
+            AssertReturn(!(cbRead % pThis->cbBlock), VERR_INVALID_PARAMETER);
+            uint8_t         abCmd[16] =
+            {
+                SCSI_READ_12, 0,
+                RT_BYTE4(LBA),     RT_BYTE3(LBA),     RT_BYTE2(LBA),     RT_BYTE1(LBA),
+                RT_BYTE4(cBlocks), RT_BYTE3(cBlocks), RT_BYTE2(cBlocks), RT_BYTE1(cBlocks),
+                0, 0, 0, 0, 0
+            };
+            rc = drvHostBaseScsiCmdOs(pThis, abCmd, 12, PDMMEDIATXDIR_FROM_DEVICE, pvBuf, &cbRead32, NULL, 0, 0);
+
+            off    += cbRead32;
+            cbRead -= cbRead32;
+            pvBuf   = (uint8_t *)pvBuf + cbRead32;
+        } while ((cbRead > 0) && RT_SUCCESS(rc));
+    }
+    else
+        rc = VERR_MEDIA_NOT_PRESENT;
+
+    return rc;
+}
+
+
+DECLHIDDEN(int) drvHostBaseWriteOs(PDRVHOSTBASE pThis, uint64_t off, const void *pvBuf, size_t cbWrite)
+{
+    RT_NOREF4(pThis, off, pvBuf, cbWrite);
+    return VERR_WRITE_PROTECT;
+}
+
+
+DECLHIDDEN(int) drvHostBaseFlushOs(PDRVHOSTBASE pThis)
+{
+    RT_NOREF1(pThis);
+    return VINF_SUCCESS;
+}
+
Index: /trunk/src/VBox/Devices/Storage/DrvHostBase-linux.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostBase-linux.cpp	(revision 64250)
+++ /trunk/src/VBox/Devices/Storage/DrvHostBase-linux.cpp	(revision 64251)
@@ -163,2 +163,20 @@
 }
 
+
+DECLHIDDEN(int) drvHostBaseReadOs(PDRVHOSTBASE pThis, uint64_t off, void *pvBuf, size_t cbRead)
+{
+    return RTFileReadAt(pThis->hFileDevice, off, pvBuf, cbRead, NULL);
+}
+
+
+DECLHIDDEN(int) drvHostBaseWriteOs(PDRVHOSTBASE pThis, uint64_t off, const void *pvBuf, size_t cbWrite)
+{
+    return RTFileWriteAt(pThis->hFileDevice, off, pvBuf, cbWrite, NULL);
+}
+
+
+DECLHIDDEN(int) drvHostBaseFlushOs(PDRVHOSTBASE pThis)
+{
+    return RTFileFlush(pThis->hFileDevice);
+}
+
Index: /trunk/src/VBox/Devices/Storage/DrvHostBase-solaris.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostBase-solaris.cpp	(revision 64250)
+++ /trunk/src/VBox/Devices/Storage/DrvHostBase-solaris.cpp	(revision 64251)
@@ -183,2 +183,20 @@
 }
 
+
+DECLHIDDEN(int) drvHostBaseReadOs(PDRVHOSTBASE pThis, uint64_t off, void *pvBuf, size_t cbRead)
+{
+    return RTFileReadAt(pThis->hFileDevice, off, pvBuf, cbRead, NULL);
+}
+
+
+DECLHIDDEN(int) drvHostBaseWriteOs(PDRVHOSTBASE pThis, uint64_t off, const void *pvBuf, size_t cbWrite)
+{
+    return RTFileWriteAt(pThis->hFileDevice, off, pvBuf, cbWrite, NULL);
+}
+
+
+DECLHIDDEN(int) drvHostBaseFlushOs(PDRVHOSTBASE pThis)
+{
+    return RTFileFlush(pThis->hFileDevice);
+}
+
Index: /trunk/src/VBox/Devices/Storage/DrvHostBase-win.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostBase-win.cpp	(revision 64250)
+++ /trunk/src/VBox/Devices/Storage/DrvHostBase-win.cpp	(revision 64251)
@@ -221,2 +221,20 @@
 }
 
+
+DECLHIDDEN(int) drvHostBaseReadOs(PDRVHOSTBASE pThis, uint64_t off, void *pvBuf, size_t cbRead)
+{
+    return RTFileReadAt(pThis->hFileDevice, off, pvBuf, cbRead, NULL);
+}
+
+
+DECLHIDDEN(int) drvHostBaseWriteOs(PDRVHOSTBASE pThis, uint64_t off, const void *pvBuf, size_t cbWrite)
+{
+    return RTFileWriteAt(pThis->hFileDevice, off, pvBuf, cbWrite, NULL);
+}
+
+
+DECLHIDDEN(int) drvHostBaseFlushOs(PDRVHOSTBASE pThis)
+{
+    return RTFileFlush(pThis->hFileDevice);
+}
+
Index: /trunk/src/VBox/Devices/Storage/DrvHostBase.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostBase.cpp	(revision 64250)
+++ /trunk/src/VBox/Devices/Storage/DrvHostBase.cpp	(revision 64251)
@@ -145,58 +145,20 @@
      */
     int rc;
-#ifdef RT_OS_DARWIN
-    if (    pThis->fMediaPresent
-        &&  pThis->ppScsiTaskDI
-        &&  pThis->cbBlock)
-#elif defined(RT_OS_FREEBSD)
-    if (    pThis->fMediaPresent
-        &&  pThis->cbBlock)
-#else
     if (pThis->fMediaPresent)
-#endif
-    {
-#if defined(RT_OS_DARWIN) || defined(RT_OS_FREEBSD)
-        /*
-         * Issue a READ(12) request.
-         */
-        do
-        {
-            const uint32_t  LBA       = off / pThis->cbBlock;
-            AssertReturn(!(off % pThis->cbBlock), VERR_INVALID_PARAMETER);
-            uint32_t        cbRead32  =   cbRead > SCSI_MAX_BUFFER_SIZE
-                                        ? SCSI_MAX_BUFFER_SIZE
-                                        : (uint32_t)cbRead;
-            const uint32_t  cBlocks   = cbRead32 / pThis->cbBlock;
-            AssertReturn(!(cbRead % pThis->cbBlock), VERR_INVALID_PARAMETER);
-            uint8_t         abCmd[16] =
-            {
-                SCSI_READ_12, 0,
-                RT_BYTE4(LBA),     RT_BYTE3(LBA),     RT_BYTE2(LBA),     RT_BYTE1(LBA),
-                RT_BYTE4(cBlocks), RT_BYTE3(cBlocks), RT_BYTE2(cBlocks), RT_BYTE1(cBlocks),
-                0, 0, 0, 0, 0
-            };
-            rc = drvHostBaseScsiCmdOs(pThis, abCmd, 12, PDMMEDIATXDIR_FROM_DEVICE, pvBuf, &cbRead32, NULL, 0, 0);
-
-            off    += cbRead32;
-            cbRead -= cbRead32;
-            pvBuf   = (uint8_t *)pvBuf + cbRead32;
-        } while ((cbRead > 0) && RT_SUCCESS(rc));
-
-#else
+    {
         /*
          * Seek and read.
          */
-        rc = RTFileReadAt(pThis->hFileDevice, off, pvBuf, cbRead, NULL);
+        rc = drvHostBaseReadOs(pThis, off, pvBuf, cbRead);
         if (RT_SUCCESS(rc))
         {
-            Log2(("%s-%d: drvHostBaseRead: off=%#llx cbRead=%#x\n"
+            Log2(("%s-%d: drvHostBaseReadOs: off=%#llx cbRead=%#x\n"
                   "%16.*Rhxd\n",
                   pThis->pDrvIns->pReg->szName, pThis->pDrvIns->iInstance, off, cbRead, cbRead, pvBuf));
         }
         else
-            Log(("%s-%d: drvHostBaseRead: RTFileReadAt(%RTfile, %#llx, %p, %#x) -> %Rrc ('%s')\n",
-                 pThis->pDrvIns->pReg->szName, pThis->pDrvIns->iInstance, pThis->hFileDevice,
+            Log(("%s-%d: drvHostBaseReadOs: drvHostBaseReadOs(%#llx, %p, %#x) -> %Rrc ('%s')\n",
+                 pThis->pDrvIns->pReg->szName, pThis->pDrvIns->iInstance,
                  off, pvBuf, cbRead, rc, pThis->pszDevice));
-#endif
     }
     else
@@ -229,18 +191,12 @@
         if (pThis->fMediaPresent)
         {
-#if defined(RT_OS_DARWIN) || defined(RT_OS_FREEBSD)
-            /** @todo write support... */
-            rc = VERR_WRITE_PROTECT;
-
-#else
             /*
              * Seek and write.
              */
-            rc = RTFileWriteAt(pThis->hFileDevice, off, pvBuf, cbWrite, NULL);
+            rc = drvHostBaseWriteOs(pThis, off, pvBuf, cbWrite);
             if (RT_FAILURE(rc))
-                Log(("%s-%d: drvHostBaseWrite: RTFileWriteAt(%RTfile, %#llx, %p, %#x) -> %Rrc ('%s')\n",
-                     pThis->pDrvIns->pReg->szName, pThis->pDrvIns->iInstance, pThis->hFileDevice,
+                Log(("%s-%d: drvHostBaseWrite: drvHostBaseWriteOs(%#llx, %p, %#x) -> %Rrc ('%s')\n",
+                     pThis->pDrvIns->pReg->szName, pThis->pDrvIns->iInstance,
                      off, pvBuf, cbWrite, rc, pThis->pszDevice));
-#endif
         }
         else
@@ -266,12 +222,5 @@
 
     if (pThis->fMediaPresent)
-    {
-#if defined(RT_OS_DARWIN) || defined(RT_OS_FREEBSD)
-        rc = VINF_SUCCESS;
-        /** @todo scsi device buffer flush... */
-#else
-        rc = RTFileFlush(pThis->hFileDevice);
-#endif
-    }
+        rc = drvHostBaseFlushOs(pThis);
     else
         rc = VERR_MEDIA_NOT_PRESENT;
Index: /trunk/src/VBox/Devices/Storage/DrvHostBase.h
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostBase.h	(revision 64250)
+++ /trunk/src/VBox/Devices/Storage/DrvHostBase.h	(revision 64251)
@@ -192,6 +192,8 @@
 DECLHIDDEN(int) drvHostBaseScsiCmdOs(PDRVHOSTBASE pThis, const uint8_t *pbCmd, size_t cbCmd, PDMMEDIATXDIR enmTxDir,
                                      void *pvBuf, uint32_t *pcbBuf, uint8_t *pbSense, size_t cbSense, uint32_t cTimeoutMillies);
-
 DECLHIDDEN(int) drvHostBaseGetMediaSizeOs(PDRVHOSTBASE pThis, uint64_t *pcb);
+DECLHIDDEN(int) drvHostBaseReadOs(PDRVHOSTBASE pThis, uint64_t off, void *pvBuf, size_t cbRead);
+DECLHIDDEN(int) drvHostBaseWriteOs(PDRVHOSTBASE pThis, uint64_t off, const void *pvBuf, size_t cbWrite);
+DECLHIDDEN(int) drvHostBaseFlushOs(PDRVHOSTBASE pThis);
 
 /** Makes a PDRVHOSTBASE out of a PPDMIMOUNT. */
