Внутренне Microsoft Windows содержит так называемые флаги характеристик (определенные в wdm.h) для каждого устройства.Если устройство, которое соответствует букве диска, имеет флаг FILE_FLOPPY_DISKETTE
, то дисковод является дисководом гибких дисков:
//
// Define the various device characteristics flags (defined in wdm.h)
//
#define FILE_REMOVABLE_MEDIA 0x00000001
#define FILE_READ_ONLY_DEVICE 0x00000002
#define FILE_FLOPPY_DISKETTE 0x00000004
#define FILE_WRITE_ONCE_MEDIA 0x00000008
#define FILE_REMOTE_DEVICE 0x00000010
#define FILE_DEVICE_IS_MOUNTED 0x00000020
#define FILE_VIRTUAL_VOLUME 0x00000040
#define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080
#define FILE_DEVICE_SECURE_OPEN 0x00000100
#define FILE_CHARACTERISTIC_PNP_DEVICE 0x00000800
#define FILE_CHARACTERISTIC_TS_DEVICE 0x00001000
#define FILE_CHARACTERISTIC_WEBDAV_DEVICE 0x00002000
Чтобы получить флаги характеристик диска, вы можете использовать различные функции API.Я считаю наиболее эффективным и простым способом использования функции NtQueryVolumeInformationFile
из ntdll.dll.В разделе Получить информацию о результате работы дисков в Windows7 - 32-битная система вы найдете пример использования этого API.
ОБНОВЛЕНИЕ: Вы можете использовать NtQueryVolumeInformationFile
работать напрямую без предыдущих вызовов IOCTL_STORAGE_GET_DEVICE_NUMBER
и IOCTL_STORAGE_QUERY_PROPERTY
, которые были вызваны в примере по другим причинам.
ОБНОВЛЕНО 2: Кстати, использование GetDriveType
для проверкидиск удаляется небезопасно.У меня есть много съемных аппаратных средств, где GetDriveType
показывает диск как несъемный, но у флагов характеристик есть установленный FILE_REMOVABLE_MEDIA
бит.Использование SetupDiGetDeviceRegistryProperty
с SPDRP_REMOVAL_POLICY
также безопасно.В последнем случае вы должны проверить на CM_REMOVAL_POLICY_EXPECT_SURPRISE_REMOVAL
или CM_REMOVAL_POLICY_EXPECT_ORDERLY_REMOVAL
, как я делаю это в примере Получить информацию о результате на дисках в windows7 - 32-битной системе .