Partager via


structure SCSI_ADAPTER_BUS_INFO (ntdddscsi.h)

La structure SCSI_ADAPTER_BUS_INFO est utilisée conjointement avec la demande de IOCTL_SCSI_GET_INQUIRY_DATA pour récupérer les données d’enquête SCSI pour tous les appareils sur un bus SCSI donné.

Remarque Le pilote de port SCSI et les modèles de pilotes miniport SCSI peuvent être modifiés ou indisponibles à l’avenir. Au lieu de cela, nous vous recommandons d’utiliser le du pilote Storport et modèles de pilotes Storport miniport.
 

Syntaxe

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

Membres

NumberOfBuses

Contient le nombre d’autobus sur l’adaptateur pour lequel les données d’enquête sont signalées.

BusData[1]

Contient un tableau de longueur variable de structures SCSI_BUS_DATA qui contiennent les données d’enquête.

Remarques

SCSI_ADAPTER_BUS_INFO est une structure d’en-tête qui décrit la disposition de la mémoire tampon de sortie de la requête IOCTL_SCSI_GET_INQUIRY_DATA. Cette requête retourne les données d’enquête SCSI pour toutes les unités logiques sur tous les bus associés à un adaptateur de bus hôte SCSI particulier (HBA). Le membre BusData de SCSI_ADAPTER_BUS_INFO contient un tableau de longueur variable de structures SCSI_BUS_DATA. Ce tableau a un élément pour chaque bus SCSI sur l’adaptateur. Sa taille est donc égale au nombre d’autobus indiqués dans le NumberOfBuses membre de SCSI_ADAPTER_BUS_INFO.

Dans la plupart des cas, NumberOfBuses a la valeur 1. Les autobus SCSI précoces étaient limités à 36 cibles (au lieu de la limite actuelle de 128), donc certains fournisseurs ont fabriqué des BBA avec plusieurs bus, afin d’augmenter le nombre maximal de cibles. Pour prendre en charge ces anciens HBA, Windows fournit un mécanisme permettant de récupérer des données d’enquête à partir d’adaptateurs HBA avec plusieurs bus. Pour les adaptateurs avec un seul bus, NumberOfBuses sera un, et le membre BusData de SCSI_ADAPTER_BUS_INFO n’aura qu’un seul élément, mais les HBA avec plusieurs bus génèrent des données pour plusieurs structures SCSI_BUS_DATA, et NumberOfBuses sera supérieur à 1.

Immédiatement après le tableau dans BusData est les données d’enquête pour tous les appareils sur tous les bus appartenant à l’adaptateur HBA. Le InquiryDataOffset membre de chaque structure de SCSI_BUS_DATA fournit un décalage aux données d’enquête pour le bus SCSI correspondant.

Les données d’enquête pour chaque bus SCSI incluent des informations sur toutes les unités logiques de ce bus. Les données d’enquête de chaque unité logique sont mises en forme dans une structure de type SCSI_INQUIRY_DATA, et toutes les structures SCSI_INQUIRY_DATA d’un bus particulier sont liées par le membre NextIn requestDataOffset. Il y aura une liste distincte pour chaque bus SCSI, et la NextIn requestDataOffset membre de la dernière structure de chaque liste contient une valeur de zéro.

L’exemple de pseudocode suivant montre comment parcourir les bus SCSI sur un HBA et les unités logiques pour chaque bus, lire et imprimer les données d’enquête pour chaque unité logique :

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

Vous devez utiliser NextIn requestDataOffset membre pour localiser les données d’enquête pour l’unité logique suivante. N’essayez pas de le faire par arithmétique du pointeur. Le positionnement de chaque structure de SCSI_INQUIRY_DATA est potentiellement différent pour chaque pilote miniport HBA, car il dépend des exigences d’alignement des données.

Exigences

Exigence Valeur
d’en-tête ntddscsi.h (include Ntddscsi.h)

Voir aussi

IOCTL_SCSI_GET_INQUIRY_DATA

SCSI_BUS_DATA

SCSI_INQUIRY_DATA