Как определить, является ли диск виртуальным или физическим

Это связано с моим другим вопросом об IMAPI2, можно ли определить, является ли привод DVD/CD виртуальным, а не физическим?

Ответ 1

Цель виртуального диска - действовать точно так же, как его физический аналог, без физического носителя. Оба типа дисков работают с операционной системой так же, как драйвер устройства. Я очень сомневаюсь, что разница между ними будет видна в Win32 API. Это было бы противоречиво для целей виртуального диска.

Я просмотрел информацию, предоставленную WMI (доступной на С#), и нашел что-то интересное. Идентификатор устройства моего виртуального диска начинался с "SCSI, тогда как идентификатор устройства моего физического диска SATA начинался с" 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"

Обратите внимание, что в моем примере идентификаторы устройств показывают, что виртуальный диск четко идентифицирован как программное обеспечение Clone Drive. Вы можете проверить имя производителя и продукта на известный список программного обеспечения виртуального диска. Это может привести к множеству ложных негативов и будет очень трудно поддерживать.

В любом случае, я не уверен, что поиск функций в идентификаторе устройства будет очень надежным решением. Могут существовать виртуальные диски, которые идентифицируют себя по-разному. Я тестировал только Clone Drive и Daemon Tools для изучения вашего вопроса.

Если бы вы использовали этот подход для защиты авторских прав (что еще вы использовали бы для этого?), тогда вам нужно подумать, стоит ли оценивать вероятность ложного определения виртуального диска, чтобы его насторожить.

Вот код С# для проверки дисков с использованием WMI и доступа к идентификатору устройства. Вам нужно будет ссылаться на сборку 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"];

Ответ 2

Посмотрите на "DriveInfo"... Посмотрите на его свойство DriveType.

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

Ответ 3

Один из способов - перейти в каталог вашего компьютера, один с c:/drive и съемными жесткими дисками. При использовании физического жесткого диска, если вы щелкнете правой кнопкой мыши и извлеките носитель, лоток cd/dvd будет выдвинут; однако виртуальные диски просто очистят данные, хранящиеся на диске, но не будут выдвигать лоток на ноутбуке/компьютере.