Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Используйте эти правила проверки, чтобы убедиться, что драйвер вызывает DDI на требуемом уровне IRQL.
Драйвер, который не соответствует правилам IRQL, может вызвать серьезные проблемы при работе, что может привести к состояниям взаимоблокировки или сбоям компьютера.
В этом разделе
| Тема | Описание |
|---|---|
Правило ForwardedAtBadIrql указывает, что драйвер должен вызывать IoCallDriver и PoCallDriver на уровне IRQL<DISPATCH_LEVEL, если только основной код функции IRP, который пересылается, не является одним из следующих: |
|
Правило ForwardedAtBadIrqlAllocate указывает, что драйвер должен вызывать IoCallDriver и PoCallDriver на уровне IRQL<DISPATCH_LEVEL, если только не пересылается одна из следующих основных функций IRP: |
|
Правило ForwardedAtBadIrqlFsdAsync указывает, что драйвер вызывает IoCallDriver и PoCallDriver на уровне IRQL<DISPATCH_LEVEL, за исключением случаев, когда пересылается основной код функции IRP, равный одному из следующих: |
|
Правило ForwardedAtBadIrqlFsdSync указывает, что драйвер вызывает IoCallDriver и PoCallDriver на IRQL<DISPATCH_LEVEL, если не пересылается основной код функции IRP, который является одним из следующих: |
|
Правило IrqlApcLte указывает, что драйвер вызывает ObGetObjectSecurity и ObReleaseObjectSecurity , только если он выполняется в IRQL <= APC_LEVEL. |
|
Правило IrqlDispatch указывает, что драйвер вызывает следующие DDIs только тогда, когда он выполняется на уровне 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, если значение < имеет значение 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 указывает, что драйвер вызывает определенные процедуры структур процесса, только если он работает на уровне 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 с параметром /check . Рассмотрим пример.
msbuild /t:sdv /p:Inputs="/check:Irql.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32Дополнительные сведения см. в статье Использование средства проверки статических драйверов для поиска дефектов в драйверах и команды средства проверки статических драйверов (MSBuild).