SCSI_ADAPTER_BUS_INFO结构(ntddscsi.h)
SCSI_ADAPTER_BUS_INFO结构与 IOCTL_SCSI_GET_INQUIRY_DATA 请求结合使用,以检索给定 SCSI 总线上所有设备的 SCSI 查询数据。
语法
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) |