Index: /trunk/src/VBox/Devices/PC/BIOS/scsi.c
===================================================================
--- /trunk/src/VBox/Devices/PC/BIOS/scsi.c	(revision 43671)
+++ /trunk/src/VBox/Devices/PC/BIOS/scsi.c	(revision 43672)
@@ -253,4 +253,5 @@
 {
     bio_dsk_t __far *bios_dsk = read_word(0x0040, 0x000E) :> &EbdaData->bdisk;
+    uint32_t        read_len;
     uint8_t         status, sizes;
     uint16_t        i;
@@ -273,6 +274,5 @@
              bios_dsk->drqp.nsect, bios_dsk->drqp.sect_sz);
 
-    //@todo: why do we need to do this?
-    cmdlen -= 2; // ATAPI uses 12 bytes for a READ 10 CDB??
+    cmdlen -= 2; /* ATAPI uses 12-byte command packets for a READ 10. */
 
     io_base   = bios_dsk->scsidev[device_id].io_base;
@@ -284,10 +284,16 @@
     while (status & VBSCSI_BUSY);
 
-    sizes = (((length + before) >> 12) & 0xF0) | cmdlen;
+    /* On the SCSI level, we have to transfer whole sectors. */
+    /* NB: With proper residual length support, this should not be necessary; we should
+     * be able to avoid transferring the 'after' part of the sector.
+     */
+    read_len = length + before + bios_dsk->drqp.skip_a;
+
+    sizes = (((read_len) >> 12) & 0xF0) | cmdlen;
     outb(io_base + VBSCSI_REGISTER_COMMAND, target_id);                 /* Write the target ID. */
     outb(io_base + VBSCSI_REGISTER_COMMAND, SCSI_TXDIR_FROM_DEVICE);    /* Write the transfer direction. */
     outb(io_base + VBSCSI_REGISTER_COMMAND, sizes);                     /* Write the CDB size. */
-    outb(io_base + VBSCSI_REGISTER_COMMAND, length + before);           /* Write the buffer size. */
-    outb(io_base + VBSCSI_REGISTER_COMMAND, (length + before) >> 8);
+    outb(io_base + VBSCSI_REGISTER_COMMAND, read_len);                  /* Write the buffer size. */
+    outb(io_base + VBSCSI_REGISTER_COMMAND, (read_len) >> 8);
     for (i = 0; i < cmdlen; i++)                                        /* Write the CDB. */
         outb(io_base + VBSCSI_REGISTER_COMMAND, cmdbuf[i]);
@@ -323,6 +329,10 @@
         buffer = (FP_SEG(buffer) + (32768 >> 4)) :> FP_OFF(buffer);
     }
+
     DBG_SCSI("%s: reading %ld bytes to %X:%X\n", __func__, length, FP_SEG(buffer), FP_OFF(buffer));
     rep_insb(buffer, length, io_base + VBSCSI_REGISTER_DATA_IN);
+
+    if (bios_dsk->drqp.skip_a)  /* If necessary, throw away more data. */
+        insb_discard(bios_dsk->drqp.skip_a, io_base + VBSCSI_REGISTER_DATA_IN);
 
     return 0;
