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


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

  3. Вызовите PoStartNextPowerIrp. (Только Windows Server 2003, Windows XP и Windows 2000)

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

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

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

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