Erstellen eines Interruptobjekts
Ein WDF-Treiber (Windows Driver Frameworks), der die Hardwareunterbrechungen eines Geräts verarbeitet, muss ein Framework-Interruptobjekt für jeden Interrupt erstellen, den jedes Gerät unterstützen kann. In framework-Versionen 1.11 und höher, die unter Windows 8 oder höheren Versionen des Betriebssystems ausgeführt werden, können treiber Kernel-Mode Driver Framework (KMDF) und User-Mode Driver Framework (UMDF) Interruptobjekte erstellen, die eine behandlung auf passiver Ebene erfordern. Wenn Sie jedoch keinen Treiber für eine SoC-Plattform (System on a Chip) schreiben, sollte Ihr Treiber DIRQL-Interruptobjekte verwenden.
Ein Treiber erstellt in der Regel Framework-Interruptobjekte in seiner Rückruffunktion EvtDriverDeviceAdd . Ein Treiber kann auch Interruptobjekte über seine EvtDevicePrepareHardware-Rückruffunktion erstellen.
Das Framework ruft die Rückruffunktion EvtDriverDeviceAdd des Treibers auf, bevor der Plug & Play-Manager (PnP) dem Gerät Systemressourcen wie Interruptvektoren zugewiesen hat. Nachdem der PnP-Manager Ressourcen zugewiesen hat, speichert das Framework Interruptressourcen im Interruptobjekt des Geräts. (Treiber, die Plug & Play nicht unterstützen, können keine Interruptobjekte verwenden.)
Um ein Framework-Interruptobjekt zu erstellen, muss der Treiber eine WDF_INTERRUPT_CONFIG-Struktur initialisieren und an die WdfInterruptCreate-Methode übergeben.
UMDF unterstützt die folgenden Typen von Interrupts:
- Level-triggered (shared oder exclusive)
- Edgetriggeriert (nur exklusiv)
- MSI (definitionsgemäß exklusiv)
Hinweis UMDF unterstützt keine freigegebenen Edge-ausgelösten Interrupts.
Ab UMDF Version 2.15 unterstützt UMDF Interrupts für einfache Geräte wie Hardwarepushtasten, die in der Regel durch GPIO-Pins unterstützt werden, die Sie nicht explizit mithilfe von Hardwareregistern aktivieren oder deaktivieren können. Zur Unterstützung solcher Geräte muss ein UMDF-Treiber exklusive, durch Edge ausgelöste Interrupts verwenden.
Ab KMDF-Version 1.15 unterstützt KMDF auch Interrupts für solche Geräte, ohne die unter Behandeln Active-Both Interrupts beschriebene Problemumgehung.
Auch in WDF_INTERRUPT_CONFIG stellt Ihr Treiber Zeiger auf die folgenden vom Treiber bereitgestellten Ereignisrückruffunktionen bereit:
EvtInterruptEnable
Aktiviert einen Hardwareunterbrechung.
EvtInterruptDisable
Deaktiviert einen Hardwareunterbrechung.
EvtInterruptIsr
Interrupt-Dienstroutine (ISR) für den Interrupt.
EvtInterruptDpc
Verzögerter Prozeduraufruf (DPC) für den Interrupt.
EvtInterruptWorkItem
Arbeitselement für einen Interrupt auf passiver Ebene.
Für Treiber, die Frameworkversion 1.11 oder höher auf Windows 8 oder höheren Versionen des Betriebssystems verwenden, kann der Treiber das übergeordnete Element eines Framework-Interruptobjekts (DIRQL oder passiv) explizit auf ein Framework-Geräteobjekt oder ein Framework-Warteschlangenobjekt festlegen. Wenn der Treiber ein übergeordnetes Element angibt, muss der Treiber den AutomaticSerialization-Member der WDF_INTERRUPT_CONFIG Struktur des Interruptobjekts auf TRUE festlegen. (Wenn AutomaticSerialization TRUE ist, synchronisiert das Framework die Ausführung der Rückruffunktion EvtInterruptDpc oder EvtInterruptWorkItem des Interruptobjekts mit Rückruffunktionen von anderen Objekten, die sich unterhalb des übergeordneten Objekts des Interrupts befinden.)
Beispielsweise kann ein Treiber eine Warteschlange als übergeordnetes Element eines Interrupts angeben, um die Rückrufe der Warteschlange mit dem Rückruf EvtInterruptDpc oder EvtInterruptWorkItem des Interrupts zu synchronisieren. In dieser Konfiguration löscht das Framework das Warteschlangenobjekt, wenn es das Geräteobjekt löscht.
Nach dem Aufrufen von WdfInterruptCreate kann der Treiber optional WdfInterruptSetPolicy oder WdfInterruptSetExtendedPolicy aufrufen, um zusätzliche Interruptparameter anzugeben. In der Regel ruft der Treiber diese Methoden über seine EvtDriverDeviceAdd-Rückruffunktion auf.
Das Framework löscht den Interrupt automatisch, bevor das übergeordnete Element des Interrupts gelöscht wird. Optional kann ein Treiber WdfObjectDelete aufrufen, um den Interrupt zu einem früheren Zeitpunkt zu löschen.
Unterstützen von Interrupts mit Nachrichtensignalen
MsIs (Message-Signaled Interrupts) werden ab Windows Vista unterstützt. Damit das Betriebssystem MSIs für Ihr Gerät unterstützt, muss die INF-Datei Ihres Treibers einige Werte in der Registrierung festlegen. Informationen zum Festlegen dieser Werte finden Sie unter Aktivieren Message-Signaled Interrupts in der Registrierung.
Ihr Treiber sollte ein Framework-Interruptobjekt für jeden Interruptvektor oder jede MSI-Nachricht erstellen, die vom Gerät unterstützt werden kann. Wenn der PnP-Manager dem Gerät nicht alle Interruptressourcen gewährt, die das Gerät unterstützen kann, werden die zusätzlichen Interruptobjekte nicht verwendet, und ihre Rückruffunktionen werden nicht aufgerufen.
In Windows 7 unterstützt das Betriebssystem keine Ressourcenanforderungen für mehr als 910 Interruptnachrichten pro Gerätefunktion. In Windows 8 unterstützt das Betriebssystem keine Ressourcenanforderungen für mehr als 2048 Unterbrechungen pro Gerätefunktion.
Wenn der Gerätetreiber diesen Grenzwert überschreitet, kann das Gerät möglicherweise nicht gestartet werden. Um auf einem Computer zu arbeiten, der viele logische Prozessoren enthält, sollte der Treiber nicht mehr als einen Interrupt pro Prozessor anfordern.
Ein Treiber muss die Systemrebalisierung von Interruptressourcen tolerieren, bei denen der PnP-Manager dem Gerät eine Reihe alternativer Interruptressourcen aus der Liste der Ressourcenanforderungen zuweist. Beispielsweise kann dem Gerät eine geringere Anzahl von Nachrichtenunterbrechungen zugewiesen werden als der angeforderte Treiber. Im schlimmsten Fall muss der Treiber bereit sein, das Gerät mit nur einem leitungsbasierten Interrupt zu betreiben.