Мне бы хотелось, чтобы мое приложение C ++ для Windows отключало диск и не позволяло операционной системе автоматически подключать его снова.
Для этой цели я использую две функции: CreateFile для извлечения дескриптора на диск и DeviceIoControl для выполнения различных операций с этим диском (через дескриптор, извлеченный из первой функции).
После просмотра документации по API Windows мой подход ксделать это следующим образом:
- Вызов CreateFile () для получения дескриптора диска с указанной буквой.
- Демонтаж диска.
- Установка этого дискав автономном режиме.
- Закрытие дескриптора диска.
Код выглядит следующим образом (для простоты я пропустил некоторые объявления переменных):
HANDLE hVolume;
std::string volume_name = std::string("\\\\.\\D:"); //for drive with letter D
hVolume = CreateFile(
volume_name.c_str(),
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
DWORD dwBytesReturned;
DeviceIoControl(
hVolume,
FSCTL_DISMOUNT_VOLUME,
NULL, 0,
NULL, 0,
&dwBytesReturned,
NULL);
DeviceIoControl(
hVolume,
IOCTL_VOLUME_OFFLINE,
NULL,
0,
NULL,
0,
&dwBytesReturned,
NULL);
CloseHandle(hVolume);
Сейчас, это отлично работает для нескольких различных USB-накопителей, которые я пробовал до сих пор.Они правильно демонтированы и не смонтированы обратно, даже если вы дважды щелкнете по диску D, отображающемуся в окне «Мой компьютер».
Когда я попробовал дисководы CD-ROM, все больше не работает.Интересно, что я получил две разные ошибки, хотя (обе при вызове DeviceIoControl с параметром IOCTL_VOLUME_OFFLINE):
- На внутреннем приводе CD-ROM (я делаю эти тесты на ноутбуке), я получилошибка 1 (ERROR_INVALID_FUNCTION).
- На двух разных внешних дисках USB CD-ROM возникла ошибка 50 (ERROR_NOT_SUPPORTED).
Кто-нибудь работал с DeviceIoControl с использованием IOCTL_VOLUME_OFFLINE и испытывал это по-другомуповедение для USB-накопителей и CD-ROM?Или кто-нибудь знает, как выполнить то, что я хотел бы сделать другим способом?
Я использую Windows 7, хотя, согласно документации Windows, это доступно начиная с Windows XP.
Любые указатели будут оценены.Большое спасибо.