Index: /trunk/include/VBox/vmm/pdmstorageifs.h
===================================================================
--- /trunk/include/VBox/vmm/pdmstorageifs.h	(revision 80588)
+++ /trunk/include/VBox/vmm/pdmstorageifs.h	(revision 80589)
@@ -950,15 +950,18 @@
      * @param   cbCdb           Size of the CDB in bytes.
      * @param   enmTxDir        Direction of transfer.
+     * @param   penmTxDir       Where to store the transfer direction as parsed from the CDB, optional.
      * @param   cbBuf           Size of the transfer buffer.
      * @param   pabSense        Where to store the optional sense key.
      * @param   cbSense         Size of the sense key buffer.
+     * @param   pcbSense        Where to store the amount of sense data written, optional.
      * @param   pu8ScsiSts      Where to store the SCSI status on success.
      * @param   cTimeoutMillies Command timeout in milliseconds.
      * @thread  Any thread.
      */
-    DECLR3CALLBACKMEMBER(int, pfnIoReqSendScsiCmd,(PPDMIMEDIAEX pInterface, PDMMEDIAEXIOREQ hIoReq, uint32_t uLun,
-                                                   const uint8_t *pbCdb, size_t cbCdb, PDMMEDIAEXIOREQSCSITXDIR enmTxDir,
-                                                   size_t cbBuf, uint8_t *pabSense, size_t cbSense, uint8_t *pu8ScsiSts,
-                                                   uint32_t cTimeoutMillies));
+    DECLR3CALLBACKMEMBER(int, pfnIoReqSendScsiCmd,(PPDMIMEDIAEX pInterface, PDMMEDIAEXIOREQ hIoReq,
+                                                   uint32_t uLun, const uint8_t *pbCdb, size_t cbCdb,
+                                                   PDMMEDIAEXIOREQSCSITXDIR enmTxDir, PDMMEDIAEXIOREQSCSITXDIR *penmTxDirRet,
+                                                   size_t cbBuf, uint8_t *pabSense, size_t cbSense, size_t *pcbSenseRet,
+                                                   uint8_t *pu8ScsiSts, uint32_t cTimeoutMillies));
 
     /**
@@ -1036,5 +1039,5 @@
 } PDMIMEDIAEX;
 /** PDMIMEDIAEX interface ID. */
-#define PDMIMEDIAEX_IID                      "1f82b709-a9f7-4928-ad50-e879c9bbeba1"
+#define PDMIMEDIAEX_IID                      "29c9e82b-934e-45c5-bb84-0d871c3cc9dd"
 
 /** @} */
Index: /trunk/include/VBox/vscsi.h
===================================================================
--- /trunk/include/VBox/vscsi.h	(revision 80588)
+++ /trunk/include/VBox/vscsi.h	(revision 80589)
@@ -87,4 +87,23 @@
 
 /**
+ * Virtual SCSI transfer direction as seen from the initiator.
+ */
+typedef enum VSCSIXFERDIR
+{
+    /** Invalid data direction. */
+    PVSCSIXFERDIR_INVALID     = 0,
+    /** Direction is unknown. */
+    VSCSIXFERDIR_UNKNOWN,
+    /** Direction is from target to initiator (aka a read). */
+    VSCSIXFERDIR_T2I,
+    /** Direction is from initiator to device (aka a write). */
+    VSCSIXFERDIR_I2T,
+    /** No data transfer associated with this request. */
+    VSCSIXFERDIR_NONE,
+    /** 32bit hack. */
+    VSCSIXFERDIR_32BIT_HACK  = 0x7fffffff
+} VSCSIXFERDIR;
+
+/**
  * LUN types we support
  */
@@ -277,5 +296,7 @@
                                                bool fRedoPossible,
                                                int rcReq,
-                                               size_t cbXfer);
+                                               size_t cbXfer,
+                                               VSCSIXFERDIR enmXferDir,
+                                               size_t cbSense);
 /** Pointer to a virtual SCSI request completed callback. */
 typedef FNVSCSIREQCOMPLETED *PFNVSCSIREQCOMPLETED;
Index: /trunk/src/VBox/Devices/Samples/DrvStorageFilter.cpp
===================================================================
--- /trunk/src/VBox/Devices/Samples/DrvStorageFilter.cpp	(revision 80588)
+++ /trunk/src/VBox/Devices/Samples/DrvStorageFilter.cpp	(revision 80589)
@@ -337,13 +337,14 @@
 
 /** @interface_method_impl{PDMIMEDIAEX,pfnIoReqSendScsiCmd} */
