DeviceIoControl возвращает ошибку 1 и 50 после использования IOCTL_VOLUME_OFFLINE на приводе CD-ROM - PullRequest
0 голосов
/ 14 декабря 2018

Мне бы хотелось, чтобы мое приложение C ++ для Windows отключало диск и не позволяло операционной системе автоматически подключать его снова.

Для этой цели я использую две функции: CreateFile для извлечения дескриптора на диск и DeviceIoControl для выполнения различных операций с этим диском (через дескриптор, извлеченный из первой функции).

После просмотра документации по API Windows мой подход ксделать это следующим образом:

  1. Вызов CreateFile () для получения дескриптора диска с указанной буквой.
  2. Демонтаж диска.
  3. Установка этого дискав автономном режиме.
  4. Закрытие дескриптора диска.

Код выглядит следующим образом (для простоты я пропустил некоторые объявления переменных):

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):

  1. На внутреннем приводе CD-ROM (я делаю эти тесты на ноутбуке), я получилошибка 1 (ERROR_INVALID_FUNCTION).
  2. На двух разных внешних дисках USB CD-ROM возникла ошибка 50 (ERROR_NOT_SUPPORTED).

Кто-нибудь работал с DeviceIoControl с использованием IOCTL_VOLUME_OFFLINE и испытывал это по-другомуповедение для USB-накопителей и CD-ROM?Или кто-нибудь знает, как выполнить то, что я хотел бы сделать другим способом?

Я использую Windows 7, хотя, согласно документации Windows, это доступно начиная с Windows XP.

Любые указатели будут оценены.Большое спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...