-1

我想通过 SAS 接口找出 HDD 的本机最大地址。我正在使用带有 SCSI_PASS_THROUGH 的 SAT(scsi ata 翻译)。

但无法从驱动器中找到带有 IOCTL_SCSI_PASS_THROUGH 的 SCSI_PASS_THROUGH 的任何缓冲区或有效感知信息。SCSI_PASS_THROUGH 的 cdb 值 =

sptwb.Spt.CdbLength = 12;
        sptwb.Spt.Cdb[0] = 0xA1;//ATA PASS THROUGH(12) OPERATION CODE(A1h)
        sptwb.Spt.Cdb[1] = (4 << 1) | 0; 
        sptwb.Spt.Cdb[2] = (1 << 3) | (1 << 2) | 2;
        sptwb.Spt.Cdb[3] = 0xe0;
        sptwb.Spt.Cdb[4] = 0x00;
        sptwb.Spt.Cdb[5] = 0x00;
        sptwb.Spt.Cdb[6] = 0x00;
        sptwb.Spt.Cdb[7] = 0x00;
        sptwb.Spt.Cdb[8] = (UCHAR)0x40;//(UCHAR)head;
        sptwb.Spt.Cdb[9] = 0x27;//COMMAND

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

4

2 回答 2

0

我面前没有所有相关的 SCSI 规范。因此,我假设您正在正确构建 SATL (SCSI ATA 转换层) CDB。首先要检查的是 ioctl 是否完成。即检查DeviceIoControl()for Trueor的返回码,False然后检查GetLastError()以确定哪里出了问题(如果适用)。如果 ioctl 没问题,请检查SCSI_PASS_THROUGH_DIRECT 结构成员.ScsiStatus。如果这是 0,那么命令完成就好了。如果状态为 0,这很可能是没有有效感知信息的原因。

当我偶然发现这个线程时,我实际上正在研究这个命令。最新的 ATA 命令规范 ACS-3(日期为 2013 年 10 月 28 日)表明Read Native Max AddressRead Native Max Address Ext命令现已过时。我在 ACS-2 中找到了它们的定义。日期为 2009 年 8 月 3 日的最新草稿显示此命令的输出不会是缓冲区。相反,输出将在返回的Device-To-Host FIS的 LBA 字段中。


附录 原始帖子的措辞让我相信这是在 Windows 中完成的。如果您正在使用 Linux,我应该包括该过程将是相同的。但是,不要GetLastError()用来确定出了什么问题。在 Linux 中,返回代码 fromioctl()将是您需要的代码。

如果在 Linux 中,您很可能会使用sg驱动程序和sg_io_hdr_t 结构。该结构还有一个.status包含 SCSI 状态代码的成员。无论是在 Linux 还是 Windows 中,您都应该始终检查此代码,因为假设命令成功,因为 ioctl 确实是一个谬论。Linux 中还有其他可用的直通驱动程序,例如 LSI MPT 接口。如果这是您正在使用的,该过程仍然相同。

于 2016-04-06T17:17:34.800 回答
0

您尝试执行的命令 0xF8 (Read Native Max Address) 不是 SCSI 命令,而是 ATA 命令。

CDB 代码 0xA1 确实可以与 IOCTL_SCSI_PASS_THROUGH API 一起使用,以将 SCSI/ATAPI 命令发送到设备。但这不是你想要的。

请尝试IOCTL_ATA_PASSTHROUGH

此处的示例和讨论: 将 ATA 命令直接发送到 Windows 中的设备?

于 2016-05-27T19:53:27.560 回答