Index: /trunk/include/VBox/vmm/pdmifs.h
===================================================================
--- /trunk/include/VBox/vmm/pdmifs.h	(revision 56438)
+++ /trunk/include/VBox/vmm/pdmifs.h	(revision 56439)
@@ -3149,4 +3149,16 @@
 #define PDMISCSIPORT_IID                        "05d9fc3b-e38c-4b30-8344-a323feebcfe5"
 
+/**
+ * LUN type.
+ */
+typedef enum PDMSCSILUNTYPE
+{
+    PDMSCSILUNTYPE_INVALID = 0,
+    PDMSCSILUNTYPE_SBC,         /** Hard disk (SBC) */
+    PDMSCSILUNTYPE_MMC,         /** CD/DVD drive (MMC) */
+    PDMSCSILUNTYPE_SSC,         /** Tape drive (SSC) */
+    PDMSCSILUNTYPE_32BIT_HACK = 0x7fffffff
+} PDMSCSILUNTYPE, *PPDMSCSILUNTYPE;
+
 
 /** Pointer to a SCSI connector interface. */
@@ -3167,4 +3179,14 @@
      */
      DECLR3CALLBACKMEMBER(int, pfnSCSIRequestSend, (PPDMISCSICONNECTOR pInterface, PPDMSCSIREQUEST pSCSIRequest));
+
+    /**
+     * Queries the type of the attached LUN.
+     *
+     * @returns VBox status code.
+     * @param   pInterface      Pointer to this interface.
+     * @param   iLUN            The logical unit number.
+     * @param   pSCSIRequest    Pointer to the LUN to be returned.
+     */
+     DECLR3CALLBACKMEMBER(int, pfnQueryLUNType, (PPDMISCSICONNECTOR pInterface, uint32_t iLun, PPDMSCSILUNTYPE pLUNType));
 
 } PDMISCSICONNECTOR;
Index: /trunk/include/VBox/vscsi.h
===================================================================
--- /trunk/include/VBox/vscsi.h	(revision 56438)
+++ /trunk/include/VBox/vscsi.h	(revision 56439)
@@ -234,13 +234,13 @@
 
 /**
- * Return the SCSI LUN handle.
+ * Query the SCSI LUN type.
  *
  * @returns VBox status code.
  * @param   hVScsiDevice    The SCSI device handle.
  * @param   iLun            The LUN number to get.
- * @param   phVScsiLun      Where to store the LUN handle.
- */
-VBOXDDU_DECL(int) VSCSIDeviceLunGet(VSCSIDEVICE hVScsiDevice, uint32_t iLun,
-                                    PVSCSILUN phVScsiLun);
+ * @param   pEnmLunType     Where to store the LUN type.
+ */
+VBOXDDU_DECL(int) VSCSIDeviceLunQueryType(VSCSIDEVICE hVScsiDevice, uint32_t iLun,
+                                          PVSCSILUNTYPE pEnmLunType);
 
 /**
Index: /trunk/src/VBox/Devices/Storage/DrvSCSI.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvSCSI.cpp	(revision 56438)
+++ /trunk/src/VBox/Devices/Storage/DrvSCSI.cpp	(revision 56439)
@@ -648,4 +648,26 @@
 }
 
+/** @copydoc PDMISCSICONNECTOR::pfnQueryLUNType. */
+static DECLCALLBACK(int) drvscsiQueryLUNType(PPDMISCSICONNECTOR pInterface, uint32_t iLun, PPDMSCSILUNTYPE pLunType)
+{
+    int rc;
+    PDRVSCSI pThis = PDMISCSICONNECTOR_2_DRVSCSI(pInterface);
+    VSCSILUNTYPE enmLunType;
+
+    rc = VSCSIDeviceLunQueryType(pThis->hVScsiDevice, iLun, &enmLunType);
+    if (RT_FAILURE(rc))
+        return rc;
+
+    switch (enmLunType)
+    {
+    case VSCSILUNTYPE_SBC:  *pLunType = PDMSCSILUNTYPE_SBC; break;
+    case VSCSILUNTYPE_MMC:  *pLunType = PDMSCSILUNTYPE_MMC; break;
+    case VSCSILUNTYPE_SSC:  *pLunType = PDMSCSILUNTYPE_SSC; break;
+    default:                *pLunType = PDMSCSILUNTYPE_INVALID;
+    }
+
+    return rc;
+}
+
 /* -=-=-=-=- IBase -=-=-=-=- */
 
