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


Набор правил IrpProcessing (WDM)

Используйте эти правила, чтобы убедиться, что драйвер правильно обрабатывает пакеты запросов ввода-вывода (IRP).

В этом разделе

Раздел Описание

CompleteRequest

Правило CompleteRequest проверяет, не вызывается ли подпрограмма IoCompleteRequest после выполнения подпрограммы завершения и не возвращает STATUS_MORE_PROCESSING_REQUIRED.

CompleteRequestStatusCheck

Правило CompleteRequestStatusCheck проверяет, совпадает ли значение состояния ввода-вывода в IRP со значением состояния, возвращенным драйвером нижнего уровня.

CompletionRoutineRegistered

Правило CompletionRoutineRegistered указывает, что если подпрограмма диспетчеризации регистрирует подпрограмму IoCompletion с помощью IoSetCompletionRoutineEx, подпрограмма отправки должна вызывать IoCallDriver или PoCallDriver.

DoubleCompletion

Правило DoubleCompletion (WDM) указывает, что драйвер не должен дважды вызывать подпрограмму IoCompleteRequest для одного ИП.

IoReuseIrp

Правило IoReuseIrp указывает, что драйвер должен использовать IoReuseIrp только в irP, которые он ранее выделил с IoAllocateIrp.

IoReuseIrp2

Правило IoReuseIrp2 указывает, что драйвер должен использовать IoReuseIrp только в irP, которые он ранее выделил в драйвере.

IoSetCompletionExCompleteIrp

Правило IoSetCompletionExCompleteIrp указывает, что подпрограмма IoSetCompletionRoutineEx возвращает значение NTSTATUS. Драйвер должен проверка это значение, чтобы определить, была ли подпрограмма IoCompletion успешно зарегистрирована перед вызовом IoCallDriver или PoCallDriver, и если IoSetCompletionRoutineEx завершается, IRP должна быть завершена и подпрограмма диспетчеризации должна вернуться.

IoSetCompletionRoutineExCheck

Правило IoSetCompletionRoutineExCheck указывает, что подпрограмма IoSetCompletionRoutineEx возвращает значение NTSTATUS. Драйвер должен проверка это значение, чтобы определить, была ли подпрограмма IoCompletion успешно зарегистрирована перед вызовом IoCallDriver или PoCallDriver.

IoSetCompletionRoutineExCheckDeviceObject

Правило IoSetCompletionRoutineExCheckDeviceObject указывает, что если текущий объект устройства не передается в IoSetCompletionRoutineEx , а нижний объект устройства — , это может привести к состоянию гонки, при котором текущий объект устройства может быть выгружен, даже если подпрограмма завершения не запущена.

IoSetCompletionRoutineNonPnpDriver

Правило IoSetCompletionRoutineNonPnpDriver указывает, что драйверы, которые не являются драйверами PnP, должны использовать IoSetCompletionRoutineEx , а не IoSetCompletionRoutine.

IrpCancelField

Правило IrpCancelField указывает, что драйвер проверка значение члена Irp-Cancel> при задании подпрограммы отмены для IRP, который он занес.

IrpProcessingComplete

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

LowerDriverReturn

Правило LowerDriverReturn указывает, что после использования PoCallDriver или IoCallDriver для вызова более низкого драйвера драйвер сохраняет состояние возврата из вызова и передает полученное состояние возврата в подпрограмму диспетчеризации.

SignalEventInCompletion

Правило SignalEventInCompletion указывает, что при обработке асинхронного IRP драйвер должен вызвать KeSetEvent в подпрограмме завершения при установке флага Irp-PendingReturned>.

SignalEventInCompletion2

Правило SignalEventInCompletion2 указывает, что при обработке асинхронного IRP драйвер должен вызывать KeSetEvent в подпрограмме завершения при установке флага Irp-PendingReturned>.

SignalEventInCompletion3

Правило SignalEventInCompletion3 указывает, что при обработке асинхронного IRP драйвер должен вызвать KeSetEvent в подпрограмме завершения при установке флага Irp-PendingReturned>.

StartIoCancel

Правило StartIoCancel указывает, что драйвер не должен вызывать IoSetStartIoAttributes с параметром NonCancelable, имеющим значение FALSE, перед вызовом IoSetCancelRoutine с подпрограммой отмены, отличной от NULL.

StartIoRecursion

Правило StartIoRecursion указывает, что если подпрограмма StartIo драйвера включает вызов IoStartNextPacket, драйвер должен сначала вызвать IoSetStartIoAttributes с атрибутом DeferredStartIo, равным TRUE. В противном случае может возникнуть бесконечная рекурсия.

PnpRemove

Правило PnpRemove указывает, что драйвер не может выполнять IRP_MN_SURPRISE_REMOVAL, IRP_MN_CANCEL_REMOVE_DEVICE, IRP_MN_CANCEL_STOP_DEVICE или IRP_MN_REMOVE_DEVICE запросы со сбоем.

PnpSurpriseRemove

Правило PnpSurpriseRemove указывает, что драйвер не вызывает IoDeleteDevice или IoDetachDevice при обработке запроса IRP_MN_SURPRISE_REMOVAL .

PowerDownAllocate

Правило PowerDownAllocate указывает, что драйвер FDO и FIDO не должны выделять память при обработке IRP_MN_SET_POWER запроса для перехода SystemPowerState с s0 на [S1... S5].

PowerDownFail

Правило PowerDownFail указывает, что драйвер FDO или FIDO не должен завершать запрос IRP_MN_SET_POWER при выключении устройства. Это правило применяется только к драйверам FDO и FIDO.

Идентификаторы PowerIrpDIs

Правило PowerIrpDIs указывает, что, когда драйвер обрабатывает систему или устройство IRP_MJ_POWER с IRP_MN_SET_POWER, он не должен вызывать DDIs, которые могут вызываться только в PASSIVE_LEVEL.

PowerUpFail

Правило PowerUpFail указывает, что драйвер FDO или FIDO не должен завершать запрос IRP_MN_SET_POWER при выключении устройства.

PnpIrpCompletion

Правило PnpIrpCompletion проверяет, передает ли драйвер FDO PnP IRP нижнему драйверу.

WmiComplete

Правило WmiComplete указывает, что при обработке вспомогательного IRP WMI драйвер вызывает IoCompleteRequest перед возвратом из подпрограммы DispatchSystemControl .

WmiForward

Правило WmiForward указывает, что драйвер должен пересылать незначительные irp WMI , если требуется пересылка.

Выбор набора правил IrpProcessing

  1. Выберите проект драйвера (.vcxProj) в Microsoft Visual Studio. В меню Драйвер щелкните Запустить средство проверки статических драйверов....

  2. Перейдите на вкладку Правила . В разделе Наборы правил выберите IrpProcessing.

    Чтобы выбрать набор правил по умолчанию в окне командной строки разработчика Visual Studio, укажите IrpProcessing.sdv с параметром /проверка. Пример:

    msbuild /t:sdv /p:Inputs="/check:IrpProcessing.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32
    

    Дополнительные сведения см. в разделах Использование статического средства проверки драйверов для поиска дефектов в драйверах и Команд статического средства проверки драйверов (MSBuild).