ScsiPortGetDeviceBase-Funktion (srb.h)

Die ScsiPortGetDeviceBase-Routine gibt eine zugeordnete logische Basisadresse zurück, die für die Kommunikation mit einem HBA verwendet werden kann. Jeder Miniporttreiber muss zugeordnete, logische Zugriffsbereichsadressen an den ScsiPort übergeben. PortXxx und ScsiPort. Registrieren SieXxx-Routinen , um mit ihren HBA(n) zu kommunizieren.

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

Syntax

SCSIPORT_API PVOID ScsiPortGetDeviceBase(
  [in] PVOID                 HwDeviceExtension,
  [in] INTERFACE_TYPE        BusType,
  [in] ULONG                 SystemIoBusNumber,
  [in] SCSI_PHYSICAL_ADDRESS IoAddress,
  [in] ULONG                 NumberOfBytes,
  [in] BOOLEAN               InIoSpace
);

Parameter

[in] HwDeviceExtension

Zeiger auf die Hardwaregeräteerweiterung. Dies ist ein Speicherbereich pro HBA, den der Porttreiber im Namen des Miniporttreibers zuordnet und initialisiert. Miniport-Treiber speichern in der Regel HBA-spezifische Informationen in dieser Erweiterung, z. B. den Zustand des HBA und die zugeordneten Zugriffsbereiche des HBA. Dieser Bereich steht dem Miniporttreiber im DeviceExtension-HwDeviceExtension-Member des HBA-Geräteobjekts> unmittelbar nach dem Aufruf von ScsiPortInitialize vom Miniporttreiber zur Verfügung. Der Porttreiber gibt diesen Arbeitsspeicher frei, wenn er das Gerät entfernt.

[in] BusType

Gibt den Schnittstellentyp des E/A-Busses an, mit dem der HBA verbunden ist. Die HwScsiFindAdapter-Routine des Miniporttreibers ruft den Wert für diesen Parameter aus dem AdapterInterfaceType-Member des Eingabe-PORT_CONFIGURATION_INFORMATION ab.

[in] SystemIoBusNumber

Gibt die systemseitig zugewiesene Nummer des E/A-Busses an, mit dem der HBA verbunden ist. Die HwScsiFindAdapter-Routine ruft den Wert für diesen Parameter aus dem SystemIoBusNumber-Member der Eingabe PORT_CONFIGURATION_INFORMATION ab.

[in] IoAddress

Gibt die busrelative Basisadresse eines Bereichs an, der vom HBA verwendet wird. Die HwScsiFindAdapter-Routine ruft den Wert für diesen Parameter aus einem der AccessRanges-Elemente im PORT_CONFIGURATION_INFORMATION ab, wenn der Porttreiber Informationen zur Bereichskonfiguration bereitstellt. Andernfalls kann es sich bei dieser Adresse um einen Wert handeln, der von ScsiPortGetBusData zurückgegeben wird, oder um einen vom Miniporttreiber bereitgestellten Standardwert. Vermeiden Sie die Verwendung einer Basisadresse von null, da die erfolgreiche Rückgabe status mit dem Fehler status (NULL) in Konflikt kommen kann.

[in] NumberOfBytes

Gibt die Größe des Bereichs in Byte an, den die Zuordnung abdecken soll. Die HwScsiFindAdapter-Routine ruft den Wert dieses Parameters aus demselben AccessRanges-Element wie IoAddress ab, wenn der Porttreiber Informationen zur Bereichskonfiguration bereitstellt. Andernfalls kann dieser Wert von ScsiPortGetBusData oder einem vom Miniporttreiber bereitgestellten Standardwert zurückgegeben werden. In jedem Fall darf der Treiber nicht außerhalb des zurückgegebenen zugeordneten Bereichs auf die Hardware zugreifen.

[in] InIoSpace

TRUE gibt an, dass sich der zu zuordnende Bereich im E/A-Bereich befindet, und der Miniporttreiber übergibt zugeordnete Adressen in diesem Bereich an den ScsiPort... Portieren SieXxx , um mit dem HBA zu kommunizieren. Die HwScsiFindAdapter-Routine ruft den Wert dieses Parameters aus demselben AccessRanges-Element wie IoAddress ab. Beachten Sie, dass ein Miniporttreiber den Wert des InMemorySpace-Elements in einem ACCESS_RANGE-Type-Element umkehren muss, bevor er als InIoSpace-Argument an ScsiPortGetDeviceBase übergeben wird. FALSE gibt an, dass sich der zu zuordnende Bereich im Arbeitsspeicher befindet.

