Обработка IRP_MN_QUERY_POWER для состояний питания системы
Диспетчер управления питанием отправляет IRP с незначительным кодом IRP IRP_MN_QUERY_POWER и SystemPowerState в Parameters.Power.Type , чтобы определить, можно ли безопасно переключиться на указанное состояние питания системы (S1–S5) и разрешить драйверам подготовиться к такому изменению.
По возможности диспетчер питания отправляет запросы перед отправкой IRP_MN_SET_POWER , которая запрашивает более низкое (менее энергопотребление) состояние. Однако в случае сбоя батареи или неминуемой потери питания диспетчер питания отправляет IRP с заданным питанием без предварительного запроса. Диспетчер питания никогда не отправляет запрос перед отправкой IRP для установки системы в рабочем состоянии (S0).
Сведения о том, как владелец политики управления питанием для устройства обрабатывает запросы на питание системы, см. в разделе Обработка системного Query-Power IRP в владельце политики управления питанием устройства.
Сведения о том, как драйверы (которые не являются владельцем политики питания для устройства) обрабатывают запросы на питание системы, см. в следующих статьях:
Обработка системного Query-Power IRP в фильтре или драйвере функции
Сбой системного Query-Power IRP в фильтре или драйвере функции
Обработка системного Query-Power IRP в драйвере шины
Обратите внимание, что драйвер никогда не должен отправлять запрос на IRP_MN_SET_POWER устройства в ответ на системный запрос; он запрашивает такой IRP только после того, как получит запрос на настройку питания системы.
Так как диспетчер питания отправляет IRP системного запроса каждому стеку устройств в системе, возможно, что драйвер для одного устройства может завершить запрос с ошибкой, а драйверы для других устройств успешно завершают его. Начиная с Windows Vista, изменение состояния питания системы в спящем режиме является критическим изменением состояния питания. Даже в том случае, если драйвер не выполняет системный запрос IRP, диспетчер питания в Windows Vista по-прежнему может изменить состояние питания системы на спящий режим. Кроме того, возможно, что срок действия батареи может истечь, когда запрос активен, что требует немедленного завершения работы. Следовательно, после запроса IRP драйверы должны быть готовы к получению любой из следующих irP питания:
IRP_MN_SET_POWER к состоянию запроса
IRP_MN_SET_POWER к другому состоянию питания
IRP_MN_SET_POWER к текущему состоянию питания
IRP_MN_QUERY_POWER к любому состоянию
Однако обычно драйвер получает IRP с установленной мощностью системы после IRP системного запроса. Независимо от того, драйвер должен быть готов к изменению состояния питания системы, даже если драйвер не работает с IRP с мощностью запроса.