Partager via


structure SCSI_ADAPTER_BUS_INFO (ntddscsi.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’interrogation SCSI pour tous les appareils d’un bus SCSI donné.

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

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 de bus sur l’adaptateur pour lesquels les données d’interrogation sont signalées.

BusData[1]

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

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 demande IOCTL_SCSI_GET_INQUIRY_DATA . Cette requête retourne les données d’interrogation SCSI pour toutes les unités logiques de tous les bus associés à un adaptateur de bus hôte (HBA) particulier. 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 de bus indiqué dans le membre NumberOfBuses de SCSI_ADAPTER_BUS_INFO.

Dans la plupart des cas, NumberOfBuses a la valeur 1. Les premiers bus SCSI étaient limités à 36 cibles (au lieu de la limite actuelle de 128), de sorte que certains fournisseurs ont fabriqué des adaptateurs HBA avec plusieurs autobus, 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 les données de demande à partir de HBA avec plusieurs bus. Pour les adaptateurs avec un seul bus, NumberOfBuses en sera un, et le membre BusData de SCSI_ADAPTER_BUS_INFO n’aura qu’un seul élément, mais les adaptateurs HBA avec plusieurs bus généreront des données pour plusieurs structures SCSI_BUS_DATA, et NumberOfBuses sera supérieur à 1.

Immédiatement après le tableau dans BusData , vous trouverez les données d’interrogation pour tous les appareils de tous les bus qui appartiennent à l’adaptateur HBA. Le membre InquiryDataOffset de chaque structure SCSI_BUS_DATA fournit un décalage sur les données d’interrogation pour le bus SCSI correspondant.

Les données d’interrogation pour chaque bus SCSI incluent des informations sur toutes les unités logiques de ce bus. Les données d’interrogation 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 entre elles par le membre NextInquiryDataOffset . Il y aura une liste distincte pour chaque bus SCSI, et le membre NextInquiryDataOffset 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 adaptateur HBA et les unités logiques de chaque bus, en lisant et en imprimant les données d’interrogation 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 le membre NextInquiryDataOffset pour localiser les données d’interrogation pour l’unité logique suivante. N’essayez pas de le faire en arithmetic pointeur. Le positionnement de chaque structure SCSI_INQUIRY_DATA est potentiellement différent pour chaque pilote miniport HBA, car il dépend des exigences d’alignement des données.

Configuration requise

Condition requise Valeur
En-tête ntddscsi.h (inclure Ntddscsi.h)

Voir aussi

IOCTL_SCSI_GET_INQUIRY_DATA

SCSI_BUS_DATA

SCSI_INQUIRY_DATA