Вы знаете, что такое API, Насколько я знаю, это связано с тем, что устройство, которое я пытаюсь извлечь, должно что-то делать, когда оно извлекается, и что что-то не происходит, когда я извлекаю с помощью CM_Request_Device_Eject
.
с использованием DeviceIoControl с управляющим кодом 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 действительно используется функцией «Извлечь» контекстного меню оболочки. При использовании этого метода устройство правильно реагирует.