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 adattatore 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 corrispondenza MdlAddress nell'IRP corrente o nel file MDL che descrive il buffer comune configurato dal driver di un dispositivo subordinato (modalità di inizializzazione automatica).
[in] MapRegisterBase
Specifica i registri mappa allocati per l'operazione DMA. Il sistema passa questo valore alla routine Adapter Control 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, espressa in byte, di cui eseguire il mapping. Se il driver indica che il dispositivo era un master bus con supporto a dispersione/raccolta quando ha chiamato IoGetDmaAdapter, il valore di Length restituito da 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 il driver di un adattatore bus-master può usare. I driver di dispositivi che usano un controller DMA di sistema non possono usare questo valore e devono ignorarlo.
Osservazioni
MapTransfer non è una routine di sistema che può essere chiamata direttamente per nome. Questa routine è chiamabile solo dal puntatore dall'indirizzo restituito in una struttura DMA_OPERATIONS. I driver ottengono l'indirizzo di questa routine chiamando IoGetDmaAdapter.
Il DmaAdapter deve essere già stato allocato in seguito alla chiamata precedente del driver a AllocateAdapterChannel.
Il numero di registri mappa che è possibile configurare non può superare il valore massimo restituito quando il driver ha chiamato IoGetDmaAdapter.
Un driver può ottenere il CurrentVa iniziale per l'avvio 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ù operazioni DMA, deve aggiornare CurrentVa e lunghezza per ogni operazione DMA.
Il driver di un dispositivo master del bus con supporto a dispersione/raccolta può usare l'indirizzo logico restituito e aggiornato valore length per creare un elenco a dispersione/raccolta, chiamando MapTransfer ripetutamente fino a quando non ha usato tutti i registri mappa disponibili per l'operazione di trasferimento. Tuttavia, tale driver potrebbe usare più semplicemente la routine GetScatterGatherList.
Fabbisogno
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) |