Как извлечь съемный диск / том USB, аналогично функции «Извлечь» в проводнике Windows?

Вы знаете, что такое API, Насколько я знаю, это связано с тем, что устройство, которое я пытаюсь извлечь, должно что-то делать, когда оно извлекается, и что что-то не происходит, когда я извлекаю с помощью CM_Request_Device_Eject .

  • с использованием DeviceIoControl с управляющим кодом IOCTL_STORAGE_EJECT_MEDIA . Последовательность событий такова:

    • получить дескриптор тома, который меня интересует, используя CreateFile , как предложено в документации
    • попытаться заблокировать том с помощью FSCTL_LOCK_VOLUME
    • попробуйте чтобы размонтировать его, используя FSCTL_DISMOUNT_VOLUME
    • , отключите предотвращение удаления носителя с помощью IOCTL_STORAGE_MEDIA_REMOVAL
    • и, наконец, выполните IOCTL_STORAGE_EJECT_MEDIA . Эта функция вообще не работает. . Каждый из вызовов DeviceIoControl завершается ошибкой с ERROR_IVALID_FUNCTION (0x00000001). Я не знаю, почему звонки терпят неудачу. Я подтвердил, что другие вызовы DeviceIoControl нормально работают для того же дескриптора файла (например, IOCTL_STORAGE_GET_DEVICE_NUMBER )
    • Наконец, моя машина разработки работает под управлением Windows 7 x64, и чтобы получить второй метод для работа Я пробовал запустить свое приложение с правами администратора, но это ничего не изменило.

      РЕДАКТИРОВАТЬ

      В конце концов, я обнаружил, где я делал ошибку с подходом №2. Оказывается, я почему-то неправильно выставлял нужный доступ при открытии дескриптора тома с помощью CreateFile . Правильный режим доступа - GENERIC_READ | GENERIC_WRITE , и я проходил 0. После исправления моей ошибки я смог успешно извлечь устройство, используя DeviceIoControl - IOCTL_STORAGE_EJECT_MEDIA , а также метод № 1, используя CM_Request_Device_Eject] [111237_Eject].

      И оказалось, что метод №2 действительно используется функцией «Извлечь» контекстного меню оболочки. При использовании этого метода устройство правильно реагирует.

  • 13
    задан Bhargav Rao 30 May 2019 в 03:47
    поделиться