阅读:2769回复:6
关于usbstor.sys和SCSI_PASS_THROUGH
我有个USB MASS DEVICE,但可能有点问题,故没有盘符出现,于是我想直接CREATEFILE(USBSTOR.SYS)并通过SCSI_PASS_THROUGH来和他通信.
首先,我用的SPTI.C 的例子代码,createfile第一参数是//?/usb/......{mass device guid}, 打开成功. 但DEVICEioCONTROL 就失败,ERROR : 50 不支持请求. 请问,这是怎么回事? 谢谢答复. |
|
沙发#
发布于:2009-11-16 14:00
补充: 可以确定是SCSI CMD根本没有提交, 因为我可以检测到DEVICE端没有收到数据.
那么,有两个基本点问题: 1,我打开的是USBSTOR.SYS这个驱动吗? 2, USBSTOR.SYS支持SCSI_PASS_THROUGH这个CTRL_CODE吗? 3, sptdwb结构的填充完全是COPY spti 例子的代码,应该不会有问题吧? 百思不得其解,请高手指点则个,多谢了. |
|
板凳#
发布于:2009-11-23 12:56
检查下你的DeviceIoControl的参数是不是正确,最好把代码贴出来。
|
|
|
地板#
发布于:2009-11-23 13:01
代码贴出来,检查下DeviceIoControl的参数,已经SCSI_PASS_THROUGH是不是配对了。
|
|
|
地下室#
发布于:2009-11-26 11:52
重新换了个好的设备,可以出盘符的, CREATEFILE("\\\\.\\E:" ...), 这一次DEVICEIOCONTROL 正常返回,数据也发送到设备上了.
看来还是CREATEFILE有问题. 疑点: 1 CREATEFILE("\\\\.\\E:" ...), 打开的是哪个驱动,DISK.SYS 吗? 2 createfile(\\?\usb\......{mass device guid}, ....) 打开是啥? 不支持SCSI_PASS_THROUGH? 因为公司是内外网的环境, post code不方便. 谢谢回复. |
|
5楼#
发布于:2009-11-26 14:35
有盘符直接用盘符打开最方便,如果没有盘符可以枚举设备,下面的代码可以实现:、
bool Open SCSI_OpenDevice() { UCHAR ver[64]; DWORD dwIndex = 0; DWORD reqSize = 0; DWORD interfaceDetailDataSize = 0; g_hDevice = NULL; if(1) { HDEVINFO hIntDevInfo = SetupDiGetClassDevs((LPGUID)&DiskClassGuid,NULL, 0, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE); if(INVALID_HANDLE_VALUE == hIntDevInfo) { TRACE("SetupDiGetClassDevs failed with error"); return(false); } SP_DEVICE_INTERFACE_DATA interfaceData; interfaceData.cbSize = sizeof (SP_INTERFACE_DEVICE_DATA); PSP_DEVICE_INTERFACE_DETAIL_DATA interfaceDetailData = NULL; while(TRUE) { BOOL status = SetupDiEnumDeviceInterfaces (hIntDevInfo, 0, (LPGUID)&DiskClassGuid, dwIndex++, &interfaceData); if((!status) && (ERROR_NO_MORE_ITEMS == GetLastError())) { break; } status = SetupDiGetDeviceInterfaceDetail(hIntDevInfo, &interfaceData, NULL, 0, &reqSize, NULL); interfaceDetailDataSize = reqSize; interfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(interfaceDetailDataSize); interfaceDetailData->cbSize = sizeof (SP_INTERFACE_DEVICE_DETAIL_DATA); status = SetupDiGetDeviceInterfaceDetail ( hIntDevInfo, // Interface Device info handle &interfaceData, // Interface data for the event class interfaceDetailData, // Interface detail data interfaceDetailDataSize, // Interface detail data size &reqSize, // Buffer size required to get the detail data NULL); if(status) { TRACE("%s", interfaceDetailData->DevicePath); if( strncmp( &interfaceDetailData->DevicePath[4],"usbstor",7)==0) { g_hDevice = CreateFile( interfaceDetailData->DevicePath, // device interface name GENERIC_READ | GENERIC_WRITE, // dwDesiredAccess FILE_SHARE_READ | FILE_SHARE_WRITE, // dwShareMode NULL, // lpSecurityAttributes OPEN_EXISTING, // dwCreationDistribution 0, // dwFlagsAndAttributes NULL // hTemplateFile ); if(g_hDevice) { return(true); // found } } } free (interfaceDetailData); } return(false); //NO FOUND. } } |
|
6楼#
发布于:2009-11-26 17:55
多谢LS的兄弟, 我去试试.
谢谢. |
|