SCSI_ADAPTER_BUS_INFO 结构 (ntddscsi.h)

SCSI_ADAPTER_BUS_INFO 结构与 IOCTL_SCSI_GET_INQUIRY_DATA 请求结合使用,以检索给定 SCSI 总线上所有设备的 SCSI 查询数据。

注意 SCSI 端口驱动程序和 SCSI 微型端口驱动程序模型将来可能会更改或不可用。 相反,我们建议使用 Storport 驱动程序Storport 微型端口 驱动程序模型。
 

语法

typedef struct _SCSI_ADAPTER_BUS_INFO {
  UCHAR         NumberOfBuses;
  SCSI_BUS_DATA BusData[1];
} SCSI_ADAPTER_BUS_INFO, *PSCSI_ADAPTER_BUS_INFO;

成员

NumberOfBuses

包含适配器上报告查询数据的总线数。

BusData[1]

包含保存查询数据的 SCSI_BUS_DATA 结构的可变长度数组。

注解

SCSI_ADAPTER_BUS_INFO是一个标头结构,用于描述 IOCTL_SCSI_GET_INQUIRY_DATA 请求的输出缓冲区的布局。 此请求返回与特定 SCSI 主机总线适配器关联的所有总线上所有逻辑单元的 SCSI 查询数据, (HBA) 。 SCSI_ADAPTER_BUS_INFO 的 BusData 成员包含 SCSI_BUS_DATA 结构的可变长度数组。 此数组为适配器上的每个 SCSI 总线提供一个元素,因此其大小等于 SCSI_ADAPTER_BUS_INFO 的 NumberOfBuses 成员中指示的总线数。

在大多数情况下, NumberOfBuses 的值为 1。 早期的 SCSI 总线 (限制为 36 个目标,而不是目前限制为 128) ,因此一些供应商制造了具有多辆总线的 HBA,以增加目标的最大数量。 为了支持这些较旧的 HBA,Windows 提供了一种机制,用于通过多个总线从 HBA 检索查询数据。 对于具有单个总线的适配器, NumberOfBuses 将为 1,SCSI_ADAPTER_BUS_INFO 的 BusData 成员将只有一个元素,但具有多个总线的 HBA 将为多个SCSI_BUS_DATA结构生成数据, NumberOfBuses 将大于 1。

紧跟在 BusData 中的数组之后是属于 HBA 的所有总线上所有设备的查询数据。 每个 SCSI_BUS_DATA 结构的 InquiryDataOffset 成员为相应 SCSI 总线的查询数据提供偏移量。

每个 SCSI 总线的查询数据包括有关该总线上所有逻辑单元的信息。 每个逻辑单元的查询数据采用 SCSI_INQUIRY_DATA 类型的结构进行格式化,特定总线的所有SCSI_INQUIRY_DATA结构都由 NextInquiryDataOffset 成员链接在一起。 每个 SCSI 总线都有一个单独的列表,每个列表中最后一个结构的 NextInquiryDataOffset 成员包含值零。

以下伪代码示例演示了如何单步执行 HBA 上的 SCSI 总线,以及每个总线的逻辑单元,以及读取和打印每个逻辑单元的查询数据:

VOID
PrintInquiryData(PCHAR  DataBuffer)
{
    PSCSI_ADAPTER_BUS_INFO  adapterInfo;
    PSCSI_INQUIRY_DATA inquiryData;
    ULONG i, j;

    adapterInfo = (PSCSI_ADAPTER_BUS_INFO) DataBuffer;
    for (i = 0; i < adapterInfo->NumberOfBuses; i++) {
       inquiryData = (PSCSI_INQUIRY_DATA) (DataBuffer +
          adapterInfo->BusData[i].InquiryDataOffset);
       while (adapterInfo->BusData[i].InquiryDataOffset) {
          printf(" %d   %d  %3d    %s    %.28s ",
             i,
             inquiryData->TargetId,
             inquiryData->Lun,
             (inquiryData->DeviceClaimed) ? "Y" : "N",
             &inquiryData->InquiryData[8]);
          for (j = 0; j < 8; j++) {
             printf("%02X ", inquiryData->InquiryData[j]);
          }
          printf("\n");
          if (inquiryData->NextInquiryDataOffset == 0) {
             break;
          }
          inquiryData = (PSCSI_INQUIRY_DATA) (DataBuffer +
             inquiryData->NextInquiryDataOffset);
       }
    }
    printf("\n\n");
}

必须使用 NextInquiryDataOffset 成员来查找下一个逻辑单元的查询数据。 请勿尝试通过指针算术执行此操作。 每个 HBA 微型端口驱动程序的每个SCSI_INQUIRY_DATA结构的定位可能有所不同,因为它取决于数据对齐要求。

要求

要求
Header ntddscsi.h (包括 Ntddscsi.h)

另请参阅

IOCTL_SCSI_GET_INQUIRY_DATA

SCSI_BUS_DATA

SCSI_INQUIRY_DATA