WdfWorkItemFlush 函数 (wdfworkitem.h)

[适用于 KMDF 和 UMDF]

WdfWorkItemFlush 方法在为指定的工作项提供服务后返回。

语法

void WdfWorkItemFlush(
  [in] WDFWORKITEM WorkItem
);

参数

[in] WorkItem

框架工作项对象的句柄,该对象是从上一次调用 WdfWorkItemCreate 获取的

返回值

备注

如果驱动程序提供无效的对象句柄,则会发生 bug 检查。

如果已调用 WdfWorkItemEnqueue 并且驱动程序调用 WdfWorkItemFlush 方法,则在系统工作线程从工作项队列中删除指定工作项并调用驱动程序的 EvtWorkItem 回调函数之前,该方法不会返回,并且随后在处理工作项后返回 EvtWorkItem 回调函数。 请注意, WdfWorkItemFlush 会等待已运行的 EvtWorkItem 回调函数完成。

如果尚未调用 WdfWorkItemEnqueue ,则调用 WdfWorkItemFlush 将立即完成。

从工作项回调内部调用 WdfWorkItemFlush 或从它调用的在同一系统工作线程上运行的代码调用 WdfWorkItemFlush 是非法的。 事实上,如果启用了驱动程序验证程序,WDF 会闯入调试器,警告这样做会导致死锁。 另一方面,从回调内部对工作项对象调用 WdfObjectDelete 是完全可以的。

大多数使用工作项的驱动程序不需要调用 WdfWorkItemFlush。 如果驱动程序必须将工作项的完成与远程 I/O 目标的删除同步,则驱动程序可能会调用 WdfWorkItemFlush 。 在这种情况下,驱动程序可以从其 EvtIoTargetQueryRemove 回调函数中调用 WdfWorkItemFlush

有关工作项的详细信息,请参阅 使用框架工作项

示例

下面的代码示例是 Toaster 示例驱动程序中的 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)
Library Wdf01000.sys (KMDF) ;WUDFx02000.dll (UMDF)
IRQL PASSIVE_LEVEL
DDI 符合性规则 DriverCreate (kmdf) KmdfIrql (kmdf) KmdfIrql2 (kmdf) 、 KmdfIrqlExplicit (kmdf)

另请参阅

EvtWorkItem