ruyili9803
驱动牛犊
驱动牛犊
  • 注册日期2004-06-07
  • 最后登录2005-09-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1066回复:1

发送Inquiry出错,请大侠帮忙

楼主#
更多 发布于:2004-08-06 08:45
请问我如果想在一个U盘驱动里发送INQUIRY命令,应该怎样填写
SCSI_PASS_THROUGH结构呀?
SCSI_PASS_THROUGH结构变量里的DataBufferOffset和SenseInfoOffset是什么意思?大家帮我看一下这段源代码好吗?

NTSTATUS
Sample_Inquiry(PDEVICE_OBJECT deviceObject)
{

    NTSTATUS ntStatus, status = STATUS_SUCCESS;
    PIRP irp;
    KEVENT event;
    IO_STATUS_BLOCK ioStatus;
    PIO_STACK_LOCATION nextStack;
    PDEVICE_EXTENSION deviceExtension;
    ULONG length = 0;
    SCSI_PASS_THROUGH_WITH_BUFFERS sptwb;


    deviceExtension = deviceObject->DeviceExtension;

    RtlZeroMemory(&sptwb,
                  sizeof(SCSI_PASS_THROUGH_WITH_BUFFERS));

    sptwb.spt.Length = sizeof(SCSI_PASS_THROUGH);
    sptwb.spt.PathId = 0;
    sptwb.spt.TargetId = 1;
    sptwb.spt.Lun = 0;
    sptwb.spt.CdbLength = 6;
    sptwb.spt.SenseInfoLength = 0;
    sptwb.spt.DataIn = SCSI_IOCTL_DATA_IN;
    sptwb.spt.DataTransferLength = 192;
    sptwb.spt.TimeOutValue = 30;
    sptwb.spt.DataBufferOffset =
       offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS,ucDataBuf);
    sptwb.spt.SenseInfoOffset =
       NULL;
    sptwb.spt.Cdb[0] = 0x12;
    sptwb.spt.Cdb[2] = 0x00;
    sptwb.spt.Cdb[4] = 0x24;
    
    length =
         offseto(SCSI_PASS_THROUGH_WITH_BUFFERS,ucDataBuf)  +
       sptwb.spt.DataTransferLength;

    //
    // issue a synchronous request
    //

    KeInitializeEvent(&event, NotificationEvent, FALSE);

    irp = IoBuildDeviceIoControlRequest(
                IOCTL_SCSI_PASS_THROUGH,
                deviceExtension->TopOfStackDeviceObject,
                &sptwb,
                sizeof(SCSI_PASS_THROUGH),
                &sptwb,
                length,
                FALSE,
                &event,
                &ioStatus);

    //
    // Call the class driver to perform the operation.  If the returned status
    // is PENDING, wait for the request to complete.
    //

    nextStack = IoGetNextIrpStackLocation(irp);
    ASSERT(nextStack != NULL);

 
    ntStatus = IoCallDriver(
                   deviceExtension- >TopOfStackDeviceObject,
                            irp);
                            
   if (ntStatus == STATUS_PENDING)
   {

        KeWaitForSingleObject(
                              &event,
                              Suspended,
                               KernelMode,
                               FALSE,
                              NULL);

              
    }
    else
   {
        ioStatus.Status = ntStatus;
    }

    //
    // USBD maps the error code for us
    //
    ntStatus = ioStatus.Status;

       return STATUS_SUCCESS;
}

加了这段代码后,驱动就运行不正常了,用usbview看发现
ConnectionStatus: DeviceConnected
Current Config Value:
Device Bus Speed:     Full
Device Address:      
Open Pipes:              0
另外用bus hound捕获的数据有误,请看我的文本文件。请大侠帮我分析一下吧。我做的是客户驱动。谢谢
附件名称/大小 下载次数 最后更新
2004-08-06_inquiry.txt (3KB)  9
ruyili9803
驱动牛犊
驱动牛犊
  • 注册日期2004-06-07
  • 最后登录2005-09-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-08-09 16:11
真搞不懂,没人理郁闷中。。。。。。。。。。。
游客

返回顶部