Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Этот 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 системного запроса питания, он должен завершиться ошибкой IRP, если он не может поддерживать любое из состояний устройства, допустимых для состояния системы запроса. Дополнительные сведения см. в разделе DeviceState. В противном случае драйвер должен передать IRP следующему нижнему драйверу. Водитель автобуса завершает IRP.
Начиная с Windows Vista, переход к состоянию сна системы считается критической операцией. Хотя драйвер может завершиться сбоем системного запроса IRP, диспетчер питания может по-прежнему изменить состояние питания системы на состояние спящего режима. После того как драйвер получает 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, драйвер гарантирует, что он не будет запускать какие-либо операции, которые изменят его способность задать запрошенное состояние питания. Драйвер должен очередью любых irps, требующих таких операций, пока не завершится набор IRP, который возвращает устройство в допустимое состояние питания.
В системах Windows 2000 и более поздних версий, когда IRP указывает PowerDeviceD1, PowerDeviceD2 или PowerDeviceD3, значение в Parameters.Power.ShutdownType предоставляет сведения о текущей системной power IRP, если системный IRP активен. В этом случае значение в ShutdownType указывает текущее запрошенное состояние питания системы или PowerActionNone , если системный запрос не выдается. В Windows 98/Me это поле всегда содержит PowerActionNone , когда IRP запрашивает состояние питания устройства.
Требования
Заголовок: Wdm.h (включая Wdm.h, Ntddk.h или Ntifs.h)