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.
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.
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.
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 |