IRQL 规则集 (WDM)

使用这些规则验证驱动程序是否在所需的 IRQL 上发出 DDI 调用。

不遵循 IRQL 规则的驱动程序在操作期间可能会导致严重问题,从而导致死锁情况或计算机崩溃。

在本节中

主题 说明

ForwardedAtBadIrql

ForwardedAtBadIrql 规则指定驱动程序应在 IRQL<DISPATCH_LEVEL调用 IoCallDriverPoCallDriver,除非要转发的 IRP 主要函数代码为下列代码之一:

ForwardedAtBadIrqlAllocate

ForwardedAtBadIrqlAllocate 规则指定驱动程序应在 IRQL<DISPATCH_LEVEL调用 IoCallDriverPoCallDriver,除非要转发的 IRP 主要函数代码为下列代码之一:

ForwardedAtBadIrqlFsdAsync

ForwardedAtBadIrqlFsdAsync 规则指定驱动程序在 IRQL<DISPATCH_LEVEL调用 IoCallDriverPoCallDriver,除非要转发的 IRP 主要函数代码为下列代码之一:

ForwardedAtBadIrqlFsdSync

ForwardedAtBadIrqlFsdSync 规则指定驱动程序在 IRQL<DISPATCH_LEVEL调用 IoCallDriverPoCallDriver,除非要转发的 IRP 主要函数代码为下列代码之一:

IrqlApcLte

IrqlApcLte 规则指定驱动程序仅在 IRQL <= APC_LEVEL执行时才调用 ObGetObjectSecurityObReleaseObjectSecurity

IrqlDispatch

IrqlDispatch 规则指定驱动程序仅在 IRQL = DISPATCH_LEVEL执行时才调用以下 DDI。

IrqlExAllocatePool

IrqlExAllocatePool 规则指定驱动程序仅在 IRQL<=DISPATCH_LEVEL执行时调用 ExAllocatePoolWithTagExAllocatePoolWithTagPriority

IrqlExApcLte1

IrqlExApcLte1 规则指定驱动程序仅在 IRQL <= APC_LEVEL调用 ExAcquireFastMutexExTryToAcquireFastMutex

IrqlExApcLte2

IrqlExApcLte2 规则指定驱动程序仅在 IRQL <= APC_LEVEL 调用以下例程。

IrqlExApcLte3

IrqlExApcLte3 规则指定驱动程序仅在 IRQL <= APC_LEVEL调用以下执行支持例程。

IrqlExApcLteInline

IrqlExApcLteInline 规则指定仅在适当的 IRQL 级别调用 DDI

IrqlExFree1

IrqlExFree1 规则指定在适当的 IRQL 下调用 ExFreePoolExFreePoolWithTag

IrqlExFree2

IrqlExFree2 规则指定在适当的 IRQL 下调用 ExFreePoolExFreePoolWithTag

IrqlExFree3

IrqlExFree3 规则指定在适当的 IRQL 下调用 ExFreePoolExFreePoolWithTag

IrqlExPassive

IrqlExPassive 规则指定驱动程序仅在 IRQL = PASSIVE_LEVEL调用以下执行支持例程:

IrqlExPassive 规则还指定驱动程序在 IRQL <= APC_LEVEL

IrqlIoApcLte

IrqlIoApcLte 规则指定驱动程序仅在 IRQL <= APC_LEVEL执行时才调用以下 I/O 管理器例程:

IrqlIoDispatch

IrqlIoDispatch 规则指定驱动程序仅在 IRQL <= DISPATCH_LEVEL 执行时调用以下 I/O 管理器例程:IoGetDeviceToVerifyIoSetDeviceToVerify

IrqlIoPassive1

IrqlIoPassive1 规则指定驱动程序仅在 IRQL = PASSIVE_LEVEL执行时才调用以下例程:

IrqlIoPassive2

IrqlIoPassive2 规则指定驱动程序仅在 IRQL = PASSIVE_LEVEL 调用以下 I/O 管理器例程:

IrqlIoPassive3

IrqlIoPassive3 规则指定驱动程序仅在 IRQL = PASSIVE_LEVEL 执行时才调用以下例程:

IrqlIoPassive4

IrqlIoPassive4 规则指定仅当驱动程序在 IRQL = PASSIVE_LEVEL 执行时才调用以下例程:

IrqlIoPassive5

