Обработка системного Query-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 и вернуть состояние сбоя.
Определите, должен ли запрос завершиться ошибкой. Рекомендации см. в разделе Сбой системы Query-Power IRP в фильтре или драйвере функции и завершение обработки, как описано в этом разделе.
Вызовите PoStartNextPowerIrp. (Только 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 .