CM_Request_Device_Ejectが機能しないケースについて調べてみた
c# - Ejecting a USB Drive - Stack Overflow
これと同じで、CM_Request_Device_Eject を実行するとCR_REMOVE_VETOED (23) が返ってきてイジェクトできないケースがあったので色々試行錯誤してみた。
1. 親デバイスごとイジェクトしたら行けたケース
CM_Get_Parent(&devInstParent, devInst, 0); で親のインスタンスを取得してイジェクトしたら取り外し状態になった。
2. DeviceIoControlで解決したケース。
DeviceIoControl経由で
FSCTL_LOCK_VOLUME
FSCTL_LOCK_VOLUME
FSCTL_DISMOUNT_VOLUME
IOCTL_STORAGE_MEDIA_REMOVAL
IOCTL_STORAGE_EJECT_MEDIA
呼び出した後に CM_Request_Device_Eject したら行けた。
IOCTL_STORAGE_EJECT_MEDIA
呼び出した後に CM_Request_Device_Eject したら行けた。
3. 取り外し対象機器が本当に利用中だったケース。
使用してるアプリを終了したら行けた・ω・
Comments