Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Ein Windows Driver Frameworks (WDF)-Treiber, der die Hardwareunterbrechungen eines Geräts verarbeitet, muss für jeden Interrupt, den jedes Gerät unterstützen kann, ein Framework-Interruptobjekt erstellen. In Framework-Versionen 1.11 und höher, die unter Windows 8 oder höher ausgeführt werden, können Kernel-Mode Driver Framework (KMDF) und User-Mode Driver Framework (UMDF)-Treiber Unterbrechungsobjekte erstellen, die eine passive Behandlung erfordern. Sofern Sie keinen Treiber für ein System auf einer Chip-Plattform (SoC) schreiben, sollte Ihr Treiber jedoch DIRQL-Interruptobjekte verwenden.
Ein Treiber erstellt in der Regel Framework-Interruptobjekte in seiner EvtDriverDeviceAdd-Rückruffunktion . Ein Treiber kann auch Unterbrechungsobjekte aus seiner EvtDevicePrepareHardware-Rückruffunktion erstellen.
Das Framework ruft die EvtDriverDeviceAdd-Rückruffunktion des Treibers auf, bevor der Plug and Play (PnP)-Manager Systemressourcen wie Interruptvektoren dem Gerät zuweist. Nachdem der PnP-Manager Ressourcen zugewiesen hat, speichert das Framework Unterbrechungsressourcen im Interruptobjekt des Geräts. (Treiber, die Plug and 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 Unterbrechungen:
- Pegelgesteuert (geteilt oder exklusiv)
- Flankengesteuert (ausschließlich exklusiv)
- MSI (exklusiv nach Definition)
Anmerkung UMDF unterstützt keine geteilten flankengesteuerten Unterbrechungen.
Ab UMDF Version 2.15 unterstützt UMDF Interrupts für einfache Geräte wie Hardware-Pushtasten, die in der Regel durch GPIO-Pins unterstützt werden, die Sie nicht explizit mithilfe von Hardwareregistern aktivieren oder deaktivieren können. Um solche Geräte zu unterstützen, muss ein UMDF-Treiber exklusive Flanken-getriggerte Unterbrechungen verwenden.
Seit KMDF Version 1.15 unterstützt KMDF auch Interrupts für solche Geräte, ohne den Workaround, wie unter "Handling Active-Both Interrupts" beschrieben.
Auch in WDF_INTERRUPT_CONFIG stellt Ihr Treiber Zeiger auf die folgenden vom Treiber bereitgestellten Ereignisrückruffunktionen bereit:
EvtInterruptEnable
Aktiviert einen Hardwareunterbruch.
EvtInterruptDisable
Deaktiviert das Hardwareinterrupt.
EvtInterruptIsr
Interrupt-Serviceroutine (ISR) für den Interrupt.
EvtInterruptDpc
Verzögerter Prozeduraufruf (DPC) für den Interrupt.
EvtInterruptWorkItem
Arbeitselement für eine Unterbrechung auf passiver Ebene.
Für Treiber, die Framework-Version 1.11 oder höher unter Windows 8 oder höher verwenden, kann vom Treiber das übergeordnete Objekt eines Framework-Interruptobjekts (DIRQL oder passiv) explizit auf ein Framework-Geräteobjekt oder ein Framework-Warteschlangenobjekt festgelegt werden. Wenn der Treiber ein übergeordnetes Element angibt, muss der Treiber das AutomaticSerialization-Element der WDF_INTERRUPT_CONFIG Struktur des Interruptobjekts auf TRUE festlegen. Denken Sie daran, dass das Framework die Ausführung der Rückruffunktion des EvtInterruptDpc oder EvtInterruptWorkItem des Interruptobjekts mit den Rückruffunktionen von anderen Objekten synchronisiert, die sich unterhalb des übergeordneten Objekts des Interrupts befinden.
Ein Treiber kann beispielsweise eine Warteschlange als übergeordnetes Element eines Interrupts angeben, um die Callbacks der Warteschlange entweder mit dem EvtInterruptDpc- oder dem EvtInterruptWorkItem-Callback 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 aus seiner EvtDriverDeviceAdd-Rückruffunktion auf.
Das Framework löscht automatisch den Interrupt, bevor das Elternobjekt des Interrupts gelöscht wird. Optional kann ein Treiber WdfObjectDelete aufrufen, um den Interrupt zu einem früheren Zeitpunkt zu löschen.
Unterstützung von nachrichtensignalierten Unterbrechungen
Windows Vista und höhere Versionen unterstützen Nachrichtensignalunterbrechungen (MSIs). Damit das Betriebssystem MSIs für Ihr Gerät unterstützt, muss die INF-Datei Ihres Treibers einige Werte in der Registrierung festlegen. Informationen darüber, wie Sie diese Werte festlegen, finden Sie unter Aktivieren von Message-Signaled Interrupts in der Registrierung.
Ihr Treiber sollte ein Framework-Interruptobjekt für jeden Interruptvektor oder jede MSI-Nachricht erstellen, die das Gerät unterstützt. Wenn der PnP-Manager dem Gerät nicht alle von dem Gerät unterstützten Interruptressourcen gewährt, verwendet der Treiber nicht die zusätzlichen Interruptobjekte und ruft seine Rückruffunktionen nicht auf.
In Windows 7 unterstützt das Betriebssystem keine Ressourcenanforderungen für mehr als 910 Interruptnachrichten pro Gerätefunktion. Unter Windows 8 unterstützt das Betriebssystem keine Ressourcenanforderungen für mehr als 2.048 Unterbrechungen pro Gerätefunktion.
Wenn der Gerätetreiber diesen Grenzwert überschreitet, kann das Gerät nicht gestartet werden. Um auf einem Computer mit vielen logischen Prozessoren zu arbeiten, sollte der Treiber nicht mehr als einen Interrupt pro Prozessor anfordern.
Ein Treiber muss ohne Fehler die Systemneuverteilung von Unterbrechungsressourcen tolerieren, bei denen der PnP-Manager dem Gerät alle alternativen Unterbrechungsressourcen aus der Liste der Ressourcenanforderungen zuweist. Beispielsweise kann dem Gerät eine kleinere Anzahl von Nachrichtenunterbrechungen zugewiesen werden, als der angeforderte Treiber. Im schlimmsten Fall muss der Treiber bereit sein, das Gerät mit nur einem zeilenbasierten Interrupt zu betreiben.