Поделиться через


Общие сведения о завершении IRP для ожидания и пробуждения

IRP ожидания и пробуждения завершается при поступлении сигнала пробуждения. Сигнал пробуждения зависит от устройства, но обычно является обычным событием обслуживания для устройства. Например, входящий круг может вызвать пробуждение спящего модема.

На следующем рисунке показаны шаги по выполнению IRP ожидания или пробуждения.

шаги для выполнения irp ожидания или пробуждения.

Когда появляется сигнал, управление повторно входит в водителя автобуса в точке, где автобус обнаруживает, что устройство проснулось. Водитель автобуса обслуживает событие по мере необходимости и вызывает IoCompleteRequest для завершения IRP_MN_WAIT_WAKE IRP для своего PDO.

Затем диспетчер ввода-вывода вызывает подпрограмму IoCompletion , заданную драйвером следующего уровня в стеке устройств. В процедуре IoCompletion этот драйвер по мере необходимости обслуживает сигнал пробуждения и вызывает IoCompleteRequest для завершения IRP. Диспетчер операций ввода-вывода продолжает вызывать подпрограммы IoCompletion, выполняя резервное копирование стека устройств, пока все драйверы не завершат процедуру IRP.

В своей процедуре IoCompletion любой драйвер, который перечисляет несколько дочерних устройств (создает несколько PDO) и получает запросы на ожидание и пробуждение от нескольких таких устройств, должен отправить себе IRP ожидания или пробуждения, чтобы повторно вооружиться для ожидания или пробуждения на другом ребенке. Дополнительные сведения см. в разделе Общие сведения о пути irP для ожидания и пробуждения через дерево устройств.

После вызова подпрограмм IoCompletion , заданных драйверами при передаче IRP вниз по стеку, диспетчер операций ввода-вывода вызывает подпрограмму обратного вызова, заданную владельцем политики питания, когда запрашивает IRP ожидания или пробуждения. В процедуре обратного вызова владелец политики должен вернуть свое устройство в рабочее состояние и завершить ожидающее ожидание или пробуждение IRP для PDO своего дочернего элемента, если таковой имеется.

Завершение IRP ребенка приводит к тому, что диспетчер ввода-вывода вызывает подпрограммы IoCompletion , заданные драйверами в стеке устройств ребенка, и т. д. В конечном итоге владелец политики, запустив исходный IRP ожидания или пробуждения на devnode, определяет, что его устройство подтвердило сигнал пробуждения, и все ожидающие ожидания и пробуждения IRP будут завершены.