Uso di DMA del sistema basato su pacchetti
I driver di dispositivi subordinati che usano DMA basato su pacchetti chiamano la sequenza generale di routine di supporto seguenti durante l'elaborazione di un IRP che richiede un trasferimento DMA:
KeFlushIoBuffers poco prima di tentare di allocare il controller DMA di sistema (per altre informazioni, vedere Gestione della coerency della cache)
AllocateAdapterChannel quando il driver è pronto per programmare il dispositivo per DMA e necessita del controller DMA di sistema
AllocateAdapterChannel, a sua volta, chiama la routine AdapterControl del driver.
MmGetMdlVirtualAddress per ottenere un indice nel file MDL, obbligatorio come parametro nella chiamata iniziale a MapTransfer
MapTransfer per programmare il controller DMA di sistema per l'operazione di trasferimento
Un driver potrebbe dover chiamare MapTransfer più volte per trasferire tutti i dati richiesti, come illustrato in Suddivisione delle richieste di trasferimento.
FlushAdapterBuffers subito dopo ogni operazione di trasferimento DMA da/verso il dispositivo subordinato
Se un driver deve chiamare MapTransfer più volte per trasferire tutti i dati richiesti, deve chiamare FlushAdapterBuffers quante volte chiama MapTransfer.
FreeAdapterChannel non appena tutti i dati richiesti sono stati trasferiti o se il driver non riesce a causa di un errore di I/O del dispositivo
Il puntatore all'oggetto adapter restituito da IoGetDmaAdapter è un parametro obbligatorio per ognuna di queste routine, ad eccezione di KeFlushIoBuffers e MmGetMdlVirtualAddress, che richiedono il puntatore al MDL passato in Irp-MdlAddress>.
I singoli driver chiamano questa sequenza di routine di supporto in punti diversi, a seconda del modo in cui ogni driver viene implementato per il servizio del dispositivo. Ad esempio, la routine StartIo di un driver potrebbe effettuare la chiamata a AllocateAdapterChannel, un altro driver potrebbe effettuare questa chiamata da una routine che rimuove i runtime di integrazione da una coda interlock creata dal driver e un altro driver potrebbe effettuare questa chiamata quando il dispositivo DMA subordinato indica che è pronto per il trasferimento dei dati.