PFLUSH_ADAPTER_BUFFERS回调函数 (wdm.h)

FlushAdapterBuffers 例程在 DMA 传输操作结束时刷新系统 DMA 控制器的内部缓存或总线-主适配器的内部缓存中剩余的任何数据。

语法

PFLUSH_ADAPTER_BUFFERS PflushAdapterBuffers;

BOOLEAN PflushAdapterBuffers(
  [in] PDMA_ADAPTER DmaAdapter,
  [in] PMDL Mdl,
  [in] PVOID MapRegisterBase,
  [in] PVOID CurrentVa,
  [in] ULONG Length,
  [in] BOOLEAN WriteToDevice
)
{...}

参数

[in] DmaAdapter

指向 IoGetDmaAdapter 返回的DMA_ADAPTER结构的指针,该结构表示总线主适配器或 DMA 控制器。

[in] Mdl

指向 MDL 的指针,该指针描述以前在驱动程序对 MapTransfer 的调用中传递的缓冲区。

[in] MapRegisterBase

指定为 DMA 操作分配的映射寄存器。 系统将此值传递给驱动程序的 AdapterControl 例程。

[in] CurrentVa

指向缓冲区中当前虚拟地址的指针,由 Mdl 描述,其中发生了 I/O 操作。 此值必须与传递给 MapTransfer 的初始 CurrentVa 值相同。

[in] Length

指定缓冲区的长度(以字节为单位)。

[in] WriteToDevice

指定 DMA 传输操作的方向:对于从系统内存中的缓冲区到驱动程序设备的传输,为 TRUE

返回值

如果 DMA 控制器或总线-主适配器的内部缓存中剩余的任何数据已成功刷新到系统内存或输出到设备,FlushAdapterBuffers 将返回 TRUE

注解

FlushAdapterBuffers 不是可直接按名称调用的系统例程。 此例程只能由 DMA_OPERATIONS结构中 返回的地址中的指针调用。 驱动程序通过调用 IoGetDmaAdapter 获取此例程的地址。

为了确保完成 DMA 传输,执行 DMA 操作的每个驱动程序都必须在完成请求 DMA 传输的 IRP 之前调用 FlushAdapterBuffers ,然后再释放映射寄存器。

驱动程序可以通过调用 MmGetMdlVirtualAddress 获取启动基于数据包的 DMA 传输的初始 CurrentVa。 但是,返回的值是 Mdl 中的索引,而不是有效的虚拟地址。 如果驱动程序必须将大型传输请求拆分为多个 DMA 操作,则必须为每个 DMA 操作更新 CurrentVaLength

要求

要求
最低受支持的客户端 从 Windows 2000 开始可用。
目标平台 桌面
标头 wdm.h(包括 Wdm.h、Ntddk.h、Ntifs.h)
IRQL <= DISPATCH_LEVEL
DDI 符合性规则 IrqlDispatch (wdm)

另请参阅

AllocateAdapterChannel

DMA_ADAPTER

DMA_OPERATIONS

IoGetDmaAdapter

KeFlushIoBuffers

MapTransfer

MmGetMdlVirtualAddress