WdfWorkItemFlush 函数 (wdfworkitem.h)
[适用于 KMDF 和 UMDF]
WdfWorkItemFlush 方法在服务指定的工作项后返回。
语法
void WdfWorkItemFlush(
[in] WDFWORKITEM WorkItem
);
参数
[in] WorkItem
从上一次调用 WdfWorkItemCreate获取的框架工作项对象的句柄。
返回值
没有
言论
如果驱动程序提供无效的对象句柄,则会发生 bug 检查。
如果已调用 WdfWorkItemEnqueue,并且驱动程序调用 WdfWorkItemFlush 方法, 在系统工作线程从工作项队列中删除指定的工作项并调用驱动程序的 EvtWorkItem 回调函数之前,该方法不会返回,EvtWorkItem 回调函数随后在处理工作项后返回。 请注意,WdfWorkItemFlush 确实等待已运行的 EvtWorkItem 回调函数完成。
如果未调用 WdfWorkItemEnqueue,请立即调用 WdfWorkItemFlush 完成。
从工作项回调内或从在同一系统工作线程上运行的代码调用 WdfWorkItemFlush 是非法的。 事实上,如果启用了驱动程序验证程序,WDF 会闯入调试器,警告这样做将导致死锁。 另一方面,从回调中调用 WdfObjectDelete 的工作项对象是完全正常的。
使用工作项的大多数驱动程序不需要调用 WdfWorkItemFlush。 如果驱动程序必须将工作项的完成与删除远程 I/O 目标同步,驱动程序可能会调用 WdfWorkItemFlush。 在这种情况下,驱动程序可以从其 EvtIoTargetQueryRemove 回调函数中调用 WdfWorkItemFlush。
有关工作项的详细信息,请参阅 使用框架工作项。
例子
下面的代码示例是来自 烤箱 示例驱动程序的 EvtIoTargetQueryRemove 回调函数。
NTSTATUS
ToastMon_EvtIoTargetQueryRemove(
WDFIOTARGET IoTarget
)
{
PTARGET_DEVICE_INFO targetDeviceInfo = NULL;
//
// Get the I/O target object's context.
//
targetDeviceInfo = GetTargetDeviceInfo(IoTarget);
//
// Ensure that the I/O target's work item
// has been processed before closing the target.
//
WdfWorkItemFlush(targetDeviceInfo->WorkItem);
WdfIoTargetCloseForQueryRemove(IoTarget);
return STATUS_SUCCESS;
}
要求
要求 | 价值 |
---|---|
目标平台 | 普遍 |
最低 KMDF 版本 | 1.0 |
最低 UMDF 版本 | 2.0 |
标头 | wdfworkitem.h (包括 Wdf.h) |
库 | Wdf01000.sys(KMDF):WUDFx02000.dll (UMDF) |
IRQL | PASSIVE_LEVEL |
DDI 符合性规则 | DriverCreate(kmdf),KmdfIrql(kmdf),KmdfIrql2(kmdf),KmdfIrqlExplicit(kmdf) |