Обработка системного Set-Power IRP в драйвере фильтра
Все драйверы фильтров и любой драйвер функции, который не владеет политикой питания для своего стека устройств, должны просто передать IRP с установленной мощностью системы в следующий драйвер ниже, выполнив следующие действия.
Вызовите IoAcquireRemoveLock, передав текущую IRP, чтобы убедиться, что драйвер не получит запрос IRP_MN_REMOVE_DEVICE PnP при обработке IRP питания.
Если IoAcquireRemoveLock возвращает состояние сбоя, драйвер не должен продолжать обработку IRP. Вместо этого, начиная с Windows Vista, драйвер должен вызвать IoCompleteRequest , чтобы завершить IRP и вернуть состояние сбоя. В Windows Server 2003, Windows XP и Windows 2000 драйвер должен сначала вызвать PoStartNextPowerIrp, вызвать IoCompleteRequest для завершения IRP, а затем вернуть состояние сбоя.
Вызовите PoStartNextPowerIrp , чтобы запустить следующий IRP питания. (Только Windows Server 2003, Windows XP и Windows 2000.)
Задайте расположение стека IRP (IoSkipCurrentIrpStackLocation или IoCopyCurrentIrpStackLocationToNext). Драйвер может задать подпрограмму IoCompletion в IRP, но это редко требуется.
Вызовите IoCallDriver (в Windows 7 и Windows Vista) или PoCallDriver (в Windows Server 2003, Windows XP и Windows 2000), чтобы передать IRP следующему драйверу ниже.
Вызов ioReleaseRemoveLock. Однако если драйвер задает подпрограмму IoCompletion для IRP, выполните этот вызов из подпрограммы IoCompletion .
Возврат STATUS_PENDING из подпрограммы DispatchPower .