IRQL 规则集 (WDM)
使用这些规则验证驱动程序是否在所需的 IRQL 上发出 DDI 调用。
不遵循 IRQL 规则的驱动程序在操作期间可能会导致严重问题,从而导致死锁情况或计算机崩溃。
在本节中
主题 | 说明 |
---|---|
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 规则指定仅在适当的 IRQL 级别调用 DDI |
|
IrqlExFree1 规则指定在适当的 IRQL 下调用 ExFreePool 和 ExFreePoolWithTag。 |
|
IrqlExFree2 规则指定在适当的 IRQL 下调用 ExFreePool 和 ExFreePoolWithTag。 |
|
IrqlExFree3 规则指定在适当的 IRQL 下调用 ExFreePool 和 ExFreePoolWithTag。 |
|
IrqlExPassive 规则指定驱动程序仅在 IRQL = PASSIVE_LEVEL调用以下执行支持例程: IrqlExPassive 规则还指定驱动程序在 IRQL <= APC_LEVEL |
|
IrqlIoApcLte 规则指定驱动程序仅在 IRQL <= APC_LEVEL执行时才调用以下 I/O 管理器例程: |
|
IrqlIoDispatch 规则指定驱动程序仅在 IRQL <= DISPATCH_LEVEL 执行时调用以下 I/O 管理器例程: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,在将 Wait 设置为 TRUE 时,在 IRQL <= APC_LEVEL 调用 KeSetEvent 例程。 |
|
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 开发人员命令提示符窗口中选择默认规则集,请使用 /检查 选项指定 Irql.sdv。 例如:
msbuild /t:sdv /p:Inputs="/check:Irql.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32
有关详细信息,请参阅 使用静态驱动程序验证程序查找驱动程序中的缺陷 和 静态驱动程序验证程序命令 (MSBuild) 。