Compartilhar via


estrutura SCSI_ADAPTER_BUS_INFO (ntddscsi.h)

A estrutura de SCSI_ADAPTER_BUS_INFO é usada em conjunto com a solicitação IOCTL_SCSI_GET_INQUIRY_DATA para recuperar os dados de consulta SCSI para todos os dispositivos em um determinado barramento SCSI.

Nota O driver de porta SCSI e os modelos de driver de miniporta SCSI podem ser alterados ou indisponíveis no futuro. Em vez disso, recomendamos usar os modelos de driver storport e driver de miniporto Storport .
 

Sintaxe

typedef struct _SCSI_ADAPTER_BUS_INFO {
  UCHAR         NumberOfBuses;
  SCSI_BUS_DATA BusData[1];
} SCSI_ADAPTER_BUS_INFO, *PSCSI_ADAPTER_BUS_INFO;

Membros

NumberOfBuses

Contém o número de ônibus no adaptador para os quais os dados de consulta estão sendo relatados.

BusData[1]

Contém uma matriz de comprimento variável de SCSI_BUS_DATA estruturas que contêm os dados de consulta.

Comentários

SCSI_ADAPTER_BUS_INFO é uma estrutura de cabeçalho que descreve o layout do buffer de saída da solicitação de IOCTL_SCSI_GET_INQUIRY_DATA . Essa solicitação retorna dados de consulta SCSI para todas as unidades lógicas em todos os ônibus associados a um HBA (adaptador de barramento de host) SCSI específico. O membro BusData do SCSI_ADAPTER_BUS_INFO contém uma matriz de comprimento variável de estruturas SCSI_BUS_DATA . Essa matriz tem um elemento para cada barramento SCSI no adaptador, portanto, seu tamanho é igual ao número de ônibus indicado no membro NumberOfBuses de SCSI_ADAPTER_BUS_INFO.

Na maioria dos casos, NumberOfBuses terá um valor de 1. Os primeiros ônibus SCSI foram limitados a 36 metas (em vez do limite atual de 128), então alguns fornecedores fabricaram HBAs com vários ônibus, a fim de aumentar o número máximo de metas. Para dar suporte a esses HBAs mais antigos, o Windows fornece um mecanismo para recuperar dados de consulta de HBAs com vários ônibus. Para adaptadores com um único barramento, NumberOfBuses será um e o membro BusData do SCSI_ADAPTER_BUS_INFO terá apenas um elemento, mas HBAs com vários ônibus gerarão dados para várias estruturas de SCSI_BUS_DATA e NumberOfBuses será maior que 1.

Imediatamente após a matriz em BusData estão os dados de consulta para todos os dispositivos em todos os ônibus que pertencem ao HBA. O membro InquiryDataOffset de cada estrutura SCSI_BUS_DATA fornece um deslocamento para os dados de consulta para o barramento SCSI correspondente.

Os dados de consulta para cada barramento SCSI incluem informações sobre todas as unidades lógicas nesse ônibus. Os dados de consulta de cada unidade lógica são formatados em uma estrutura do tipo SCSI_INQUIRY_DATA e todas as estruturas de SCSI_INQUIRY_DATA de um determinado barramento são vinculadas pelo membro NextInquiryDataOffset . Haverá uma lista separada para cada barramento SCSI e o membro NextInquiryDataOffset da última estrutura em cada lista contém um valor igual a zero.

O exemplo de pseudocódigo a seguir ilustra como percorrer os barramentos SCSI em um HBA e as unidades lógicas para cada barramento, lendo e imprimindo os dados de consulta para cada unidade lógica:

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");
}

Você deve usar o membro NextInquiryDataOffset para localizar os dados de consulta para a próxima unidade lógica. Não tente fazer isso por aritmética de ponteiro. O posicionamento de cada estrutura de SCSI_INQUIRY_DATA é potencialmente diferente para cada driver de miniporto HBA, pois depende dos requisitos de alinhamento de dados.

Requisitos

Requisito Valor
Cabeçalho ntddscsi.h (inclua Ntddscsi.h)

Confira também

IOCTL_SCSI_GET_INQUIRY_DATA

SCSI_BUS_DATA

SCSI_INQUIRY_DATA