Отличие быстрого запуска от пробуждения от гибернации
В Windows существует три режима запуска:
- Холодный (традиционный)
- Выход из режима гибернации
- Быстрый (объединяет первые два, представленные в Windows 8)
Чтобы отличить быстрые запуски от пробуждения от гибернации, драйверы устройств в режиме ядра могут изучить системные irP питания.
Во время холодного запуска загрузчик создает образ памяти ядра, загружая разделы файла ядра Windows в память и связывая их. Затем ядро настраивает основные системные функции, перечисляет устройства, подключенные к компьютеру, и загружает драйверы для них.
В отличие от этого, быстрый запуск просто загружает файл гибернации (Hiberfil.sys) в память. Быстрый запуск, как правило, занимает значительно меньше времени, чем холодный.
Чтобы отличить быстрый запуск от пробуждения от гибернации, драйвер может проверить сведения в IRP набора питания системы (IRP_MN_SET_POWER), которая информирует драйвер о том, что компьютер перешел в (рабочее) состояние S0. Расположение стека ввода-вывода драйвера в этом IRP содержит элемент Power, который представляет собой структуру, содержащую сведения, связанные с питанием. Начиная с Windows Vista, структура элемента Power содержит элемент SystemPowerStateContext , который представляет собой SYSTEM_POWER_STATE_CONTEXT структуру, содержащую сведения о предыдущих состояниях питания системы. Эти сведения кодируются в битовые поля в структуре SYSTEM_POWER_STATE_CONTEXT .
Большинство битовых полей в структуре SYSTEM_POWER_STATE_CONTEXT зарезервированы для системного использования и непрозрачны для драйверов. Однако эта структура содержит два битовых поля TargetSystemState и EffectiveSystemState, которые могут считываться драйверами, чтобы определить, произошел ли быстрый запуск или выход из спящего режима.
Для битового поля TargetSystemState и EffectiveSystemState задано значение SYSTEM_POWER_STATE значений перечисления. Если TargetSystemState = PowerSystemHibernate и EffectiveSystemState = PowerSystemHibernate, происходит выход из спящего режима.
Однако, если TargetSystemState = PowerSystemShutdown и EffectiveSystemState = PowerSystemHibernate, произошел быстрый запуск.
Битовое поле TargetSystemState указывает последний переход состояния питания системы, для которого драйвер получил IRP питания системы до завершения работы компьютера или перехода в режим гибернации. Битовое поле EffectiveSystemState указывает действующее предыдущее состояние питания системы устройства в соответствии с восприятием пользователем. Значения TargetSystemState и EffectiveSystemState могут не совпадать, если, например, драйвер получил уведомление о переходе системы в состояние гибернации, но впоследствии произошло гибридное завершение работы.
Дополнительные сведения см. в разделе SYSTEM_POWER_STATE_CONTEXT.
Подготовка к быстрому запуску
Чтобы подготовиться к быстрому запуску, Windows выполняет последовательность полного завершения работы и сохраняет файл гибернации.
- Во-первых, как и при полном завершении работы, Windows закрывает все приложения и завершает все сеансы пользователя. На этом этапе приложения не выполняются, но загружается ядро Windows и запущен системный сеанс.
- Затем диспетчер питания отправляет системные irP питания драйверам устройств, чтобы сообщить им, что они должны подготовить свои устройства к переходу в режим гибернации.
- Наконец, Windows сохраняет образ памяти ядра (включая загруженные драйверы режима ядра) в Hiberfil.sys и завершает работу компьютера.
Если драйвер устройства настраивает устройство по-разному в зависимости от того, был ли холодный запуск или выход из спящего режима, этот драйвер должен после быстрого запуска настроить устройство так, как будто произошел холодный запуск. Например, предоставляемый системой драйвер NDIS отключает возможности пробуждения мини-портов при быстром запуске, но не при выходе из спящего режима.