PFLUSH_ADAPTER_BUFFERS_EX回调函数 (wdm.h)
FlushAdapterBuffersEx 例程在系统 DMA 控制器或总线主设备执行的 DMA 传输操作结束时刷新数据缓存中保留的任何数据。
语法
PFLUSH_ADAPTER_BUFFERS_EX PflushAdapterBuffersEx;
NTSTATUS PflushAdapterBuffersEx(
[in] PDMA_ADAPTER DmaAdapter,
[in] PMDL Mdl,
[in] PVOID MapRegisterBase,
[in] ULONGLONG Offset,
[in] ULONG Length,
[in] BOOLEAN WriteToDevice
)
{...}
参数
[in] DmaAdapter
指向 DMA_ADAPTER 结构的指针。 此结构是表示驱动程序的系统 DMA 通道或总线主设备的适配器对象。 调用方从对 IoGetDmaAdapter 例程的上一次调用中获取了此指针。
[in] Mdl
指向 MDL 链的指针,该链描述要刷新的内存页。 将此参数设置为指向用于 DMA 传输的 MDL 链。 有关详细信息,请参阅 GetScatterGatherListEx、BuildScatterGatherListEx 或 MapTransferEx 中 Mdl 参数的说明。
[in] MapRegisterBase
以前为适配器对象分配的映射寄存器的句柄。
[in] Offset
相对于要用于刷新操作的 MDL 链的起始偏移量。 将此参数设置为用作 DMA 传输起始偏移量的值。 有关详细信息,请参阅 GetScatterGatherListEx、BuildScatterGatherListEx 或 MapTransferEx 中 Offset 参数的说明。
[in] Length
要刷新的数据的字节数。 将此参数设置为用作 DMA 传输的传输长度的值。 有关详细信息,请参阅 GetScatterGatherListEx、BuildScatterGatherListEx 或 MapTransferEx 中 Length 参数的说明。
[in] WriteToDevice
DMA 传输的方向。 将此参数设置为用作 DMA 传输的传输方向的值。 有关详细信息,请参阅 GetScatterGatherListEx、BuildScatterGatherListEx 或 MapTransferEx 中 WriteToDevice 参数的说明。
返回值
如果调用成功,FlushAdapterBuffersEx 将返回STATUS_SUCCESS。 可能的错误返回值包括以下状态代码。
返回代码 | 说明 |
---|---|
|
由于调用方传递的参数值无效,例程失败。 |
注解
FlushAdapterBuffersEx 不是可直接按名称调用的系统例程。此例程只能由DMA_OPERATIONS结构中返回的地址中的指针调用 。 驱动程序通过调用 IoGetDmaAdapter 获取此例程的地址,并将 DeviceDescription 参数的 Version 成员设置为 DEVICE_DESCRIPTION_VERSION3。 如果 IoGetDmaAdapter 返回 NULL,则例程在平台上不可用。
FlushAdapterBuffersEx 在未实现硬件强制缓存一致性的硬件平台中启用处理器缓存一致性, (总线窥探) 。 此外,对于系统 DMA 传输, FlushAdapterBuffersEx 会刷新系统 DMA 控制器的内部缓存中保留的任何数据。
启动散点/收集 DMA 传输的驱动程序必须确保传输完成后从缓存刷新所有传输的数据。 驱动程序应在驱动程序完成请求 DMA 传输的 IRP 之前以及驱动程序释放映射寄存器之前调用 FlushAdapterBuffersEx 。 有关详细信息,请参阅 在 DMA 操作期间刷新缓存数据。
FlushAdapterBuffersEx 是 FlushAdapterBuffers 例程的扩展版本。 FlushAdapterBuffersEx 可以在一次调用中刷新整个散点/收集列表。 相比之下,若要使用 FlushAdapterBuffers 刷新散点/收集列表,需要对 MDL 链中的每个 MDL 单独调用。
FlushAdapterBuffersEx 可以代替 FlushAdapterBuffers 来刷新缓冲区,以便进行单数据包 DMA 传输。 在这种情况下,Mdl 参数指向的 MDL 链仅包含一个 MDL。 以这种方式使用 FlushAdapterBuffersEx 的好处是调用方可以指定 MDL 中的偏移量。
如果在 DMA 传输操作完成之前调用 FlushAdapterBuffersEx ,则此调用可能会在传输完成之前取消传输,或者可能导致未定义的行为。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | 从Windows 8开始可用。 |
目标平台 | 桌面 |
标头 | wdm.h(包括 Wdm.h、Ntddk.h、Ntifs.h) |
IRQL | <= DISPATCH_LEVEL |