发送ATA命令“读取本机最大地址(0x27,0xF8)不使用SAT通过SAS控制器响应(SCSI ATA转换)

时间:2016-03-22 09:53:04

标签: translation scsi ata

我想找出通过SAS接口的硬盘的本机最大地址。 我正在使用SAT(scsi ata translation)和SCSI_PASS_THROUGH。

但无法找到SCSI_PASS_THROUGH的任何缓冲区或有效senseinfo 来自驱动器的IOCTL_SCSI_PASS_THROUGH。 cdb值为SCSI_PASS_THROUGH =

object_1

但不返回任何缓冲区。 请提供准确的cdb参数以读取SAS机器上的本机最大地址。

2 个答案:

答案 0 :(得分:0)

我没有在我面前有所有相关的SCSI规格。因此,我假设您正在构建SATL (SCSI ATA转换层) CDB。要检查的第一件事是ioctl是否完成了。也就是说,检查DeviceIoControl()True的{​​{1}}返回码,然后检查False以确定出错的地方(如果适用)。如果ioctl没问题,请检查SCSI_PASS_THROUGH_DIRECT structure成员GetLastError()。如果这是0,那么命令就完成了。如果状态为0,则可能是没有有效感知信息的原因。

当我偶然发现这个帖子时,我正在研究这个命令。最新的ATA Command Spec,ACS-3(日期为2013年10月28日)显示,读取本机最大地址读取本机最大地址扩展命令现已过时。我在ACS-2中找到了他们的定义。 2009年8月3日的most recent draft表明此命令的输出不是缓冲区。相反,输出将位于返回的设备到主机FIS 的LBA字段中。

<强>附录 原帖的措辞让我相信这是在Windows中完成的。我应该已经包括Linux的过程将是相同的,如果这是你正在使用的。但是,请勿使用.ScsiStatus来确定出错的地方。在Linux中,GetLastError()的返回码将是您需要的代码。

如果在Linux中,您最有可能使用 sg 驱动程序和the sg_io_hdr_t structure。此结构还具有ioctl()成员,其中包含SCSI状态代码。无论是在Linux还是Windows中,您都应该检查此代码,因为假设命令成功,因为ioctl确实是一个谬误。 Linux中还有其他可用的驱动程序,例如LSI MPT接口。如果你正在使用它,那么这个过程仍然是一样的。

答案 1 :(得分:0)

您尝试实施的命令,0xF8(读取本机最大地址)不是SCSI命令,它是ATA命令。

CDB代码0xA1确实与IOCTL_SCSI_PASS_THROUGH API配合使用,可以向设备发送SCSI / ATAPI命令。但那不是你想要的。

请尝试IOCTL_ATA_PASSTHROUGH

此处的示例和讨论: Sending ATA commands directly to device in Windows?