структура 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). Элемент BusData SCSI_ADAPTER_BUS_INFO содержит массив переменной длины структур SCSI_BUS_DATA. Этот массив имеет один элемент для каждой шины SCSI на адаптере, поэтому его размер равен количеству автобусов, указанным в NumberOfBuses член SCSI_ADAPTER_BUS_INFO.
В большинстве случаев NumberOfBuses будет иметь значение 1. Ранние автобусы SCSI были ограничены 36 целевыми объектами (а не текущим ограничением 128), поэтому некоторые поставщики произвели HBAs с несколькими автобусами, чтобы увеличить максимальное количество целевых объектов. Для поддержки этих старых HBAs Windows предоставляет механизм получения данных запроса от HBAs с несколькими автобусами. Для адаптеров с одной шиной NumberOfBuses будет одним, а SCSI_ADAPTER_BUS_INFO элемент BusData BusData будет иметь только один элемент, но HBAs с несколькими автобусами создаст данные для нескольких структур SCSI_BUS_DATA, а NumberOfBuses будет больше 1.
Сразу после массива в BusData — это данные запроса для всех устройств на всех автобусах, принадлежащих HBA. Элемент InquiryDataOffset каждого SCSI_BUS_DATA структуры предоставляет смещение к данным запроса для соответствующей шины SCSI.
Данные запроса для каждой шины SCSI содержат сведения обо всех логических единицах этой шины. Данные запроса каждой логической единицы форматируются в структуре типа SCSI_INQUIRY_DATA, а все SCSI_INQUIRY_DATA структуры для конкретной шины связаны элементом nextInquiryDataOffset. Будет отдельный список для каждой шины SCSI, а NextInquiryDataOffset элемент последней структуры в каждом списке содержит значение нуля.
В следующем примере псевдокода показано, как выполнить шаг через автобусы SCSI на HBA и логические единицы для каждой шины, считывая и печатая данные запроса для каждой логической единицы:
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. Не пытайтесь сделать это с помощью арифметики указателя. Расположение каждой SCSI_INQUIRY_DATA структуры потенциально отличается для каждого драйвера мини-порта HBA, так как зависит от требований к выравниванию данных.
Требования
Требование | Ценность |
---|---|
заголовка | ntddscsi.h (include Ntddscsi.h) |