Share via


Warten eines Interrupts

In diesem Thema wird beschrieben, wie Sie einen DIRQL-Interrupt verwalten. Informationen zum Warten eines Interrupts auf passiver Ebene finden Sie unter Unterstützung von Interrupts für passive Ebenen.

Die Wartung eines Interrupts besteht aus zwei und manchmal drei Schritten:

  1. Schnelles Speichern flüchtiger Informationen (z. B. Registrieren von Inhalten) in einer Interruptdienstroutine, die bei IRQL = DIRQL ausgeführt wird.

  2. Verarbeiten der gespeicherten flüchtigen Informationen in einem verzögerten Prozeduraufruf (DPC), der bei IRQL = DISPATCH_LEVEL ausgeführt wird.

  3. Ausführen zusätzlicher Arbeiten bei IRQL = PASSIVE_LEVEL, falls erforderlich.

Wenn ein Gerät einen Hardware-Interrupt generiert, ruft das Framework die Interrupt Service Routine (ISR) des Treibers auf, die frameworkbasierte Treiber als EvtInterruptIsr-Rückruffunktion implementieren.

Die Rückruffunktion EvtInterruptIsr , die auf dem DIRQL des Geräts ausgeführt wird, muss schnell Interruptinformationen speichern, z. B. Inhalte registrieren, die verloren gehen, wenn ein weiterer Interrupt auftritt.

In der Regel plant die Rückruffunktion EvtInterruptIsr einen Aufruf der verzögerten Prozedur (DPC), um die gespeicherten Informationen später bei einem niedrigeren IRQL (DISPATCH_LEVEL) zu verarbeiten. Frameworkbasierte Treiber implementieren DPC-Routinen als EvtInterruptDpc - oder EvtDpcFunc-Rückruffunktionen .

Die meisten Treiber verwenden eine einzelne EvtInterruptDpc-Rückruffunktion für jeden Interrupttyp. Um die Ausführung einer EvtInterruptDpc-Rückruffunktion zu planen, muss ein Treiber WdfInterruptQueueDpcForIsr innerhalb der Rückruffunktion EvtInterruptIsr aufrufen.

Wenn Ihr Treiber mehrere Frameworkwarteschlangenobjekte für jedes Gerät erstellt, sollten Sie ein separates DPC-Objekt und eine EvtDpcFunc-Rückruffunktion für jede Warteschlange verwenden. Um die Ausführung einer EvtDpcFunc-Rückruffunktion zu planen, muss der Treiber zuerst ein oder mehrere DPC-Objekte erstellen, indem er WdfDpcCreate aufruft, in der Regel in der EvtDriverDeviceAdd-Rückruffunktion des Treibers. Dann kann die EvtInterruptIsr-Rückruffunktion des Treibers WdfDpcEnqueue aufrufen.

Treiber führen in der Regel E/A-Anforderungen in ihren Rückruffunktionen EvtInterruptDpc oder EvtDpcFunc aus.

Manchmal muss ein Treiber einige Unterbrechungswartungsvorgänge unter IRQL = PASSIVE_LEVEL ausführen. In solchen Fällen kann die EvtInterruptDpc - oder EvtDpcFunc-Rückruffunktion des Treibers, die mit IRQL = DISPATCH_LEVEL ausgeführt wird, die Ausführung eines oder mehrerer Frameworkarbeitselemente planen, die mit IRQL = PASSIVE_LEVEL ausgeführt werden.

Ein Beispiel für einen Treiber, der Arbeitselemente beim Warten von Geräteunterbrechungen verwendet, finden Sie im PCIDRV-Beispieltreiber .