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


Обработка системного Set-Power IRP в драйвере фильтра

Все драйверы фильтров и любой драйвер функции, который не владеет политикой питания для своего стека устройств, должны просто передать IRP с установленной мощностью системы в следующий драйвер ниже, выполнив следующие действия.

  1. Вызовите IoAcquireRemoveLock, передав текущую IRP, чтобы убедиться, что драйвер не получит запрос IRP_MN_REMOVE_DEVICE PnP при обработке IRP питания.

    Если IoAcquireRemoveLock возвращает состояние сбоя, драйвер не должен продолжать обработку IRP. Вместо этого, начиная с Windows Vista, драйвер должен вызвать IoCompleteRequest , чтобы завершить IRP и вернуть состояние сбоя. В Windows Server 2003, Windows XP и Windows 2000 драйвер должен сначала вызвать PoStartNextPowerIrp, вызвать IoCompleteRequest для завершения IRP, а затем вернуть состояние сбоя.

  2. Вызовите PoStartNextPowerIrp , чтобы запустить следующий IRP питания. (Только Windows Server 2003, Windows XP и Windows 2000.)

  3. Задайте расположение стека IRP (IoSkipCurrentIrpStackLocation или IoCopyCurrentIrpStackLocationToNext). Драйвер может задать подпрограмму IoCompletion в IRP, но это редко требуется.

  4. Вызовите IoCallDriver (в Windows 7 и Windows Vista) или PoCallDriver (в Windows Server 2003, Windows XP и Windows 2000), чтобы передать IRP следующему драйверу ниже.

  5. Вызов ioReleaseRemoveLock. Однако если драйвер задает подпрограмму IoCompletion для IRP, выполните этот вызов из подпрограммы IoCompletion .

  6. Возврат STATUS_PENDING из подпрограммы DispatchPower .