如何弹出USB可移动磁盘/卷,类似于Windows资源管理器中的"弹出"功能?

Mik*_*scu 13 usb winapi removable-drive

你知道什么是API,或者是用来完成"弹出"功能的API调用序列,它可以在可移动卷的shell上下文菜单中找到?

到目前为止,我尝试了两件事:

  1. 使用CM_Request_Device_Eject,我列举(使用的可移动磁盘SetupDiXXX的API),找到一个我感兴趣的,走路设备管理体系(使用CM_XXX的API),并最后调用CM_Request_Device_EjectdevInst我在interesed的设备.这工作在某种意义上说,它删除我的电脑的体积并让设备"安全删除"(准备移除),但它是不一样的外壳上下文菜单中选择"弹出"功能.我知道这个的方式是因为我试图弹出的设备应该在弹出时执行某些操作,并且当我使用弹出时不会发生某些事情CM_Request_Device_Eject.

  2. DeviceIoControlIOCTL_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.

事实证明,方法#2确实是shell上下文菜单的"弹出"功能所使用的方法.使用此方法,设备可以正确反应.

Mik*_*scu 2

最终,我发现我在方法#2 中犯了错误。

事实证明,由于某种原因,我在使用 CreateFile 打开卷的句柄时没有正确设置所需的访问权限。

正确的访问模式是GENERIC_READ | GENERIC_WRITE,我正在通过0。更正错误后,我能够使用 DeviceIoControl - IOCTL_STORAGE_EJECT_MEDIA 以及方法 #1(使用 CM_Request_Device_Eject)成功弹出设备。

最后,事实证明方法 #2 确实是 shell 上下文菜单的“Eject”功能所使用的方法。使用此方法,设备可以正确反应。