割り込みの処理
このトピックでは、DIRQL 割り込みを処理する方法について説明します。 パッシブ レベルの割り込み処理については、「パッシブ レベルの割り込み処理」を参照してください。
割り込み処理は、2 つの手順で、場合によっては 3 つの手順で構成されます。
IRQL = DIRQL で実行される割り込みサービス ルーチンで、揮発性情報 (レジスタの内容など) をすばやく保存します。
IRQL = DISPATCH_LEVEL で実行される遅延プロシージャ 呼び出し (DPC) で、保存された揮発性情報を処理します。
必要に応じて、IRQL = PASSIVE_LEVEL で追加作業を実行します。
デバイスがハードウェア割り込みを生成すると、フレームワークはドライバーの割り込みサービス ルーチン (ISR) を呼び出します。このルーチンは、フレームワーク ベースのドライバーが EvtInterruptIsr コールバック関数として実装します。
デバイスの DIRQL で実行される EvtInterruptIsr コールバック関数は、レジスタの内容など、別の割り込みが発生した場合に失われる割り込み情報をすばやく保存する必要があります。
通常、EvtInterruptIsr コールバック関数は、保存された情報を後でより低い IRQL (DISPATCH_LEVEL) で処理するために、遅延プロシージャ呼び出し (DPC) をスケジュールします。 フレームワーク ベースのドライバーは、EvtInterruptDpc または EvtDpcFunc コールバック関数として DPC ルーチンを実装します。
ほとんどのドライバーは、割り込みの種類ごとに 1 つの EvtInterruptDpc コールバック関数を使用します。 EvtInterruptDpc コールバック関数の実行をスケジュールするには、ドライバーが EvtInterruptIsr コールバック関数内から WdfInterruptQueueDpcForIsr を呼び出す必要があります。
ドライバーがデバイスごとに複数のフレームワーク キュー オブジェクトを作成する場合は、キューごとに個別の DPC オブジェクトと EvtDpcFunc コールバック関数を使用することを検討してください。 EvtDpcFunc コールバック関数の実行をスケジュールするには、ドライバーは最初に WdfDpcCreate を呼び出して、1 つ以上の DPC オブジェクトを作成する必要があります。通常はドライバーの EvtDriverDeviceAdd コールバック関数内です。 その後、ドライバーの EvtInterruptIsr コールバック関数は WdfDpcEnqueue を呼び出すことができます。
ドライバーは通常、EvtInterruptDpc または EvtDpcFunc コールバック関数で I/O 要求を完了します。
ドライバーが IRQL = PASSIVE_LEVEL で割り込み処理操作を実行する必要がある場合があります。 このような場合、IRQL = DISPATCH_LEVEL で実行されるドライバーの EvtInterruptDpc または EvtDpcFunc コールバック関数は、IRQL = PASSIVE_LEVEL で実行される 1 つ以上のフレームワーク作業項目の実行をスケジュールできます。
デバイス割り込み処理中に作業項目を使用するドライバーの例については、「PCIDRV サンプル ドライバー」を参照してください。