@@ -892,4 +914,5 @@
     pThis->pDrvIns                              = pDrvIns;
     pThis->ISCSIConnector.pfnSCSIRequestSend    = drvscsiRequestSend;
+    pThis->ISCSIConnector.pfnQueryLUNType       = drvscsiQueryLUNType;
 
     pDrvIns->IBase.pfnQueryInterface            = drvscsiQueryInterface;
Index: /trunk/src/VBox/Devices/Storage/UsbMsd.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/UsbMsd.cpp	(revision 56438)
+++ /trunk/src/VBox/Devices/Storage/UsbMsd.cpp	(revision 56439)
@@ -2171,4 +2171,18 @@
         pThis->Lun0.pIScsiConnector = NULL;
     }
+
+    /*
+     * Find out what kind of device we are.
+     */
+    PDMSCSILUNTYPE enmLunType;
+    pThis->fIsCdrom = false;
+    rc = pThis->Lun0.pIScsiConnector->pfnQueryLUNType(pThis->Lun0.pIScsiConnector, 0 /*iLun*/, &enmLunType);
+    if (RT_SUCCESS(rc))
+    {
+        /* Anything else will be reported as a hard disk. */
+        if (enmLunType == PDMSCSILUNTYPE_MMC)
+            pThis->fIsCdrom = true;
+    }
+
     return rc;
 }
@@ -2318,5 +2332,13 @@
      * Find out what kind of device we are.
      */
-    pThis->fIsCdrom = false;    //@todo: Find out somehow
+    PDMSCSILUNTYPE enmLunType;
+    pThis->fIsCdrom = false;
+    rc = pThis->Lun0.pIScsiConnector->pfnQueryLUNType(pThis->Lun0.pIScsiConnector, 0 /*iLun*/, &enmLunType);
+    if (RT_SUCCESS(rc))
+    {
+        /* Anything else will be reported as a hard disk. */
+        if (enmLunType == PDMSCSILUNTYPE_MMC)
+            pThis->fIsCdrom = true;
+    }
 
     /*
Index: /trunk/src/VBox/Devices/Storage/VSCSI/VSCSIDevice.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/VSCSI/VSCSIDevice.cpp	(revision 56438)
+++ /trunk/src/VBox/Devices/Storage/VSCSI/VSCSIDevice.cpp	(revision 56439)
@@ -257,17 +257,18 @@
 
 
-VBOXDDU_DECL(int) VSCSIDeviceLunGet(VSCSIDEVICE hVScsiDevice, uint32_t iLun,
-                                    PVSCSILUN phVScsiLun)
-{
-    PVSCSIDEVICEINT pVScsiDevice = (PVSCSIDEVICEINT)hVScsiDevice;
-
-    /* Parameter checks */
-    AssertPtrReturn(pVScsiDevice, VERR_INVALID_HANDLE);
-    AssertPtrReturn(phVScsiLun, VERR_INVALID_POINTER);
+VBOXDDU_DECL(int) VSCSIDeviceLunQueryType(VSCSIDEVICE hVScsiDevice, uint32_t iLun,
+                                          PVSCSILUNTYPE pEnmLunType)
+{
+    PVSCSIDEVICEINT pVScsiDevice = (PVSCSIDEVICEINT)hVScsiDevice;
+
+    /* Parameter checks */
+    AssertPtrReturn(pVScsiDevice, VERR_INVALID_HANDLE);
+    AssertPtrReturn(pEnmLunType, VERR_INVALID_POINTER);
     AssertReturn(iLun < VSCSI_DEVICE_LUN_MAX, VERR_VSCSI_LUN_INVALID);
     AssertReturn(iLun < pVScsiDevice->cLunsMax, VERR_VSCSI_LUN_NOT_ATTACHED);
     AssertPtrReturn(pVScsiDevice->papVScsiLun[iLun], VERR_VSCSI_LUN_NOT_ATTACHED);
 
-    *phVScsiLun = pVScsiDevice->papVScsiLun[iLun];
+    PVSCSILUNINT hVScsiLun = pVScsiDevice->papVScsiLun[iLun];
+    *pEnmLunType = hVScsiLun->pVScsiLunDesc->enmLunType;
 
     return VINF_SUCCESS;
