IRP_MN_QUERY_POWER
Этот IRP запрашивает устройство, чтобы определить, можно ли изменить состояние питания системы или состояние питания устройства.
Основной код
При отправке
Диспетчер питания или владелец политики управления питанием устройства отправляет это IRP, чтобы определить, может ли он изменить состояние питания системы или устройства, как правило, для перехода в спящий режим. Драйвер должен вызвать PoRequestPowerIrp , чтобы выделить и отправить этот IRP.
Диспетчер управления питанием отправляет этот IRP по адресу IRQL = PASSIVE_LEVEL стекам устройств, устанавливающим флаг DO_POWER_PAGABLE в PDO.
Диспетчер питания может отправить IRP по адресу IRQL = DISPATCH_LEVEL, если установлен флаг DO_POWER_INRUSH. Такие драйверы не могут напрямую или косвенно получать доступ к любому страничном коду или данным.
Входные параметры
Parameters.Power.Type указывает тип настраиваемого состояния питания : SystemPowerState или DevicePowerState.
Parameters.Power.State указывает само состояние питания следующим образом:
Если параметр Parameters.Power.Type имеет значение SystemPowerState, значение является перечислителем типа SYSTEM_POWER_STATE .
Если параметр Parameters.Power.Type имеет значение DevicePowerState, значение является перечислителем типа DEVICE_POWER_STATE .
Parameters.Power.ShutdownType указывает дополнительные сведения о запрашиваемом переходе. Возможные значения — перечислители типа POWER_ACTION .
Выходные параметры
Нет.
Блок состояния ввода-вывода
Драйвер задает для Irp-IoStatus.Status> значение STATUS_SUCCESS, чтобы указать, что устройство может перейти в запрошенное состояние. Драйвер задает любое соответствующее состояние сбоя, чтобы указать, что он не может войти в запрошенное состояние.
Операция
Параметры для IRP_MN_QUERY_POWER идентичны параметрам для IRP_MN_SET_POWER. Однако вместо уведомления драйверов о безотзывном изменении состояния питания IRP_MN_QUERY_POWER запрашивает, может ли система или устройство перейти в определенное состояние питания.
Драйвер не должен изменять состояние питания своего устройства в ответ на запрос IRP_MN_QUERY_POWER .
После того как драйвер получает запрос IRP_MN_QUERY_POWER в Windows Server 2003, Windows XP и Windows 2000, драйвер должен вызвать PoStartNextPowerIrp, как описано в разделе Вызов PoStartNextPowerIrp. Начиная с Windows Vista вызов PoStartNextPowerIrp не требуется, и такой вызов не выполняет никаких операций управления питанием.
IRP_MN_QUERY_POWER для состояния питания системы
Диспетчер питания отправляет это IRP, чтобы убедиться, что он может изменить состояние питания системы без прерывания работы, например, прерывания сетевых подключений.
По возможности диспетчер питания запрашивает перед отправкой IRP_MN_SET_POWER , чтобы запросить состояние спящего режима или нормальное завершение работы системы. Однако при некоторых критических условиях (например, при нажатии пользователем кнопки выключения питания или истечении срока действия батареи) диспетчер питания может отправить запрос IRP_MN_SET_POWER , не отправляя запрос на питание. Диспетчер питания запрашивает только состояния спящего режима; он никогда не запрашивает до возвращения в рабочее состояние.
Когда драйвер получает системный запрос на получение IRP, он должен завершиться ошибкой, если он не может поддерживать любое из состояний устройства, допустимых для состояния запрашиваемой системы. Дополнительные сведения см. в разделе DeviceState. В противном случае драйвер должен передать IRP следующему более низкому драйверу. Водитель автобуса завершает IRP.
Начиная с Windows Vista переход в спящий режим системы считается критической операцией. Несмотря на то, что драйвер может завершиться ошибкой при выполнении запроса к системе, диспетчер питания по-прежнему может изменить состояние питания системы на спящий режим. После того как драйвер получает системный запрос IRP, драйвер всегда должен быть готов к последующему изменению состояния питания системы.
Когда владелец политики управления питанием устройства получает IRP запроса на питание системы, он должен задать подпрограмму IoCompletion в IRP перед передачей. В подпрограмме IoCompletion она должна отправлять IRP_MN_QUERY_POWER для состояния устройства, допустимого для состояния запрашиваемой системы. Дополнительные сведения см. в разделе Обработка системного Query-Power IRP в владельце политики управления питанием устройства.
Если в IRP указано значение PowerSystemShutdown (S5), значение Parameters.Power.ShutdownType указывает причину завершения работы. ShutdownType сообщает драйверу, выполняется ли сброс системы (PowerActionShutdownReset) или выключение на неопределенный срок для перезагрузки позже (PowerActionShutdownOff). Для драйверов большинства устройств разница незначима. Однако для некоторых устройств, таких как устройство потоковой передачи видео, которое выполняет DMA, драйвер может отключить свое устройство при сбросе системы, тем самым останавливая все текущие ввод-вывод.
В системах Microsoft Windows 2000 и более поздних версий значение ShutdownType также может иметь значение PowerActionShutdown. В этом случае драйвер не может определить, какой тип завершения работы запрашивается, и поэтому он должен перейти к сбросу.
Если драйвер не выполняет запрос IRP_MN_QUERY_POWER для состояния питания системы, диспетчер питания обычно отвечает , выдавая IRP_MN_SET_POWER IRP. Как правило, это IRP подтверждает текущее состояние системы. Однако возможно, что драйверы могут получить IRP_MN_SET_POWER в запрашиваемом состоянии или в другом промежуточном состоянии. Водители должны быть готовы справиться с этими ситуациями.
IRP_MN_QUERY_POWER для состояния питания устройства
Владелец политики управления питанием устройства отправляет этот IRP в свой стек в ответ на запрос системного IRP_MN_QUERY_POWER .
Если драйвер может поместить свое устройство в запрошенное состояние устройства, он устанавливает ioStatus.Status в STATUS_SUCCESS и передает IRP следующему более низкому драйверу и т. д., пока IRP не достигнет водителя автобуса. Если какой-либо драйвер в стеке должен завершить IRP, он должен немедленно завершить IRP, вызвав IoCompleteRequest и возвратив состояние сбоя. Драйверы, которые не выполняют IRP, не передают его дальше по стеку.
Возвращая STATUS_SUCCESS, драйвер гарантирует, что он не запустит никаких операций, которые изменили бы его возможность задать запрошенное состояние питания. Драйвер должен ставить в очередь все irP, требующие таких операций, до тех пор, пока не завершится IRP с заданным питанием, возвращающим устройство в приемлемое состояние питания.
В системах с Windows 2000 и более поздних версий, когда IRP указывает PowerDeviceD1, PowerDeviceD2 или PowerDeviceD3, значение Parameters.Power.ShutdownType предоставляет сведения о текущей системной IRP питания, если системная функция power IRP активна. В этом случае значение ShutdownType указывает состояние питания системы, запрошенное в данный момент, или PowerActionNone , если системный запрос не является невыполненным. В Windows 98/Me это поле всегда содержит значение PowerActionNone , когда IRP запрашивает состояние питания устройства.
Требования
Заголовок |
Wdm.h (включая Wdm.h, Ntddk.h или Ntifs.h) |