-static DECLCALLBACK(int) drvStorageFltIMedia_IoReqSendScsiCmd(PPDMIMEDIAEX pInterface, PDMMEDIAEXIOREQ hIoReq, uint32_t uLun,
-                                                              const uint8_t *pbCdb, size_t cbCdb, PDMMEDIAEXIOREQSCSITXDIR enmTxDir,
-                                                              size_t cbBuf, uint8_t *pabSense, size_t cbSense, uint8_t *pu8ScsiSts,
-                                                              uint32_t cTimeoutMillies)
+static DECLCALLBACK(int) drvStorageFltIMedia_IoReqSendScsiCmd(PPDMIMEDIAEX pInterface, PDMMEDIAEXIOREQ hIoReq,
+                                                              uint32_t uLun, const uint8_t *pbCdb, size_t cbCdb,
+                                                              PDMMEDIAEXIOREQSCSITXDIR enmTxDir, PDMMEDIAEXIOREQSCSITXDIR *penmTxDirRet,
+                                                              size_t cbBuf, uint8_t *pabSense, size_t cbSense, size_t *pcbSenseRet,
+                                                              uint8_t *pu8ScsiSts, uint32_t cTimeoutMillies)
 {
     PDRVSTORAGEFILTER pThis = RT_FROM_MEMBER(pInterface, DRVSTORAGEFILTER, IMediaEx);
     return pThis->pIMediaExBelow->pfnIoReqSendScsiCmd(pThis->pIMediaExBelow, hIoReq, uLun, pbCdb, cbCdb,
-                                                      enmTxDir, cbBuf, pabSense, cbSense, pu8ScsiSts,
-                                                      cTimeoutMillies);
+                                                      enmTxDir, penmTxDirRet, cbBuf, pabSense, cbSense, pcbSenseRet,
+                                                      pu8ScsiSts, cTimeoutMillies);
 }
 
Index: /trunk/src/VBox/Devices/Storage/DevAHCI.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DevAHCI.cpp	(revision 80588)
+++ /trunk/src/VBox/Devices/Storage/DevAHCI.cpp	(revision 80589)
@@ -4501,6 +4501,6 @@
             rc = pAhciPort->pDrvMediaEx->pfnIoReqSendScsiCmd(pAhciPort->pDrvMediaEx, pAhciReq->hIoReq,
                                                              0, &pAhciReq->aATAPICmd[0], ATAPI_PACKET_SIZE,
-                                                             PDMMEDIAEXIOREQSCSITXDIR_UNKNOWN, cbBuf,
-                                                             &pAhciPort->abATAPISense[0], sizeof(pAhciPort->abATAPISense),
+                                                             PDMMEDIAEXIOREQSCSITXDIR_UNKNOWN, NULL, cbBuf,
+                                                             &pAhciPort->abATAPISense[0], sizeof(pAhciPort->abATAPISense), NULL,
                                                              &pAhciReq->u8ScsiSts, 30 * RT_MS_1SEC);
         }
Index: /trunk/src/VBox/Devices/Storage/DevBusLogic.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DevBusLogic.cpp	(revision 80588)
+++ /trunk/src/VBox/Devices/Storage/DevBusLogic.cpp	(revision 80589)
@@ -2754,6 +2754,6 @@
 
         rc = pTgtDev->pDrvMediaEx->pfnIoReqSendScsiCmd(pTgtDev->pDrvMediaEx, pReq->hIoReq, uLun,
-                                                       pbCdb, cbCdb, PDMMEDIAEXIOREQSCSITXDIR_UNKNOWN,
-                                                       cbBuf, NULL, 0, &pReq->u8ScsiSts, 30 * RT_MS_1SEC);
+                                                       pbCdb, cbCdb, PDMMEDIAEXIOREQSCSITXDIR_UNKNOWN, NULL,
+                                                       cbBuf, NULL, 0, NULL, &pReq->u8ScsiSts, 30 * RT_MS_1SEC);
         if (rc == VINF_SUCCESS || rc != VINF_PDM_MEDIAEX_IOREQ_IN_PROGRESS)
         {
@@ -3282,5 +3282,5 @@
                 rc = pTgtDev->pDrvMediaEx->pfnIoReqSendScsiCmd(pTgtDev->pDrvMediaEx, pReq->hIoReq, uLun,
                                                                &pReq->CCBGuest.c.abCDB[0], pReq->CCBGuest.c.cbCDB,
-                                                               enmXferDir, cbBuf, pReq->pbSenseBuffer, cbSense,
+                                                               enmXferDir, NULL, cbBuf, pReq->pbSenseBuffer, cbSense, NULL,
                                                                &pReq->u8ScsiSts, 30 * RT_MS_1SEC);
                 if (rc != VINF_PDM_MEDIAEX_IOREQ_IN_PROGRESS)
Index: /trunk/src/VBox/Devices/Storage/DevLsiLogicSCSI.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DevLsiLogicSCSI.cpp	(revision 80588)
+++ /trunk/src/VBox/Devices/Storage/DevLsiLogicSCSI.cpp	(revision 80589)
@@ -2275,7 +2275,7 @@
                 rc = pTgtDev->pDrvMediaEx->pfnIoReqSendScsiCmd(pTgtDev->pDrvMediaEx, pLsiReq->hIoReq, pLsiReq->GuestRequest.SCSIIO.au8LUN[1],
                                                                &pLsiReq->GuestRequest.SCSIIO.au8CDB[0], pLsiReq->GuestRequest.SCSIIO.u8CDBLength,
-                                                               enmXferDir, pLsiReq->GuestRequest.SCSIIO.u32DataLength,
-                                                               &pLsiReq->abSenseBuffer[0], sizeof(pLsiReq->abSenseBuffer), &pLsiReq->u8ScsiSts,
-                                                               30 * RT_MS_1SEC);
+                                                               enmXferDir, NULL, pLsiReq->GuestRequest.SCSIIO.u32DataLength,
+                                                               &pLsiReq->abSenseBuffer[0], sizeof(pLsiReq->abSenseBuffer), NULL,
+                                                               &pLsiReq->u8ScsiSts, 30 * RT_MS_1SEC);
                 if (rc != VINF_PDM_MEDIAEX_IOREQ_IN_PROGRESS)
                     lsilogicR3ReqComplete(pThis, pLsiReq, rc);
