estructura SCSI_ADAPTER_BUS_INFO (ntddscsi.h)

La estructura SCSI_ADAPTER_BUS_INFO se usa junto con la solicitud de IOCTL_SCSI_GET_INQUIRY_DATA para recuperar los datos de consulta SCSI para todos los dispositivos de un bus SCSI determinado.

Nota Los modelos de controlador de puerto SCSI y controlador de minipuerto SCSI pueden modificarse o no estar disponibles en el futuro. En su lugar, se recomienda usar los modelos del controlador Storport y del controlador storport miniport .
 

Sintaxis

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

Miembros

NumberOfBuses

Contiene el número de autobuses en el adaptador para el que se notifican los datos de consulta.

BusData[1]

Contiene una matriz de longitud variable de SCSI_BUS_DATA estructuras que contienen los datos de consulta.

Comentarios

SCSI_ADAPTER_BUS_INFO es una estructura de encabezado que describe el diseño del búfer de salida de la solicitud de IOCTL_SCSI_GET_INQUIRY_DATA . Esta solicitud devuelve datos de consulta SCSI para todas las unidades lógicas de todos los buses asociados a un adaptador de bus host SCSI determinado (HBA). El miembro BusData de SCSI_ADAPTER_BUS_INFO contiene una matriz de longitud variable de SCSI_BUS_DATA estructuras. Esta matriz tiene un elemento para cada bus SCSI del adaptador, por lo que su tamaño es igual al número de buses indicados en el miembro NumberOfBuses de SCSI_ADAPTER_BUS_INFO.

En la mayoría de los casos, NumberOfBuses tendrá un valor de 1. Los primeros buses SCSI estaban limitados a 36 destinos (en lugar del límite actual de 128), por lo que algunos proveedores fabricaban HBA con varios autobuses, con el fin de aumentar el número máximo de destinos. Para admitir estas HBA anteriores, Windows proporciona un mecanismo para recuperar datos de consulta de HBA con varios buses. En el caso de los adaptadores con un único bus, NumberOfBuses será uno y el miembro BusData de SCSI_ADAPTER_BUS_INFO tendrá solo un elemento, pero los HBA con varios buses generarán datos para varias estructuras de SCSI_BUS_DATA y NumberOfBuses será mayor que 1.

Inmediatamente después de la matriz de BusData se incluyen los datos de consulta de todos los dispositivos de todos los buses que pertenecen al HBA. El miembro InquiryDataOffset de cada estructura de SCSI_BUS_DATA proporciona un desplazamiento a los datos de consulta del bus SCSI correspondiente.

Los datos de consulta de cada bus SCSI incluyen información sobre todas las unidades lógicas de ese bus. Los datos de consulta de cada unidad lógica tienen formato en una estructura de tipo SCSI_INQUIRY_DATA, y todas las estructuras de SCSI_INQUIRY_DATA de un bus determinado se vinculan juntas por el miembro NextInquiryDataOffset . Habrá una lista independiente para cada bus SCSI y el miembro NextInquiryDataOffset de la última estructura de cada lista contiene un valor de cero.

En el siguiente ejemplo de pseudocódigo se muestra cómo recorrer los buses SCSI en un HBA y las unidades lógicas de cada bus, leer e imprimir los datos de consulta para cada unidad 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");
}

Debe usar el miembro NextInquiryDataOffset para buscar los datos de consulta de la siguiente unidad lógica. No intente hacerlo mediante aritmética de punteros. El posicionamiento de cada estructura de SCSI_INQUIRY_DATA es potencialmente diferente para cada controlador de miniporte HBA, ya que depende de los requisitos de alineación de datos.

Requisitos

Requisito Valor
Header ntddscsi.h (incluya Ntddscsi.h)

Consulte también

IOCTL_SCSI_GET_INQUIRY_DATA

SCSI_BUS_DATA

SCSI_INQUIRY_DATA