Uso de DMA del sistema basado en paquetes
Los controladores de dispositivos subordinados que usan DMA basado en paquetes llaman a la siguiente secuencia general de rutinas de soporte a medida que procesan un IRP que solicita una transferencia DMA:
KeFlushIoBuffers justo antes de intentar asignar el controlador DMA del sistema (para obtener más información, consulte Mantenimiento de la coherencia de la caché)
AllocateAdapterChannel cuando el controlador está listo para programar su dispositivo para DMA y necesita el controlador DMA del sistema
AllocateAdapterChannel, a su vez, llama a la rutina AdapterControl del controlador.
MmGetMdlVirtualAddress para obtener un índice en MDL, necesario como parámetro en la llamada inicial a MapTransfer
MapTransfer para programar el controlador DMA del sistema para la operación de transferencia
Es posible que un controlador tenga que llamar a MapTransfer más de una vez para transferir todos los datos solicitados, como se explica en División de solicitudes de transferencia.
FlushAdapterBuffers justo después de cada operación de transferencia de DMA hacia o desde el dispositivo subordinado
Si un controlador debe llamar a MapTransfer más de una vez para transferir todos los datos solicitados, debe llamar a FlushAdapterBuffers tantas veces como llama a MapTransfer.
FreeAdapterChannel en cuanto se hayan transferido todos los datos solicitados o si el controlador produce un error de IRP debido a un error de E/S del dispositivo
El puntero de objeto de adaptador devuelto por IoGetDmaAdapter es un parámetro obligatorio para cada una de estas rutinas, excepto KeFlushIoBuffers y MmGetMdlVirtualAddress, que requieren el puntero a la MDL pasado en Irp->MdlAddress.
Los controladores individuales llaman a esta secuencia de rutinas de soporte en diferentes puntos, dependiendo de cómo se implemente cada controlador para atender su dispositivo. Por ejemplo, la rutina StartIo de un controlador podría llamar a AllocateAdapterChannel, otro controlador podría realizar esta llamada desde una rutina que quite IRP de una cola interbloqueada creada por el controlador y, aún así, otro controlador podría realizar esta llamada cuando su dispositivo DMA subordinado indica que está listo para transferir datos.