Index: /trunk/src/VBox/Devices/Storage/DevATA.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DevATA.cpp	(revision 53408)
+++ /trunk/src/VBox/Devices/Storage/DevATA.cpp	(revision 53409)
@@ -183,8 +183,12 @@
     /** Maximum ATAPI elementary transfer size, PIO only. */
     uint32_t cbPIOTransferLimit;
+    /** ATAPI passthrough transfer size, shared PIO/DMA */
+    uint32_t cbAtapiPassthroughTransfer;
     /** Current read/write buffer position, shared PIO/DMA. */
     uint32_t iIOBufferCur;
     /** First element beyond end of valid buffer content, shared PIO/DMA. */
     uint32_t iIOBufferEnd;
+    /** Align the following fields correctly. */
+    uint32_t Alignment0;
 
     /** ATA/ATAPI current PIO read/write transfer position. Not shared with DMA for safety reasons. */
@@ -1737,4 +1741,5 @@
     s->cbTotalTransfer = 0;
     s->cbElementaryTransfer = 0;
+    s->cbAtapiPassthroughTransfer = 0;
     s->iIOBufferCur = 0;
     s->iIOBufferEnd = 0;
@@ -1763,4 +1768,5 @@
     s->fATAPITransfer = true;
     s->cbElementaryTransfer = s->cbTotalTransfer;
+    s->cbAtapiPassthroughTransfer = s->cbTotalTransfer;
     s->cbPIOTransferLimit = s->uATARegLCyl | (s->uATARegHCyl << 8);
     if (s->uTxDir == PDMBLOCKTXDIR_TO_DEVICE)
@@ -1953,5 +1959,5 @@
     PSTAMPROFILEADV pProf = NULL;
 
-    cbTransfer = RT_MIN(s->cbTotalTransfer, s->cbIOBuffer);
+    cbTransfer = RT_MIN(s->cbAtapiPassthroughTransfer, s->cbIOBuffer);
 
     if (s->uTxDir == PDMBLOCKTXDIR_TO_DEVICE)
@@ -2179,5 +2185,5 @@
         if (s->uTxDir == PDMBLOCKTXDIR_FROM_DEVICE)
         {
-            Assert(cbTransfer <= s->cbTotalTransfer);
+            Assert(cbTransfer <= s->cbAtapiPassthroughTransfer);
             /*
              * Reply with the same amount of data as the real drive
@@ -2209,5 +2215,5 @@
          * done in one transfer, so set the actual value of the buffer end. */
         s->cbElementaryTransfer = cbTransfer;
-        if (cbTransfer >= s->cbTotalTransfer)
+        if (cbTransfer >= s->cbAtapiPassthroughTransfer)
         {
             s->iSourceSink = ATAFN_SS_NULL;
@@ -3751,4 +3757,5 @@
     s->cbTotalTransfer = 0;
     s->cbElementaryTransfer = 0;
+    s->cbAtapiPassthroughTransfer = 0;
     atapiParseCmd(s);
     return false;
@@ -3843,4 +3850,5 @@
 {
     s->cbElementaryTransfer = s->cbTotalTransfer;
+    s->cbAtapiPassthroughTransfer = s->cbTotalTransfer;
     s->uATARegNSector = (s->uATARegNSector & ~7) | ATAPI_INT_REASON_CD;
     Log2(("%s: interrupt reason %#04x\n", __FUNCTION__, s->uATARegNSector));
@@ -3862,4 +3870,5 @@
     s->cbTotalTransfer = 0;
     s->cbElementaryTransfer = 0;
+    s->cbAtapiPassthroughTransfer = 0;
     s->iIOBufferPIODataStart = 0;
     s->iIOBufferPIODataEnd = 0;
