我想找出通过SAS接口的硬盘的本机最大地址。 我正在使用SAT(scsi ata translation)和SCSI_PASS_THROUGH。
但无法找到SCSI_PASS_THROUGH的任何缓冲区或有效senseinfo 来自驱动器的IOCTL_SCSI_PASS_THROUGH。 cdb值为SCSI_PASS_THROUGH =
object_1
但不返回任何缓冲区。 请提供准确的cdb参数以读取SAS机器上的本机最大地址。
答案 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命令。但那不是你想要的。
此处的示例和讨论: Sending ATA commands directly to device in Windows?