Набор правил IRQL (WDM)
Используйте эти правила, чтобы убедиться, что драйвер выполняет вызовы DDI по требуемому irQL.
Драйвер, который не соответствует правилам IRQL, может вызвать серьезные проблемы во время работы, которые могут привести к взаимоблокировке или сбою компьютера.
В этом разделе
Раздел | Описание |
---|---|
Правило ForwardedAtBadIrql указывает, что драйвер должен вызывать IoCallDriver и PoCallDriver по DISPATCH_LEVEL IRQL<, если только пересылаемый код основной функции IRP не является одним из следующих: |
|
Правило ForwardedAtBadIrqlAllocate указывает, что драйвер должен вызывать IoCallDriver и PoCallDriver по DISPATCH_LEVEL IRQL<, если только пересылаемый код основной функции IRP не является одним из следующих: |
|
Правило ForwardedAtBadIrqlFsdAsync указывает, что драйвер вызывает IoCallDriver и PoCallDriver на DISPATCH_LEVEL IRQL<, если только пересылаемый код основной функции IRP не является одним из следующих: |
|
Правило ForwardedAtBadIrqlFsdSync указывает, что драйвер вызывает IoCallDriver и PoCallDriver на DISPATCH_LEVEL IRQL<, если только пересылаемый код основной функции IRP не является одним из следующих: |
|
Правило IrqlApcLte указывает, что драйвер вызывает ObGetObjectSecurity и ObReleaseObjectSecurity только при выполнении в IRQL <= APC_LEVEL. |
|
Правило IrqlDispatch указывает, что драйвер вызывает следующие DID только в том случае, если выполняется в IRQL = DISPATCH_LEVEL. |
|
Правило IrqlExAllocatePool указывает, что драйвер вызывает ExAllocatePoolWithTag и ExAllocatePoolWithTagPriority только при выполнении в IRQL<=DISPATCH_LEVEL. |
|
Правило IrqlExApcLte1 указывает, что драйвер вызывает ExAcquireFastMutex и ExTryToAcquireFastMutex только в irQL <= APC_LEVEL. |
|
Правило IrqlExApcLte2 указывает, что драйвер вызывает следующие подпрограммы только в IRQL <= APC_LEVEL. |
|
Правило IrqlExApcLte3 указывает, что драйвер вызывает следующие исполнительные подпрограммы поддержки только в IRQL <= APC_LEVEL. |
|
Правило IrqlExApcLteInline указывает, что DDIs вызываются только на соответствующих уровнях IRQL. |
|
Правило IrqlExFree1 указывает, что ExFreePool и ExFreePoolWithTag вызываются по правильному irQL. |
|
Правило IrqlExFree2 указывает, что ExFreePool и ExFreePoolWithTag вызываются по правильному irQL. |
|
Правило IrqlExFree3 указывает, что ExFreePool и ExFreePoolWithTag вызываются по правильному irQL. |
|
Правило IrqlExPassive указывает, что драйвер вызывает следующие подпрограммы поддержки руководителей только в IRQL = PASSIVE_LEVEL: Правило IrqlExPassive также указывает, что драйвер вызывает ExRaiseStatus по адресу IRQL <= APC_LEVEL |
|
Правило IrqlIoApcLte указывает, что драйвер вызывает следующие подпрограммы диспетчера ввода-вывода только в том случае, если выполняется в IRQL <= APC_LEVEL: |
|
Правило IrqlIoDispatch указывает, что драйвер вызывает следующие подпрограммы диспетчера ввода-вывода только при выполнении в IRQL <= DISPATCH_LEVEL: IoGetDeviceToVerify, IoSetDeviceToVerify. |
|
Правило IrqlIoPassive1 указывает, что драйвер вызывает следующие подпрограммы только в том случае, если выполняется в IRQL = PASSIVE_LEVEL: |
|
Правило IrqlIoPassive2 указывает, что драйвер вызывает следующие подпрограммы диспетчера ввода-вывода только в irQL = PASSIVE_LEVEL: |
|
Правило IrqlIoPassive3 указывает, что драйвер вызывает следующие подпрограммы только в том случае, если выполняется в IRQL = PASSIVE_LEVEL: |
|
Правило IrqlIoPassive4 указывает, что драйвер вызывает следующие подпрограммы только в том случае, если выполняется в IRQL = PASSIVE_LEVEL: |
|
Правило IrqlIoPassive5 указывает, что драйвер вызывает определенные подпрограммы диспетчера ввода-вывода только в том случае, если он выполняется в irQL = PASSIVE_LEVEL. |
|
Правило IrqlIoRtlZwPassive указывает, что драйвер вызывает определенные подпрограммы диспетчера ввода-вывода только в том случае, если выполняется в irQL = PASSIVE_LEVEL. |
|
Правило IrqlKeApcLte1 указывает, что драйвер вызывает следующие подпрограммы ядра, только если выполняется в irQL <= APC_LEVEL: |
|
Правило IrqlKeApcLte2 указывает, что драйвер вызывает следующие подпрограммы ядра, только если выполняется в irQL <= APC_LEVEL: |
|
Правило IrqlKeDispatchLte указывает, что драйвер вызывает следующие подпрограммы ядра, только если выполняется в irQL <= DISPATCH_LEVEL: |
|
Правило IrqlKeRaiseLower указывает, что драйвер выполняет следующие действия при повышении и снижении IRQL: Когда драйвер вызывает KeRaiseIrql, он выполняется в irQL, который меньше или равен значению параметра NewIrql .Драйвер вызывает KeLowerIrql только после вызова KeRaiseIrql или KeRaiseIrqlToDpcLevel. |
|
Правило IrqlKeRaiseLower2 указывает, что драйверы используют KeLowerIrql для восстановления исходного IRQL, вызванного предыдущим вызовом KeRaiseIrql или KeRaiseIrqlToDpcLevel. |
|
Правило IrqlKeReleaseSpinLock указывает, что драйвер вызывает KeReleaseSpinLock только в том случае, если выполняется в irQL = DISPATCH_LEVEL. |
|
Правило IrqlKeSetEvent указывает, что подпрограмма KeSetEvent вызывается только в параметре IRQL <= DISPATCH_LEVEL, если параметр Wait имеет значение FALSE, и параметр IRQL <= APC_LEVEL, если параметр Wait имеет значение TRUE. |
|
Правило IrqlKeWaitForMutexObject указывает драйвер для вызова подпрограммы KeWaitForMutexObject в правильном irQL на основе значения параметра Timeout : |
|
Правило IrqlKeWaitForMultipleObjects указывает, что вызывающие объекты подпрограммы KeWaitForMultipleObjects должны выполняться в правильном irQL на основе параметра Timeout . |
|
Правило IrqlMmApcLte указывает, что драйвер вызывает следующие подпрограммы диспетчера памяти только в том случае, если выполняется в IRQL <= APC_LEVEL: |
|
Правило IrqlMmDispatch указывает, что драйвер вызывает MmFreeContiguousMemory только в том случае, если выполняется в irQL <= DISPATCH_LEVEL. |
|
Правило IIrqlNtifsApcPassive указывает, что драйвер вызывает DDIs, перечисленные в правиле, только если выполняется в IRQL = PASSIVE_LEVEL или в IRQL <= APC_LEVEL. |
|
Правило IrqlObPassive указывает, что драйвер вызывает ObReferenceObjectByHandle только в том случае, если выполняется в irQL = PASSIVE_LEVEL. |
|
Правило IrqlPsPassive указывает, что драйвер вызывает следующие подпрограммы Process Structure только в том случае, если выполняется в IRQL = PASSIVE_LEVEL: |
|
Правило IrqlReturn указывает, что подпрограммы диспетчеризации драйвера возвращаются в том же irQL, в котором они были вызваны. |
|
Правило IrqlRtlPassive указывает, что драйвер вызывает RtlDeleteRegistryValue только в том случае, если он выполняется в irQL = PASSIVE_LEVEL. |
|
Правило IrqlZwPassive указывает, что драйвер вызывает ZwClose только при выполнении в irQL = PASSIVE_LEVEL. |
Выбор набора правил Irql
Выберите проект драйвера (VCXProj) в Microsoft Visual Studio. В меню Драйвер выберите Запуск средства проверки статических драйверов....
Перейдите на вкладку Правила . В разделе Наборы правил выберите Irql.
Чтобы выбрать набор правил по умолчанию в окне командной строки разработчика Visual Studio, укажите Irql.sdv с параметром /проверка. Пример:
msbuild /t:sdv /p:Inputs="/check:Irql.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32
Дополнительные сведения см. в разделах Использование статического средства проверки драйверов для поиска дефектов в драйверах и Команд средства проверки статических драйверов (MSBuild).