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

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

3 ответа

Решение

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

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

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

Вот код C# для проверки дисков с помощью 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"];

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

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

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

Другие вопросы по тегам