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 主机总线适配器关联的所有总线上所有逻辑单元的 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) |