Aktivieren und Deaktivieren von Interrupts
Wenn Ihr Treiber Geräteunterbrechungen verarbeitet, muss er Die Rückruffunktionen EvtInterruptEnable und EvtInterruptDisable bereitstellen, die die Interrupts aktivieren und deaktivieren. In der Regel werden diese Rückruffunktionen auf dem DIRQL des Geräts ausgeführt und müssen alles tun, was erforderlich ist, um den Interruptmechanismus eines Geräts zu aktivieren und zu deaktivieren. Bei Interrupts auf passiver Ebene werden diese Rückruffunktionen bei IRQL = PASSIVE_LEVEL ausgeführt, während die Interruptsperre auf passiver Ebene gedrückt wird.
Wenn Ihr Treiber zusätzliche Vorgänge ausführen muss, die sich auf das Aktivieren oder Deaktivieren von Interrupts beziehen, und wenn diese zusätzlichen Vorgänge nicht unter IRQL = DIRQL ausgeführt werden können, kann der Treiber auch Die Rückruffunktionen EvtDeviceD0EntryPostInterruptsEnabled und EvtDeviceD0ExitPreInterruptsDisabled bereitstellen. Diese beiden Rückruffunktionen werden unter IRQL = PASSIVE_LEVEL ohne Unterbrechungssperre ausgeführt und können Frameworkobjektmethoden aufrufen, die unter IRQL = DIRQL nicht verfügbar sind.
Das Framework ruft die Rückruffunktionen EvtInterruptEnable und EvtDeviceD0EntryPostInterruptsEnabled jedes Mal auf, wenn das Gerät in seinen Arbeitszustand (D0) wechselt, nachdem das Framework die Rückruffunktion EvtDeviceD0Entry des Treibers aufgerufen hat.
Das Framework ruft die Rückruffunktionen EvtDeviceD0ExitPreInterruptsDisabled und EvtInterruptDisable jedes Mal auf, wenn das Gerät seinen Arbeitszustand verlässt, bevor das Framework die Rückruffunktion EvtDeviceD0Ex des Treibers aufruft . Weitere Informationen dazu, wann das Framework die Rückruffunktionen eines Treibers aufruft, finden Sie unter PnP- und Energieverwaltungsszenarien.
Sie dürfen nicht davon ausgehen, dass ein Gerät jedes Mal dieselben Interruptressourcen verwendet, wenn das Framework die EvtInterruptEnable-Rückruffunktion Ihres Treibers aufruft. Manchmal verteilt der PnP-Manager Systemressourcen neu und weist Ihrem Gerät möglicherweise neue Interruptressourcen zu.
Der Treiber kann WdfInterruptGetInfo aufrufen, um die Interruptressourcen eines Geräts zu bestimmen. Der Treiber kann WdfInterruptGetDevice aufrufen, um das Gerät zu bestimmen, zu dem ein Interruptobjekt gehört. (Einige Treiber können WdfInterruptWdmGetInterrupt aufrufen.)
Um Interrupts direkt zu aktivieren und zu deaktivieren, kann der Treiber die WdfInterruptEnable - und WdfInterruptDisable-Methoden des Interruptobjekts aufrufen, die die Rückruffunktionen EvtInterruptEnable und EvtInterruptDisable des Treibers aufrufen. Die meisten Treiber sollten jedoch nur zulassen, dass das Framework die Rückruffunktionen EvtInterruptEnable und EvtInterruptDisable zu den richtigen Zeiten aufruft.