@@ -3905,6 +3905,6 @@
 
         rc = pTgtDev->pDrvMediaEx->pfnIoReqSendScsiCmd(pTgtDev->pDrvMediaEx, pReq->hIoReq, uLun,
-                                                       pbCdb, cbCdb, PDMMEDIAEXIOREQSCSITXDIR_UNKNOWN,
-                                                       cbBuf, NULL, 0, &pReq->u8ScsiSts, 30 * RT_MS_1SEC);
+                                                       pbCdb, cbCdb, PDMMEDIAEXIOREQSCSITXDIR_UNKNOWN, NULL,
+                                                       cbBuf, NULL, 0, NULL, &pReq->u8ScsiSts, 30 * RT_MS_1SEC);
         if (rc == VINF_SUCCESS || rc != VINF_PDM_MEDIAEX_IOREQ_IN_PROGRESS)
         {
Index: /trunk/src/VBox/Devices/Storage/DevVirtioSCSI.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DevVirtioSCSI.cpp	(revision 80588)
+++ /trunk/src/VBox/Devices/Storage/DevVirtioSCSI.cpp	(revision 80589)
@@ -1092,6 +1092,6 @@
     rc = pIMediaEx->pfnIoReqSendScsiCmd(pIMediaEx, pReq->hIoReq, uLUN,
                                         pVirtqReq->uCdb, pThis->virtioScsiConfig.uCdbSize,
-                                        PDMMEDIAEXIOREQSCSITXDIR_UNKNOWN, cbDataIn,
-                                        pReq->pbSense, pReq->cbSense,
+                                        PDMMEDIAEXIOREQSCSITXDIR_UNKNOWN, NULL, cbDataIn,
+                                        pReq->pbSense, pReq->cbSense, NULL,
                                         &pReq->uStatus, 30 * RT_MS_1SEC);
 
Index: /trunk/src/VBox/Devices/Storage/DrvHostDVD.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostDVD.cpp	(revision 80588)
+++ /trunk/src/VBox/Devices/Storage/DrvHostDVD.cpp	(revision 80589)
@@ -190,8 +190,9 @@
 
 /** @interface_method_impl{PDMIMEDIAEX,pfnIoReqSendScsiCmd} */
-static DECLCALLBACK(int) drvHostDvdIoReqSendScsiCmd(PPDMIMEDIAEX pInterface, PDMMEDIAEXIOREQ hIoReq, uint32_t uLun,
-                                                    const uint8_t *pbCdb, size_t cbCdb, PDMMEDIAEXIOREQSCSITXDIR enmTxDir,
-                                                    size_t cbBuf, uint8_t *pabSense, size_t cbSense, uint8_t *pu8ScsiSts,
-                                                    uint32_t cTimeoutMillies)
+static DECLCALLBACK(int) drvHostDvdIoReqSendScsiCmd(PPDMIMEDIAEX pInterface, PDMMEDIAEXIOREQ hIoReq,
+                                                    uint32_t uLun, const uint8_t *pbCdb, size_t cbCdb,
+                                                    PDMMEDIAEXIOREQSCSITXDIR enmTxDir, PDMMEDIAEXIOREQSCSITXDIR *penmTxDirRet,
+                                                    size_t cbBuf, uint8_t *pabSense, size_t cbSense, size_t *pcbSenseRet,
+                                                    uint8_t *pu8ScsiSts, uint32_t cTimeoutMillies)
 {
     RT_NOREF3(uLun, cTimeoutMillies, enmTxDir);
@@ -409,5 +410,29 @@
         && VALID_PTR(pabSense)
         && cbSense > 0)
-        memcpy(pabSense, &pThis->abATAPISense[0], RT_MIN(cbSense, sizeof(pThis->abATAPISense)));
+    {
+        size_t cbSenseCpy = RT_MIN(cbSense, sizeof(pThis->abATAPISense));
+
+        memcpy(pabSense, &pThis->abATAPISense[0], cbSenseCpy);
+        if (pcbSenseRet)
+            *pcbSenseRet = cbSenseCpy;
+    }
+
+    if (penmTxDirRet)
+    {
+        switch (enmXferDir)
+        {
+            case PDMMEDIATXDIR_NONE:
+                *penmTxDirRet = PDMMEDIAEXIOREQSCSITXDIR_NONE;
+                break;
+            case PDMMEDIATXDIR_FROM_DEVICE:
+                *penmTxDirRet = PDMMEDIAEXIOREQSCSITXDIR_FROM_DEVICE;
+                break;
+            case PDMMEDIATXDIR_TO_DEVICE:
+                *penmTxDirRet = PDMMEDIAEXIOREQSCSITXDIR_TO_DEVICE;
+                break;
+            default:
+                *penmTxDirRet = PDMMEDIAEXIOREQSCSITXDIR_UNKNOWN;
+        }
+    }
 
     RTCritSectLeave(&pThis->Core.CritSect);
Index: /trunk/src/VBox/Devices/Storage/DrvSCSI.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvSCSI.cpp	(revision 80588)
+++ /trunk/src/VBox/Devices/Storage/DrvSCSI.cpp	(revision 80589)
@@ -73,4 +73,8 @@
     /** Where to store the SCSI status code. */
     uint8_t                  *pu8ScsiSts;
+    /** Where to store the amount of sense data written, optional. */
+    size_t                   *pcbSense;
+    /** Where to store the transfer direction determined by the VSCSI layer, optional. */
+    PDMMEDIAEXIOREQSCSITXDIR *penmXferDir;
     /** Transfer size determined by the VSCSI layer. */
     size_t                   cbXfer;
@@ -170,4 +174,26 @@
 }
 
