Partager via


PMAP_TRANSFER fonction de rappel (wdm.h)

La routine MapTransfer configure des registres de carte pour un objet d’adaptateur afin de mapper un transfert DMA à partir d’une mémoire tampon verrouillée.

Syntaxe

PMAP_TRANSFER PmapTransfer;

PHYSICAL_ADDRESS PmapTransfer(
  [in]      PDMA_ADAPTER DmaAdapter,
  [in]      PMDL Mdl,
  [in]      PVOID MapRegisterBase,
  [in]      PVOID CurrentVa,
  [in, out] PULONG Length,
  [in]      BOOLEAN WriteToDevice
)
{...}

Paramètres

[in] DmaAdapter

Pointeur vers l’objet d’adaptateur DMA retourné par IoGetDmaAdapter et précédemment passé à AllocateAdapterChannel pour la demande de transfert de l’IRP actuelle.

[in] Mdl

Pointeur vers l’un des éléments suivants : le MDL qui décrit la mémoire tampon sur MdlAddress dans l’IRP actuel ou le MDL qui décrit la mémoire tampon commune configurée par le pilote d’un appareil subordonné (mode d’initialisation automatique).

[in] MapRegisterBase

Spécifie les registres de carte alloués pour l’opération DMA. Le système transmet cette valeur à la routine AdapterControl du pilote.

[in] CurrentVa

Pointeur vers l’adresse virtuelle actuelle des données à transférer pour une opération de transfert DMA.

[in, out] Length

Spécifie la longueur, en octets, à mapper. Si le pilote a indiqué que son appareil était un bus master avec la prise en charge des points/regroupements lorsqu’il a appelé IoGetDmaAdapter, la valeur Length au retour de MapTransfer indique le nombre d’octets mappés. Sinon, les valeurs d’entrée et de sortie de Length sont identiques.

[in] WriteToDevice

Indique la direction de l’opération de transfert : TRUE pour un transfert de la mémoire tampon verrouillée vers l’appareil.

Valeur retournée

MapTransfer retourne l’adresse logique de la région mappée, que le pilote d’un adaptateur master bus peut utiliser. Les pilotes d’appareils qui utilisent un contrôleur DMA système ne peuvent pas utiliser cette valeur et doivent l’ignorer.

Remarques

MapTransfer n’est pas une routine système qui peut être appelée directement par nom. Cette routine peut être appelée uniquement par le pointeur à partir de l’adresse retournée dans une structurede DMA_OPERATIONS. Les pilotes obtiennent l’adresse de cette routine en appelant IoGetDmaAdapter.

Le DmaAdapter doit avoir déjà été alloué à la suite de l’appel précédent du pilote à AllocateAdapterChannel.

Le nombre de registres de carte qui peuvent être configurés ne peut pas dépasser le maximum retourné lorsque le pilote appelé IoGetDmaAdapter.

Un pilote peut obtenir le CurrentVa initial pour le début d’un transfert DMA basé sur des paquets en appelant MmGetMdlVirtualAddress. Toutefois, la valeur retournée est un index dans mdl, plutôt qu’une adresse virtuelle valide. Si le pilote doit fractionner une demande de transfert volumineuse en plusieurs opérations DMA, il doit mettre à jour CurrentVa et Length pour chaque opération DMA.

Le pilote d’un appareil master de bus avec prise en charge des points/regroupements peut utiliser l’adresse logique retournée et la valeur Length mise à jour pour créer une liste de points/regroupements, appelant MapTransfer à plusieurs reprises jusqu’à ce qu’il ait utilisé tous les registres de carte disponibles pour l’opération de transfert. Toutefois, un tel pilote peut utiliser plus simplement la routine GetScatterGatherList .

Configuration requise

Condition requise Valeur
Client minimal pris en charge Disponible à partir de Windows 2000.
Plateforme cible Desktop (Expérience utilisateur)
En-tête wdm.h (inclure Wdm.h, Ntddk.h, Ntifs.h)
IRQL <= DISPATCH_LEVEL
Règles de conformité DDI IrqlDispatch(wdm)

Voir aussi

ADDRESS_AND_SIZE_TO_SPAN_PAGES

AllocationAdapterChannel

AllocationCommonBuffer

DMA_ADAPTER

FlushAdapterBuffers

FreeAdapterChannel

FreeMapRegisters

IoGetDmaAdapter

KeFlushIoBuffers

MmGetMdlVirtualAddress