IRQL 规则集 (WDM)

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

不符合 IRQL 规则的驱动程序可能会导致作过程中出现严重问题,从而导致死锁条件或计算机崩溃。

本部分内容

主题 DESCRIPTION

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 规则规定 DDI 仅在正确的 IRQL 级别上调用

IrqlExFree1

IrqlExFree1 规则指定在正确的 IRQL 中调用 ExFreePoolExFreePoolWithTag

IrqlExFree2

IrqlExFree2 规则指定在正确的 IRQL 中调用 ExFreePoolExFreePoolWithTag

IrqlExFree3

IrqlExFree3 规则指定在正确的 IRQL 中调用 ExFreePoolExFreePoolWithTag

IrqlExPassive

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

IrqlExPassive 规则还指定驱动程序在 IRQL <= APC_LEVEL 时调用 ExRaiseStatus

IrqlIoApcLte

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

IrqlIoDispatch

IrqlIoDispatch 规则指定驱动程序仅在 IRQL <执行时调用以下 I/O 管理器例程 = DISPATCH_LEVEL: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 处执行。
驱动程序仅在调用 KeRaiseIrqlKeRaiseIrqlToDpcLevel 后才调用 KeLowerIrql

IrqlKeRaiseLower2

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

IrqlKeReleaseSpinLock

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

IrqlKeSetEvent

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

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 开发人员命令提示符窗口中选择默认规则集,请使用 /check 选项指定 Irql.sdv。 例如:

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

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