Freigeben über


Aktivieren oder Inaktivieren eines ISR

Ab Windows 8 kann ein Treiber die IoReportInterruptActive- oder IoReportInterruptInactive-Routine aufrufen, um eine registrierte Interruptdienstroutine (ISR) aktiv oder inaktiv zu machen.

Um einen ISR zu registrieren und den ISR mit einem Interrupt oder einer Gruppe von Interrupts zu verbinden, ruft der Treiber die IoConnectInterruptEx-Routine auf. Nachdem der ISR registriert wurde, kann der Treiber IoReportInterruptActive und IoReportInterruptInactive verwenden, um einfache (oder "weiche") Verbindungs- und Trennungsvorgänge auszuführen, die die Registrierung des ISR unverändert lassen. IoReportInterruptInactive deaktiviert Aufrufe des ISR, indem der zugehörige Interrupt oder die zugehörigen Interrupts vorläufig getrennt werden. IoReportInterruptActive stellt diese Unterbrechungen soft her, um Aufrufe des ISR zu aktivieren.

Beispielsweise kann ein Treiber IoReportInterruptInactive aufrufen, um eine Reihe von Interrupts vorläufig zu trennen, bevor ein Gerät den D0-Energiezustand verlässt, und IoReportInterruptActive aufrufen, um diese Interrupts nach dem Erneutenten des Geräts mit D0 zu verbinden. Im Prinzip kann ein Treiber stattdessen IoDisconnectInterruptEx aufrufen, bevor das Gerät D0 verlässt, und IoConnectInterruptEx aufrufen, nachdem das Gerät D0 erneut aktiviert hat. IoReportInterruptXxx-Aufrufe sind jedoch schneller als IoConnectInterruptEx- und IoDisconnectInterruptEx-Aufrufe. Im Gegensatz zu IoConnectInterruptEx - und IoDisconnectInterruptEx-Aufrufen , die aus einer Vielzahl von Gründen fehlschlagen können (z. B. unzureichende Systemressourcen), schlagen IoReportInterruptXxx-Aufrufe selten, wenn überhaupt, fehl. Darüber hinaus können die IoReportInterruptXxx-Routinen unter IRQL <= DISPATCH_LEVEL aufgerufen werden, während IoConnectInterruptEx und IoDisconnectInterruptEx nur bei PASSIVE_LEVEL aufgerufen werden können.

Standardmäßig ist der ISR aktiv (und Aufrufe des ISR sind aktiviert), nachdem IoConnectInterruptEx den ISR erfolgreich registriert hat.

Aufrufe von IoReportInterruptInactive und IoReportInterruptActive sind optional. Wenn ein Treiber diese Routinen nie aufruft, bleibt der registrierte ISR aktiv, bis der Treiber die IoDisconnectInterruptEx-Routine aufruft , um die Registrierung des ISR aufzuheben.

Der Treiber sollte das Gerät nur so konfigurieren, dass Interrupts ausstellen, wenn der ISR für diese Interrupts aktiv ist. Fehler, um zu verhindern, dass ein Gerät Interrupts ausgibt, wenn der ISR inaktiv ist, kann zu Systeminstabilität führen. Wenn ein Gerät beispielsweise eine pegelgesteuerte Interruptleitung mit anderen Geräten teilt und das Gerät Interruptanforderungen ausgibt, wenn der ISR inaktiv ist, werden die ISRs für die anderen Geräte in der Leitung den Interrupt nicht bestätigen, und der Interrupt wird weiterhin ausgelöst. Vor dem Aufrufen von IoReportInterruptInactive sollte der Treiber das Gerät so konfigurieren, dass die Ausgabe von Interrupts beendet wird. Nach dem Aufrufen von IoReportInterruptActive sollte der Treiber das Gerät so konfigurieren, dass interrupts ausgegeben werden.

Um die Registrierung eines ISR aufzuheben, kann ein Treiber IoDisconnectInterruptEx aufrufen, unabhängig davon, ob der ISR derzeit aktiv oder inaktiv ist.

Ein IoReportInterruptActive-Aufruf , der auftritt, wenn der ISR bereits aktiv ist, hat keine Auswirkung, wird aber nicht als Fehler behandelt. Ebenso hat ein IoReportInterruptInactive-Aufruf , der auftritt, wenn der ISR bereits inaktiv ist, keine Auswirkung, wird aber nicht als Fehler behandelt.