KDEFERRED_ROUTINE コールバック関数 (wdm.h)

コールバック ルーチンは、スレッド化された DPC の InterruptService が返された後、アクションを実行します。

CustomDpc ルーチンは、割り込みサービス ルーチンが返された後、I/O 操作のサービスを終了します。

CustomThreadedDpc ルーチンは、スレッド化された DPC のアクションを実行します。 システムは、スレッド化された DPC の実行時にこのルーチンを実行します。

CustomTimerDpc ルーチンは、タイマー オブジェクトの時間間隔の有効期限が切れた後に実行されます。

構文

KDEFERRED_ROUTINE KdeferredRoutine;

void KdeferredRoutine(
  [in]           _KDPC *Dpc,
  [in, optional] PVOID DeferredContext,
  [in, optional] PVOID SystemArgument1,
  [in, optional] PVOID SystemArgument2
)
{...}

パラメーター

[in] Dpc

このコールバック ルーチンに関連付けられている DPC オブジェクトを表す KDPC 構造体への呼び出し元指定ポインター。

[in, optional] DeferredContext

CustomDpc の場合、以前の KeInitializeDpc の呼び出しで指定されたドライバー定義のコンテキスト情報への呼び出し元が指定したポインター。

CustomThreadedDpc の場合は、ドライバー定義のコンテキスト情報を指定します。 DPC オブジェクトを初期化すると、ドライバーは、この値を DeferredContext パラメーターとして KeInitializeThreadedDpc に指定しました。

この CustomTimerDpc ルーチンに関連付けられている DPC オブジェクトを表す KDPC 構造体への呼び出し元指定ポインター。

[in, optional] SystemArgument1

以前の KeInsertQueueDpc の呼び出しで指定されたドライバー指定の情報への呼び出し元指定ポインター。 DPC を DPC キューに追加すると、ドライバーは 、この値を SystemArgument1 パラメーターとして KeInsertQueueDpc に指定しました。

CustomTimerDpc の場合、この値は使用されません。

[in, optional] SystemArgument2

ドライバー定義のコンテキスト情報を指定します。 DPC を DPC キューに追加すると、ドライバーは、この値を SystemArgument2 パラメーターとして KeInsertQueueDpc に指定しました。

CustomTimerDpc の場合、この値は使用されません。

戻り値

なし

解説

DPC オブジェクトを作成し、そのオブジェクトの CustomDpc ルーチンを登録するには、ドライバーが KeInitializeDpc を呼び出す必要があります。 (DPC ルーチンが 1 つだけ必要な場合は、 DpcForIsr ルーチンとシステム割り当て DPC オブジェクトを使用できます)。

CustomDpc ルーチンを実行キューに登録するには、ドライバーの InterruptService ルーチンで KeInsertQueueDpc を呼び出す必要があります。

1 つ以上の CustomDpc ルーチンは、DpcForIsr ルーチンの代わりに、または DpcForIsr ルーチンと組み合わせて使用できます。 複数の内部 IRP キューを維持するドライバーは、通常、キューごとに CustomDpc ルーチンを提供します。 各 CustomDpc ルーチンは、通常、少なくとも次のタスクを担当します。

  • 現在の IRP で説明されている I/O 操作の完了。

  • ドライバーの IRP キューの 1 つから次の IRP をデキューします。 (システム提供の IRP キューと StartIo ルーチン呼び出し IoStartNextPacket を使用するドライバー)。

  • 現在の IRP で I/O 状態ブロックを設定し、完了した要求に対して IoCompleteRequest を呼び出します。

CustomDpc ルーチンでは、失敗した操作を再試行したり、小さな部分に分割された大きな I/O 要求に対して次の転送を設定したりすることもできます。

CustomDpc ルーチンの詳細については、「DPC オブジェクトと DPC」を参照してください。

ドライバーは、 KeInitializeThreadedDpc を呼び出すことによって、DPC オブジェクトの CustomThreadedDpc を登録しますCustomThreadedDpc ルーチンが実行されるように DPC を DPC キューに実際に追加するには、KeInsertQueueDpc を呼び出します。

CustomThreadedDpc ルーチンの使用の詳細については、「スレッド化された DPC の概要」を参照してください。

CustomThreadedDpc ルーチンは、IRQL = DISPATCH_LEVELで実行することも、IRQL = PASSIVE_LEVELでリアルタイム スレッドで実行することもできます。

DPC オブジェクトを作成し、そのオブジェクトの CustomTimerDpc ルーチンを登録するには、ドライバーが KeInitializeDpc を呼び出す必要があります。

実行のために CustomTimerDpc ルーチンをキューに登録するには、ドライバー ルーチンで KeSetTimer または KeSetTimerEx を呼び出し、KeInitializeDpc によって返される DPC オブジェクト ポインターを指定する必要があります。 タイマー間隔の有効期限が切れると、 システムは CustomTimerDpc ルーチンを呼び出します。

CustomTimerDpc ルーチンの詳細については、「タイマー オブジェクトと DPC」を参照してください。

コールバック ルーチンを定義するには、まず、定義するコールバック ルーチンの種類を識別する関数宣言を指定する必要があります。 Windows には、ドライバーのコールバック関数型のセットが用意されています。 コールバック関数の種類を使用して関数を宣言すると、 ドライバーのコード分析静的ドライバー検証ツール (SDV)、およびその他の検証ツールでエラーが検出され、Windows オペレーティング システムのドライバーを記述するための要件になります。

たとえば、 という名前MyCustomDpcCustomDpc コールバック ルーチンを定義するには、次のコード例に示すように、KDEFERRED_ROUTINE型を使用します。

KDEFERRED_ROUTINE MyCustomDpc;

次に、コールバック ルーチンを次のように実装します。

_Use_decl_annotations_
VOID
  MyCustomDpc(
    struct _KDPC  *Dpc,
    PVOID  DeferredContext,
    PVOID  SystemArgument1,
    PVOID  SystemArgument2
    )
  {
      // Function body
  }

要件

要件
対象プラットフォーム デスクトップ
Header wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)
IRQL DISPATCH_LEVELで呼び出されます。

こちらもご覧ください

KeInsertQueueDpc

KeSetTimer

KeSetTimerEx