基于数据包的直接内存访问(DMA)在微型驱动程序直接读取数据并直接写入数据以捕获从用户模式接收的缓冲区时发生。 Windows 驱动程序工具包 (WDK) 示例中的 AVStream 模拟硬件示例驱动程序(AVSHwS) 演示如何生成执行此类 DMA 的 AVStream 微型驱动程序。
实现基于数据包的 DMA 方案:
在相关KSPIN_DESCRIPTOR_EX结构的 Flags 成员中指定 KSPIN_FLAG_GENERATE_MAPPINGS 。 请注意,此标志只能由具有分散/聚集支持的总线主控使用。
注册中断服务例程 (ISR),如 为硬件编写 AVStream 微型驱动程序中所述。
然后在 AVStrMiniDeviceStart 启动调度中:
使用 IoGetDmaAdapter 设置 DMA 适配器对象。
通过调用 KsDeviceRegisterAdapterObject 将 DMA 适配器对象注册到 AVStream。
微型驱动程序通过在调用 KsDeviceRegisterAdapterObject 时提供 MaxMappingByteCount 参数来指定单个散点/收集映射的最大大小。
如果任何散点/收集映射超出此最大大小,AVStream 会自动将映射分解为多个散点/收集映射,每个映射都不超过 MaxMappingByteCount 中指定的大小。
还必须提供 AVStrMiniPinProcess 回调例程。 驱动程序编写器应为此回调选择适当的功能。 例如,您可以执行以下操作:
通过调用 KsStreamPointerClone 克隆前导边缘。
基于克隆方法编程的 DMA 硬件。
调用 KsStreamPointerAdvanceOffsets 或 KsStreamPointerAdvance 以推进前导边缘。
如需处理其他帧,请从步骤 2 开始重复操作。
当硬件中断 DMA 完成时,内核将调用供应商之前注册的 ISR。 在 ISR 中,微型驱动程序将延迟过程调用(DPC)排入队列。
DPC 应更新 DataUsed,并且可能更新 KSSTREAM_HEADER 结构的其他成员。 然后,DPC 可能会调用 KsStreamPointerDelete 来删除克隆并释放关联的帧。
或者,仅当帧的一部分完成时,DPC 可以推进克隆指针。 为此,请调用 KsStreamPointerAdvanceOffsets。
如果需要恢复处理,请调用 KsPinAttemptProcessing。
注释
如果映射长度小于一个物理页,则不能保证它驻留在单个物理页上。