Udostępnij za pośrednictwem


Rozróżnianie szybkiego uruchamiania od wybudzania z hibernacji

W systemie Windows istnieją trzy tryby uruchamiania:

  • Zimno (tradycyjne)

  • Wybudzenie ze stanu hibernacji

  • Szybkie (łączy pierwsze dwa, wprowadzone w systemie Windows 8)

Aby odróżnić szybkie uruchamianie od wybudzenia z hibernacji, sterowniki urządzeń w trybie jądra mogą badać IRP zasilania systemu.

Podczas zimnego uruchamiania program ładujący tworzy obraz pamięci jądra, ładując sekcje pliku jądra systemu Windows do pamięci i łącząc je. Następnie jądro konfiguruje podstawowe funkcje systemu, wylicza urządzenia dołączone do komputera i ładuje dla nich sterowniki.

Z kolei szybkie uruchamianie po prostu ładuje plik hibernacji (Hiberfil.sys) do pamięci. Szybkie uruchamianie zwykle zajmuje znacznie mniej czasu niż zimny start.

Aby odróżnić szybkie uruchamianie od wybudzenia z hibernacji, sterownik może sprawdzić informacje w IRP ustawienia mocy (IRP_MN_SET_POWER), który informuje sterownik, że komputer wszedł do stanu S0 (roboczy). Lokalizacja stosu I/O sterownika w tym IRP zawiera element członkowski Power, który jest strukturą zawierającą informacje związane z energią. Począwszy od systemu Windows Vista, struktura składowa Power zawiera element członkowski SystemPowerStateContext , który jest strukturą SYSTEM_POWER_STATE_CONTEXT zawierającą informacje o poprzednich stanach zasilania systemu. Te informacje są kodowane w polach bitowych w strukturze SYSTEM_POWER_STATE_CONTEXT .

Większość pól bitowych w strukturze SYSTEM_POWER_STATE_CONTEXT jest zarezerwowana do użytku systemowego i jest nieprzezroczysta dla sterowników. Jednak ta struktura zawiera dwa pola bitowe, TargetSystemState i EffectiveSystemState, które mogą być odczytywane przez sterowniki w celu określenia, czy wystąpił szybki start, czy wybudzanie z hibernacji.

Pola bitowe TargetSystemState i EffectiveSystemState są ustawione na wartości wyliczenia SYSTEM_POWER_STATE. Jeśli TargetSystemState = PowerSystemHibernate i EffectiveSystemState = PowerSystemHibernate, wystąpiło wybudzenie z hibernacji.

Jednakże, jeśli TargetSystemState = PowerSystemShutdown i EffectiveSystemState = PowerSystemHibernate, doszło do szybkiego uruchomienia.

Pole bitu TargetSystemState określa ostatnią zmianę stanu zasilania systemu, dla którego sterownik otrzymał IRP dotyczący mocy systemu przed zamknięciem komputera lub przełączeniem w stan hibernacji. Pole bitowe EffectiveSystemState wskazuje skuteczny poprzedni stan zasilania systemu urządzenia, który jest postrzegany przez użytkownika. Wartości TargetSystemState i EffectiveSystemState mogą nie być zgodne, jeśli na przykład sterownik otrzymał powiadomienie o oczekującym przejściu systemu do stanu hibernacji, ale nastąpiło następnie zamknięcie hybrydowe.

Aby uzyskać więcej informacji, zobacz SYSTEM_POWER_STATE_CONTEXT.

Przygotowywanie do szybkiego uruchamiania

Aby przygotować się do szybkiego uruchamiania, system Windows wykonuje pełną sekwencję zamykania i zapisuje plik hibernacji.

  1. Najpierw, podobnie jak w przypadku pełnego zamknięcia, system Windows zamyka wszystkie aplikacje i wyloguje się ze wszystkich sesji użytkownika. Na tym etapie żadne aplikacje nie są uruchomione, ale jądro systemu Windows jest ładowane, a sesja systemowa jest uruchomiona.

  2. Następnie menedżer zasilania wysyła adresy IRP systemu do sterowników urządzeń, aby poinformować ich o przygotowaniu urządzeń do hibernacji.

  3. Na koniec system Windows zapisuje obraz pamięci jądra (w tym załadowane sterowniki trybu jądra) w Hiberfil.sys i wyłącza komputer.

Jeśli sterownik urządzenia konfiguruje urządzenie inaczej w zależności od tego, czy nastąpiło zimne uruchomienie, czy wznawianie z hibernacji, to po szybkim uruchomieniu ten sterownik powinien skonfigurować urządzenie tak, jakby miało miejsce zimne uruchomienie. Na przykład sterownik NDIS dostarczany przez system wyłącza możliwości budzenia miniportu podczas szybkiego uruchamiania, ale nie podczas wybudzania z hibernacji.