次の方法で共有


WdfWorkItemFlush 関数 (wdfworkitem.h)

[KMDF と UMDF に適用]

WdfWorkItemFlush メソッドは、指定した作業項目が処理された後に返されます。

構文

void WdfWorkItemFlush(
  [in] WDFWORKITEM WorkItem
);

パラメーター

[in] WorkItem

WdfWorkItemCreate への以前の呼び出しから取得したフレームワーク作業項目オブジェクトハンドル。

戻り値

何一つ

備考

ドライバーが無効なオブジェクト ハンドルを提供すると、バグ チェックが発生します。

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)

関連項目

EvtWorkItem する