Freigeben über


SCSI_ADAPTER_BUS_INFO-Struktur (ntddscsi.h)

Die SCSI_ADAPTER_BUS_INFO-Struktur wird in Verbindung mit der IOCTL_SCSI_GET_INQUIRY_DATA-Anforderung verwendet, um die SCSI-Abfragedaten für alle Geräte auf einem bestimmten SCSI-Bus abzurufen.

Hinweis Der SCSI-Porttreiber und die SCSI-Miniporttreibermodelle können in Zukunft geändert oder nicht mehr verfügbar sein. Stattdessen wird empfohlen, die Modelle Storport-Treiber und Storport-Miniporttreiber zu verwenden.
 

Syntax

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

Member

NumberOfBuses

Enthält die Anzahl der Busse auf dem Adapter, für die Abfragedaten gemeldet werden.

BusData[1]

Enthält ein Array mit variabler Länge SCSI_BUS_DATA Strukturen, die die Abfragedaten enthalten.

Hinweise

SCSI_ADAPTER_BUS_INFO ist eine Headerstruktur, die das Layout des Ausgabepuffers der IOCTL_SCSI_GET_INQUIRY_DATA Anforderung beschreibt. Diese Anforderung gibt SCSI-Abfragedaten für alle logischen Einheiten auf allen Bussen zurück, die einem bestimmten SCSI-Hostbusadapter (HBA) zugeordnet sind. Das BusData-Element von SCSI_ADAPTER_BUS_INFO enthält ein Array mit variabler Länge aus SCSI_BUS_DATA Strukturen. Dieses Array verfügt über ein Element für jeden SCSI-Bus auf dem Adapter, sodass seine Größe der Anzahl von Bussen entspricht, die im NumberOfBuses-Member von SCSI_ADAPTER_BUS_INFO angegeben sind.

In den meisten Fällen weist NumberOfBuses den Wert 1 auf. Frühe SCSI-Busse waren auf 36 Ziele beschränkt (anstelle des derzeitigen Grenzwerts von 128), sodass einige Anbieter HBAs mit mehreren Bussen herstellten, um die maximale Anzahl von Zielen zu erhöhen. Um diese älteren HBAs zu unterstützen, bietet Windows einen Mechanismus zum Abrufen von Abfragedaten von HBAs mit mehreren Bussen. Bei Adaptern mit einem einzelnen Bus ist NumberOfBuses eins, und das BusData-Element von SCSI_ADAPTER_BUS_INFO verfügt nur über ein Element, aber HBAs mit mehreren Bussen generieren Daten für mehrere SCSI_BUS_DATA-Strukturen, und NumberOfBuses ist größer als 1.

Unmittelbar nach dem Array in BusData folgen die Abfragedaten für alle Geräte auf allen Bussen, die zum HBA gehören. Das InquiryDataOffset-Element jeder SCSI_BUS_DATA-Struktur stellt einen Offset zu den Abfragedaten für den entsprechenden SCSI-Bus bereit.

Die Abfragedaten für jeden SCSI-Bus enthalten Informationen zu allen logischen Einheiten auf diesem Bus. Die Abfragedaten jeder logischen Einheit sind in einer Struktur vom Typ SCSI_INQUIRY_DATA formatiert, und alle SCSI_INQUIRY_DATA Strukturen für einen bestimmten Bus werden durch das NextInquiryDataOffset-Element miteinander verknüpft. Es gibt eine separate Liste für jeden SCSI-Bus, und das NextInquiryDataOffset-Element der letzten Struktur in jeder Liste enthält den Wert 0.

Im folgenden Pseudocodebeispiel wird veranschaulicht, wie Sie die SCSI-Busse in einem HBA und die logischen Einheiten für jeden Bus schrittweise durchlaufen und die Abfragedaten für jede logische Einheit lesen und drucken:

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

Sie müssen das NextInquiryDataOffset-Element verwenden, um die Abfragedaten für die nächste logische Einheit zu suchen. Versuchen Sie nicht, dies durch Zeigerarithmetik zu tun. Die Positionierung der einzelnen SCSI_INQUIRY_DATA Struktur ist für jeden HBA-Miniporttreiber potenziell unterschiedlich, da sie von den Anforderungen an die Datenausrichtung abhängt.

Anforderungen

Anforderung Wert
Header ntddscsi.h (include Ntddscsi.h)

Weitere Informationen

IOCTL_SCSI_GET_INQUIRY_DATA

SCSI_BUS_DATA

SCSI_INQUIRY_DATA