EVT_WDF_DPC コールバック関数 (wdfdpc.h)
[KMDF にのみ適用]
ドライバーの EvtDpcFunc コールバック関数は、IRQL = DISPATCH_LEVELでドライバー定義の操作を実行します。
構文
EVT_WDF_DPC EvtWdfDpc;
void EvtWdfDpc(
[in] WDFDPC Dpc
)
{...}
パラメーター
[in] Dpc
フレームワーク DPC オブジェクトへのハンドル。
戻り値
なし
解説
EvtDpcFunc コールバック関数を登録するには、ドライバーが関数のアドレスをWDF_DPC_CONFIG構造体に配置し、WdfDpcCreate を呼び出す必要があります。
ドライバーは通常、EvtDpcFunc コールバック関数で I/O 要求を完了します。
EvtDpcFunc コールバック関数は、DISPATCH_LEVELで実行され、ページング可能なコードにアクセスすることはできません。 EvtDpcFunc コールバック関数が IRQL = PASSIVE_LEVELで操作を実行する必要がある場合は、フレームワーク作業項目を使用できます。
多くのドライバーは、 EvtDpcFunc コールバック関数を提供する代わりに、デバイスがサポートする割り込みの種類ごとに 1 つの EvtInterruptDpc コールバック関数を提供します。 ドライバーがデバイスごとに複数の フレームワーク キュー オブジェクト を作成する場合は、キューごとに個別の DPC オブジェクトと EvtDpcFunc コールバック関数を使用することを検討してください。
EvtDpcFunc コールバック関数の実行をスケジュールするには、ドライバーで WdfDpcEnqueue を呼び出す必要があります。 ドライバーは通常、EvtInterruptIsr コールバック関数から WdfDpcEnqueue を呼び出します。
ドライバーが WdfDpcEnqueue を呼び出すと、システムは、システムの DPC キューに DPC オブジェクトを追加します。 システムが優先度の高いタスクを実行していない場合は、キューから オブジェクトを削除し、オブジェクトの EvtDpcFunc コールバック関数を呼び出します。
オブジェクトが既にキューに入っている場合、システムは DPC オブジェクトを DPC キューに追加しません。 システムが EvtDpcFunc コールバック関数を呼び出す前に、EvtInterruptIsr コールバック関数が複数回呼び出されることがあります。 したがって、 EvtDpcFunc コールバック関数は、複数の割り込みからの情報を処理でき、最後に呼び出されてから発生したすべての割り込みを処理する必要があります。
通常、ドライバーの EvtDpcFunc コールバック関数の実行を他のコールバック関数の実行と同期する必要があります。 詳細については、「 割り込みコードの同期」を参照してください。
DPC オブジェクトの親オブジェクトへのハンドルを取得するために、 EvtDpcFunc コールバック関数は WdfDpcGetParentObject を呼び出すことができます。 DPC オブジェクトの基になる KDPC 構造体へのポインターを取得するために、 EvtDpcFunc コールバック関数は WdfDpcWdmGetDpc を呼び出すことができます。
EvtDpcFunc コールバック関数の使用の詳細については、「割り込みのサービス」を参照してください。
要件
要件 | 値 |
---|---|
対象プラットフォーム | ユニバーサル |
最小 KMDF バージョン | 1.0 |
Header | wdfdpc.h (Wdf.h を含む) |
IRQL | DISPATCH_LEVEL |