Index: trunk/include/VBox/vmm/pdmifs.h
===================================================================
--- trunk/include/VBox/vmm/pdmifs.h	(revision 47035)
+++ trunk/include/VBox/vmm/pdmifs.h	(revision 47036)
@@ -894,4 +894,10 @@
     /** 2.88MB 3 1/2" floppy drive. */
     PDMBLOCKTYPE_FLOPPY_2_88,
+    /** Fake drive that can take up to 15.6 MB images.
+     * C=255, H=2, S=63.  */
+    PDMBLOCKTYPE_FLOPPY_FAKE_15_6,
+    /** Fake drive that can take up to 63.5 MB images.
+     * C=255, H=2, S=255.  */
+    PDMBLOCKTYPE_FLOPPY_FAKE_63_5,
     /** CDROM drive. */
     PDMBLOCKTYPE_CDROM,
@@ -902,4 +908,6 @@
 } PDMBLOCKTYPE;
 
+/** Check if the given block type is a floppy. */
+#define PDMBLOCKTYPE_IS_FLOPPY(a_enmType) ( (a_enmType) >= PDMBLOCKTYPE_FLOPPY_360 && (a_enmType) <= PDMBLOCKTYPE_FLOPPY_2_88 )
 
 /**
Index: trunk/src/VBox/Devices/PC/BIOS/floppy.c
===================================================================
--- trunk/src/VBox/Devices/PC/BIOS/floppy.c	(revision 47035)
+++ trunk/src/VBox/Devices/PC/BIOS/floppy.c	(revision 47036)
@@ -392,4 +392,10 @@
         retval = 1;
     }
+    else if ( drive_type == 14 || drive_type == 15 ) {
+        // 15.6 MB 3.5" (fake) || 63.5 MB 3.5" (fake) - report same as 2.88 MB.
+        config_data = 0xCC; // 1100 1100
+        media_state = 0xD7; // 1101 0111
+        retval = 1;
+    }
     else {
         // not recognized
@@ -1026,4 +1032,5 @@
         SET_AL(0);
         SET_DL(num_floppies);
+        SET_DH(1);      // max head #
         
         switch (drive_type) {
@@ -1035,25 +1042,20 @@
         case 1: // 360KB, 5.25"
             CX = 0x2709;    // 40 tracks, 9 sectors
-            SET_DH(1);      // max head #
             break;
         
         case 2: // 1.2MB, 5.25"
             CX = 0x4f0f;    // 80 tracks, 15 sectors
-            SET_DH(1);      // max head #
             break;
         
         case 3: // 720KB, 3.5"
             CX = 0x4f09;    // 80 tracks, 9 sectors
-            SET_DH(1);      // max head #
             break;
         
         case 4: // 1.44MB, 3.5"
             CX = 0x4f12;    // 80 tracks, 18 sectors
-            SET_DH(1);      // max head #
             break;
         
         case 5: // 2.88MB, 3.5"
             CX = 0x4f24;    // 80 tracks, 36 sectors
-            SET_DH(1);      // max head #
             break;
         
@@ -1070,7 +1072,15 @@
         case 8: // 320k, 5.25"
             CX = 0x2708;    // 40 tracks, 8 sectors
-            SET_DH(1);      // max head #
-            break;
-        
+            break;
+        
+        case 14: // 15.6 MB 3.5" (fake)
+            CX = 0xfe3f;    // 255 tracks, 63 sectors
+            break;
+
+        case 15: // 63.5 MB 3.5" (fake)
+            CX = 0xfeff;    // 255 tracks, 255 sectors - This works because the cylinder
+            break;          // and sectors limits/encoding aren't checked by the BIOS
+                            // due to copy protection schemes and such stuff.
+
         default: // ?
             BX_PANIC("%s: bad floppy type\n", __func__);
Index: trunk/src/VBox/Devices/PC/DevPcBios.cpp
===================================================================
--- trunk/src/VBox/Devices/PC/DevPcBios.cpp	(revision 47035)
+++ trunk/src/VBox/Devices/PC/DevPcBios.cpp	(revision 47036)
@@ -502,5 +502,4 @@
     PUVM            pUVM = PDMDevHlpGetUVM(pDevIns); AssertRelease(pUVM);
     PPDMIBLOCKBIOS  apHDs[4] = {0};
-    PPDMIBLOCKBIOS  apFDs[2] = {0};
     LogFlow(("pcbiosInitComplete:\n"));
 
@@ -587,32 +586,31 @@
      * Floppy drive type.
      */
