Unterbrechen von Synchronisierungsobjekten
Der PortCls-Systemtreiber implementiert die IInterruptSync-Schnittstelle zugunsten von Miniporttreibern. IInterruptSync stellt ein Interruptsynchronisierungsobjekt dar, das die Ausführung einer Liste von Interruptdienstroutinen (ISRs) mit Nicht-Interrupt-Routinen synchronisiert.
Interruptsynchronisierungsobjekte bieten zwei wichtige Funktionen:
Ausführung einer Liste von ISRs als Reaktion auf einen Interrupt. Das Synchronisierungsobjekt ist mit einer Interruptquelle verbunden. Jedes Mal, wenn der Interrupt auftritt, führt das Synchronisierungsobjekt die ISRs gemäß dem ausgewählten Modus in einer angegebenen Reihenfolge aus. (Siehe folgende Beschreibung der drei Modi.)
Ausführung von Routinen, die keine ISRs sind. Diese Nicht-Interrupt-Routinen sind nicht mit dem Interrupt des Synchronisierungsobjekts verbunden. Stattdessen wird eine Nicht-Unterbrechungsroutine zu einem Zeitpunkt ausgeführt, zu dem der Aufrufer sich entscheidet. Das Synchronisierungsobjekt führt jedoch die Nicht-Interrupt-Routine synchron mit der Liste der ISRs des Objekts aus. Anders ausgedrückt: Die Nicht-Interrupt-Routine wird bis zum Abschluss ausgeführt, bevor eine der ISRs in der Liste des Synchronisierungsobjekts mit der Ausführung beginnt und umgekehrt.
Ein Interruptsynchronisierungsobjekt ist flexibel im Umgang mit mehreren ISRs. Die ISRs befinden sich in einer verknüpften Liste, die das Synchronisierungsobjekt zur Unterbrechungszeit durchläuft. Wenn ein Miniporttreiber einen ISR mit einem Synchronisierungsobjekt registriert, gibt er an, ob der ISR am Anfang oder Am Ende dieser Liste hinzugefügt werden soll.
Ein Miniporttreiber ruft die PcNewInterruptSync-Funktion auf, um ein Interruptsynchronisierungsobjekt zu erstellen. Während dieses Aufrufs gibt der Treiber die Art und Weise an, in der das Objekt seine Liste der ISRs zur Unterbrechungszeit durchlaufen soll. Der Aufruf unterstützt die drei Optionen, die von den INTERRUPTSYNCMODE-Enumerationskonstanten in der folgenden Tabelle angegeben werden.
Konstante | Bedeutung |
---|---|
InterruptSyncModeNormal |
Rufen Sie jede ISR in der Liste auf, bis einer von ihnen STATUS_SUCCESS zurückgibt. |
InterruptSyncModeAll |
Rufen Sie jede ISR in der Liste genau einmal auf, unabhängig von den Rückgabecodes der vorherigen ISRs. |
InterruptSyncModeRepeat |
Durchlaufen Sie die gesamte Liste der ISRs, bis eine Reise durch die Liste stattfindet, in der kein ISR in der Liste STATUS_SUCCESS zurückgibt. |
Im InterruptSyncModeNormal-Modus ruft das Synchronisierungsobjekt jeden ISR in der Liste auf, bis einer von ihnen STATUS_SUCCESS zurückgibt. Alle ISRs in der Liste, die dieser ISR folgen, werden nicht aufgerufen. Dieser Modus emuliert die Art und Weise, wie das Betriebssystem ISRs normalerweise verarbeitet. Wenn keiner der ISRs STATUS_SUCCESS zurückgibt, ist das Verhalten mit InterruptSyncModeAll identisch.
Im InterruptSyncModeAll-Modus wird jeder ISR in der Liste genau einmal aufgerufen, unabhängig von den Rückgabecodes der vorherigen ISRs. Dies ist für primitivere Hardware vorgesehen, bei der die Quelle des Interrupts nicht deterministisch ist, obwohl dies auch in anderen Situationen nützlich sein kann. Beispielsweise können zwei Interruptquellen bei jedem Interrupt eng synchronisiert werden, unabhängig davon, aus welcher der beiden Quellen ein bestimmter Interrupt stammt.
Im InterruptSyncModeRepeat-Modus durchläuft das Synchronisierungsobjekt wiederholt die gesamte Liste der ISRs, bis eine Durchreise durch die Liste erfolgt, bei der keine Routine in der Liste STATUS_SUCCESS zurückgibt. Dieser Modus eignet sich für Situationen, in denen Interrupts von mehreren Quellen gleichzeitig in derselben Interruptzeile ausgelöst werden oder während der ISR-Verarbeitung ein zweiter Interrupt ausgelöst werden kann. Jede Interruptquelle muss in der Lage sein zu bestimmen, ob eine Verarbeitung erforderlich ist. Das System reagiert nicht mehr, wenn ein ISR, der immer STATUS_SUCCESS zurückgibt, bei einem Synchronisierungsobjekt in diesem Modus registriert ist.
In einem dieser Modi bestätigt das Synchronisierungsobjekt den Interrupt für das Betriebssystem, wenn einer der registrierten ISRs STATUS_SUCCESS zurückgibt. Wenn in allen drei Modi alle Interruptquellen angeben, dass sie den Interrupt nicht erfolgreich verarbeitet haben, gibt das Synchronisierungsobjekt einen nicht erfolgreichen Ergebniscode an das Betriebssystem zurück.
Die IInterruptSync-Schnittstelle unterstützt die folgenden Methoden: