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