Index: /trunk/src/VBox/Devices/Storage/DrvHostBase-darwin.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostBase-darwin.cpp	(revision 64245)
+++ /trunk/src/VBox/Devices/Storage/DrvHostBase-darwin.cpp	(revision 64246)
@@ -122,2 +122,34 @@
 }
 
+
+DECLHIDDEN(int) drvHostBaseGetMediaSizeOs(PDRVHOSTBASE pThis, uint64_t *pcb)
+{
+    /*
+     * Try a READ_CAPACITY command...
+     */
+    struct
+    {
+        uint32_t cBlocks;
+        uint32_t cbBlock;
+    }           Buf = {0, 0};
+    uint32_t    cbBuf = sizeof(Buf);
+    uint8_t     abCmd[16] =
+    {
+        SCSI_READ_CAPACITY, 0, 0, 0, 0, 0, 0,
+        0,0,0,0,0,0,0,0,0
+    };
+    int rc = drvHostBaseScsiCmdOs(pThis, abCmd, 6, PDMMEDIATXDIR_FROM_DEVICE, &Buf, &cbBuf, NULL, 0, 0);
+    if (RT_SUCCESS(rc))
+    {
+        Assert(cbBuf == sizeof(Buf));
+        Buf.cBlocks = RT_BE2H_U32(Buf.cBlocks);
+        Buf.cbBlock = RT_BE2H_U32(Buf.cbBlock);
+        //if (Buf.cbBlock > 2048) /* everyone else is doing this... check if it needed/right.*/
+        //    Buf.cbBlock = 2048;
+        pThis->cbBlock = Buf.cbBlock;
+
+        *pcb = (uint64_t)Buf.cBlocks * Buf.cbBlock;
+    }
+    return rc;
+}
+
Index: /trunk/src/VBox/Devices/Storage/DrvHostBase-freebsd.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostBase-freebsd.cpp	(revision 64245)
+++ /trunk/src/VBox/Devices/Storage/DrvHostBase-freebsd.cpp	(revision 64246)
@@ -123,2 +123,34 @@
 }
 
+
+DECLHIDDEN(int) drvHostBaseGetMediaSizeOs(PDRVHOSTBASE pThis, uint64_t *pcb)
+{
+    /*
+     * Try a READ_CAPACITY command...
+     */
+    struct
+    {
+        uint32_t cBlocks;
+        uint32_t cbBlock;
+    }           Buf = {0, 0};
+    uint32_t    cbBuf = sizeof(Buf);
+    uint8_t     abCmd[16] =
+    {
+        SCSI_READ_CAPACITY, 0, 0, 0, 0, 0, 0,
+        0,0,0,0,0,0,0,0,0
+    };
+    int rc = drvHostBaseScsiCmdOs(pThis, abCmd, 6, PDMMEDIATXDIR_FROM_DEVICE, &Buf, &cbBuf, NULL, 0, 0);
+    if (RT_SUCCESS(rc))
+    {
+        Assert(cbBuf == sizeof(Buf));
+        Buf.cBlocks = RT_BE2H_U32(Buf.cBlocks);
+        Buf.cbBlock = RT_BE2H_U32(Buf.cbBlock);
+        //if (Buf.cbBlock > 2048) /* everyone else is doing this... check if it needed/right.*/
+        //    Buf.cbBlock = 2048;
+        pThis->cbBlock = Buf.cbBlock;
+
+        *pcb = (uint64_t)Buf.cBlocks * Buf.cbBlock;
+    }
+    return rc;
+}
+
Index: /trunk/src/VBox/Devices/Storage/DrvHostBase-linux.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostBase-linux.cpp	(revision 64245)
+++ /trunk/src/VBox/Devices/Storage/DrvHostBase-linux.cpp	(revision 64246)
@@ -31,4 +31,5 @@
 # include "swab.h"
 #endif
+#include <linux/fd.h>
 #include <linux/cdrom.h>
 #include <limits.h>
