Partager via


Fonction ScsiPortGetDeviceBase (srb.h)

La routine ScsiPortGetDeviceBase retourne une adresse de base logique mappée qui peut être utilisée pour communiquer avec un adaptateur HBA. Chaque pilote miniport doit passer des adresses de plage d’accès logique mappées au ScsiPort. PortXxx et ScsiPort.. Inscrivezxxx routines pour communiquer avec ses HBA.

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

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

Paramètres

[in] HwDeviceExtension

Pointeur vers l’extension de périphérique matériel. Il s’agit d’une zone de stockage par adaptateur HBA que le pilote de port alloue et initialise pour le compte du pilote miniport. Les pilotes miniport stockent généralement des informations spécifiques à L’adaptateur HBA dans cette extension, telles que l’état de l’adaptateur HBA et les plages d’accès mappées de l’adaptateur HBA. Cette zone est disponible pour le pilote miniport dans le membre DeviceExtension-HwDeviceExtension> de l’objet d’appareil de l’adaptateur HBA immédiatement après que le pilote miniport a appelé ScsiPortInitialize. Le pilote de port libère cette mémoire lorsqu’il supprime l’appareil.

[in] BusType

Spécifie le type d’interface du bus d’E/S sur lequel l’adaptateur HBA est connecté. La routine HwScsiFindAdapter du pilote miniport obtient la valeur de ce paramètre à partir du membre AdapterInterfaceType du PORT_CONFIGURATION_INFORMATION d’entrée.

[in] SystemIoBusNumber

Spécifie le numéro attribué par le système du bus d’E/S sur lequel l’adaptateur HBA est connecté. La routine HwScsiFindAdapter obtient la valeur de ce paramètre auprès du membre SystemIoBusNumber du PORT_CONFIGURATION_INFORMATION d’entrée.

[in] IoAddress

Spécifie l’adresse de base relative du bus d’une plage utilisée par l’adaptateur HBA. La routine HwScsiFindAdapter obtient la valeur de ce paramètre à partir de l’un des éléments AccessRanges dans le PORT_CONFIGURATION_INFORMATION si le pilote de port fournit des informations de configuration de plage. Sinon, cette adresse peut être une valeur retournée par ScsiPortGetBusData ou une valeur par défaut fournie par un pilote miniport. Évitez d’utiliser une adresse de base de zéro, car son status de retour réussi peut entrer en conflit avec l’erreur status (NULL).

[in] NumberOfBytes

Spécifie la taille en octets de la plage que le mappage doit couvrir. La routine HwScsiFindAdapter obtient la valeur de ce paramètre à partir du même élément AccessRanges que IoAddress si le pilote de port fournit des informations de configuration de plage. Sinon, cette valeur peut être retournée par ScsiPortGetBusData ou par une valeur par défaut fournie par un pilote miniport. Dans tous les cas, le pilote ne doit pas accéder au matériel en dehors de la plage mappée retournée.

[in] InIoSpace

TRUE indique que la plage à mapper se trouve dans l’espace d’E/S, et que le pilote miniport transmet les adresses mappées dans cette plage au ScsiPort... PortXxx pour communiquer avec l’adaptateur HBA. La routine HwScsiFindAdapter obtient la valeur de ce paramètre à partir du même élément AccessRanges que IoAddress. Notez qu’un pilote miniport doit inverser la valeur du membre InMemorySpace dans un élément de type ACCESS_RANGE avant qu’il ne soit passé à ScsiPortGetDeviceBase en tant qu’argument InIoSpace . FALSE indique que la plage à mapper se trouve dans l’espace mémoire.

Valeur retournée

ScsiPortGetDeviceBase retourne une adresse de base logique mappée pour l’IoAddress donnée s’il a correctement mappé la plage donnée d’IoAddress à NumberOfBytes. Si une plage donnée ne peut pas être mappée, ScsiPortGetDeviceBase retourne NULL.

Remarques

Les plateformes de système d’exploitation basés sur NT peuvent avoir plusieurs types de bus d’E/S et plusieurs bus d’E/S du même type. De plus, hal peut mapper l’espace d’E/S à la mémoire dans certaines plateformes.

Par conséquent, un pilote miniport ne peut pas utiliser d’adresses de plage d’accès relatives au bus pour communiquer avec son adaptateur HBA. Pour maintenir la portabilité des pilotes miniports entre les machines CISC et RISC, les adresses qu’ils utilisent pour accéder aux adaptateurs HBA doivent être traduites avec ScsiPortGetDeviceBase.

Chaque pilote miniport doit utiliser des adresses de plage logique d’espace système, mappées par ScsiPortGetDeviceBase, pour communiquer avec ses HBA. Appels au ScsiPort... Les routines Port/RegisterXxx nécessitent ces adresses logiques mappées.

ScsiPortGetDeviceBase peut être appelé plusieurs fois, en fonction du nombre de HBA pris en charge par le pilote miniport et du nombre de plages d’accès requises par chaque adaptateur HBA. Chaque plage mappée correspond à une plage d’adresses d’appareil relatives au bus spécifiées dans un élément de type ACCESS_RANGE du tableau AccessRanges .

ScsiPortGetDeviceBase peut être appelé uniquement à partir de la routine HwScsiFindAdapter d’un pilote miniport ou de HwScsiAdapterControl lorsque le type de contrôle est ScsiSetRunningConfig. Les appels d’autres routines de pilotes miniport entraînent une défaillance du système ou un fonctionnement incorrect pour l’appelant.

Suivez ces instructions pour appeler ScsiPortGetDeviceBase :

  • Si HwScsiFindAdapter utilise un jeu de valeurs ou de plages d’accès relatives au bus par défaut retournées par ScsiPortGetBusData, il doit appeler ScsiPortValidateRange avant d’essayer d’appeler ScsiPortGetDeviceBase.
  • Si HwScsiFindAdapter détermine qu’un adaptateur HBA particulier n’est pas pris en charge par le pilote miniport, il doit appeler ScsiPortFreeDeviceBase pour libérer le ou les mappages qu’il a configurés pour communiquer avec cet adaptateur HBA.
L’adresse logique retournée par ScsiPortGetDeviceBase doit être utilisée pour toutes les références ultérieures au matériel, mais ne doit pas être ajoutée à une spécification AccessRanges dans le PORT_CONFIGURATION_INFORMATION. Les enregistreurs de pilotes miniports ne doivent pas faire d’hypothèses sur le nombre de bits utilisés dans l’adresse de base logique retournée par ScsiPortGetDeviceBase.

ScsiPortGetDeviceBase utilise SCSI_PHYSICAL_ADDRESS pour représenter les adresses relatives aux bus.

typedef PHYSICAL_ADDRESS SCSI_PHYSICAL_ADDRESS, *PSCSI_PHYSICAL_ADDRESS;

Le type SCSI_PHYSICAL_ADDRESS est un type de données indépendant du système d’exploitation que les pilotes miniports SCSI utilisent pour représenter une adresse physique ou une adresse relative de bus.

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 .
 

Configuration requise

Condition requise Valeur
Plateforme cible Desktop (Expérience utilisateur)
En-tête srb.h (inclure Miniport.h, Scsi.h)
Bibliothèque Scsiport.lib

Voir aussi

ACCESS_RANGE

HwScsiFindAdapter

PORT_CONFIGURATION_INFORMATION (SCSI)

ScsiPortFreeDeviceBase

ScsiPortGetBusData

ScsiPortValidateRange