次の方法で共有


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
Header wdfworkitem.h (Wdf.h を含む)
Library Wdf01000.sys (KMDF);WUDFx02000.dll (UMDF)
IRQL PASSIVE_LEVEL
DDI コンプライアンス規則 DriverCreate(kmdf)KmdfIrql(kmdf)KmdfIrql2(kmdf)、KmdfIrqlExplicit(kmdf)

こちらもご覧ください

Evtworkitem