@@ -127,2 +128,37 @@
 }
 
+DECLHIDDEN(int) drvHostBaseGetMediaSizeOs(PDRVHOSTBASE pThis, uint64_t *pcb)
+{
+    int rc = VERR_INVALID_STATE;
+
+    if (PDMMEDIATYPE_IS_FLOPPY(pThis->enmType))
+    {
+        rc = ioctl(RTFileToNative(pThis->hFileDevice), FDFLUSH);
+        if (rc)
+        {
+            rc = RTErrConvertFromErrno (errno);
+            Log(("DrvHostFloppy: FDFLUSH ioctl(%s) failed, errno=%d rc=%Rrc\n", pThis->pszDevice, errno, rc));
+            return rc;
+        }
+
+        floppy_drive_struct DrvStat;
+        rc = ioctl(RTFileToNative(pThis->hFileDevice), FDGETDRVSTAT, &DrvStat);
+        if (rc)
+        {
+            rc = RTErrConvertFromErrno(errno);
+            Log(("DrvHostFloppy: FDGETDRVSTAT ioctl(%s) failed, errno=%d rc=%Rrc\n", pThis->pszDevice, errno, rc));
+            return rc;
+        }
+        pThis->fReadOnly = !(DrvStat.flags & FD_DISK_WRITABLE);
+        rc = RTFileSeek(pThis->hFileDevice, 0, RTFILE_SEEK_END, pcb);
+    }
+    else if (pThis->enmType == PDMMEDIATYPE_CDROM || pThis->enmType == PDMMEDIATYPE_DVD)
+    {
+        /* Clear the media-changed-since-last-call-thingy just to be on the safe side. */
+        ioctl(RTFileToNative(pThis->hFileDevice), CDROM_MEDIA_CHANGED, CDSL_CURRENT);
+        rc = RTFileSeek(pThis->hFileDevice, 0, RTFILE_SEEK_END, pcb);
+    }
+
+    return rc;
+}
+
Index: /trunk/src/VBox/Devices/Storage/DrvHostBase-solaris.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostBase-solaris.cpp	(revision 64245)
+++ /trunk/src/VBox/Devices/Storage/DrvHostBase-solaris.cpp	(revision 64246)
@@ -167,2 +167,18 @@
 }
 
+DECLHIDDEN(int) drvHostBaseGetMediaSizeOs(PDRVHOSTBASE pThis, uint64_t *pcb)
+{
+    /*
+     * Sun docs suggests using DKIOCGGEOM instead of DKIOCGMEDIAINFO, but
+     * Sun themselves use DKIOCGMEDIAINFO for DVDs/CDs, and use DKIOCGGEOM
+     * for secondary storage devices.
+     */
+    struct dk_minfo MediaInfo;
+    if (ioctl(RTFileToNative(pThis->hFileRawDevice), DKIOCGMEDIAINFO, &MediaInfo) == 0)
+    {
+        *pcb = MediaInfo.dki_capacity * (uint64_t)MediaInfo.dki_lbsize;
+        return VINF_SUCCESS;
+    }
+    return RTFileSeek(pThis->hFileDevice, 0, RTFILE_SEEK_END, pcb);
+}
+
Index: /trunk/src/VBox/Devices/Storage/DrvHostBase-win.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostBase-win.cpp	(revision 64245)
+++ /trunk/src/VBox/Devices/Storage/DrvHostBase-win.cpp	(revision 64246)
@@ -113,2 +113,63 @@
 }
 
