liweiqiao
驱动牛犊
驱动牛犊
  • 注册日期2004-10-08
  • 最后登录2007-09-27
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1469回复:0

发送SCSI命令后读取U盘回传值的问题!

楼主#
更多 发布于:2005-01-17 13:46
可以当作Mass Storage Device的USB接口的MP3,我通过IOCTL_SCSI_PASS_THROUGH,DeviceIoControl发送firmware支持的SCSI命令过去,可以成功,现在的问题是,我要怎么才能读到firmware给我返回来的数据.请教高手,谢谢!
附上我的代码:

void __fastcall TF_main::TestContrastClick(TObject *Sender)
{
    bool success;
    UCHAR cmd[16] = {SCSI_OPCODE_HWTEST_COMMAND,HWTEST_CONTRAST_ID,0,0,
                     0,0,0,0,
                     0x01,0,0,0,
                     0,0,0,0};

    success = IssueSCSICmd(fileHandle, cmd);
    if (success)
        ShowMessage("The command we send was operated successfully.\r\n"
            "but I didn't received the right returned data we want!");
}

bool IssueSCSICmd(HANDLE fileHandle, UCHAR *cmd)
{
    assert(cmd != NULL);
    BOOL status = 0;
    SCSI_PASS_THROUGH_WITH_BUFFERS sptwb;
    ULONG length = 0,
          errorCode = 0;
    DWORD returned = 0;

    PSCSI_PASS_THROUGH_WITH_BUFFERS temp;
    PLONG puStr;

    ZeroMemory(&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 = CDB6GENERIC_LENGTH;
    sptwb.spt.SenseInfoLength = 24;
    sptwb.spt.DataIn = SCSI_IOCTL_DATA_IN;
    sptwb.spt.DataTransferLength = 192;
    sptwb.spt.TimeOutValue = 10;
    sptwb.spt.DataBufferOffset =
        offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS,ucDataBuf);
    sptwb.spt.SenseInfoOffset =
        offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS,ucSenseBuf);

    CopyMemory(sptwb.spt.Cdb, cmd, 16);
    length = offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS,ucDataBuf) +
        sptwb.spt.DataTransferLength;

    status = DeviceIoControl(fileHandle,
                             IOCTL_SCSI_PASS_THROUGH,
                             &sptwb,
                             sizeof(SCSI_PASS_THROUGH),
                             &sptwb,
                             length,
                             &returned,
                             FALSE);

    if (!status)
    {
        errorCode = GetLastError();
        PrintError(errorCode);
        return false;
    }

    ShowMessage("The size of the data stored in the\r\n"
        "output buffer(in bytes) is: "+IntToStr(returned));
    temp = &sptwb;
    puStr = (PLONG)temp;
    F_main->Memo1->Lines->Add(IntToStr(*puStr));

    return true;
}
游客

返回顶部