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で呼び出されます。 |