Warte-/Reaktivierungs-Rückrufroutinen
Wenn ein Treiber eine Warte-/Reaktivierungs-IRP anfordert, muss er eine Rückrufroutine angeben, damit das Gerät beim Auftreten des Aktivierungsereignisses in den Arbeitszustand (D0) versetzt werden kann. Nachdem das Aktivierungsereignis aufgetreten ist und alle Treiber die IRP abgeschlossen haben, ruft das System die Rückrufroutine auf, die an PoRequestPowerIrp übergeben wurde.
Da diese Rückrufroutine im Namen des Treibers festgelegt wird, der den IRP-Ursprung hat und nicht für einen Treiber, der die IRP verarbeitet, darf poStartNextPowerIrp nicht aufgerufen werden. Nur die IoCompletion-Routinen , die als Treiber festgelegt sind, die IRP übergeben, sollten den nächsten Energie-IRP starten. Beachten Sie, dass der Richtlinienbesitzer das IRP nicht nur sendet, sondern auch verarbeitet, und er daher möglicherweise eine IoCompletion-Routine festlegt, während der IRP den Stapel weitergibt und zusätzlich eine Rückrufroutine festlegt, wenn er die Warte-/Reaktivierungs-IRP anfordert.
Die Rückrufroutine hat die folgenden Zuständigkeiten:
Wenn der Treiber mehrere Geräte steuert, bestimmen Sie, welches seiner Geräte die Aktivierung signalisiert hat.
Dienst des Ereignisses, das das Aktivierungssignal verursacht hat.
Legen Sie das Gerät, das die Aktivierung signalisiert hat, im D0-Zustand fest, indem Sie PoRequestPowerIrp aufrufen, um eine PowerDeviceD0-Anforderung zu senden. Der Treiber muss auch PoSetPowerState aufrufen, um den Power Manager über den neuen Gerätestromzustand zu informieren. Weitere Informationen finden Sie unter Senden von IRP_MN_QUERY_POWER oder IRP_MN_SET_POWER für Geräteleistungszustände.
Wenn der Treiber eine Cancel-Routine für das IRP festgelegt hat, rufen Sie IoSetCancelRoutine auf, um die Cancel-Routine auf NULL zurückzusetzen.
Wenn der Treiber über eine Energierichtlinie für mehrere Geräte verfügt, verringern Sie die Anzahl der Warte-/Reaktivierungsreferenzen. Wenn die Anzahl nichtzero ist und angibt, dass ein anderes Gerät zuvor eine Warte-/Reaktivierungs-IRP gesendet hat, fordern Sie eine weitere Warte-/Wake-IRP (PoRequestPowerIrp) für sein PDO an.
Für ein PCI-Gerät kann z. B. "Warten/Aufwachen" sowohl für ein Modem als auch für eine Netzwerkschnittstellenkarte (Network Interface Card, NIC) aktiviert sein. Wenn die NIC das System reaktiviert (und somit das IRP abschließt), muss der PCI-FDO einen weiteren Warte-/Wake-IRP an sich selbst senden, damit das Modem weiterhin aktiviert werden kann.
Da der Treiber, der die Warte-/Reaktivierungs-IRP angefordert hat, die Energierichtlinie für seinen Gerätestapel steuert, ist er dafür verantwortlich, sein Gerät nach Abschluss des IRP in den Betriebszustand zurückzusetzen. Obwohl niedrigere Treiber möglicherweise bereits physisch auf das Gerät angewendet haben, muss der Richtlinienbesitzer PoRequestPowerIrp aufrufen, um eine IRP_MN_SET_POWER Anforderung für den Gerätestromzustand D0 zu senden. Erst nachdem alle Treiber im Gerätestapel diese Einschalt-IRP verarbeitet haben, wird das Gerät wieder in den Betriebszustand versetzt.