使用这些规则验证驱动程序是否在所需的 IRQL 上发出 DDI 调用。
不符合 IRQL 规则的驱动程序可能会导致作过程中出现严重问题,从而导致死锁条件或计算机崩溃。
本部分内容
主题 | DESCRIPTION |
---|---|
ForwardedAtBadIrql 规则指定驱动程序应在 IRQL<DISPATCH_LEVEL调用 IoCallDriver 和 PoCallDriver,除非要转发的 IRP 主要函数代码是下列代码之一: |
|
ForwardedAtBadIrqlAllocate 规则指定驱动程序应在 IRQL<DISPATCH_LEVEL 调用 IoCallDriver 和 PoCallDriver,除非转发的 IRP 主函数代码是以下之一: |
|
ForwardedAtBadIrqlFsdAsync 规则指定驱动程序应在 IRQL<DISPATCH_LEVEL 调用 IoCallDriver 和 PoCallDriver,除非转发的 IRP 主函数代码是以下之一: |
|
ForwardedAtBadIrqlFsdSync 规则指定驱动程序应在 IRQL<DISPATCH_LEVEL 调用 IoCallDriver 和 PoCallDriver,除非转发的 IRP 主函数代码是以下之一: |
|
IrqlApcLte 规则指定驱动程序仅在 IRQL <= APC_LEVEL执行时调用 ObGetObjectSecurity 和 ObReleaseObjectSecurity。 |
|
IrqlDispatch 规则指定驱动程序仅在 IRQL = DISPATCH_LEVEL执行时才调用以下 DDI。 |
|
IrqlExAllocatePool 规则指定,驱动程序仅在执行时的 IRQL<=DISPATCH_LEVEL 下调用 ExAllocatePoolWithTag 和 ExAllocatePoolWithTagPriority。 |
|
IrqlExApcLte1 规则指定驱动程序仅在 IRQL <= APC_LEVEL 调用 ExAcquireFastMutex 和 ExTryToAcquireFastMutex。 |
|
IrqlExApcLte2 规则指定驱动程序仅在 IRQL <= APC_LEVEL 调用以下例程。 |
|
IrqlExApcLte3 规则指定驱动程序仅在 IRQL <= APC_LEVEL 调用以下执行支持例程。 |
|
IrqlExApcLteInline 规则规定 DDI 仅在正确的 IRQL 级别上调用 |
|
IrqlExFree1 规则指定在正确的 IRQL 中调用 ExFreePool 和 ExFreePoolWithTag。 |
|
IrqlExFree2 规则指定在正确的 IRQL 中调用 ExFreePool 和 ExFreePoolWithTag。 |
|
IrqlExFree3 规则指定在正确的 IRQL 中调用 ExFreePool 和 ExFreePoolWithTag。 |
|
IrqlExPassive 规则指定驱动程序仅在 IRQL = PASSIVE_LEVEL 调用以下执行支持例程: IrqlExPassive 规则还指定驱动程序在 IRQL <= APC_LEVEL 时调用 ExRaiseStatus |
|
IrqlIoApcLte 规则规定,驱动程序仅在 IRQL = APC_LEVEL 时调用以下 I/O 管理器例程: |
|
IrqlIoDispatch 规则指定驱动程序仅在 IRQL <执行时调用以下 I/O 管理器例程 = DISPATCH_LEVEL:IoGetDeviceToVerify、IoSetDeviceToVerify。 |
|
IrqlIoPassive1 规则指定驱动程序仅在 IRQL = PASSIVE_LEVEL执行时才调用以下例程: |
|
IrqlIoPassive2 规则指定驱动程序仅在 IRQL = PASSIVE_LEVEL调用以下 I/O 管理器例程: |
|
IrqlIoPassive3 规则指定驱动程序仅在 IRQL = PASSIVE_LEVEL执行时调用以下例程: |
|
IrqlIoPassive4 规则指定驱动程序仅在 IRQL = PASSIVE_LEVEL执行时调用以下例程: |
|
IrqlIoPassive5 规则指定驱动程序仅在 IRQL = PASSIVE_LEVEL执行时才调用特定的 I/O 管理器例程。 |
|
IrqlIoRtlZwPassive 规则指定驱动程序仅在 IRQL = PASSIVE_LEVEL执行时才调用特定的 I/O 管理器例程。 |
|
IrqlKeApcLte1 规则指定驱动程序仅在 IRQL <= APC_LEVEL执行时调用以下内核例程: |
|
IrqlKeApcLte2 规则指定驱动程序仅在 IRQL <= APC_LEVEL执行时调用以下内核例程: |
|
IrqlKeDispatchLte 规则指定驱动程序仅在 IRQL <= DISPATCH_LEVEL执行时调用以下内核例程: |
|
IrqlKeRaiseLower 规则指定驱动程序在提升和降低 IRQL 时执行以下操作: 当驱动程序调用 KeRaiseIrql 时,它在小于或等于 NewIrql 参数值的 IRQL 处执行。驱动程序仅在调用 KeRaiseIrql 或 KeRaiseIrqlToDpcLevel 后才调用 KeLowerIrql。 |
|
IrqlKeRaiseLower2 规则指定驱动程序使用 KeLowerIrql 还原先前调用 KeRaiseIrql 或 KeRaiseIrqlToDpcLevel 引发的原始 IRQL。 |
|
IrqlKeReleaseSpinLock 规则指定驱动程序仅在 IRQL = DISPATCH_LEVEL 执行时才调用 KeReleaseSpinLock。 |
|
IrqlKeSetEvent 规则指定,当 Wait 设置为 FALSE 时,仅在 IRQL = DISPATCH_LEVEL 时调用 KeSetEvent 例程;当 Wait 设置为 TRUE 时,仅在 IRQL = APC_LEVEL 时调用。 |
|
IrqlKeWaitForMutexObject 规则根据 Timeout 参数的值指定在正确的 IRQL 中调用 KeWaitForMutexObject 例程的驱动程序: |
|
IrqlKeWaitForMultipleObjects 规则指定 KeWaitForMultipleObjects 例程的调用方必须根据 Timeout 参数在适当的 IRQL 上运行。 |
|
IrqlMmApcLte 规则指定驱动程序仅在 IRQL <= APC_LEVEL执行时才调用以下内存管理器例程: |
|
IrqlMmDispatch 规则指定驱动程序仅在 IRQL <= DISPATCH_LEVEL执行时才调用 MmFreeContiguousMemory。 |
|
IIrqlNtifsApcPassive 规则指定,仅当驱动程序在 IRQL = PASSIVE_LEVEL 或 IRQL <= APC_LEVEL 执行时,才调用规则中列出的 DDI。 |
|
IrqlObPassive 规则指定驱动程序仅在 IRQL = PASSIVE_LEVEL执行时调用 ObReferenceObjectByHandle。 |
|
IrqlPsPassive 规则指定驱动程序仅在 IRQL = PASSIVE_LEVEL执行时才调用特定的进程结构例程。 |
|
IrqlReturn 规则指定驱动程序的调度例程在调用它们的同一 IRQL 处返回。 |
|
IrqlRtlPassive 规则指定驱动程序仅在 IRQL = PASSIVE_LEVEL执行时才调用 RtlDeleteRegistryValue 。 |
|
IrqlZwPassive 规则指定驱动程序仅在 IRQL = PASSIVE_LEVEL执行时调用 ZwClose。 |
选择 Irql 规则集
在 Microsoft Visual Studio 中选择你的驱动程序项目(.vcxProj)。 在 “驱动程序 ”菜单中,单击“ 启动静态驱动程序验证程序...”。
单击“ 规则 ”选项卡。在 “规则集”下,选择 “Irql”。
若要从 Visual Studio 开发人员命令提示符窗口中选择默认规则集,请使用 /check 选项指定 Irql.sdv。 例如:
msbuild /t:sdv /p:Inputs="/check:Irql.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32
有关详细信息,请参阅使用静态驱动程序验证程序查找驱动程序和静态驱动程序验证程序命令中的缺陷(MSBuild)。