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

Используйте эти правила проверки, чтобы убедиться, что драйвер вызывает DDI на требуемом уровне IRQL.

Драйвер, который не соответствует правилам IRQL, может вызвать серьезные проблемы при работе, что может привести к состояниям взаимоблокировки или сбоям компьютера.

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

Тема Описание

ForwardedAtBadIrql

Правило ForwardedAtBadIrql указывает, что драйвер должен вызывать IoCallDriver и PoCallDriver на уровне IRQL<DISPATCH_LEVEL, если только основной код функции IRP, который пересылается, не является одним из следующих:

ForwardedAtBadIrqlAllocate

Правило ForwardedAtBadIrqlAllocate указывает, что драйвер должен вызывать IoCallDriver и PoCallDriver на уровне IRQL<DISPATCH_LEVEL, если только не пересылается одна из следующих основных функций IRP:

ForwardedAtBadIrqlFsdAsync

Правило ForwardedAtBadIrqlFsdAsync указывает, что драйвер вызывает IoCallDriver и PoCallDriver на уровне IRQL<DISPATCH_LEVEL, за исключением случаев, когда пересылается основной код функции IRP, равный одному из следующих:

ForwardedAtBadIrqlFsdSync

Правило ForwardedAtBadIrqlFsdSync указывает, что драйвер вызывает IoCallDriver и PoCallDriver на IRQL<DISPATCH_LEVEL, если не пересылается основной код функции IRP, который является одним из следующих:

IrqlApcLte

Правило IrqlApcLte указывает, что драйвер вызывает ObGetObjectSecurity и ObReleaseObjectSecurity , только если он выполняется в IRQL <= APC_LEVEL.

IrqlDispatch

Правило IrqlDispatch указывает, что драйвер вызывает следующие DDIs только тогда, когда он выполняется на уровне IRQL = DISPATCH_LEVEL.

IrqlExAllocatePool

Правило IrqlExAllocatePool указывает, что драйвер вызывает ExAllocatePoolWithTag и ExAllocatePoolWithTagPriority только тогда, когда он выполняется на уровне IRQL<=DISPATCH_LEVEL.

IrqlExApcLte1

Правило IrqlExApcLte1 указывает, что драйвер вызывает ExAcquireFastMutex и ExTryToAcquireFastMutex только в IRQL <= APC_LEVEL.

IrqlExApcLte2

Правило IrqlExApcLte2 указывает, что драйвер вызывает следующие подпрограммы только в IRQL <= APC_LEVEL.

IrqlExApcLte3

Правило IrqlExApcLte3 указывает, что драйвер вызывает следующие процедуры поддержки руководителей только в IRQL <= APC_LEVEL.

IrqlExApcLteInline

Правило IrqlExApcLteInline указывает, что DDIs вызываются только на надлежащих уровнях IRQL

IrqlExFree1

Правило IrqlExFree1 указывает, что ExFreePool и ExFreePoolWithTag вызываются на соответствующем уровне IRQL.

IrqlExFree2

Правило IrqlExFree2 указывает, что ExFreePool и ExFreePoolWithTag вызываются в надлежащей среде IRQL.

IrqlExFree3

Правило IrqlExFree3 указывает, что ExFreePool и ExFreePoolWithTag вызывают на соответствующем уровне IRQL.

IrqlExPassive

Правило IrqlExPassive указывает, что драйвер вызывает следующие процедуры поддержки руководителей только в IRQL = PASSIVE_LEVEL:

Правило IrqlExPassive также указывает, что драйвер вызывает ExRaiseStatus в IRQL <= APC_LEVEL

IrqlIoApcLte

Правило IrqlIoApcLte указывает, что драйвер вызывает следующие подпрограммы диспетчера ввода-вывода, только если он выполняется в IRQL <= APC_LEVEL:

IrqlIoDispatch

Правило IrqlIoDispatch указывает, что драйвер вызывает следующие подпрограммы диспетчера ввода-вывода, только если он выполняется в IRQL <= DISPATCH_LEVEL: IoGetDeviceToVerify, IoSetDeviceToVerify.

IrqlIoPassive1

Правило IrqlIoPassive1 указывает, что драйвер должен вызывать следующие функции только при выполнении на уровне IRQL = PASSIVE_LEVEL:

IrqlIoPassive2

Правило IrqlIoPassive2 указывает, что драйвер должен вызывать следующие процедуры диспетчера ввода-вывода только на уровне IRQL = PASSIVE_LEVEL:

IrqlIoPassive3

Правило IrqlIoPassive3 указывает, что драйвер вызывает следующие подпрограммы только при выполнении на уровне IRQL = PASSIVE_LEVEL:

