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 オペレーティング システムのドライバーを記述するための要件になります。
たとえば、 という名前MyCustomDpc
の CustomDpc コールバック ルーチンを定義するには、次のコード例に示すように、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で呼び出されます。 |