Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Właściciel zasad zasilania urządzenia wysyła IRP zapytanie o zasilanie urządzenia (IRP_MN_QUERY_POWER) w celu określenia, czy niższe sterowniki mogą uwzględnić zmianę stanu zasilania urządzenia, i IRP ustawienia zasilania urządzenia (IRP_MN_SET_POWER) w celu zmiany stanu zasilania urządzenia. (Ten sterownik może również wysłać protokół IRP oczekiwania/budzenia, aby umożliwić jego urządzeniu przebudzenie w odpowiedzi na sygnał zewnętrzny; zobacz Obsługa urządzeń, które mają Wake-Up możliwości, aby uzyskać szczegółowe informacje).
Sterownik powinien wysłać żądanie IRP_MN_QUERY_POWER , gdy zostanie spełniony jeden z następujących warunków:
Sterownik otrzymuje systemowy IRP dotyczący zapytań zasilania.
Kierowca przygotowuje się do umieszczenia bezczynnego urządzenia w stanie uśpienia, więc musi wykonać zapytanie do niższych sterowników, aby dowiedzieć się, czy jest to wykonalne.
Sterownik powinien wysłać żądanie IRP_MN_SET_POWER , gdy zostanie spełniony dowolny z następujących warunków:
Sterownik ustalił, że urządzenie jest bezczynne i może zostać uśpione.
Urządzenie jest w stanie uśpienia i musi powrócić do stanu pracy, aby obsłużyć czekające operacje wejścia/wyjścia.
Sterownik otrzymuje systemowy IRP sterowania mocą.
Sterownik nie może przydzielić własnej mocy IRP; Menedżer zasilania udostępnia w tym celu procedurę PoRequestPowerIrp . Zgodnie z opisem reguł obsługi protokołu Power IRPs funkcja PoRequestPowerIrp przydziela i wysyła protokół IRP oraz w połączeniu z usługą IoCallDriver (w systemach Windows 7 i Windows Vista) lub PoCallDriver (w systemie Windows Server 2003, Windows XP i Windows 2000), gwarantuje, że wszystkie żądania zasilania są prawidłowo zsynchronizowane. Wywołujące elementy PoRequestPowerIrp muszą działać na poziomie IRQL <= DISPATCH_LEVEL.
Poniżej przedstawiono prototyp dla tej procedury:
NTSTATUS
PoRequestPowerIrp (
IN PDEVICE_OBJECT DeviceObject,
IN UCHAR MinorFunction,
IN POWER_STATE PowerState,
IN PREQUEST_POWER_COMPLETE CompletionFunction,
IN PVOID Context,
OUT PIRP *Irp OPTIONAL
);
Aby wysłać pakiet IRP, sterownik wywołuje funkcję PoRequestPowerIrp, określając wskaźnik do obiektu urządzenia docelowego w DeviceObject, kodzie pomocniczym IRP IRP_MN_SET_POWER lub IRP_MN_QUERY_POWER w MinorFunction, wartość DevicePowerState w PowerState.Typ i stan zasilania urządzenia w PowerState.Stan. W systemie Windows 98/Me DeviceObject musi określić PDO urządzenia bazowego; w systemie Windows 2000 i nowszych wersjach systemu Windows ta wartość może wskazywać na PDO lub FDO sterownika w tym samym stosie urządzenia.
Jeśli sterownik musi wykonywać dodatkowe zadania po ukończeniu IRP przez wszystkie inne sterowniki, powinien przekazać wskaźnik do funkcji zakończenia zasilania w CompletionFunction. Menedżer we/wy wywołuje funkcję CompletionFunction po uruchomieniu wszystkich procedur IoCompletion zestawionych przez sterowniki, podczas gdy przekazywały IRP w dół stosu.
Za każdym razem, gdy właściciel zasad zasilania urządzenia wysyła IRP zapytania zasilania urządzenia, powinien następnie wysłać IRP ustawienia zasilania urządzenia z procedury wywołania zwrotnego (CompletionFunction), która została określona w wywołaniu do PoRequestPowerIrp. Jeśli zapytanie zakończyło się pomyślnie, żądanie IRP ustawienia zasilania określa zapytany stan zasilania. Jeśli zapytanie nie powiedzie się, IRP ustawiania zasilania ponownie przywraca bieżący stan zasilania urządzenia. Ponowne potwierdzenie bieżącego stanu jest ważne, ponieważ sterowniki ustawiają operacje wejścia/wyjścia w kolejce w odpowiedzi na zapytanie; właściciel zasad musi wysłać żądanie ustawienia zasilania IRP, aby powiadomić sterowniki w stosie urządzeń o rozpoczęciu przetwarzania zakolejkowanych żądań wejścia/wyjścia.
Należy pamiętać, że właściciel polityki dla urządzenia nie tylko wysyła żądanie IRP dotyczące zasilania urządzenia, ale także obsługuje IRP, gdy jest przekazywane w dół stosu urządzenia. W związku z tym taki sterownik często ustawia procedurę IoCompletion (z usługą IoSetCompletionRoutine) w ramach kodu obsługującego protokół IRP, szczególnie gdy urządzenie jest zasilane. Procedury IoCompletion są wywoływane w sekwencji z procedurami IoCompletion ustawionymi przez inne sterowniki i przed elementem CompletionFunction. Aby uzyskać więcej informacji, zobacz IoCompletion Routines for Device Power IRPs (Procedury IoCompletion dla środowisk IRPs zasilania urządzeń).
Ponieważ IRP został ukończony przez wszystkie sterowniki po wywołaniu funkcji CompletionFunction, funkcja CompletionFunction nie może wywołać IoCallDriver, PoCallDriver lub PoStartNextPowerIrp z IRP, z którego pochodzi. (Może to jednak wywołać te procedury dla innej mocy IRP). Zamiast tego ta procedura wykonuje wszelkie dodatkowe akcje wymagane przez sterownik, który pochodzi z protokołu IRP. Jeśli sterownik wysłał urządzenie IRP w odpowiedzi na system IRP, funkcja CompletionFunction może zakończyć system IRP. Aby uzyskać więcej informacji, zobacz Obsługa protokołu IRP systemu Set-Power u właściciela zasad zasilania urządzenia.
W odpowiedzi na wywołanie PoRequestPowerIrp, menedżer zasilania przydziela IRP zasilania i wysyła go na szczyt stosu urządzeń. Menedżer zasilania zwraca wskaźnik do przydzielonego IRP.
Jeśli nie wystąpią żadne błędy, funkcja PoRequestPowerIrp zwraca STATUS_PENDING. Ten stan oznacza, że protokół IRP został pomyślnie wysłany i oczekuje na ukończenie. Wywołanie nie powiedzie się, jeśli menedżer zasilania nie może przydzielić IRP lub jeśli obiekt wywołujący określił nieprawidłowy kod IRP mocy podrzędnej.
Żądania zasilania urządzenia muszą być obsługiwane najpierw przez podstawowy sterownik magistrali dla urządzenia, a następnie przez każdy kolejny wyższy sterownik w stosie. W związku z tym, podczas wysyłania żądania PowerDeviceD0, sterownik musi upewnić się, że jego funkcja CompletionFunction wykonuje wymagane zadania po zakończeniu przetwarzania IRP i włączeniu urządzenia.
Podczas wyłączania urządzenia (PowerDeviceD3) każdy sterownik w stosie urządzenia musi zapisać cały niezbędny kontekst i wykonać niezbędne czyszczenie przed wysłaniem IRP do następnego niższego sterownika. Zakres informacji kontekstowych i procesu czyszczenia zależy od rodzaju sterownika. Sterownik funkcji musi zapisywać kontekst sprzętowy; sterownik filtru może wymagać zapisania własnego kontekstu oprogramowania. CompletionFunction ustawiony w tej sytuacji może podjąć akcje skojarzone z ukończonym żądaniem IRP zasilania, ale sterownik nie może uzyskać dostępu do urządzenia.