IrqlIoPassive5 规则指定驱动程序仅在 IRQL = PASSIVE_LEVEL 执行时才调用特定的 I/O 管理器例程。

IrqlIoRtlZwPassive

IrqlIoRtlZwPassive 规则指定驱动程序仅在 IRQL = PASSIVE_LEVEL 执行时才调用特定的 I/O 管理器例程。

IrqlKeApcLte1

IrqlKeApcLte1 规则指定驱动程序仅在 IRQL <= APC_LEVEL 执行时才调用以下内核例程:

IrqlKeApcLte2

IrqlKeApcLte2 规则指定驱动程序仅在 IRQL <= APC_LEVEL执行时才调用以下内核例程:

IrqlKeDispatchLte

IrqlKeDispatchLte 规则指定驱动程序仅在 IRQL <= DISPATCH_LEVEL 执行时才调用以下内核例程:

IrqlKeRaiseLower

IrqlKeRaiseLower 规则指定驱动程序在提高和降低 IRQL 时执行以下操作:

当驱动程序调用 KeRaiseIrql 时,它将在低于或等于 NewIrql 参数值的 IRQL 处执行。
驱动程序仅在调用 KeRaiseIrql 或KeRaiseIrqlToDpcLevel 后调用 KeLowerIrql

IrqlKeRaiseLower2

IrqlKeRaiseLower2 规则指定驱动程序使用 KeLowerIrql 还原先前调用 KeRaiseIrql 或 KeRaiseIrqlToDpcLevel 引发的原始 IRQL。

IrqlKeReleaseSpinLock

IrqlKeReleaseSpinLock 规则指定驱动程序仅在 IRQL = DISPATCH_LEVEL执行时才调用 KeReleaseSpinLock

IrqlKeSetEvent

IrqlKeSetEvent 规则指定仅在将 Wait 设置为 FALSE 时在 IRQL <= DISPATCH_LEVEL,在将 Wait 设置为 TRUE 时,在 IRQL <= APC_LEVEL 调用 KeSetEvent程。

IrqlKeWaitForMutexObject

IrqlKeWaitForMutexObject 规则指定驱动程序以基于 Timeout 参数的值在适当的 IRQL 上调用 KeWaitForMutexObject 例程:

IrqlKeWaitForMultipleObjects

IrqlKeWaitForMultipleObjects 规则指定 KeWaitForMultipleObjects 例程的调用方必须基于 Timeout 参数在适当的 IRQL 上运行。

IrqlMmApcLte

IrqlMmApcLte 规则指定驱动程序仅在 IRQL <= APC_LEVEL 执行时调用以下内存管理器例程:

IrqlMmDispatch

IrqlMmDispatch 规则指定驱动程序仅在 IRQL <= DISPATCH_LEVEL 执行时才调用 MmFreeContiguousMemory

IrqlNtifsApcPassive

IIrqlNtifsApcPassive 规则指定驱动程序仅在 IRQL = PASSIVE_LEVEL 或 IRQL <= APC_LEVEL 执行时调用规则中列出的 DDI。

IrqlObPassive

IrqlObPassive 规则指定驱动程序仅在 IRQL = PASSIVE_LEVEL 执行时调用 ObReferenceObjectByHandle

IrqlPsPassive

IrqlPsPassive 规则指定驱动程序仅在 IRQL = PASSIVE_LEVEL 执行以下进程结构例程时调用:

IrqlReturn

IrqlReturn 规则指定驱动程序的调度例程在调用它们的同一 IRQL 处返回。

IrqlRtlPassive

IrqlRtlPassive 规则指定驱动程序仅在 IRQL = PASSIVE_LEVEL 执行时调用 RtlDeleteRegistryValue

IrqlZwPassive

IrqlZwPassive 规则指定驱动程序仅在 IRQL = PASSIVE_LEVEL 执行时才调用 ZwClose

选择 Irql 规则集

  1. 在 Microsoft Visual Studio 中选择驱动程序项目 (.vcxProj) 。 在“ 驱动程序 ”菜单中,单击“ 启动静态驱动程序验证程序...”

  2. 单击“ 规则 ”选项卡。在“ 规则集”下,选择“ Irql”。

    若要从 Visual Studio 开发人员命令提示符窗口中选择默认规则集,请使用 /检查 选项指定 Irql.sdv。 例如:

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

    有关详细信息,请参阅 使用静态驱动程序验证程序查找驱动程序中的缺陷静态驱动程序验证程序命令 (MSBuild)