Usar o DMA do sistema baseado em pacotes
Os drivers de dispositivos subordinados que usam DMA baseado em pacote chamam a seguinte sequência geral de rotinas de suporte enquanto processam um IRP solicitando uma transferência DMA:
KeFlushIoBuffers antes de tentar alocar o controlador DMA do sistema (para obter mais informações, consulte Manter a coerência do cache)
AllocateAdapterChannel quando o driver está pronto para programar seu dispositivo para DMA e precisa do controlador DMA do sistema
AllocateAdapterChannel, por sua vez, chama a rotina AdapterControl do driver.
MmGetMdlVirtualAddress para obter um índice no MDL, necessário como um parâmetro na chamada inicial para MapTransfer
MapTransfer para programar o controlador DMA do sistema para a operação de transferência
Um driver pode precisar chamar MapTransfer mais de uma vez para transferir todos os dados solicitados, conforme explicado em Dividir solicitações de transferência.
FlushAdapterBuffers logo após cada operação de transferência DMA de/para o dispositivo subordinado
Se um driver precisar chamar MapTransfer mais de uma vez para transferir todos os dados solicitados, ele deverá chamar FlushAdapterBuffers o mesmo número de vezes que chamar MapTransfer.
FreeAdapterChannel assim que todos os dados solicitados tiverem sido transferidos ou se o driver falhar no IRP devido a um erro de E/S do dispositivo
O ponteiro do objeto do adaptador retornado por IoGetDmaAdapter é um parâmetro necessário para cada uma dessas rotinas, exceto KeFlushIoBuffers e MmGetMdlVirtualAddress, que exigem o ponteiro para o MDL passado em Irp->MdlAddress.
Drivers individuais chamam essa sequência de rotinas de suporte em pontos diferentes, dependendo de como cada driver é implementado para fazer a manutenção de seu dispositivo. Por exemplo, a rotina StartIo de um driver pode fazer a chamada para AllocateAdapterChannel, outro driver pode fazer essa chamada de uma rotina que remove IRPs de uma fila interlocked criada pelo driver e, ainda, outro driver pode fazer essa chamada quando seu dispositivo DMA subordinado indica que está pronto para transferir dados.