2011-12-15 73 views
10

这是从我关于IMAPI2的另一个问题提出的,是否有可能识别DVD/CD驱动器是虚拟的还是非物理的?如何识别驱动器是虚拟的还是物理的

+0

@ L.B该OP指出,DVD/CD驱动器是虚拟的还是物理的;即......它是通过类似MagicISO的方式安装的,还是它是设备的物理组件。 – 2011-12-15 19:55:38

回答

2

虚拟驱动器的目的是完全作为其物理对应物,而不需要物理介质。这两种驱动器都以与设备驱动程序相同的方式与操作系统一起工作。我非常怀疑它们之间的区别在Win32 API中是可见的。这对虚拟驱动器的目的来说是违反直觉的。

我查看了WMI提供的信息(可通过C#访问),并找到了感兴趣的内容。我的虚拟驱动器的设备ID以'SCSI'开头,而我的物理SATA驱动器的设备ID以'IDE'开头。我相信大部分(全部?)虚拟驱动器软件模拟SCSI驱动器;我不确定。通常情况下,用户可能会有IDE或SATA光驱,它们都会以'IDE'开头。

Virtual Drive Device: "SCSI\CDROM&VEN_ELBY&PROD_CLONEDRIVE&REV_1.4\1&00000000&0&000000" 
Real Drive Device: "IDE\CDROMASUS_DRW-24B1ST_________________________1.03____\5&295AF142&0&5.0.0" 

请注意,在虚拟驱动器被明确确定为克隆驱动软件我的例子设备ID。您可以根据已知的虚拟驱动器软件列表检查制造商和产品名称。这可能会产生很多错误的否定,并且很难维护。

无论哪种方式,我不确定搜索设备ID中的功能是否是一种高度可靠的解决方案。可能会有虚拟驱动器以不同的方式标识自己。我只测试克隆驱动器和守护进程工具来研究你的问题。

如果您使用这种方法进行版权保护(您还会使用这种方法?),那么您必须考虑假冒虚拟驱动器确定的可能性是否值得激怒您的客户。

这是用于检查使用WMI的驱动器并访问设备ID的C#代码。您将需要引用System.Management程序集。

string driveLetter = "F"; 
ManagementObjectSearcher diskQuery = new ManagementObjectSearcher(String.Format("SELECT * FROM Win32_CDROMDrive WHERE Drive='{0}:'", driveLetter)); 
ManagementObject diskResult = diskQuery.Get().OfType<ManagementObject>().SingleOrDefault(); 
string deviceID = null; 
if (diskResult != null) 
    deviceID = (string)diskResult["DeviceID"]; 
-4

一种方法是导航到您的计算机目录,该目录使用c:/ drive和可移动硬盘。使用物理硬盘时,如果右键单击并弹出媒体,cd/dvd托盘将滑出;但是,虚拟驱动器只会清除存储在驱动器中的数据,但不会在笔记本电脑/计算机上滑出托盘。

+2

-1该OP正在寻找一个可行的解决方案,通过C# – 2011-12-15 19:51:40

0

查看“DriveInfo”...查看它的DriveType属性。

System.IO.DriveInfo di = new System.IO.DriveInfo(“X:\”);

相关问题