Index: /trunk/src/VBox/Devices/Storage/DrvRamDisk.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvRamDisk.cpp	(revision 64724)
+++ /trunk/src/VBox/Devices/Storage/DrvRamDisk.cpp	(revision 64725)
@@ -177,4 +177,6 @@
     /** Flag whether the RAM disk was pre allocated. */
     bool                    fPreallocRamDisk;
+    /** Flag whether to report a non totating medium. */
+    bool                    fNonRotational;
     /** AVL tree containing the disk blocks to check. */
     PAVLRFOFFTREE           pTreeSegments;
@@ -638,4 +640,11 @@
 }
 
+/** @interface_method_impl{PDMIMEDIA,pfnIsNonRotational} */
+static DECLCALLBACK(bool) drvramdiskIsNonRotational(PPDMIMEDIA pInterface)
+{
+    PDRVRAMDISK pThis = RT_FROM_MEMBER(pInterface, DRVRAMDISK, IMedia);
+    return pThis->fNonRotational;
+}
+
 
 /*********************************************************************************************************************************
@@ -1132,4 +1141,15 @@
 
 /**
+ * @interface_method_impl{PDMIMEDIAEX,pfnQueryFeatures}
+ */
+static DECLCALLBACK(int) drvramdiskQueryFeatures(PPDMIMEDIAEX pInterface, uint32_t *pfFeatures)
+{
+    RT_NOREF1(pInterface)
+    *pfFeatures = PDMIMEDIAEX_FEATURE_F_ASYNC | PDMIMEDIAEX_FEATURE_F_DISCARD;
+    return VINF_SUCCESS;
+}
+
+
+/**
  * @interface_method_impl{PDMIMEDIAEX,pfnIoReqAllocSizeSet}
  */
@@ -1209,4 +1229,41 @@
     RTMemCacheFree(pThis->hIoReqCache, pIoReq);
     return VINF_SUCCESS;
+}
+
+/**
+ * @interface_method_impl{PDMIMEDIAEX,pfnIoReqQueryResidual}
+ */
+static DECLCALLBACK(int) drvramdiskIoReqQueryResidual(PPDMIMEDIAEX pInterface, PDMMEDIAEXIOREQ hIoReq, size_t *pcbResidual)
+{
+    RT_NOREF2(pInterface, hIoReq);
+
+    *pcbResidual = 0;
+    return VINF_SUCCESS;
+}
+
+/**
+ * @interface_method_impl{PDMIMEDIAEX,pfnIoReqQueryXferSize}
+ */
+static DECLCALLBACK(int) drvramdiskIoReqQueryXferSize(PPDMIMEDIAEX pInterface, PDMMEDIAEXIOREQ hIoReq, size_t *pcbXfer)
+{
+    RT_NOREF1(pInterface);
+    PPDMMEDIAEXIOREQINT pIoReq = hIoReq;
+
+    if (   pIoReq->enmType == PDMMEDIAEXIOREQTYPE_READ
+        || pIoReq->enmType == PDMMEDIAEXIOREQTYPE_WRITE)
+        *pcbXfer = pIoReq->ReadWrite.cbReq;
+    else
+        *pcbXfer = 0;
+
+    return VINF_SUCCESS;
+}
+
+/**
+ * @interface_method_impl{PDMIMEDIAEX,pfnIoReqCancelAll}
+ */
+static DECLCALLBACK(int) drvramdiskIoReqCancelAll(PPDMIMEDIAEX pInterface)
+{
+    RT_NOREF1(pInterface);
+    return VINF_SUCCESS; /** @todo */
 }
 
@@ -1600,5 +1657,6 @@
                                     "PreAlloc\0"
                                     "IoBufMax\0"
-                                    "SectorSize\0"))
+                                    "SectorSize\0"
+                                    "NonRotational\0"))
         return VERR_PDM_DRVINS_UNKNOWN_CFG_VALUES;
 
@@ -1608,5 +1666,11 @@
                                 N_("RamDisk: Error querying the media size"));
     rc = CFGMR3QueryBoolDef(pCfg, "PreAlloc", &pThis->fPreallocRamDisk, false);
-    AssertRC(rc);
+    if (RT_FAILURE(rc))
+        return PDMDRV_SET_ERROR(pDrvIns, rc,
+                                N_("RamDisk: Error querying \"PreAlloc\""));
+    rc = CFGMR3QueryBoolDef(pCfg, "NonRotational", &pThis->fNonRotational, true);
+    if (RT_FAILURE(rc))
+        return PDMDRV_SET_ERROR(pDrvIns, rc,
+                                N_("RamDisk: Error querying \"NonRotational\""));
     rc = CFGMR3QueryU32Def(pCfg, "IoBufMax", &cbIoBufMax, 5 * _1M);
     if (RT_FAILURE(rc))
@@ -1640,9 +1704,14 @@
     pThis->IMedia.pfnReadPcBios          = drvramdiskReadPcBios;
     pThis->IMedia.pfnDiscard             = drvramdiskDiscard;
+    pThis->IMedia.pfnIsNonRotational     = drvramdiskIsNonRotational;
 
     /* IMediaEx */
+    pThis->IMediaEx.pfnQueryFeatures            = drvramdiskQueryFeatures;
     pThis->IMediaEx.pfnIoReqAllocSizeSet        = drvramdiskIoReqAllocSizeSet;
     pThis->IMediaEx.pfnIoReqAlloc               = drvramdiskIoReqAlloc;
     pThis->IMediaEx.pfnIoReqFree                = drvramdiskIoReqFree;
+    pThis->IMediaEx.pfnIoReqQueryResidual       = drvramdiskIoReqQueryResidual;
+    pThis->IMediaEx.pfnIoReqQueryXferSize       = drvramdiskIoReqQueryXferSize;
+    pThis->IMediaEx.pfnIoReqCancelAll           = drvramdiskIoReqCancelAll;
     pThis->IMediaEx.pfnIoReqCancel              = drvramdiskIoReqCancel;
     pThis->IMediaEx.pfnIoReqRead                = drvramdiskIoReqRead;
