当 AllocateAdapterChannel 将控制权转移到驱动程序的 AdapterControl 例程时,驱动程序将“拥有”系统 DMA 控制器和一组映射寄存器。 然后,驱动程序必须调用 MapTransfer ,以将系统 DMA 控制器设置为使用驱动程序分配的公共缓冲区,然后驱动程序为传输操作设置其设备。
驱动程序向 MapTransfer 提供以下参数:
IoGetDmaAdapter 返回的适配器对象指针
指向描述驱动程序分配的公共缓冲区的 MDL 的指针
通过 AllocateAdapterChannel 传递给驱动程序的 AdapterControl 例程的 MapRegisterBase 句柄
指向变量的指针 (Length) 指示驱动程序分配的公共缓冲区的大小(以字节为单位)
一个布尔值,指示传输操作的方向, (请求从系统内存传输到设备)
MapTransfer 返回一个逻辑地址,使用系统 DMA 的驱动程序必须忽略该地址。 当 MapTransfer 返回控件时,驱动程序应为 DMA 操作设置其设备。 驱动程序只调用 MapTransfer 一次,但会继续在其公共缓冲区和锁定的用户缓冲区之间复制数据,直到完成请求的传输。
驱动程序可以调用 ReadDmaCounter 来确定当前在公共缓冲区中要传输的字节数;然后,驱动程序可以继续使用用户数据填充其公共缓冲区,或将数据从其公共缓冲区复制到用户缓冲区,具体取决于 DMA 操作的方向。
传输完成或驱动程序必须返回 IRP 的错误状态时,驱动程序将调用 FlushAdapterBuffers ,以确保将系统 DMA 控制器中缓存的任何数据读入系统内存或写出到设备。 然后,驱动程序应立即调用 FreeAdapterChannel ,以释放系统 DMA 控制器供任何驱动程序 (包括自身) 使用。