Поделиться через


структура 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 для всех логических единиц на всех шинах, связанных с определенным адаптером шины узла 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)

См. также раздел

IOCTL_SCSI_GET_INQUIRY_DATA

SCSI_BUS_DATA

SCSI_INQUIRY_DATA