Freigeben über


ScsiPortValidateRange-Funktion (srb.h)

Die ScsiPortValidateRange-Routine gibt an, ob die angegebenen Zugriffsbereichswerte bereits von einem anderen Treiber in der Registrierung beansprucht wurden.

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

SCSIPORT_API BOOLEAN ScsiPortValidateRange(
  [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. Hierbei handelt es sich um einen HBA-Speicherbereich, den der Porttreiber im Namen des Miniporttreibers ordnet und initialisiert. Miniporttreiber speichern normalerweise 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 durch den Miniporttreiber zur Verfügung. Der Porttreiber gibt diesen Arbeitsspeicher frei, wenn er das Gerät entfernt.

[in] BusType

Gibt den Wert des AdapterInterfaceType-Members in der PORT_CONFIGURATION_INFORMATION-Struktur an, wenn HwScsiFindAdapter aufgerufen wird.

[in] SystemIoBusNumber

Gibt den Wert des SystemIoBusNumber-Members in den Konfigurationsinformationen an, wenn HwScsiFindAdapter aufgerufen wird.

[in] IoAddress

Gibt eine busrelative Basisadresse für den Bereich der Ports oder den Gerätespeicher an, der überprüft werden soll, bevor die HwScsiFindAdapter-Routine des Miniporttreibers versucht, den Zugriffsbereich für den Adapter an dieser Adresse zuzuordnen.

[in] NumberOfBytes

Gibt die Größe in Bytes oder die Anzahl der Elemente im Bereich an.

[in] InIoSpace

Gibt an, wenn true ist, dass sich der Bereich im E/A-Bereich und nicht im Arbeitsspeicher befindet. Bei FALSE befindet sich der Bereich im Arbeitsspeicher.

Rückgabewert

ScsiPortValidateRange gibt TRUE zurück, wenn die HwScsiFindAdapter-Routine den zugeordneten Bereich sicher zuordnen und verwenden kann, um auf den Adapter zuzugreifen. ScsiPortValidateRange gibt FALSE zurück, wenn die angegebenen Zugriffsbereichswerte bereits von einem anderen Treiber in der Registrierung beansprucht wurden.

Hinweise

ScsiPortValidateRange kann nur aus der HwScsiFindAdapter-Routine eines Miniporttreibers aufgerufen werden. Anrufe von anderen Miniporttreiberroutinen führen zu Systemfehlern oder zu einem falschen Betrieb für den Aufrufer.

Wenn der betriebssystemspezifische Porttreiber ein AccessRanges-Element der PORT_CONFIGURATION_INFORMATION-Struktur initialisiert, bevor er die HwScsiFindAdapter-Routine des Miniporttreibers aufruft, muss der Miniporttreiber die angegebenen Werte an ScsiPortGetDeviceBase übergeben und die zugeordneten logischen Adressen für den Bereich verwenden, um zu bestimmen, ob es sich um einen unterstützten HBA handelt.

Der Porttreiber füllt entweder ein ACCESS_RANGE-Type-Element mit einer vollständigen Beschreibung eines busrelativen Adressbereichs für einen Adapter, oder der Porttreiber stellt alle Elemente des Elements auf Null.

Für AccessRanges-Eingabeelemente , die mit Standardnullen festgelegt sind, kann die HwScsiFindAdapter-Routine versuchen, einen adapter zu finden, den sie auf dem angegebenen E/A-Bus unterstützt. Unter diesen Umständen verfügt ein Miniporttreiber in der Regel über eine Reihe von vom Treiber bestimmten Standardadressen für seinen Typ(en) von HBA. Ein zuvor geladener Treiber verwendet jedoch möglicherweise bereits einen initialisierten Adapter in einem der Standardadressbereiche dieses Miniporttreibers, insbesondere in reinen x86-Systemen, in denen einige Geräte im x86-Realmodus initialisiert werden. Um zu verhindern, dass ein solches Gerät versehentlich neu programmiert wird, sollte die HwScsiFindAdapter-Routine jedes Miniporttreibers ScsiPortValidateRange aufrufen, bevor alle vom Treiber bereitgestellten Adressen ScsiPortGetDeviceBase zugeordnet werden und dann die zugeordneten logischen Adressen verwendet werden, um Adapter auf einem E/A-Bus abzufragen.

Wenn ScsiPortValidateRangeFALSE zurückgibt, darf HwScsiFindAdapter nicht versuchen, die Eingabebereichsadressen zuzuordnen, da bereits ein anderer Treiber den Bereich in der Registrierung beansprucht hat.

Wenn ScsiPortValidateRangeTRUE zurückgibt, kann HwScsiFindAdapter die folgenden Schritte ausführen:

  1. Ordnen Sie die Adressen des relativen Busbereichs den Logischen Bereichsadressen des Systemraums mit ScsiPortGetDeviceBase zu.
  2. Verwenden Sie die zugeordneten logischen Adressen mit ScsiPortRead/WriteXxx , um zu bestimmen, ob es sich bei dem Adapter tatsächlich um einen vom Treiber unterstützten HBA handelt.
Wenn ein Miniporttreiber einen Bereich verwendet, der erfolgreich an ScsiPortValidateRange für einen unterstützten HBA übergeben wurde, muss dieser Treiber den InIoSpace-Wert invertieren, wenn er das RangeInMemory-Element eines AccessRanges-Elements im PORT_CONFIGURATION_INFORMATION festlegt.

ScsiPortValidateRange 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 entweder eine physische Adresse oder eine busrelative Adresse darzustellen.

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.
 

Anforderungen

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

Weitere Informationen

ACCESS_RANGE

HwScsiFindAdapter

PORT_CONFIGURATION_INFORMATION (SCSI)

ScsiPortGetDeviceBase

ScsiPortInitialize