-    for (i = 0; i < RT_ELEMENTS(apFDs); i++)
+    uint32_t cFDs = 0;
+    u32 = 0;
+    for (i = 0; i < 2; i++)
     {
         PPDMIBASE pBase;
         int rc = PDMR3QueryLun(pUVM, pThis->pszFDDevice, 0, i, &pBase);
         if (RT_SUCCESS(rc))
-            apFDs[i] = PDMIBASE_QUERY_INTERFACE(pBase, PDMIBLOCKBIOS);
-    }
-    u32 = 0;
-    if (apFDs[0])
-        switch (apFDs[0]->pfnGetType(apFDs[0]))
-        {
-            case PDMBLOCKTYPE_FLOPPY_360:   u32 |= 1 << 4; break;
-            case PDMBLOCKTYPE_FLOPPY_1_20:  u32 |= 2 << 4; break;
-            case PDMBLOCKTYPE_FLOPPY_720:   u32 |= 3 << 4; break;
-            case PDMBLOCKTYPE_FLOPPY_1_44:  u32 |= 4 << 4; break;
-            case PDMBLOCKTYPE_FLOPPY_2_88:  u32 |= 5 << 4; break;
-            default:                        AssertFailed(); break;
-        }
-    if (apFDs[1])
-        switch (apFDs[1]->pfnGetType(apFDs[1]))
-        {
-            case PDMBLOCKTYPE_FLOPPY_360:   u32 |= 1; break;
-            case PDMBLOCKTYPE_FLOPPY_1_20:  u32 |= 2; break;
-            case PDMBLOCKTYPE_FLOPPY_720:   u32 |= 3; break;
-            case PDMBLOCKTYPE_FLOPPY_1_44:  u32 |= 4; break;
-            case PDMBLOCKTYPE_FLOPPY_2_88:  u32 |= 5; break;
-            default:                        AssertFailed(); break;
-        }
+        {
+            PPDMIBLOCKBIOS pFD = PDMIBASE_QUERY_INTERFACE(pBase, PDMIBLOCKBIOS);
+            if (pFD)
+            {
+                cFDs++;
+                unsigned cShift = i == 0 ? 4 : 0;
+                switch (pFD->pfnGetType(pFD))
+                {
+                    case PDMBLOCKTYPE_FLOPPY_360:       u32 |= 1  << cShift; break;
+                    case PDMBLOCKTYPE_FLOPPY_1_20:      u32 |= 2  << cShift; break;
+                    case PDMBLOCKTYPE_FLOPPY_720:       u32 |= 3  << cShift; break;
+                    case PDMBLOCKTYPE_FLOPPY_1_44:      u32 |= 4  << cShift; break;
+                    case PDMBLOCKTYPE_FLOPPY_2_88:      u32 |= 5  << cShift; break;
+                    case PDMBLOCKTYPE_FLOPPY_FAKE_15_6: u32 |= 14 << cShift; break;
+                    case PDMBLOCKTYPE_FLOPPY_FAKE_63_5: u32 |= 15 << cShift; break;
+                    default:                        AssertFailed(); break;
+                }
+            }
+        }
+    }
     pcbiosCmosWrite(pDevIns, 0x10, u32);                                        /* 10h - Floppy Drive Type */
 
@@ -620,10 +618,8 @@
      * Equipment byte.
      */
-    u32 = !!apFDs[0] + !!apFDs[1];
-    switch (u32)
-    {
-        case 1: u32 = 0x01; break;      /* floppy installed, 2 drives. */
-        default:u32 = 0;    break;      /* floppy not installed. */
-    }
+    if (cFDs > 0)
+        u32 = 0x01;                        /* floppy installed, 2 drives. */
+    else
+        u32 = 0x00;                        /* floppy not installed. */
     u32 |= RT_BIT(1);                      /* math coprocessor installed  */
     u32 |= RT_BIT(2);                      /* keyboard enabled (or mouse?) */
