Share via


PMAP_TRANSFER funzione di callback (wdm.h)

La routine MapTransfer configura i registri mappa per un oggetto adapter per eseguire il mapping di un trasferimento DMA da un buffer bloccato.

Sintassi

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
)
{...}

Parametri

[in] DmaAdapter

Puntatore all'oggetto adapter DMA restituito da IoGetDmaAdapter e passato in precedenza a AllocateAdapterChannel per la richiesta di trasferimento di IRP corrente.

[in] Mdl

Puntatore a uno dei seguenti: MDL che descrive il buffer in MdlAddress nell'IRP corrente o MDL che descrive il buffer comune configurato dal driver di un dispositivo subordinato (modalità di inizializzazione automatica).

[in] MapRegisterBase

Specifica i registri della mappa allocati per l'operazione DMA. Il sistema passa questo valore alla routine AdapterControl del driver.

[in] CurrentVa

Puntatore all'indirizzo virtuale corrente dei dati da trasferire per un'operazione di trasferimento DMA.

[in, out] Length

Specifica la lunghezza, in byte, da eseguire il mapping. Se il driver indica che il dispositivo era un master del bus con supporto a dispersione/raccolta quando si chiama IoGetDmaAdapter, il valore di Length on return from MapTransfer indica il numero di byte mappati. In caso contrario, i valori di input e output di Length sono identici.

[in] WriteToDevice

Indica la direzione dell'operazione di trasferimento: TRUE per un trasferimento dal buffer bloccato al dispositivo.

Valore restituito

MapTransfer restituisce l'indirizzo logico dell'area mappata, che può essere usato dal driver di una scheda master del bus. I driver dei dispositivi che usano un controller DMA di sistema non possono usare questo valore e devono ignorarlo.

Commenti

MapTransfer non è una routine di sistema che può essere chiamata direttamente in base al nome. Questa routine è chiamabile solo per puntatore dall'indirizzo restituito in una strutturadi DMA_OPERATIONS. I driver ottengono l'indirizzo di questa routine chiamando IoGetDmaAdapter.

DmaAdapter deve essere già stato allocato in seguito alla chiamata precedente del driver a AllocateAdapterChannel.

Il numero di registri mappa che possono essere configurati non può superare il valore massimo restituito quando il driver denominato IoGetDmaAdapter.

Un driver può ottenere l'oggetto CurrentVa iniziale per l'inizio di un trasferimento DMA basato su pacchetti chiamando MmGetMdlVirtualAddress. Tuttavia, il valore restituito è un indice nel Mdl, anziché un indirizzo virtuale valido. Se il driver deve suddividere una richiesta di trasferimento di grandi dimensioni in più di un'operazione DMA, deve aggiornare CurrentVa e Length per ogni operazione DMA.

Il driver di un dispositivo master del bus con supporto a dispersione/raccolta può usare l'indirizzo logico restituito e il valore lunghezza aggiornato per creare un elenco di dispersione/raccolta, chiamando MapTransfer ripetutamente fino a quando non ha usato tutti i registri di mappa disponibili per l'operazione di trasferimento. Tuttavia, tale driver potrebbe usare più semplicemente la routine GetScatterGatherList .

Requisiti

Requisito Valore
Client minimo supportato Disponibile a partire da Windows 2000.
Piattaforma di destinazione Desktop
Intestazione wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
IRQL <= DISPATCH_LEVEL
Regole di conformità DDI IrqlDispatch(wdm)

Vedi anche

ADDRESS_AND_SIZE_TO_SPAN_PAGES

AllocateAdapterChannel

AllocateCommonBuffer

DMA_ADAPTER

FlushAdapterBuffers

FreeAdapterChannel

FreeMapRegisters

IoGetDmaAdapter

KeFlushIoBuffers

MmGetMdlVirtualAddress