+
+/**
+ * Converts the given VSCSI transfer direction enum to the appropriate PDM extended media interface one.
+ *
+ * @returns The PDM extended media interface transfer direction.
+ * @param   enmVScsiXferDir     The VSCSI transfer direction.
+ */
+static PDMMEDIAEXIOREQSCSITXDIR drvscsiVScsiXferDir2PdmMediaExDir(VSCSIXFERDIR enmVScsiXferDir)
+{
+    switch (enmVScsiXferDir)
+    {
+        case VSCSIXFERDIR_UNKNOWN: return PDMMEDIAEXIOREQSCSITXDIR_UNKNOWN;
+        case VSCSIXFERDIR_T2I:     return PDMMEDIAEXIOREQSCSITXDIR_FROM_DEVICE;
+        case VSCSIXFERDIR_I2T:     return PDMMEDIAEXIOREQSCSITXDIR_TO_DEVICE;
+        case VSCSIXFERDIR_NONE:    return PDMMEDIAEXIOREQSCSITXDIR_NONE;
+        default:                   return PDMMEDIAEXIOREQSCSITXDIR_INVALID;
+    }
+
+    return PDMMEDIAEXIOREQSCSITXDIR_INVALID;
+}
+
+
 /* -=-=-=-=- VScsiIoCallbacks -=-=-=-=- */
 
@@ -881,8 +907,9 @@
 
 /** @interface_method_impl{PDMIMEDIAEX,pfnIoReqSendScsiCmd} */