Index: trunk/src/VBox/Devices/Storage/DevFdc.cpp
===================================================================
--- trunk/src/VBox/Devices/Storage/DevFdc.cpp	(revision 47035)
+++ trunk/src/VBox/Devices/Storage/DevFdc.cpp	(revision 47036)
@@ -122,4 +122,8 @@
     FDRIVE_DRV_120  = 0x02,   /* 1.2  MB 5"25 drive     */
     FDRIVE_DRV_NONE = 0x03    /* No drive connected     */
+#ifdef VBOX
+    , FDRIVE_DRV_FAKE_15_6 = 0x0e /* Fake 15.6 MB drive. */
+    , FDRIVE_DRV_FAKE_63_5 = 0x0f /* Fake 63.5 MB drive. */
+#endif
 } fdrive_type_t;
 
@@ -184,8 +188,41 @@
 #define NUM_SIDES(drv)      (drv->flags & FDISK_DBL_SIDES ? 2 : 1)
 
-static void fd_init(fdrive_t *drv)
+static void fd_init(fdrive_t *drv, bool fInit)
 {
     /* Drive */
+#ifndef VBOX
     drv->drive = FDRIVE_DRV_NONE;
+#else  /* VBOX */
+    if (fInit) {
+        /* Fixate the drive type at init time if possible. */
+        if (drv->pDrvBlock) {
+            PDMBLOCKTYPE enmType = drv->pDrvBlock->pfnGetType(drv->pDrvBlock);
+            switch (enmType) {
+                case PDMBLOCKTYPE_FLOPPY_360:
+                case PDMBLOCKTYPE_FLOPPY_1_20:
+                    drv->drive = FDRIVE_DRV_120;
+                    break;
+                case PDMBLOCKTYPE_FLOPPY_720:
+                case PDMBLOCKTYPE_FLOPPY_1_44:
+                    drv->drive = FDRIVE_DRV_144;
+                    break;
+                default:
+                    AssertFailed();
+                case PDMBLOCKTYPE_FLOPPY_2_88:
+                    drv->drive = FDRIVE_DRV_288;
+                    break;
+                case PDMBLOCKTYPE_FLOPPY_FAKE_15_6:
+                    drv->drive = FDRIVE_DRV_FAKE_15_6;
+                    break;
+                case PDMBLOCKTYPE_FLOPPY_FAKE_63_5:
+                    drv->drive = FDRIVE_DRV_FAKE_63_5;
+                    break;
+            }
+        } else {
+            drv->drive = FDRIVE_DRV_NONE;
+        }
+    } /* else: The BIOS (and others) get the drive type via the CMOS, so
+               don't change it after the VM has been constructed. */
+#endif /* VBOX */
     drv->perpendicular = 0;
     /* Disk */
@@ -267,7 +304,7 @@
     fdrive_type_t drive;
     fdisk_type_t  disk;
-    uint8_t last_sect;
-    uint8_t max_track;
-    uint8_t max_head;
+    uint8_t last_sect;      /**< Number of sectors. */
+    uint8_t max_track;      /**< Number of tracks. */
+    uint8_t max_head;       /**< Max head number. */
     fdrive_rate_t rate;
     const char *str;
@@ -317,4 +354,51 @@
     /* 360 kB must match 5"1/4 better than 3"1/2... */
     { FDRIVE_DRV_144, FDRIVE_DISK_720,  9, 80, 0, FDRIVE_RATE_250K,  "360 kB 3\"1/2", },
+#ifdef VBOX /* For larger than real life floppy images (see DrvBlock.cpp). */
+    /* 15.6 MB fake floppy disk (just need something big). */
+    { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_USER,  63, 255, 1, FDRIVE_RATE_1M,   "15.6 MB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_288,   36,  80, 1, FDRIVE_RATE_1M,   "2.88 MB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_288,   39,  80, 1, FDRIVE_RATE_1M,   "3.12 MB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_288,   40,  80, 1, FDRIVE_RATE_1M,    "3.2 MB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_288,   44,  80, 1, FDRIVE_RATE_1M,   "3.52 MB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_288,   48,  80, 1, FDRIVE_RATE_1M,   "3.84 MB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_144,   18,  80, 1, FDRIVE_RATE_500K, "1.44 MB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_144,   20,  80, 1, FDRIVE_RATE_500K,  "1.6 MB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_144,   21,  80, 1, FDRIVE_RATE_500K, "1.68 MB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_144,   21,  82, 1, FDRIVE_RATE_500K, "1.72 MB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_144,   21,  83, 1, FDRIVE_RATE_500K, "1.74 MB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_144,   22,  80, 1, FDRIVE_RATE_500K, "1.76 MB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_144,   23,  80, 1, FDRIVE_RATE_500K, "1.84 MB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_144,   24,  80, 1, FDRIVE_RATE_500K, "1.92 MB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_720,    9,  80, 1, FDRIVE_RATE_250K,  "720 kB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_720,   10,  80, 1, FDRIVE_RATE_250K,  "800 kB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_720,   10,  82, 1, FDRIVE_RATE_250K,  "820 kB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_720,   10,  83, 1, FDRIVE_RATE_250K,  "830 kB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_720,   13,  80, 1, FDRIVE_RATE_250K, "1.04 MB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_720,   14,  80, 1, FDRIVE_RATE_250K, "1.12 MB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_720,    9,  80, 0, FDRIVE_RATE_250K,  "360 kB 3\"1/2", },
+    /* 63.5 MB fake floppy disk (just need something big). */
+    { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_USER, 255, 255, 1, FDRIVE_RATE_1M,   "63.5 MB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_USER,  63, 255, 1, FDRIVE_RATE_1M,   "15.6 MB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_288,   36,  80, 1, FDRIVE_RATE_1M,   "2.88 MB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_288,   39,  80, 1, FDRIVE_RATE_1M,   "3.12 MB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_288,   40,  80, 1, FDRIVE_RATE_1M,    "3.2 MB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_288,   44,  80, 1, FDRIVE_RATE_1M,   "3.52 MB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_288,   48,  80, 1, FDRIVE_RATE_1M,   "3.84 MB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_144,   18,  80, 1, FDRIVE_RATE_500K, "1.44 MB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_144,   20,  80, 1, FDRIVE_RATE_500K,  "1.6 MB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_144,   21,  80, 1, FDRIVE_RATE_500K, "1.68 MB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_144,   21,  82, 1, FDRIVE_RATE_500K, "1.72 MB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_144,   21,  83, 1, FDRIVE_RATE_500K, "1.74 MB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_144,   22,  80, 1, FDRIVE_RATE_500K, "1.76 MB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_144,   23,  80, 1, FDRIVE_RATE_500K, "1.84 MB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_144,   24,  80, 1, FDRIVE_RATE_500K, "1.92 MB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_720,    9,  80, 1, FDRIVE_RATE_250K,  "720 kB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_720,   10,  80, 1, FDRIVE_RATE_250K,  "800 kB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_720,   10,  82, 1, FDRIVE_RATE_250K,  "820 kB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_720,   10,  83, 1, FDRIVE_RATE_250K,  "830 kB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_720,   13,  80, 1, FDRIVE_RATE_250K, "1.04 MB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_720,   14,  80, 1, FDRIVE_RATE_250K, "1.12 MB 3\"1/2", },
+    { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_720,    9,  80, 0, FDRIVE_RATE_250K,  "360 kB 3\"1/2", },
+#endif
     /* end */
     { FDRIVE_DRV_NONE, FDRIVE_DISK_NONE, (uint8_t)-1, (uint8_t)-1, 0, (fdrive_rate_t)0, NULL, },
@@ -335,5 +419,5 @@
         bdrv_get_geometry_hint(drv->bs, &nb_heads, &max_track, &last_sect);
 #else /* VBOX */
-    if (drv->pDrvBlock
+    if (   drv->pDrvBlock
         && drv->pDrvMount
         && drv->pDrvMount->pfnIsMounted (drv->pDrvMount)) {
@@ -740,4 +824,5 @@
 {
     if (!(fdctrl->sra & FD_SRA_INTPEND)) {
+        FLOPPY_DPRINTF("Raising interrupt...\n");
 #ifdef VBOX
         PDMDevHlpISASetIrq (fdctrl->pDevIns, fdctrl->irq_lvl, 1);
@@ -2363,6 +2448,7 @@
  * @param   drv         The drive in question.
  * @param   pDevIns     The driver instance.
+ * @param   fInit       Set if we're at init time and can change the drive type.
  */
-static int fdConfig (fdrive_t *drv, PPDMDEVINS pDevIns)
+static int fdConfig(fdrive_t *drv, PPDMDEVINS pDevIns, bool fInit)
 {
     static const char * const s_apszDesc[] = {"Floppy Drive A:", "Floppy Drive B"};
@@ -2388,5 +2474,5 @@
                 drv->pDrvMount = PDMIBASE_QUERY_INTERFACE(drv->pDrvBase, PDMIMOUNT);
                 if (drv->pDrvMount) {
-                    fd_init(drv);
+                    fd_init(drv, fInit);
                 } else {
                     AssertMsgFailed (("Configuration error: LUN#%d without mountable interface!\n", drv->iLUN));
@@ -2467,5 +2553,5 @@
     AssertRelease (!drv->pDrvMount);
 
-    rc = fdConfig (drv, pDevIns);
+    rc = fdConfig (drv, pDevIns, false /*fInit*/);
     AssertMsg (rc != VERR_PDM_NO_ATTACHED_DRIVER,
                ("Configuration error: failed to configure drive %d, rc=%Rrc\n", rc));
@@ -2670,5 +2756,5 @@
     {
         fdrive_t *pDrv = &pThis->drives[i];
-        rc = fdConfig(pDrv, pDevIns);
+        rc = fdConfig(pDrv, pDevIns, true /*fInit*/);
         if (   RT_FAILURE(rc)
             && rc != VERR_PDM_NO_ATTACHED_DRIVER)
Index: trunk/src/VBox/Devices/Storage/DrvBlock.cpp
===================================================================
--- trunk/src/VBox/Devices/Storage/DrvBlock.cpp	(revision 47035)
+++ trunk/src/VBox/Devices/Storage/DrvBlock.cpp	(revision 47036)
@@ -775,4 +775,5 @@
 }
 
+
 /**
  * Reset notification.
@@ -787,4 +788,32 @@
     pThis->fLocked = false;
 }
+
+
+/**
+ * Translates a PDMBLOCKTYPE value into a string.
+ *
+ * @returns Read only string.
+ * @param   enmType             The type value.
+ */
+static const char *drvblockGetTypeName(PDMBLOCKTYPE enmType)
+{
+    switch (enmType)
+    {
+        case PDMBLOCKTYPE_ERROR:                return "ERROR";
+        case PDMBLOCKTYPE_FLOPPY_360:           return "FLOPPY_360";
+        case PDMBLOCKTYPE_FLOPPY_720:           return "FLOPPY_720";
+        case PDMBLOCKTYPE_FLOPPY_1_20:          return "FLOPPY_1_20";
+        case PDMBLOCKTYPE_FLOPPY_1_44:          return "FLOPPY_1_44";
+        case PDMBLOCKTYPE_FLOPPY_2_88:          return "FLOPPY_2_88";
+        case PDMBLOCKTYPE_FLOPPY_FAKE_15_6:     return "FLOPPY_FAKE_15_6";
+        case PDMBLOCKTYPE_FLOPPY_FAKE_63_5:     return "FLOPPY_FAKE_63_5";
+        case PDMBLOCKTYPE_CDROM:                return "CDROM";
+        case PDMBLOCKTYPE_DVD:                  return "DVD";
+        case PDMBLOCKTYPE_HARD_DISK:            return "HARD_DISK";
+        default:                                return "Unknown";
+
+    }
+}
+
 
 /**
@@ -890,4 +919,8 @@
     else if (!strcmp(psz, "Floppy 360"))
         pThis->enmType = PDMBLOCKTYPE_FLOPPY_360;
+    else if (!strcmp(psz, "Floppy 15.6"))
+        pThis->enmType = PDMBLOCKTYPE_FLOPPY_FAKE_15_6;
+    else if (!strcmp(psz, "Floppy 63.5"))
+        pThis->enmType = PDMBLOCKTYPE_FLOPPY_FAKE_63_5;
     else
     {
@@ -1008,4 +1041,54 @@
         if (pThis->enmType == PDMBLOCKTYPE_HARD_DISK)
             pThis->pDrvMedia->pfnGetUuid(pThis->pDrvMedia, &pThis->Uuid);
+    }
+
+    /*
+     * Automatically upgrade the floppy drive if the specified one is too
+     * small to represent the whole boot time image. (We cannot do this later
+     * since the BIOS (and others) gets the info via CMOS.)
+     *
+     * This trick should make 2.88 images as well as the fake 15.6 and 63.5 MB
+     * images despite the hardcoded default 1.44 drive.
+     */
+    if (   PDMBLOCKTYPE_IS_FLOPPY(pThis->enmType)
+        && pThis->pDrvMedia)
+    {
+        uint64_t     const cbFloppyImg = pThis->pDrvMedia->pfnGetSize(pThis->pDrvMedia);
+        PDMBLOCKTYPE const enmCfgType  = pThis->enmType;
+        switch (enmCfgType)
+        {
+            default:
+                AssertFailed();
+            case PDMBLOCKTYPE_FLOPPY_360:
+                if (cbFloppyImg > 40 * 2 * 9 * 512)
+                    pThis->enmType = PDMBLOCKTYPE_FLOPPY_360;
+                /* fall thru */
+            case PDMBLOCKTYPE_FLOPPY_720:
+                if (cbFloppyImg > 80 * 2 * 14 * 512)
+                    pThis->enmType = PDMBLOCKTYPE_FLOPPY_1_20;
+                /* fall thru */
+            case PDMBLOCKTYPE_FLOPPY_1_20:
+                if (cbFloppyImg > 80 * 2 * 20 * 512)
+                    pThis->enmType = PDMBLOCKTYPE_FLOPPY_1_44;
+                /* fall thru */
+            case PDMBLOCKTYPE_FLOPPY_1_44:
+                if (cbFloppyImg > 80 * 2 * 24 * 512)
+                    pThis->enmType = PDMBLOCKTYPE_FLOPPY_2_88;
+                /* fall thru */
+            case PDMBLOCKTYPE_FLOPPY_2_88:
+                if (cbFloppyImg > 80 * 2 * 48 * 512)
+                    pThis->enmType = PDMBLOCKTYPE_FLOPPY_FAKE_15_6;
+                /* fall thru */
+            case PDMBLOCKTYPE_FLOPPY_FAKE_15_6:
+                if (cbFloppyImg > 255 * 2 * 63 * 512)
+                    pThis->enmType = PDMBLOCKTYPE_FLOPPY_FAKE_63_5;
+            case PDMBLOCKTYPE_FLOPPY_FAKE_63_5:
+                if (cbFloppyImg > 255 * 2 * 255 * 512)
+                    LogRel(("Warning: Floppy image is larger that 63.5 MB! (%llu bytes)\n", cbFloppyImg));
+                break;
+        }
+        if (pThis->enmType != enmCfgType)
+            LogRel(("Automatically upgraded floppy drive from %s to %s to better support the %u byte image\n",
+                    drvblockGetTypeName(enmCfgType), drvblockGetTypeName(pThis->enmType), cbFloppyImg));
     }
 
Index: trunk/src/VBox/Devices/Storage/DrvHostBase.cpp
===================================================================
--- trunk/src/VBox/Devices/Storage/DrvHostBase.cpp	(revision 47035)
+++ trunk/src/VBox/Devices/Storage/DrvHostBase.cpp	(revision 47036)
@@ -2080,4 +2080,6 @@
         case PDMBLOCKTYPE_FLOPPY_1_44:
         case PDMBLOCKTYPE_FLOPPY_2_88:
+        case PDMBLOCKTYPE_FLOPPY_FAKE_15_6:
+        case PDMBLOCKTYPE_FLOPPY_FAKE_63_5:
             if (uDriveType != DRIVE_REMOVABLE)
             {
