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


структура 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), поэтому некоторые поставщики произвели 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)

См. также

IOCTL_SCSI_GET_INQUIRY_DATA

SCSI_BUS_DATA

SCSI_INQUIRY_DATA