Fonction ScsiPortGetPhysicalAddress (srb.h)
La routine ScsiPortGetPhysicalAddress convertit une plage d’adresses virtuelle donnée en plage d’adresses physique pour une opération DMA.
Syntaxe
SCSIPORT_API SCSI_PHYSICAL_ADDRESS ScsiPortGetPhysicalAddress(
[in] PVOID HwDeviceExtension,
[in] PSCSI_REQUEST_BLOCK Srb,
[in] PVOID VirtualAddress,
[out] ULONG *Length
);
Paramètres
[in] HwDeviceExtension
Pointeur vers l’extension de périphérique matériel. Il s’agit d’une zone de stockage par 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 à HBA dans cette extension, telles que l’état de l’adaptateur HBA et les plages d’accès mappées du HBA. Cette zone est disponible pour le pilote miniport dans le membre DeviceExtension-HwDeviceExtension> de l’objet d’appareil du 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] Srb
Pointeur vers le bloc de requête SCSI si la VirtualAddress à convertir provient du membre DataBuffer de ce SRB ou, éventuellement, du SenseInfoBuffer. Sinon, ce paramètre doit être NULL.
[in] VirtualAddress
Pointeur vers l’adresse virtuelle de base à convertir. Si cette adresse virtuelle se situe dans la plage d’un DataBuffer fourni par SRB, l’appelant doit également fournir le pointeur Srb .
[out] Length
Retourne le nombre d’octets mappés, en commençant à l’adresse physique retournée.
Valeur retournée
ScsiPortGetPhysicalAddress retourne l’adresse physique correspondante pour une Adresse Virtuelle donnée. Si l’adresse donnée ne peut pas être convertie, elle retourne NULL.
Remarques
Les pilotes miniport des HBA master bus appellent ScsiPortGetPhysicalAddress pour obtenir des plages d’adresses physiques mappées à utiliser pendant les opérations DMA. Par exemple, ScsiPortGetPhysicalAddress peut être utilisé pour créer une liste de points/regroupements pour les transferts de données qui s’étendent sur des pages. Notez que la longueur retournée peut être supérieure à la taille du DataBuffer dans un SRB donné.
Si un Srb non NULL est passé, virtualAddress doit se trouver dans la plage du DataBuffer du SRB ou doit être un pointeur du SenseInfoBuffer. Sinon, la VirtualAddress donnée doit se trouver dans l’extension non mise en cache du pilote miniport, dans SrbExtension ou dans SenseInfoBuffer.
Un pilote miniport peut appeler ScsiPortGetPhysicalAddress pour traduire une adresse d’extension uniquement si la routine DriverEntry de ce pilote miniport a défini NeedPhysicalAddresses sur TRUE dans le HW_INITIALIZATION_DATA lorsqu’elle a appelé ScsiPortInitialize.
En raison de contraintes sur certains bus, comme ISA, il n’est pas garanti que l’adresse retournée par cette routine corresponde à l’adresse retournée par une routine externe analogue (telle que MmGetPhysicalAddress). Un pilote miniport doit appeler uniquement les routines ScsiPortXxx pour être portables.
ScsiPortGetPhysicalAddress utilise SCSI_PHYSICAL_ADDRESS pour représenter des adresses physiques.
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 miniport 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 (include Miniport.h, Scsi.h) |
Bibliothèque | Scsiport.lib |