环境:
系统: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, // dwIoControlCode //另外一种FSCTL_DISMOUNT_VOLUME
NULL, // lpInBuffer //FSCTL_LOCK_VOLUME
0, // nInBufferSize
NULL,

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

被折叠的 条评论
为什么被折叠?



