次の方法で共有


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

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

CustomDpc ルーチンは、InterruptService ルーチンが戻った後、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 オブジェクトを初期化するときに、ドライバーは、KeInitializeThreadedDpc する DeferredContext パラメーターとしてこの値を指定しました。

この 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 ルーチンの代わりに、または組み合わせて使用できます。 複数の内部 IRP キューを維持するドライバーは、通常、各キューの CustomDpc ルーチンを提供します。 CustomDpc ルーチン は、通常、少なくとも次のタスクを担当します。

  • 現在の IRP によって記述されている I/O 操作を完了します。

  • ドライバーのいずれかの IRP キューから次の IRP をデキューします。 (StartIo ルーチン呼び出しと共に、システム提供の IRP キューを使用するドライバー 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 オペレーティング システムのドライバーを記述するための要件になります。

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

KDEFERRED_ROUTINE MyCustomDpc;

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

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

必要条件

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

関連項目

KeInsertQueueDpc

KeSetTimer

KeSetTimerEx