调用CM_Request_Device_Eject弹出U盘返回PNP_VetoIllegalDeviceRequest错误
问题根因与修复方案
你当前的调用逻辑存在多处错误,且缺少必要前置操作,修复方式如下:
- DevInst参数取值错误
你硬编码DevInst为3的逻辑完全不可靠,所有设备的DevInst数值都是系统动态分配的,不同设备、不同插入顺序下取值都会变化。其次你当前传入的是USBSTOR磁盘类设备的实例,CM_Request_Device_Eject不支持直接对磁盘类设备发起弹出请求,你需要枚举该设备的父节点,找到对应USB总线层的大容量存储设备实例后,再对父实例调用弹出接口。 - 缺少前置处理步骤
系统手动弹出U盘时会自动完成卷锁定、缓存刷新、卷卸载操作,手动调用API不会自动执行这些步骤,你需要提前完成以下操作:- 枚举该磁盘对应的所有盘符,调用
CreateFile打开卷设备 - 发送
FSCTL_LOCK_VOLUME控制码锁定卷,阻止其他进程读写 - 发送
FSCTL_DISMOUNT_VOLUME控制码卸载卷,确保所有缓存数据写入硬件
- 枚举该磁盘对应的所有盘符,调用
- 权限与属性校验
你的程序必须以管理员权限运行,否则没有硬件操作权限。调用CM_Request_Device_Eject前可以先查询设备的DEVPKEY_Device_RemovalPolicy属性,确认设备支持可移除操作。
内容的提问来源于stack exchange,提问作者Damn Vegetables
相关产品推荐
相关产品推荐

