环境:
系统: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, //