IRP_MN_WAIT_WAKE
Этот IRP позволяет водителю пробудить спящую систему или пробудить спящее устройство.
Основной код
При отправке
Драйвер, владеющий политикой управления питанием, нацеливает это IRP на PDO, чтобы устройство пробуждалось в ответ на внешнее событие, например на входящий телефонный звонок. Драйвер должен вызвать PoRequestPowerIrp для отправки этого IRP.
Как правило, драйвер должен отправить это IRP, как только он определит, что его устройство должно быть включено для пробуждения. Следовательно, драйверы для большинства таких устройств отправляют этот IRP после включения их устройств и перед выполнением запроса IRP_MN_START_DEVICE .
Однако драйвер может отправить IRP в любое время, когда устройство находится в рабочем состоянии (PowerDeviceD0). Стек устройств не должен находиться в процессе перехода; то есть драйвер не должен отправлять IRP_MN_WAIT_WAKE в то время как в стеке устройств активен любой другой экземпляр управления питанием.
IRP ожидания или пробуждения не изменяет состояние питания устройства или системы. Он просто включает сигнал пробуждения от устройства. Когда сигнал пробуждения поступает, владелец политики должен вызвать PoRequestPowerIrp , чтобы отправить IRP set-power для возврата устройства в D0.
Драйвер должен работать в irQL = PASSIVE_LEVEL для отправки этого IRP. Однако IRP можно выполнить по адресу IRQL = DISPATCH_LEVEL.
Входные параметры
Parameters.WaitWake.PowerState содержит наименьшее (наименьшее) состояние питания системы, из которого устройству должно быть разрешено пробуждать систему.
Выходные параметры
Нет.
Блок состояния ввода-вывода
Драйвер присваивает Irp-IoStatus.Status> одно из следующих свойств:
STATUS_PENDING
Драйвер получил IRP и ожидает, пока устройство сообщит о пробуждении.
STATUS_INVALID_DEVICE_STATE
Устройство находится в менее активном состоянии, чем состояние DeviceWake , указанное в структуре DEVICE_CAPABILITIES для устройства, или устройство не может разбудить систему из состояния SystemWake , переданного в IRP.
STATUS_NOT_SUPPORTED
Устройство не поддерживает пробуждение.
STATUS_DEVICE_BUSY
Запрос IRP_MN_WAIT_WAKE уже находится в состоянии ожидания и должен быть завершен или отменен, прежде чем может быть выдан другой запрос IRP_MN_WAIT_WAKE.
STATUS_SUCCESS
Устройство сигнализирует о событии пробуждения.
Если драйвер должен завершить работу с этим IRP, он немедленно завершает IRP и не передает его следующему драйверу ниже.
Операция
Драйвер отправляет IRP_MN_WAIT_WAKE по двум причинам:
Чтобы разрешить устройству пробуждение спящей системы в ответ на внешний сигнал пробуждения.
Чтобы устройство пробуждалось из спящего режима в ответ на внешний сигнал пробуждения.
IRP необходимо передать в стек устройства водителю шины для устройства, который вызывает IoMarkIrpPending и возвращает STATUS_PENDING из подпрограммы DispatchPower . IRP остается в ожидании, пока не появляется сигнал пробуждения или пока драйвер, отправляющий IRP, не отменит его.
В любой момент времени в ожидании PDO можно удерживать только один IRP ожидания или пробуждения. Если драйвер уже содержит IRP ожидания или пробуждения для PDO, он должен завершиться сбоем дополнительных таких irP с STATUS_DEVICE_BUSY. Драйвер, который перечисляет более одного дочернего PDO, может иметь ожидание IRP ожидания или пробуждения для каждого такого PDO.
Каждый драйвер задает процедуру IoCompletion , когда IRP перемещается по стеку устройств. Когда устройство сигнализирует о событии пробуждения, водитель автобуса обслуживает сигнал пробуждения и завершает IRP, возвращая STATUS_SUCCESS. Затем диспетчер ввода-вывода вызывает подпрограмму IoCompletion следующего более высокого драйвера и т. д. в стеке устройств.
Когда драйвер отправляет IRP ожидания или пробуждения, он должен указать подпрограмму обратного вызова в вызове PoRequestPowerIrp . В процедуре обратного вызова драйвер обычно обслуживает устройство. Например, владелец политики питания для устройства должен вызвать PoRequestPowerIrp , чтобы отправить IRP_MN_SET_POWER состояния устройства D0.
Драйвер, который выступает в качестве драйвера шины для одного устройства, и владелец политики для родительского устройства, запрашивает IRP IRP_MN_WAIT_WAKE для стека устройств родительского устройства, когда получает запрос IRP_MN_WAIT_WAKE от дочернего PDO. Если драйвер перечисляет несколько дочерних PDO, он должен запрашивать только один IRP ожидания или пробуждения для стека устройств родительского устройства независимо от того, сколько дочерних PPO отправляют запросы на ожидание или пробуждение. Вместо этого такой драйвер должен сохранять внутреннее количество irP ожидания и пробуждения, при этом увеличивается количество каждый раз, когда он получает запрос, и уменьшается число при каждом выполнении запроса. Если количество ненулевое после завершения ожидания или пробуждения IRP, драйвер должен отправить еще одно IRP ожидания и пробуждения в стек устройств, чтобы "перенаправить" себя для пробуждения. Дополнительные сведения см. в разделе Общие сведения о пути irP ожидания и пробуждения через дерево устройств.
Чтобы отменить IRP_MN_WAIT_WAKE, драйвер вызывает IoCancelIrp. Отменить его может только драйвер, который был источником IRP. Драйвер отменяет ожидающее IRP_MN_WAIT_WAKE при возникновении следующих действий:
Драйвер получает PnP IRP, который останавливает или удаляет устройство.
Система переходит в спящий режим, и сигнал пробуждения устройства не должен разбудить его.
Требования
Заголовок |
Wdm.h (включая Wdm.h, Ntddk.h или Ntifs.h) |