ioriyw
驱动牛犊
驱动牛犊
  • 注册日期2002-05-21
  • 最后登录2010-05-10
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望50点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2769回复:6

关于usbstor.sys和SCSI_PASS_THROUGH

楼主#
更多 发布于:2009-11-16 12:38
我有个USB MASS DEVICE,但可能有点问题,故没有盘符出现,于是我想直接CREATEFILE(USBSTOR.SYS)并通过SCSI_PASS_THROUGH来和他通信.
首先,我用的SPTI.C 的例子代码,createfile第一参数是//?/usb/......{mass device guid},  打开成功.
但DEVICEioCONTROL 就失败,ERROR : 50 不支持请求.

请问,这是怎么回事?
谢谢答复.
ioriyw
驱动牛犊
驱动牛犊
  • 注册日期2002-05-21
  • 最后登录2010-05-10
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望50点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2009-11-16 14:00
补充: 可以确定是SCSI CMD根本没有提交, 因为我可以检测到DEVICE端没有收到数据.
那么,有两个基本点问题: 1,我打开的是USBSTOR.SYS这个驱动吗?
                                           2, USBSTOR.SYS支持SCSI_PASS_THROUGH这个CTRL_CODE吗?
                                           3, sptdwb结构的填充完全是COPY spti 例子的代码,应该不会有问题吧?

百思不得其解,请高手指点则个,多谢了.
Leonsoft
驱动小牛
驱动小牛
  • 注册日期2003-05-08
  • 最后登录2012-08-11
  • 粉丝1
  • 关注0
  • 积分21分
  • 威望281点
  • 贡献值1点
  • 好评度103点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2009-11-23 12:56
检查下你的DeviceIoControl的参数是不是正确,最好把代码贴出来。
I will do the best with what the God gave me.
Leonsoft
驱动小牛
驱动小牛
  • 注册日期2003-05-08
  • 最后登录2012-08-11
  • 粉丝1
  • 关注0
  • 积分21分
  • 威望281点
  • 贡献值1点
  • 好评度103点
  • 原创分0分
  • 专家分0分
地板#
发布于:2009-11-23 13:01
代码贴出来,检查下DeviceIoControl的参数,已经SCSI_PASS_THROUGH是不是配对了。
I will do the best with what the God gave me.
ioriyw
驱动牛犊
驱动牛犊
  • 注册日期2002-05-21
  • 最后登录2010-05-10
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望50点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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不方便.

谢谢回复.
mmiker
驱动牛犊
驱动牛犊
  • 注册日期2008-04-02
  • 最后登录2010-01-07
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望22点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
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.
    }
}
ioriyw
驱动牛犊
驱动牛犊
  • 注册日期2002-05-21
  • 最后登录2010-05-10
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望50点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2009-11-26 17:55
多谢LS的兄弟, 我去试试.
谢谢.
游客

返回顶部