+DECLHIDDEN(int) drvHostBaseGetMediaSizeOs(PDRVHOSTBASE pThis, uint64_t *pcb)
+{
+    int rc = VERR_GENERAL_FAILURE;
+
+    if (PDMMEDIATYPE_IS_FLOPPY(pThis->enmType))
+    {
+        DISK_GEOMETRY   geom;
+        DWORD           cbBytesReturned;
+        int             cbSectors;
+
+        memset(&geom, 0, sizeof(geom));
+        rc = DeviceIoControl((HANDLE)RTFileToNative(pThis->hFileDevice), IOCTL_DISK_GET_DRIVE_GEOMETRY,
+                             NULL, 0, &geom, sizeof(geom), &cbBytesReturned,  NULL);
+        if (rc) {
+            cbSectors = geom.Cylinders.QuadPart * geom.TracksPerCylinder * geom.SectorsPerTrack;
+            *pcb = cbSectors * geom.BytesPerSector;
+            rc = VINF_SUCCESS;
+        }
+        else
+        {
+            DWORD   dwLastError;
+
+            dwLastError = GetLastError();
+            rc = RTErrConvertFromWin32(dwLastError);
+            Log(("DrvHostFloppy: IOCTL_DISK_GET_DRIVE_GEOMETRY(%s) failed, LastError=%d rc=%Rrc\n",
+                 pThis->pszDevice, dwLastError, rc));
+            return rc;
+        }
+    }
+    else
+    {
+        /* use NT api, retry a few times if the media is being verified. */
+        IO_STATUS_BLOCK             IoStatusBlock = {0};
+        FILE_FS_SIZE_INFORMATION    FsSize= {0};
+        NTSTATUS rcNt = NtQueryVolumeInformationFile((HANDLE)RTFileToNative(pThis->hFileDevice),  &IoStatusBlock,
+                                                     &FsSize, sizeof(FsSize), FileFsSizeInformation);
+        int cRetries = 5;
+        while (rcNt == STATUS_VERIFY_REQUIRED && cRetries-- > 0)
+        {
+            RTThreadSleep(10);
+            rcNt = NtQueryVolumeInformationFile((HANDLE)RTFileToNative(pThis->hFileDevice),  &IoStatusBlock,
+                                                &FsSize, sizeof(FsSize), FileFsSizeInformation);
+        }
+        if (rcNt >= 0)
+        {
+            *pcb = FsSize.TotalAllocationUnits.QuadPart * FsSize.BytesPerSector;
+            return VINF_SUCCESS;
+        }
+
+        /* convert nt status code to VBox status code. */
+        /** @todo Make conversion function!. */
+        switch (rcNt)
+        {
+            case STATUS_NO_MEDIA_IN_DEVICE:     rc = VERR_MEDIA_NOT_PRESENT; break;
+            case STATUS_VERIFY_REQUIRED:        rc = VERR_TRY_AGAIN; break;
+        }
+        LogFlow(("drvHostBaseGetMediaSize: NtQueryVolumeInformationFile -> %#lx\n", rcNt, rc));
+    }
+    return rc;
+}
+
Index: /trunk/src/VBox/Devices/Storage/DrvHostBase.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostBase.cpp	(revision 64245)
+++ /trunk/src/VBox/Devices/Storage/DrvHostBase.cpp	(revision 64246)
@@ -1133,79 +1133,5 @@
 static DECLCALLBACK(int) drvHostBaseGetMediaSize(PDRVHOSTBASE pThis, uint64_t *pcb)
 {
-#if defined(RT_OS_DARWIN) || defined(RT_OS_FREEBSD)
-    /*
-     * Try a READ_CAPACITY command...
-     */
-    struct
-    {
-        uint32_t cBlocks;
-        uint32_t cbBlock;
-    }           Buf = {0, 0};
-    uint32_t    cbBuf = sizeof(Buf);
-    uint8_t     abCmd[16] =
-    {
-        SCSI_READ_CAPACITY, 0, 0, 0, 0, 0, 0,
-        0,0,0,0,0,0,0,0,0
-    };
-    int rc = drvHostBaseScsiCmdOs(pThis, abCmd, 6, PDMMEDIATXDIR_FROM_DEVICE, &Buf, &cbBuf, NULL, 0, 0);
-    if (RT_SUCCESS(rc))
-    {
-        Assert(cbBuf == sizeof(Buf));
-        Buf.cBlocks = RT_BE2H_U32(Buf.cBlocks);
-        Buf.cbBlock = RT_BE2H_U32(Buf.cbBlock);
-        //if (Buf.cbBlock > 2048) /* everyone else is doing this... check if it needed/right.*/
-        //    Buf.cbBlock = 2048;
-        pThis->cbBlock = Buf.cbBlock;
-
-        *pcb = (uint64_t)Buf.cBlocks * Buf.cbBlock;
-    }
-    return rc;
-
-#elif defined(RT_OS_SOLARIS)
-    /*
-     * Sun docs suggests using DKIOCGGEOM instead of DKIOCGMEDIAINFO, but
-     * Sun themselves use DKIOCGMEDIAINFO for DVDs/CDs, and use DKIOCGGEOM
-     * for secondary storage devices.
-     */
-    struct dk_minfo MediaInfo;
-    if (ioctl(RTFileToNative(pThis->hFileRawDevice), DKIOCGMEDIAINFO, &MediaInfo) == 0)
-    {
-        *pcb = MediaInfo.dki_capacity * (uint64_t)MediaInfo.dki_lbsize;
-        return VINF_SUCCESS;
-    }
-    return RTFileSeek(pThis->hFileDevice, 0, RTFILE_SEEK_END, pcb);
-
-#elif defined(RT_OS_WINDOWS)
-    /* use NT api, retry a few times if the media is being verified. */
-    IO_STATUS_BLOCK             IoStatusBlock = {0};
-    FILE_FS_SIZE_INFORMATION    FsSize= {0};
-    NTSTATUS rcNt = NtQueryVolumeInformationFile((HANDLE)RTFileToNative(pThis->hFileDevice),  &IoStatusBlock,
-                                                 &FsSize, sizeof(FsSize), FileFsSizeInformation);
-    int cRetries = 5;
-    while (rcNt == STATUS_VERIFY_REQUIRED && cRetries-- > 0)
-    {
-        RTThreadSleep(10);
-        rcNt = NtQueryVolumeInformationFile((HANDLE)RTFileToNative(pThis->hFileDevice),  &IoStatusBlock,
-                                            &FsSize, sizeof(FsSize), FileFsSizeInformation);
-    }
-    if (rcNt >= 0)
-    {
-        *pcb = FsSize.TotalAllocationUnits.QuadPart * FsSize.BytesPerSector;
-        return VINF_SUCCESS;
-    }
-
-    /* convert nt status code to VBox status code. */
-    /** @todo Make conversion function!. */
-    int rc = VERR_GENERAL_FAILURE;
-    switch (rcNt)
-    {
-        case STATUS_NO_MEDIA_IN_DEVICE:     rc = VERR_MEDIA_NOT_PRESENT; break;
-        case STATUS_VERIFY_REQUIRED:        rc = VERR_TRY_AGAIN; break;
-    }
-    LogFlow(("drvHostBaseGetMediaSize: NtQueryVolumeInformationFile -> %#lx\n", rcNt, rc));
-    return rc;
-#else
-    return RTFileSeek(pThis->hFileDevice, 0, RTFILE_SEEK_END, pcb);
-#endif
+    return drvHostBaseGetMediaSizeOs(pThis, pcb);
 }
 
Index: /trunk/src/VBox/Devices/Storage/DrvHostBase.h
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostBase.h	(revision 64245)
+++ /trunk/src/VBox/Devices/Storage/DrvHostBase.h	(revision 64246)
@@ -193,4 +193,5 @@
                                      void *pvBuf, uint32_t *pcbBuf, uint8_t *pbSense, size_t cbSense, uint32_t cTimeoutMillies);
 
+DECLHIDDEN(int) drvHostBaseGetMediaSizeOs(PDRVHOSTBASE pThis, uint64_t *pcb);
 
 /** Makes a PDRVHOSTBASE out of a PPDMIMOUNT. */