Rückgabewert

ScsiPortGetDeviceBase gibt eine zugeordnete logische Basisadresse für die angegebene IoAddress zurück, wenn der angegebene Bereich von IoAddress bis NumberOfBytes erfolgreich zugeordnet wurde. Wenn ein bestimmter Bereich nicht zugeordnet werden kann, gibt ScsiPortGetDeviceBaseNULL zurück.

Hinweise

NT-basierte Betriebssystemplattformen können über mehrere Typen von E/A-Bussen und mehrere E/A-Busse desselben Typs verfügen. Darüber hinaus kann die HAL den E/A-Speicherplatz auf einigen Plattformen dem Arbeitsspeicher zuordnen.

Folglich kann ein Miniporttreiber keine busrelativen Zugriffsbereichsadressen für die Kommunikation mit seinem HBA verwenden. Um die Portabilität des Miniporttreibers auf CISC- und RISC-basierten Computern zu gewährleisten, müssen die Adressen, die sie für den Zugriff auf HBAs verwenden, mit ScsiPortGetDeviceBase übersetzt werden.

Jeder Miniporttreiber muss logische Bereichsadressen im Systembereich verwenden, die von ScsiPortGetDeviceBase zugeordnet sind, um mit seinen HBA(n) zu kommunizieren. Aufrufe an den ScsiPort... Port-/Register-Xxx-Routinen erfordern diese zugeordneten logischen Adressen.

ScsiPortGetDeviceBase kann mehrmals aufgerufen werden, je nachdem, wie viele HBAs der Miniporttreiber unterstützt und wie viele Zugriffsbereiche jeder HBA benötigt. Jeder zugeordnete Bereich entspricht einem Bereich von busrelativen Geräteadressen, die in einem ACCESS_RANGE-Type-Element des AccessRanges-Arrays angegeben sind.

ScsiPortGetDeviceBase kann nur über die HwScsiFindAdapter-Routine eines Miniporttreibers oder über HwScsiAdapterControl aufgerufen werden, wenn der Steuerelementtyp ScsiSetRunningConfig ist. Aufrufe von anderen Miniporttreiberroutinen führen zu Systemfehlern oder zu einem falschen Betrieb für den Aufrufer.

Befolgen Sie die folgenden Richtlinien zum Aufrufen von ScsiPortGetDeviceBase:

  • Wenn HwScsiFindAdapter einen vom Miniporttreiber bereitgestellten Satz von standardmäßigen busrelativen Zugriffsbereichen oder -werten verwendet, die von ScsiPortGetBusData zurückgegeben werden, sollte ScsiPortValidateRange aufgerufen werden, bevor versucht wird , ScsiPortGetDeviceBase aufzurufen.
  • Wenn HwScsiFindAdapter feststellt, dass ein bestimmter HBA nicht vom Miniporttreiber unterstützt wird, muss ScsiPortFreeDeviceBase aufgerufen werden, um die Zuordnungen freizugeben, die für die Kommunikation mit diesem HBA eingerichtet wurden.
Die von ScsiPortGetDeviceBase zurückgegebene logische Adresse sollte für alle nachfolgenden Verweise auf die Hardware verwendet werden, aber nicht zu einer AccessRanges-Spezifikation im PORT_CONFIGURATION_INFORMATION hinzugefügt werden. Miniport-Treiberautoren sollten keine Annahmen darüber treffen, wie viele Bits in der logischen Basisadresse verwendet werden, die von ScsiPortGetDeviceBase zurückgegeben wird.

ScsiPortGetDeviceBase verwendet SCSI_PHYSICAL_ADDRESS , um busrelative Adressen darzustellen.

typedef PHYSICAL_ADDRESS SCSI_PHYSICAL_ADDRESS, *PSCSI_PHYSICAL_ADDRESS;

Der SCSI_PHYSICAL_ADDRESS Typs ist ein betriebssystemunabhängiger Datentyp, den SCSI-Miniporttreiber verwenden, um eine physische Adresse oder eine busrelative Adresse darzustellen.

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

Anforderungen

Anforderung Wert
Zielplattform Desktop
Kopfzeile srb.h (include Miniport.h, Scsi.h)
Bibliothek Scsiport.lib

Weitere Informationen

ACCESS_RANGE

HwScsiFindAdapter

PORT_CONFIGURATION_INFORMATION (SCSI)

ScsiPortFreeDeviceBase

ScsiPortGetBusData

ScsiPortValidateRange