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 主机总线适配器(HBA)关联的所有总线上所有逻辑单元的 SCSI 查询数据。 SCSI_ADAPTER_BUS_INFO的 BusData 成员包含 SCSI_BUS_DATA 结构的可变长度数组。 此数组具有适配器上每个 SCSI 总线的一个元素,因此其大小等于 SCSI_ADAPTER_BUS_INFO NumberOfBuses 成员中指示的总线数。

在大多数情况下,NumberOfBuses 的值为 1。 早期的SCSI总线限制为36个目标(而不是目前的限制为128),因此一些供应商制造了具有几辆公共汽车的HBA,以提高目标的最大数量。 为了支持这些较旧的 HBA,Windows 提供了一种机制,用于从具有多个总线的 HBA 检索查询数据。 对于具有单个总线的适配器,NumberOfBuses 将是一个,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结构的位置可能有所不同,因为它取决于数据对齐要求。

要求

要求 价值
标头 ntddscsi.h (包括 Ntddscsi.h)

另请参阅

IOCTL_SCSI_GET_INQUIRY_DATA

SCSI_BUS_DATA

SCSI_INQUIRY_DATA