-static DECLCALLBACK(int) drvscsiIoReqSendScsiCmd(PPDMIMEDIAEX pInterface, PDMMEDIAEXIOREQ hIoReq, uint32_t uLun,
-                                                 const uint8_t *pbCdb, size_t cbCdb, PDMMEDIAEXIOREQSCSITXDIR enmTxDir,
-                                                 size_t cbBuf, uint8_t *pabSense, size_t cbSense, uint8_t *pu8ScsiSts,
-                                                 uint32_t cTimeoutMillies)
+static DECLCALLBACK(int) drvscsiIoReqSendScsiCmd(PPDMIMEDIAEX pInterface, PDMMEDIAEXIOREQ hIoReq,
+                                                 uint32_t uLun, const uint8_t *pbCdb, size_t cbCdb,
+                                                 PDMMEDIAEXIOREQSCSITXDIR enmTxDir, PDMMEDIAEXIOREQSCSITXDIR *penmTxDirRet,
+                                                 size_t cbBuf, uint8_t *pabSense, size_t cbSense, size_t *pcbSenseRet,
+                                                 uint8_t *pu8ScsiSts, uint32_t cTimeoutMillies)
 {
     RT_NOREF1(cTimeoutMillies);
@@ -898,7 +925,9 @@
     Log(("cbBuf=%zu\n", cbBuf));
 
-    pReq->enmXferDir = enmTxDir;
-    pReq->cbBuf      = cbBuf;
-    pReq->pu8ScsiSts = pu8ScsiSts;
+    pReq->enmXferDir   = enmTxDir;
+    pReq->cbBuf        = cbBuf;
+    pReq->pu8ScsiSts   = pu8ScsiSts;
+    pReq->pcbSense     = pcbSenseRet;
+    pReq->penmXferDir  = penmTxDirRet;
 
     /* Allocate and sync buffers if a data transfer is indicated. */
@@ -989,5 +1018,5 @@
 static DECLCALLBACK(void) drvscsiIoReqVScsiReqCompleted(VSCSIDEVICE hVScsiDevice, void *pVScsiDeviceUser,
                                                         void *pVScsiReqUser, int rcScsiCode, bool fRedoPossible,
-                                                        int rcReq, size_t cbXfer)
+                                                        int rcReq, size_t cbXfer, VSCSIXFERDIR enmXferDir, size_t cbSense)
 {
     RT_NOREF2(hVScsiDevice, fRedoPossible);
@@ -1019,4 +1048,8 @@
     *pReq->pu8ScsiSts = (uint8_t)rcScsiCode;
     pReq->cbXfer      = cbXfer;
+    if (pReq->pcbSense)
+        *pReq->pcbSense = cbSense;
+    if (pReq->penmXferDir)
+        *pReq->penmXferDir = drvscsiVScsiXferDir2PdmMediaExDir(enmXferDir);
     int rc = pThis->pDevMediaExPort->pfnIoReqCompleteNotify(pThis->pDevMediaExPort, (PDMMEDIAEXIOREQ)pReq,
                                                             &pReq->abAlloc[0], rcReq);
Index: /trunk/src/VBox/Devices/Storage/DrvVD.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvVD.cpp	(revision 80588)
+++ /trunk/src/VBox/Devices/Storage/DrvVD.cpp	(revision 80589)
@@ -3631,8 +3631,9 @@
  * @interface_method_impl{PDMIMEDIAEX,pfnIoReqSendScsiCmd}
  */
-static DECLCALLBACK(int) drvvdIoReqSendScsiCmd(PPDMIMEDIAEX pInterface, PDMMEDIAEXIOREQ hIoReq, uint32_t uLun,
-                                               const uint8_t *pbCdb, size_t cbCdb, PDMMEDIAEXIOREQSCSITXDIR enmTxDir,
-                                               size_t cbBuf, uint8_t *pabSense, size_t cbSense, uint8_t *pu8ScsiSts,
-                                               uint32_t cTimeoutMillies)
+static DECLCALLBACK(int) drvvdIoReqSendScsiCmd(PPDMIMEDIAEX pInterface, PDMMEDIAEXIOREQ hIoReq,
+                                               uint32_t uLun, const uint8_t *pbCdb, size_t cbCdb,
+                                               PDMMEDIAEXIOREQSCSITXDIR enmTxDir, PDMMEDIAEXIOREQSCSITXDIR *penmTxDirRet,
+                                               size_t cbBuf, uint8_t *pabSense, size_t cbSense, size_t *pcbSenseRet,
+                                               uint8_t *pu8ScsiSts, uint32_t cTimeoutMillies)
 {
     RT_NOREF10(pInterface, uLun, pbCdb, cbCdb, enmTxDir, cbBuf, pabSense, cbSense, pu8ScsiSts, cTimeoutMillies);
Index: /trunk/src/VBox/Devices/Storage/UsbMsd.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/UsbMsd.cpp	(revision 80588)
+++ /trunk/src/VBox/Devices/Storage/UsbMsd.cpp	(revision 80589)
@@ -1561,6 +1561,6 @@
 
     return pThis->Lun0.pIMediaEx->pfnIoReqSendScsiCmd(pThis->Lun0.pIMediaEx, pReq->hIoReq, pReq->Cbw.bCBWLun,
-                                                      &pReq->Cbw.CBWCB[0], pReq->Cbw.bCBWCBLength, enmTxDir,
-                                                      pReq->Cbw.dCBWDataTransferLength, NULL, 0,
+                                                      &pReq->Cbw.CBWCB[0], pReq->Cbw.bCBWCBLength, enmTxDir, NULL,
+                                                      pReq->Cbw.dCBWDataTransferLength, NULL, 0, NULL,
                                                       &pReq->iScsiReqStatus, 20 * RT_MS_1SEC);
 }
Index: /trunk/src/VBox/Devices/Storage/VSCSI/VSCSIDevice.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/VSCSI/VSCSIDevice.cpp	(revision 80588)
+++ /trunk/src/VBox/Devices/Storage/VSCSI/VSCSIDevice.cpp	(revision 80589)
@@ -67,4 +67,5 @@
                 SCSIINQUIRYDATA ScsiInquiryReply;
 
+                vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
                 vscsiReqSetXferSize(pVScsiReq, RT_MIN(sizeof(SCSIINQUIRYDATA), scsiBE2H_U16(&pVScsiReq->pbCDB[3])));
                 memset(&ScsiInquiryReply, 0, sizeof(ScsiInquiryReply));
@@ -86,4 +87,5 @@
              * to return an error.
              */
+            vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
             vscsiReqSetXferSize(pVScsiReq, scsiBE2H_U32(&pVScsiReq->pbCDB[6]));
             if (pVScsiReq->cbXfer < 16)
@@ -106,4 +108,5 @@
         case SCSI_TEST_UNIT_READY:
         {
+            vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_NONE);
             if (   vscsiDeviceLunIsPresent(pVScsiDevice, pVScsiReq->iLun)
                 && pVScsiDevice->papVScsiLun[pVScsiReq->iLun]->fReady)
@@ -115,4 +118,5 @@
         case SCSI_REQUEST_SENSE:
         {
+            vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
             vscsiReqSetXferSize(pVScsiReq, pVScsiReq->pbCDB[4]);
 
@@ -183,5 +187,5 @@
     pVScsiDevice->pfnVScsiReqCompleted(pVScsiDevice, pVScsiDevice->pvVScsiDeviceUser,
                                        pVScsiReq->pvVScsiReqUser, rcScsiCode, fRedoPossible,
-                                       rcReq, pVScsiReq->cbXfer);
+                                       rcReq, pVScsiReq->cbXfer, pVScsiReq->enmXferDir, pVScsiReq->cbSenseWritten);
 
     if (pVScsiReq->pvLun)
@@ -411,4 +415,6 @@
     pVScsiReq->cbXfer         = 0;
     pVScsiReq->pvLun          = NULL;
+    pVScsiReq->enmXferDir     = VSCSIXFERDIR_UNKNOWN;
+    pVScsiReq->cbSenseWritten = 0;
     RTSgBufInit(&pVScsiReq->SgBuf, paSGList, cSGListEntries);
 
Index: /trunk/src/VBox/Devices/Storage/VSCSI/VSCSIInternal.h
===================================================================
--- /trunk/src/VBox/Devices/Storage/VSCSI/VSCSIInternal.h	(revision 80588)
+++ /trunk/src/VBox/Devices/Storage/VSCSI/VSCSIInternal.h	(revision 80589)
@@ -126,4 +126,8 @@
     /** Transfer size determined from the CDB. */
     size_t               cbXfer;
+    /** Number of bytes of sense data written. */
+    size_t               cbSenseWritten;
+    /** Transfer direction as indicated by the CDB. */
+    VSCSIXFERDIR         enmXferDir;
     /** Pointer to the opaque data which may be allocated by the LUN
      * the request is for. */
@@ -491,4 +495,16 @@
 
 /**
+ * Sets the transfer direction for the given request.
+ *
+ * @returns nothing.
+ * @param   pVScsiReq     The SCSI request.
+ * @param   cbXfer        The transfer size for the request.
+ */
+DECLINLINE(void) vscsiReqSetXferDir(PVSCSIREQINT pVScsiReq, VSCSIXFERDIR enmXferDir)
+{
+    pVScsiReq->enmXferDir = enmXferDir;
+}
+
+/**
  * Wrapper for the set I/O request allocation size I/O callback.
  *
Index: /trunk/src/VBox/Devices/Storage/VSCSI/VSCSILunMmc.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/VSCSI/VSCSILunMmc.cpp	(revision 80588)
+++ /trunk/src/VBox/Devices/Storage/VSCSI/VSCSILunMmc.cpp	(revision 80589)
@@ -1086,4 +1086,5 @@
             case SCSI_TEST_UNIT_READY:
                 Assert(!pVScsiLunMmc->Core.fReady); /* Only should get here if LUN isn't ready. */
+                vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_NONE);
                 rcReq = vscsiLunReqSenseErrorSet(pVScsiLun, pVScsiReq, SCSI_SENSE_NOT_READY, SCSI_ASC_MEDIUM_NOT_PRESENT, 0x00);
                 break;
