阅读:1468回复:0
发送SCSI命令后读取U盘回传值的问题!
可以当作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; } |
|