次の方法で共有


ExQueueWorkItem 関数 (wdm.h)

ExQueueWorkItem は、特定の作業項目をキューに挿入します。このキューから、システム ワーカー スレッドによって項目が削除され、呼び出し元が ExInitializeWorkItem に指定したルーチンを制御できます。

警告

このルーチンは細心の注意を払って使用してください。 以下の 「備考」セクションを 参照してください。

構文

void ExQueueWorkItem(
  [in, out] __drv_aliasesMem PWORK_QUEUE_ITEM WorkItem,
  [in]      WORK_QUEUE_TYPE                   QueueType
);

パラメーター

[in, out] WorkItem

作業項目へのポインター。 この作業項目は、 ExInitializeWorkItem の前の呼び出しによって初期化されている必要があります。

[in] QueueType

WorkItem が指す作業項目を挿入するキューを指定します。 QueueType には、次のいずれかを指定できます。

意味
CriticalWorkQueue リアルタイム優先度属性を持つシステム スレッドが作業項目を処理するキューに WorkItem を挿入します。
DelayedWorkQueue 可変優先度属性を持つシステム スレッドが作業項目を処理するキューに WorkItem を挿入します。

QueueTypeHyperCriticalWorkQueue は、システムで使用するために予約されています。

戻り値

なし

解説

デバイス ドライバーでは、 ExQueueWorkItem ではなく IoQueueWorkItem を使用する必要があります。 ドライバーは、指定した作業項目がデバイス オブジェクトまたはデバイス スタックに関連付けられていない場合にのみ、 ExQueueWorkItem と関連付けられた ExInitializeWorkItem を使用する必要があります。 他のすべての場合、ドライバーは IoAllocateWorkItemIoFreeWorkItemおよび IoQueueWorkItem を使用する必要があります。これは、これらのルーチンによってのみ、指定された作業項目に関連付けられているデバイス オブジェクトが、作業項目が処理されるまで使用可能なままになるためです。

ExInitializeWorkItem対する Routine パラメーターで指定されたコールバック ルーチンは、IRQL PASSIVE_LEVELのシステム コンテキストで呼び出されます。 この呼び出し元から提供されるルーチンは、 ExFreePool または ExFreePoolWithTag を呼び出すことによって作業項目が不要になったときに作業項目を解放する役割を担 います

システム ワーカー スレッドは限られたリソースです。 ドライバーは、ドライバーの使用のために作業項目を永続的に予約することはできません。 作業項目は、迅速に完了する操作用に設計されています。 ドライバーは、できるだけ早く割り当てる作業項目を解放する必要があります。

ドライバーは、1 つの同期オブジェクトを既に保持していて、別の同期オブジェクトを取得しようとする可能性がある場合に、そのコールバック ルーチンが操作を完了するのを待つ必要はありません。 デッドロックを防ぐために、ドライバーは ExQueueWorkItem を呼び出す前に、現在保持されているセマフォ、ミューテックス、リソース変数などを解放する必要があります。

QueueType の値は、コールバック ルーチンを実行するランタイムの優先度を次のように決定します。

  • コールバックがリアルタイム優先度属性を持つシステム スレッドで実行される場合、より高いリアルタイム優先度を持つスレッドを除き、コールバック ルーチンを割り込むことはできません。

  • コールバックが変数 priority 属性を持つシステム スレッドで実行されている場合、コールバックは、より高い変数とリアルタイムの優先順位を持つスレッドによって割り込まれる可能性があり、コールバックは量子に対して同じ優先度の他のスレッドとラウンドロビンを実行するようにスケジュールされます。

いずれかの優先度のスレッドは中断可能なままです。

要件

要件
対象プラットフォーム ユニバーサル
Header wdm.h (Wdm.h、Ntifs.h、Fltkernel.h を含む)
Library NtosKrnl.lib
[DLL] NtosKrnl.exe
IRQL IRQL <= DISPATCH_LEVEL

こちらもご覧ください

ExFreePool

ExFreePoolWithTag

ExInitializeWorkItem

IoAllocateWorkItem

IoFreeWorkItem

IoQueueWorkItem

WORK_QUEUE_ITEM