割り込みの有効化と無効化
ドライバーがデバイスの割り込みを処理する場合は、割り込みを有効または無効にする EvtInterruptEnable および EvtInterruptDisable コールバック関数を提供する必要があります。 通常、これらのコールバック関数はデバイスの DIRQL で実行され、デバイスの割り込みメカニズムを有効または無効にするために必要な操作を行う必要があります。 パッシブレベルの割り込みの場合 、これらのコールバック関数は、パッシブレベルの割り込みロックを保持しながら IRQL = PASSIVE_LEVEL で実行されます。
ドライバーが割り込みの有効化または無効化に関連する追加の操作を実行する必要があり、これらの追加操作を IRQL = DIRQL で実行できない場合、ドライバーは EvtDeviceD0EntryPostInterruptsEnabled および EvtDeviceD0ExitPreInterruptsDisabled コールバック関数を提供することもできます。 これら 2 つのコールバック関数は、割り込みロックを保持せずに IRQL = PASSIVE_LEVELで実行され、IRQL = DIRQL で使用できないフレームワーク オブジェクト メソッドを呼び出すことができます。
フレームワークは、デバイスが動作 (D0) 状態に入るたびに、ドライバーの EvtDeviceD0Entry コールバック関数を呼び出した後、ドライバーの EvtInterruptEnable および EntryPostInterruptsEnabled コールバック関数を呼び出します。
フレームワークは、デバイスが動作状態を離れるたびに、ドライバーの EvtDeviceD0Exit コールバック関数を呼び出す前に、ドライバーの EvtDeviceD0ExitPreInterruptsDisabled コールバック関数と EvtInterruptDisable コールバック関数を呼び出します。 フレームワークがドライバーのコールバック関数を呼び出すタイミングについては、「PnP and Power Management Scenarios」を参照してください。
フレームワークがドライバーの EvtInterruptEnable コールバック関数を呼び出すたびに、デバイスが同じ割り込みリソースを使用することを想定しないでください。 PnP マネージャーがシステム リソースを再配布し、デバイスに新しい割り込みリソースを割り当てる場合があります。
ドライバーは、WdfInterruptGetInfo を呼び出して、デバイスの割り込みリソースを判断できます。 ドライバーは、WdfInterruptGetDevice を呼び出して、割り込みオブジェクトが属しているデバイスを特定できます。 (いくつかのドライバーは WdfInterruptWdmGetInterrupt を呼び出す可能性があります。)
割り込みを直接有効または無効にするには、ドライバーは、割り込みオブジェクトの WdfInterruptEnable および WdfInterruptDisable メソッドを呼び出すことができます。このメソッドは、ドライバーの EvtInterruptEnable および EvtInterruptDisable イベント コールバック関数を呼び出します。 ただし、ほとんどのドライバーは、フレームワークが適切なタイミングで EvtInterruptEnable および EvtInterruptDisable コールバック関数を呼び出せるようにする必要があります。