Verwenden von Power-Managed E/A-Warteschlangen

Wenn ein Treiber eine E/A-Warteschlange erstellt, kann er angeben, ob die Warteschlange energieverwaltet ist. Wenn E/A-Anforderungen in einer energieverwalteten Warteschlange verfügbar sind, übermittelt das Framework die Anforderungen nur dann an den Treiber, wenn sich das Gerät im Betriebszustand (D0) befindet. Das Framework erlaubt dem Gerät nicht, seinen Arbeitszustand zu verlassen, bis alle E/A-Anforderungen, die das Framework von der energieverwalteten Warteschlange an den Treiber übermittelt hat, abgeschlossen, abgebrochen oder verschoben wurden.

Weitere Informationen zu energieverwalteten E/A-Warteschlangen finden Sie unter Energieverwaltung für E/A-Warteschlangen.

Rückruffunktionen für Power-Managed Warteschlangen

Wenn Ihr Treiber stromverwaltete E/A-Warteschlangen verwendet, kann er zwei zusätzliche Rückruffunktionen bereitstellen:

EvtIoStop
Die EvtIoStop-Rückruffunktion beendet die Verarbeitung einer angegebenen E/A-Anforderung. Wenn das Gerät seinen Arbeitszustand (D0) verlässt oder entfernt wird, ruft das Framework einmal für jede E/A-Anforderung, die der Treiber nicht abgeschlossen hat, die EvtIoStop-Rückruffunktion einer E/A-Warteschlange auf, einschließlich Anforderungen, die der Treiber besitzt und die es an ein E/A-Ziel weitergeleitet hat.

EvtIoResume
Die EvtIoResume-Rückruffunktion setzt die Verarbeitung einer zuvor beendeten E/A-Anforderung fort. Das Framework ruft die EvtIoResume-Rückruffunktion einer E/A-Warteschlange auf, wenn die Übermittlung von E/A-Anforderungen an den Treiber aus der Warteschlange fortgesetzt wird, nachdem das Gerät in seinen Arbeitszustand zurückgekehrt ist.

Jedes Mal, wenn das Framework die EvtIoStop-Rückruffunktion eines Treibers aufruft, schließt die Funktion in der Regel die E/A-Anforderung ab oder ruft WdfRequestStopAcknowledge auf, um den Besitz der Anforderung an das Framework zurückzugeben.

Obwohl dies optional ist, sollten Sie im Allgemeinen eine EvtIoStop-Rückruffunktion für eine energieverwaltete Warteschlange bereitstellen. Durch die Bereitstellung von EvtIoStop kann Ihr Treiber dazu beitragen, die Zeit zu verkürzen, die verstrichen ist, bevor Ihr Gerät und möglicherweise das System in einen Energiesparzustand wechselt.

Wenn Sie EvtIoStop nicht für eine energieverwaltete Warteschlange bereitstellen, wartet das Framework, bis alle Anforderungen, die von der energieverwalteten Warteschlange an den Treiber übermittelt werden, abgeschlossen sind, bevor das Gerät (oder das System) in einen niedrigeren Energiezustand verschoben oder das Gerät entfernt wird. Möglicherweise kann diese Untätigkeit verhindern, dass ein System in seinen Ruhezustand oder einen anderen niedrigen Systemleistungszustand wechselt. Im Extremfall kann dies dazu führen, dass das System mit dem Fehlerprüfungscode 9F abstürzt.

Wenn Ihr Treiber keine Anforderungen an ein E/A-Ziel weiterleitet und anforderungen nicht für einen unbestimmten Zeitraum hält, können Sie EvtIoStop für eine energieverwaltete Warteschlange sicher weglassen.

Warten auf Verteilerobjekte

Im Allgemeinen sollten Treiber dispatcher-Objekte nur als Synchronisierungsmechanismen innerhalb eines nichtarbiträren Threadkontexts verwenden.

Da Anforderungshandler in einem beliebigen Threadkontext ausgeführt werden, darf ein Anforderungshandler für eine energieverwaltete Warteschlange nicht warten, bis Kernelverteilerobjekte festgelegt wurden. Dies kann zu einem Deadlock führen.

Weitere Informationen dazu, wann ein Treiber auf Verteilerobjekte warten kann und was zu tun ist, wenn dies nicht möglich ist, finden Sie unter Einführung in Kernel Dispatcher-Objekte.