Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Tylko sterownik, który wysłał IRP oczekiwania/budzenia, może go anulować.
W następujących okolicznościach sterownik może potrzebować anulować oczekujące polecenie oczekiwania/wznawiania IRP:
Sterownik odbiera żądanie PnP IRP_MN_STOP_DEVICE, IRP_MN_QUERY_REMOVE_DEVICE, IRP_MN_REMOVE_DEVICE lub IRP_MN_SURPRISE_REMOVAL dla urządzenia. Sterownik powinien ponownie uruchomić protokół IRP oczekiwania/budzenia (PoRequestPowerIrp) po ponownym uruchomieniu urządzenia.
System przejdzie w stan uśpienia, ale urządzenie nie powinno być aktywowane do obudzenia systemu.
Na przykład sterownik koncentratora USB może przesłać żądanie IRP_MN_WAIT_WAKE podczas uruchamiania urządzenia, w przypadku, gdy później umieści jedno ze swoich urządzeń wejściowych w stanie uśpienia. Gdy system jest w stanie pracy, sygnał wznawiania z urządzenia zwraca urządzenie do stanu roboczego (ale nie ma wpływu na stan zasilania systemu). Gdy system przygotowuje się do zamknięcia, sterownik koncentratora USB anuluje to żądanie IRP, jeśli urządzenie nie powinno mieć możliwości przebudzenia systemu.
System wprowadza stan uśpienia, z którego urządzenie nie może go obudzić. Oznacza to, że przechodzi w stan o niższym poziomie zasilania niż wartość SystemWake określona w strukturze DEVICE_CAPABILITIES.
Urządzenie wchodzi w stan zasilania, w którym nie może reagować na sygnał wybudzenia. Oznacza to, że wchodzi w stan mniejszej mocy niż wartość DeviceWake określona w strukturze DEVICE_CAPABILITIES.
Aby anulować IRP oczekiwania lub budzenia, sterownik, który wysłał IRP, wywołuje IoCancelIrp, przekazując wskaźnik do IRP, który został zwrócony wcześniej, gdy sterownik wywołał PoRequestPowerIrp.
Sterownik nie może anulować oczekiwania/wznawiania IRP, którego sam nie wysłał.
Anulowanie procedur czekania/wznawiania IRPs
Wiele funkcji i sterowników magistrali powinno ustawić anulowanie procedur oczekiwania/wznawiania irps; następujące typy sterowników muszą ustawić takie procedury:
Sterowniki, które zmieniają ustawienia urządzenia w celu włączenia lub wyłączenia wznawiania.
Sterowniki wysyłające IRP_MN_WAIT_WAKE żądania do sterowników urządzeń nadrzędnych.
Procedura Anulowania umożliwia sterownikowi wyłączenie budzenia dla swojego urządzenia i wyczyszczenie wszelkich danych związanych z oczekującą operacją wait/wake IRP. Sterowniki, które żądają IRP oczekiwania/wznawiania dla urządzeń nadrzędnych, mogą również anulować te IRP.
W procedurze wait/wake Cancel sterownik powinien wykonać następujące czynności:
Wywołaj metodę IoSetCancelRoutine , aby zresetować procedurę Anuluj dla protokołu IRP na wartość NULL.
Wywołaj metodę IoReleaseCancelSpinLock, przekazując metodę CancelIRQL określoną w IRP, aby zwolnić blokadę anulowania spin dla protokołu IRP.
Zresetuj wszystkie odpowiednie pola w rozszerzeniu urządzenia. Na przykład w przypadku czekania/wznawiania IRP większość sterowników ustawia flagę i zachowuje wskaźnik do IRP w rozszerzeniu urządzenia.
Należy pamiętać, że sterownik może otrzymać protokół IRP oczekiwania/wznawiania podczas anulowania innego takiego protokołu IRP. Sterownik musi sprawdzić, czy ma już protokół IRP w ramach ochrony za pomocą blokady spin (lub jego odpowiednika). Jeśli tak, sterownik musi dokładnie zsynchronizować swoją obsługę, aby upewnić się, że anuluje właściwy IRP. Aby uzyskać więcej informacji na temat używania spinlocków w procedurze anulowania, zobacz Anulowanie IRP.
Zmień wszystkie wymagane ustawienia urządzenia. Na przykład sterownik modemu wyłączy ustawienie wznawiania urządzenia.
Ustaw wartość Irp-IoStatus.Status> na STATUS_CANCELLED.
Wywołaj funkcję IoCompleteRequest aby ukończyć IRP czekania/budzenia, używając IO_NO_INCREMENT.
Jeśli sterownik wcześniej zażądał powiązanego IRP_MN_WAIT_WAKE dla urządzenia nadrzędnego, powinien anulować to żądanie IRP w swojej procedurze Anuluj. Sterownik musi zwolnić blokadę anulowania spin, zanim anuluje IRP elementu nadrzędnego.
Na przykład sterownik, który działa jako sterownik magistrali dla urządzenia i jest właścicielem sterownika zasad zasilania dla jego elementu nadrzędnego, powinien anulować powiązany czas oczekiwania/budzenia IRP, który został wcześniej wysłany do jego elementu nadrzędnego. Wywołanie metody IoCancelIrp wywoła procedurę Anulowania elementu nadrzędnego i tak dalej w stosie urządzenia.