MFC之使用SCSI指令0x2A、0x28对USB设备进行读写问题(实测)

在Win7环境下,使用MFC进行SCSI指令操作时遇到问题,0x28读取正常,但0x2A写入失败,因系统对0x2A命令的写入权限控制严格。解决方法包括通过FSCTL_LOCK_VOLUME实现独占访问,或者使用FSCTL_DISMOUNT_VOLUME强制移除其他进程访问,实现对USB设备的读写操作。
摘要由CSDN通过智能技术生成

环境:

系统:Win7

设备:读卡器+T卡

 

问题:使用SCSI指令0x28读可以,0x2A进行写不成功,调试发现设备拒绝访问

原因:
Win7之后,系统对2A命令写要求严格,设备必须加锁或者卸载卷才能操作。


解决方案:
有两种方法,

方法一:独占访问,即通过FSCTL_LOCK_VOLUME 来设置独占访问。(有锁,相应的也有FSCTL_UNLOCK_VOLUME 。关掉句柄也能达到同样的效果)。


方法二:通过FSCTL_DISMOUNT_VOLUME来移除其他进程对卷的访问,但是如果设置了独占访问,那么再调用FSCTL_DISMOUNT_VOLUME就会失败。(这种方法为强制性,成功率更高,在MFC程序中测试通过)

HANDLE hDev = CreateFile(
    "\\\\.\\E:",
    0,
    (FILE_SHARE_READ | FILE_SHARE_WRITE),
    NULL,
    OPEN_EXISTING,
    FILE_FLAG_OVERLAPPED,
    NULL
    );
 
if (hDev == INVALID_HANDLE_VALUE)
{
    return -1;
}
DWORD bytesReturned;
OVERLAPPED overlapped;
 
BOOL retDevIoCtrl = DeviceIoControl(
    hDev,              // handle to a volume
    FSCTL_DISMOUNT_VOLUME, //
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值