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


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

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

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

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

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

ForwardedAtBadIrql

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

ForwardedAtBadIrqlAllocate

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

ForwardedAtBadIrqlFsdAsync

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

ForwardedAtBadIrqlFsdSync

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

IrqlApcLte

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

IrqlDispatch

Правило IrqlDispatch указывает, что драйвер вызывает следующие DID только в том случае, если выполняется в 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, если параметр Wait имеет значение 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 указывает, что драйвер вызывает следующие подпрограммы Process Structure только в том случае, если выполняется в 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 с параметром /проверка. Пример:

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

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