次の方法で共有


ISR をアクティブまたは非アクティブにする

Windows 8 以降では、ドライバーは、IoReportInterruptActive または IoReportInterruptInactive ルーチンを呼び出して、登録された割り込みサービス ルーチン (ISR) をアクティブまたは非アクティブにすることができます。

ISR を登録し、ISR を 1 つの割り込みまたは割り込みのセットに接続するために、ドライバーは IoConnectInterruptEx ルーチンを呼び出します。 ISR が登録されると、ドライバーは IoReportInterruptActiveIoReportInterruptInactive を使用して、ISR の登録を変更せずに、軽量 (または "ソフト") 接続および切断操作を実行できます。 IoReportInterruptInactive は、関連付けられた 1 つまたは複数の割り込みをソフト切断することで、ISR への呼び出しを無効にします。 IoReportInterruptActive は、これらの割り込みをソフト接続して ISR への呼び出しを有効にします。

たとえば、ドライバーは、デバイスが D0 電源状態を終了する前に IoReportInterruptInactive を呼び出して、一連の割り込みをソフト切断し、デバイスが D0 に再入力した後に IoReportInterruptActive を呼び出して、これらの割り込みをソフト接続することができます。 これに代わって、原理上、ドライバーは、デバイスが D0 を終了する前に IoDisconnectInterruptEx を呼び出し、デバイスが D0 を再入力した後に IoConnectInterruptEx を呼び出すことができます。 ただし、IoReportInterruptXxx の呼び出しは、IoConnectInterruptEx 呼び出しと IoDisconnectInterruptEx 呼び出しよりも高速です。 IoConnectInterruptEx および IoDisconnectInterruptEx の呼び出しとは異なり、さまざまな理由 (システム リソースの不足など) によって失敗する可能性があります。IoReportInterruptXxx 呼び出しが失敗することはほとんどありません。 さらに、IoReportInterruptXxx ルーチンは IRQL <= DISPATCH_LEVEL で呼び出すことができますが、IoConnectInterruptExIoDisconnectInterruptEx は PASSIVE_LEVEL でのみ呼び出すことができます。

既定では、IoConnectInterruptEx が ISR を正常に登録した後、ISR はアクティブになっています (ISR への呼び出しが有効になります)。

IoReportInterruptInactive および IoReportInterruptActive の呼び出しは省略可能です。 ドライバーがこれらのルーチンを呼び出さない場合、ドライバーが IoDisconnectInterruptEx ルーチンを呼び出して ISR の登録を解除するまで、登録されている ISR はアクティブなままです。

ドライバーは、これらの割り込みの ISR がアクティブな場合にのみ割り込みを発行するようにデバイスを構成する必要があります。 ISR が非アクティブな場合にデバイスが割り込みを発行できないようにしないと、システムが不安定になる可能性があります。 たとえば、あるデバイスがレベルでトリガーされる割り込みラインを他のデバイスと共有していて、ISR が非アクティブのときにデバイスが割り込み要求を発行すると、ライン上の他のデバイスの ISR は割り込みを認識せず、割り込みは発生し続けます。 IoReportInterruptInactive を呼び出す前に、ドライバーは割り込みの発行を停止するようにデバイスを構成する必要があります。 IoReportInterruptActive を呼び出した後、ドライバーは割り込みの発行を開始するようにデバイスを構成する必要があります。

ISR の登録を解除するために、ドライバーは、ISR が現在アクティブか非アクティブかに関係なく、IoDisconnectInterruptEx を呼び出すことができます。

ISR が既にアクティブな場合に発生する IoReportInterruptActive 呼び出しは何も作用しませんが、エラーとしては扱われません。 同様に、ISR が既に非アクティブな場合に発生する IoReportInterruptInactive 呼び出しは何も作用しませんが、これもエラーとして扱われません。