gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 23:58:17 25 4
gpt4 key购买 nike

您知道 Windows 用于完成可移动卷的 shell 上下文菜单上提供的“弹出”功能的 API 或 API 调用序列是什么吗?

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

  • 使用 CM_Request_Device_Eject ,我枚举可移动磁盘(使用 SetupDiXXX APIs ),找到我感兴趣的磁盘,遍历设备管理器层次结构(使用 CM_XXX APIs ),最后在我感兴趣的设备的 CM_Request_Device_Eject 上调用 devInst 。从某种意义上说,它确实从“我的电脑”中删除了卷并使设备“安全删除”(准备删除),但它与 shell 上下文菜单“弹出”功能不同。我知道这一点的方式是因为我尝试弹出的设备应该在弹出时执行某些操作,而当我使用 CM_Request_Device_Eject 执行弹出操作时没有发生某些事情。
  • 使用 DeviceIoControlIOCTL_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 以及使用 CM_Request_Device_Eject 的方法 #1 成功弹出设备。

    事实证明,方法#2 确实是 shell 上下文菜单的“弹出”功能使用的方法。使用这种方法,设备 react 正确。

    最佳答案

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

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

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

    最后,方法#2 确实是shell 上下文菜单的“弹出”功能使用的方法。使用这种方法,设备 react 正确。

    关于winapi - 如何弹出USB可移动磁盘/卷,类似于Windows资源管理器中的 "Eject"功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3918248/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com