Freigeben über


DispatchPower-Routinen

Die DispatchPower-Routine eines Treibers unterstützt die Energieverwaltung , indem IRPs für den IRP_MJ_POWER E/A-Funktionscode verarbeitet werden. Dem IRP_MJ_POWER Funktionscode sind mehrere kleinere E/A-Funktionscodes für die Energieverwaltung zugeordnet. Der Power-Manager verwendet diese Nebenfunktionscodes, um Treiber anweisen, den Energiezustand zu ändern, auf Systemreaktivierungsereignisse zu warten und darauf zu reagieren, und um Treiber zu ihren Geräten abzufragen.

Die DispatchPower-Routine jedes Treibers führt die folgenden Aufgaben aus:

  • Behandeln Sie die IRP nach Möglichkeit.

  • Übergeben Sie den IRP mithilfe von PoCallDriver an den nächstniedringen Treiber im Gerätestapel.

  • Führen Sie bei einem Bustreiber den angeforderten Strombetrieb auf dem Gerät aus, und schließen Sie die IRP ab.

Alle Treiber für ein Gerät müssen die Möglichkeit haben, Energie-IRPs für das Gerät zu verarbeiten, außer in einigen Fällen, in denen ein Funktions- oder Filtertreiber den IRP-Fehler zulassen darf. Die meisten Funktions- und Filtertreiber führen entweder eine Verarbeitung durch oder legen eine IoCompletion-Routine für jeden Energie-IRP fest, und übergeben den IRP dann an den nächstniedrigten Treiber, ohne sie abzuschließen. Schließlich erreicht das IRP den Bustreiber, der den Energiezustand des Geräts bei Bedarf physisch ändert und die IRP abschließt.

Wenn die IRP abgeschlossen ist, ruft der E/A-Manager alle IoCompletion-Routinen auf, die von Treibern festgelegt werden, während der IRP den Gerätestapel hinuntergefahren ist. Ob ein Treiber eine Vervollständigungsroutine festlegen muss, hängt von der Art des IRP und den individuellen Anforderungen des Treibers ab.

Power IRPs, die ein Gerät einschalten, müssen zuerst vom niedrigsten Treiber im Gerätestapel (dem zugrunde liegenden Bustreiber) und dann von jedem aufeinanderfolgenden Treiber im Stapel verarbeitet werden. Energie-IRPs, die ein Gerät herunterfahren, müssen zuerst vom Treiber am oberen Rand des Gerätestapels und dann von jedem aufeinanderfolgenden Treiber verarbeitet werden, der den Stapel herunterläuft.

Spezielle Handhabung für Wechselgeräte

In ihren DispatchPower-Routinen sollten Treiber von Wechselmedien überprüfen, ob das Gerät noch vorhanden ist. Wenn das Gerät entfernt wurde, sollte der Treiber die IRP nicht an den nächstniedrigten Treiber übergeben. Stattdessen sollte der Treiber folgendes tun:

  • Rufen Sie PoStartNextPowerIrp auf, um mit der Verarbeitung der nächsten Energie-IRP zu beginnen.

  • Legen Sie Irp-IoStatus.Status> auf STATUS_DELETE_PENDING fest.

  • Rufen Sie IoCompleteRequest auf, und geben Sie IO_NO_INCREMENT an, um die IRP abzuschließen.

  • Gibt STATUS_DELETE_PENDING zurück.