QT 之 USB SCSI指令0x2A对USB设备进行写有问题
摘要: 使用QT进行SCSI指令操作时遇到问题,0x28读取正常,但0x2A写入失败,原因是系统对0x2A命令的写入权限控制严格。解决方法是通过FSCTL_LOCK_VOLUME实现独占访问,实现对USB设备的写操作。
问题:使用SCSI指令0x28读可以,0x2A进行写不成功,抓包看根本没有下发0x2A命令
原因:Win7之后,系统对2A命令写要求严格,设备必须加锁或者卸载卷才能操作。
解决方案:
独占访问,即通过FSCTL_LOCK_VOLUME 来设置独占访问。(相应的也解除独占访问设置 FSCTL_UNLOCK_VOLUME )。
(1). FSCTL_LOCK_VOLUME 的设置,参考:https://learn.microsoft.com/zh-cn/windows/win32/api/winioctl/ni-winioctl-fsctl_lock_volume
正常情况下 DeviceIoControl 函数返回1, lpBytesReturned 返回0
1 2 3 4 5 6 7 8 9 10 | BOOL DeviceIoControl( (HANDLE) hVolume, // handle to a volume (DWORD) FSCTL_LOCK_VOLUME, // dwIoControlCode NULL, // lpInBuffer 0, // nInBufferSize NULL, // lpOutBuffer 0, // nOutBufferSize (LPDWORD) lpBytesReturned, // number of bytes returned NULL // OVERLAPPED structure ); |
(2). FSCTL_UNLOCK_VOLUME 的设置,参考:https://learn.microsoft.com/zh-cn/windows/win32/api/winioctl/ni-winioctl-fsctl_unlock_volume
1 2 3 4 5 6 7 8 9 10 | BOOL DeviceIoControl( (HANDLE) hDevice, // handle to a volume FSCTL_UNLOCK_VOLUME, // dwIoControlCode NULL, // lpInBuffer 0, // nInBufferSize NULL, // lpOutBuffer 0, // nOutBufferSize (LPDWORD) lpBytesReturned, // number of bytes returned (LPOVERLAPPED) lpOverlapped // OVERLAPPED structure ); |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战