Вызов PoStartNextPowerIrp

Начиная с Windows Vista вызов PoStartNextPowerIrp не требуется, и вызов этой подпрограммы не выполняет никаких операций управления питанием. Однако в Windows Server 2003, Windows XP и Windows 2000 после того, как драйвер обработает IRP с мощностью запроса или IRP с заданной мощностью, драйвер должен вызвать PoStartNextPowerIrp , чтобы уведомить диспетчер питания о том, что он готов к получению другого IRP питания. Драйверы должны вызывать PoStartNextPowerIrp , а расположение стека IRP указывает на текущий драйвер и перед вызовом PoCallDriver.

Драйвер должен вызывать эту подпрограмму один раз для каждого IRP_MN_QUERY_POWER или IRP_MN_SET_POWER запроса, который он получает. Драйверам не нужно вызывать PoStartNextPowerIrp при обработке запросов IRP_MN_WAIT_WAKE или IRP_MN_POWER_SEQUENCE .

Когда драйвер вызывает PoStartNextPowerIrp, текущее расположение стека IRP должно указывать на текущий драйвер. Как правило, этот вызов лучше всего выполнить из процедуры IoCompletion . Метод PoStartNextPowerIrp должен вызываться перед IoCompleteRequest, IoSkipCurrentIrpStackLocation и PoCallDriver. Вызов подпрограмм в другом порядке может привести к взаимоблокировке системы.

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

В следующих разделах показано, когда каждый тип драйвера должен вызывать эту подпрограмму:

Вызов PoStartNextPowerIrp из драйвера фильтра

Вызов PoStartNextPowerIrp от владельца политики управления питанием устройства

Вызов PoStartNextPowerIrp из драйвера шины