@@ -1093,4 +1094,5 @@
                 SCSIINQUIRYDATA ScsiInquiryReply;
 
+                vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
                 vscsiReqSetXferSize(pVScsiReq, RT_MIN(sizeof(SCSIINQUIRYDATA), scsiBE2H_U16(&pVScsiReq->pbCDB[3])));
                 memset(&ScsiInquiryReply, 0, sizeof(ScsiInquiryReply));
@@ -1122,4 +1124,5 @@
                 uint8_t aReply[8];
                 memset(aReply, 0, sizeof(aReply));
+                vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
                 vscsiReqSetXferSize(pVScsiReq, sizeof(aReply));
 
@@ -1144,4 +1147,5 @@
                 bool    fValid = false;
 
+                vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
                 vscsiReqSetXferSize(pVScsiReq, pVScsiReq->pbCDB[4]);
                 memset(aReply, 0, sizeof(aReply));
@@ -1176,4 +1180,5 @@
             {
                 size_t cbMax = scsiBE2H_U16(&pVScsiReq->pbCDB[7]);
+                vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
                 vscsiReqSetXferSize(pVScsiReq, cbMax);
                 rcReq = vscsiLunMmcModeSense10(pVScsiLunMmc, pVScsiReq, cbMax);
@@ -1183,4 +1188,6 @@
             {
                 uint32_t uLba = scsiBE2H_U32(&pVScsiReq->pbCDB[2]);
+
+                vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_NONE);
                 if (uLba > pVScsiLunMmc->cSectors)
                     rcReq = vscsiLunReqSenseErrorSet(pVScsiLun, pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST,
@@ -1193,4 +1200,5 @@
             {
                 /** @todo implement!! */
+                vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_I2T);
                 vscsiReqSetXferSize(pVScsiReq, pVScsiReq->pbCDB[4]);
                 rcReq = vscsiLunReqSenseOkSet(pVScsiLun, pVScsiReq);
@@ -1394,4 +1402,5 @@
                 uint8_t uDataMode = pVScsiReq->pbCDB[1] & 0x1f;
 
+                vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
                 vscsiReqSetXferSize(pVScsiReq, scsiBE2H_U16(&pVScsiReq->pbCDB[6]));
 
@@ -1425,4 +1434,6 @@
             {
                 int rc2 = VINF_SUCCESS;
+
+                vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_NONE);
                 switch (pVScsiReq->pbCDB[4] & 3)
                 {
@@ -1448,4 +1459,5 @@
                 uint8_t uSubPageCode = pVScsiReq->pbCDB[3];
 
+                vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
                 vscsiReqSetXferSize(pVScsiReq, scsiBE2H_U16(&pVScsiReq->pbCDB[7]));
 
@@ -1487,4 +1499,5 @@
                         /* Leave the rest 0 */
 
+                        vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
                         vscsiReqSetXferSize(pVScsiReq, sizeof(aReply));
                         RTSgBufCopyFromBuf(&pVScsiReq->SgBuf, aReply, sizeof(aReply));
@@ -1515,4 +1528,5 @@
                 fMSF   = (pVScsiReq->pbCDB[1] >> 1) & 1;
 
+                vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
                 vscsiReqSetXferSize(pVScsiReq, cbMax);
                 switch (format)
@@ -1537,4 +1551,5 @@
                 size_t cbMax = scsiBE2H_U16(&pVScsiReq->pbCDB[7]);
 
+                vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
                 vscsiReqSetXferSize(pVScsiReq, cbMax);
                 if (pVScsiReq->pbCDB[1] & 0x1)
@@ -1549,4 +1564,5 @@
                 uint8_t aReply[8];
 
+                vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
                 vscsiReqSetXferSize(pVScsiReq, cbMax);
                 scsiH2BE_U16(&aReply[0], 0);
@@ -1566,4 +1582,5 @@
                 size_t cbMax = scsiBE2H_U16(&pVScsiReq->pbCDB[7]);
 
+                vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
                 vscsiReqSetXferSize(pVScsiReq, cbMax);
                 memset(aReply, '\0', sizeof(aReply));
@@ -1588,4 +1605,6 @@
             {
                 size_t cbMax = scsiBE2H_U16(&pVScsiReq->pbCDB[7]);
+
+                vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
                 vscsiReqSetXferSize(pVScsiReq, cbMax);
                 rcReq = vscsiLunMmcReadTrackInformation(pVScsiLunMmc, pVScsiReq, cbMax);
@@ -1595,4 +1614,6 @@
             {
                 size_t cbMax = scsiBE2H_U16(&pVScsiReq->pbCDB[7]);
+
+                vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
                 vscsiReqSetXferSize(pVScsiReq, cbMax);
                 rcReq = vscsiLunMmcGetConfiguration(pVScsiLunMmc, pVScsiReq, cbMax);
@@ -1602,4 +1623,6 @@
             {
                 size_t cbMax = scsiBE2H_U16(&pVScsiReq->pbCDB[8]);
+
+                vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
                 vscsiReqSetXferSize(pVScsiReq, cbMax);
                 rcReq = vscsiLunMmcReadDvdStructure(pVScsiLunMmc, pVScsiReq, cbMax);
@@ -1617,4 +1640,5 @@
                  __FUNCTION__, uLbaStart, cSectorTransfer));
 
+        vscsiReqSetXferDir(pVScsiReq, enmTxDir == VSCSIIOREQTXDIR_WRITE ? VSCSIXFERDIR_I2T : VSCSIXFERDIR_T2I);
         vscsiReqSetXferSize(pVScsiReq, cSectorTransfer * cbSector);
         if (RT_UNLIKELY(uLbaStart + cSectorTransfer > pVScsiLunMmc->cSectors))
Index: /trunk/src/VBox/Devices/Storage/VSCSI/VSCSILunSbc.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/VSCSI/VSCSILunSbc.cpp	(revision 80588)
+++ /trunk/src/VBox/Devices/Storage/VSCSI/VSCSILunSbc.cpp	(revision 80589)
@@ -201,4 +201,5 @@
         case SCSI_INQUIRY:
         {
+            vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
             vscsiReqSetXferSize(pVScsiReq, RT_MIN(sizeof(SCSIINQUIRYDATA), scsiBE2H_U16(&pVScsiReq->pbCDB[3])));
 
@@ -252,4 +253,5 @@
             memset(aReply, 0, sizeof(aReply));
 
+            vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
             vscsiReqSetXferSize(pVScsiReq, sizeof(aReply));
 
@@ -274,4 +276,5 @@
             bool    fValid = false;
 
+            vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
             vscsiReqSetXferSize(pVScsiReq, pVScsiReq->pbCDB[4]);
             memset(aReply, 0, sizeof(aReply));
@@ -312,4 +315,5 @@
             size_t  cbList = pVScsiReq->pbCDB[4];
 
+            vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_I2T);
             vscsiReqSetXferSize(pVScsiReq, pVScsiReq->pbCDB[4]);
 
@@ -405,4 +409,5 @@
             uint8_t uDataMode = pVScsiReq->pbCDB[1] & 0x1f;
 
+            vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
             vscsiReqSetXferSize(pVScsiReq, scsiBE2H_U16(&pVScsiReq->pbCDB[6]));
 
@@ -437,4 +442,5 @@
         case SCSI_START_STOP_UNIT:
         {
+            vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_NONE);
             vscsiReqSetXferSize(pVScsiReq, 0);
             rcReq = vscsiLunReqSenseOkSet(pVScsiLun, pVScsiReq);
@@ -446,4 +452,5 @@
             uint8_t uSubPageCode = pVScsiReq->pbCDB[3];
 
+            vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
             vscsiReqSetXferSize(pVScsiReq, scsiBE2H_U16(&pVScsiReq->pbCDB[7]));
 
@@ -486,4 +493,5 @@
                     /* Leave the rest 0 */
 
+                    vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
                     vscsiReqSetXferSize(pVScsiReq, sizeof(aReply));
                     RTSgBufCopyFromBuf(&pVScsiReq->SgBuf, aReply, sizeof(aReply));
@@ -505,4 +513,5 @@
 
                 /* Copy the header. */
+                vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_I2T);
                 vscsiReqSetXferSize(pVScsiReq, cbList);
                 cbCopied = RTSgBufCopyToBuf(&pVScsiReq->SgBuf, &abHdr[0], sizeof(abHdr));
@@ -570,4 +579,5 @@
         if (RT_UNLIKELY(uLbaStart + cSectorTransfer > pVScsiLunSbc->cSectors))
         {
+            vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_NONE);
             rcReq = vscsiLunReqSenseErrorSet(pVScsiLun, pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_LOGICAL_BLOCK_OOR, 0x00);
             vscsiDeviceReqComplete(pVScsiLun->pVScsiDevice, pVScsiReq, rcReq, false, VINF_SUCCESS);
@@ -576,4 +586,5 @@
         {
             /* A 0 transfer length is not an error. */
+            vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_NONE);
             rcReq = vscsiLunReqSenseOkSet(pVScsiLun, pVScsiReq);
             vscsiDeviceReqComplete(pVScsiLun->pVScsiDevice, pVScsiReq, rcReq, false, VINF_SUCCESS);
@@ -587,6 +598,9 @@
                 rcReq = vscsiLunReqSenseErrorSet(pVScsiLun, pVScsiReq, SCSI_SENSE_DATA_PROTECT, SCSI_ASC_WRITE_PROTECTED, 0x00);
             else
+            {
+                vscsiReqSetXferDir(pVScsiReq, enmTxDir == VSCSIIOREQTXDIR_WRITE ? VSCSIXFERDIR_I2T : VSCSIXFERDIR_T2I);
                 rc = vscsiIoReqTransferEnqueue(pVScsiLun, pVScsiReq, enmTxDir,
                                                uLbaStart * 512, cSectorTransfer * 512);
+            }
         }
     }
@@ -594,4 +608,5 @@
     {
         /* Enqueue flush */
+        vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_NONE);
         vscsiReqSetXferSize(pVScsiReq, 0);
         rc = vscsiIoReqFlushEnqueue(pVScsiLun, pVScsiReq);
Index: /trunk/src/VBox/Devices/Storage/VSCSI/VSCSISense.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/VSCSI/VSCSISense.cpp	(revision 80588)
+++ /trunk/src/VBox/Devices/Storage/VSCSI/VSCSISense.cpp	(revision 80589)
@@ -44,5 +44,8 @@
 
     if (pVScsiReq->pbSense && pVScsiReq->cbSense)
-        memcpy(pVScsiReq->pbSense, pVScsiSense->abSenseBuf, RT_MIN(sizeof(pVScsiSense->abSenseBuf), pVScsiReq->cbSense));
+    {
+        pVScsiReq->cbSenseWritten = RT_MIN(sizeof(pVScsiSense->abSenseBuf), pVScsiReq->cbSense);
+        memcpy(pVScsiReq->pbSense, pVScsiSense->abSenseBuf, pVScsiReq->cbSenseWritten);
+    }
 
     return SCSI_STATUS_OK;
@@ -59,5 +62,8 @@
 
     if (pVScsiReq->pbSense && pVScsiReq->cbSense)
-        memcpy(pVScsiReq->pbSense, pVScsiSense->abSenseBuf, RT_MIN(sizeof(pVScsiSense->abSenseBuf), pVScsiReq->cbSense));
+    {
+        pVScsiReq->cbSenseWritten = RT_MIN(sizeof(pVScsiSense->abSenseBuf), pVScsiReq->cbSense);
+        memcpy(pVScsiReq->pbSense, pVScsiSense->abSenseBuf, pVScsiReq->cbSenseWritten);
+    }
 
     return SCSI_STATUS_CHECK_CONDITION;
@@ -75,5 +81,8 @@
 
     if (pVScsiReq->pbSense && pVScsiReq->cbSense)
-        memcpy(pVScsiReq->pbSense, pVScsiSense->abSenseBuf, RT_MIN(sizeof(pVScsiSense->abSenseBuf), pVScsiReq->cbSense));
+    {
+        pVScsiReq->cbSenseWritten = RT_MIN(sizeof(pVScsiSense->abSenseBuf), pVScsiReq->cbSense);
+        memcpy(pVScsiReq->pbSense, pVScsiSense->abSenseBuf, pVScsiReq->cbSenseWritten);
+    }
 
     return SCSI_STATUS_CHECK_CONDITION;