IrqlIoPassive4

Правило IrqlIoPassive4 указывает, что драйвер вызывает следующие подпрограммы только когда оно выполняется на уровне IRQL = PASSIVE_LEVEL.

IrqlIoPassive5

Правило IrqlIoPassive5 указывает, что драйвер вызывает определенные функции диспетчера ввода-вывода только когда он выполняется на уровне IRQL = PASSIVE_LEVEL.

IrqlIoRtlZwPassive

Правило IrqlIoRtlZwPassive указывает, что драйвер вызывает определенные рутины диспетчера ввода-вывода только когда он работает на уровне IRQL = PASSIVE_LEVEL.

IrqlKeApcLte1

Правило IrqlKeApcLte1 указывает, что драйвер вызывает следующие подпрограммы ядра, только если он выполняется в IRQL <= APC_LEVEL:

IrqlKeApcLte2

Правило IrqlKeApcLte2 указывает, что драйвер вызывает следующие подпрограммы ядра, только если он выполняется в IRQL <= APC_LEVEL:

IrqlKeDispatchLte

Правило IrqlKeDispatchLte указывает, что драйвер должен вызывать следующие функции ядра лишь при условии, что он работает на уровне IRQL <= DISPATCH_LEVEL.

IrqlKeRaiseLower

Правило IrqlKeRaiseLower указывает, что драйвер выполняет следующие действия при повышении и снижении IRQL:

Когда драйвер вызывает KeRaiseIrql, он выполняется в IRQL, который ниже или равен значению параметра NewIrql .
Драйвер вызывает KeLowerIrql только после вызова KeRaiseIrql или KeRaiseIrqlToDpcLevel.

IrqlKeRaiseLower2

Правило IrqlKeRaiseLower2 указывает, что драйверы используют KeLowerIrql для восстановления исходного IRQL, вызываемого предыдущим вызовом KeRaiseIrql или KeRaiseIrqlToDpcLevel.

IrqlKeReleaseSpinLock

Правило IrqlKeReleaseSpinLock указывает, что драйвер вызывает KeReleaseSpinLock только в том случае, если он выполняется в IRQL = DISPATCH_LEVEL.

IrqlKeSetEvent

Правило IrqlKeSetEvent указывает, что подпрограмма KeSetEvent вызывается только в IRQL = DISPATCH_LEVEL, если значение < имеет значение FALSE, а при значении IRQL <= APC_LEVEL, если для wait задано значение TRUE.

IrqlKeWaitForMutexObject

Правило IrqlKeWaitForMutexObject указывает, что драйвер должен вызывать подпрограмму KeWaitForMutexObject на соответствующем уровне IRQL на основе значения параметра Timeout.

IrqlKeWaitForMultipleObjects

Правило IrqlKeWaitForMultipleObjects указывает, что вызывающие объекты подпрограммы KeWaitForMultipleObjects должны выполняться в надлежащей среде IRQL на основе параметра Timeout .

IrqlMmApcLte

Правило IrqlMmApcLte указывает, что драйвер вызывает следующие подпрограммы диспетчера памяти, только если он выполняется в IRQL <= APC_LEVEL:

IrqlMmDispatch

Правило IrqlMmDispatch указывает, что драйвер вызывает MmFreeContiguousMemory только в том случае, если он выполняется в IRQL <= DISPATCH_LEVEL.

IrqlNtifsApcPassive

Правило IIrqlNtifsApcPassive указывает, что драйвер вызывает перечисленные в правиле DDIs только при выполнении на уровне IRQL = PASSIVE_LEVEL или IRQL <= APC_LEVEL.

IrqlObPassive

Правило IrqlObPassive указывает, что драйвер вызывает ObReferenceObjectByHandle только при выполнении в IRQL = PASSIVE_LEVEL.

IrqlPsPassive

Правило IrqlPsPassive указывает, что драйвер вызывает определенные процедуры структур процесса, только если он работает на уровне IRQL = PASSIVE_LEVEL.

IrqlReturn

Правило IrqlReturn указывает, что подпрограммы отправки драйвера возвращаются в тот же IRQL, в котором они были вызваны.

IrqlRtlPassive

Правило IrqlRtlPassive указывает, что драйвер вызывает RtlDeleteRegistryValue только когда он работает на уровне IRQL = PASSIVE_LEVEL.

IrqlZwPassive

Правило IrqlZwPassive указывает, что драйвер вызывает ZwClose только в том случае, если он выполняется в IRQL = PASSIVE_LEVEL.

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

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

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

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

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

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