找回密码
 立即注册
首页 业界区 安全 QT 之 USB SCSI指令0x2A对USB设备进行写有问题 ...

QT 之 USB SCSI指令0x2A对USB设备进行写有问题

管水芸 昨天 13:17
 要: 使用QT进行SCSI指令操作时遇到问题,0x28读取正常,但0x2A写入失败,原因是系统对0x2A命令的写入权限控制严格。解决方法是通过FSCTL_LOCK_VOLUME实现独占访问,实现对USB设备的写操作。 问题参考:https://blog.csdn.net/kifea/article/details/1036960990x2A命令参考: https://www.usbzh.com/article/detail-1014.html 问题:使用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. BOOL DeviceIoControl(
  2.   (HANDLE) hVolume,            // handle to a volume
  3.   (DWORD) FSCTL_LOCK_VOLUME,   // dwIoControlCode
  4.   NULL,                        // lpInBuffer
  5.   0,                           // nInBufferSize
  6.   NULL,                        // lpOutBuffer
  7.   0,                           // nOutBufferSize
  8.   (LPDWORD) lpBytesReturned,   // number of bytes returned
  9.   NULL                         // OVERLAPPED structure
  10. );
复制代码
(2). FSCTL_UNLOCK_VOLUME 的设置,参考:https://learn.microsoft.com/zh-cn/windows/win32/api/winioctl/ni-winioctl-fsctl_unlock_volume
  1. BOOL DeviceIoControl(
  2.   (HANDLE) hDevice,            // handle to a volume
  3.   FSCTL_UNLOCK_VOLUME,         // dwIoControlCode
  4.   NULL,                        // lpInBuffer
  5.   0,                           // nInBufferSize
  6.   NULL,                        // lpOutBuffer
  7.   0,                           // nOutBufferSize
  8.   (LPDWORD) lpBytesReturned,   // number of bytes returned
  9.   (LPOVERLAPPED) lpOverlapped  // OVERLAPPED structure
  10. );
复制代码
  
 
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册