调试 DDI 合规性 Bug - DRIVER_VERIFIER_DETECTED_VIOLATION (C4): 0x20002 - 0x20022

如果选择了 “DDI 符合性检查 ”选项,并且驱动程序验证程序检测到驱动程序违反了其中一个 DDI 符合性规则, 驱动程序验证程序 将生成 bug 检查0xC4:DRIVER_VERIFIER_DETECTED_VIOLATION 参数 1 等于特定符合性规则) 的标识符的 (。

DDI 符合性规则可确保驱动程序与 Windows 操作系统内核正确交互。 例如,规则验证驱动程序是否在函数所需的 IRQL 处进行函数调用,或者驱动程序是否正确获取并释放了旋转锁。 本部分介绍调试这些冲突的一些示例策略。

调试 DDI 符合性检查冲突

使用 !analyze 显示有关 bug 的信息检查

与发生的任何 bug 检查一样,一旦控制了调试器,最好的第一步是运行 !analyze -v 命令。

*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************

DRIVER_VERIFIER_DETECTED_VIOLATION (c4)
A device driver attempting to corrupt the system has been caught.  This is
because the driver was specified in the registry as being suspect (by the
administrator) and the kernel has enabled substantial checking of this driver.
If the driver attempts to corrupt the system, bugchecks 0xC4, 0xC1 and 0xA will
be among the most commonly seen crashes.
Arguments:
Arg1: 00020004, ID of the 'IrqlExAllocatePool' rule that was violated.
Arg2: 8481c118, A pointer to the string describing the violated rule condition.
Arg3: 00000000, Reserved (unused).
Arg4: 00000000, Reserved (unused).

## Debugging Details:


DV_VIOLATED_CONDITION:  ExAllocatePoolWithTagPriority should only be called at IRQL <= DISPATCH_LEVEL.

DV_MSDN_LINK: https://go.microsoft.com/fwlink/p/?linkid=216021

DV_RULE_INFO: 0x20004

每当 驱动程序验证程序 发现 DDI 符合性检查 冲突时, !analyze 输出中将提供有关冲突的信息。

在此示例中, Bug 检查0xC4:DRIVER_VERIFIER_DETECTED_VIOLATION 具有参数 1 (Arg1) 值 0x20004,指示驱动程序违反了 IrqlExAllocatePool 符合性规则。

!analyze 输出包括以下信息:

DV_VIOLATED_CONDITION: 此字段提供导致规则冲突的原因的说明。 在此示例中,违反的条件是驱动程序尝试在非常高的 IRQL 级别分配内存,或在DISPATCH_LEVEL尝试分配分页池内存。 例如,这可能是尝试在中断服务例程 (ISR) 中调用 ExAllocatePoolWithTagPriority 的驱动程序,或者是在保持旋转锁时尝试分配分页池内存的驱动程序。

DV_MSDN_LINK: 在 WinDBG 中,这是一个实时链接,使调试器打开 MSDN 页面,其中显示有关 IrqlExAllocatePool 规则的详细信息。

DV_RULE_INFO: 在 WinDBG 中,这是一个实时链接,用于显示调试器上提供的帮助中有关此规则的信息。

使用 !ruleinfo 扩展命令

!analyze 输出的 DV_RULE_INFO: 字段显示可用于查找有关此规则冲突的详细信息的命令。 对于此示例,可以使用命令: !ruleinfo 0x20004

kd> !ruleinfo 0x20004

RULE_ID: 0x20004

RULE_NAME: IrqlExAllocatePool

RULE_DESCRIPTION:
The IrqlExAllocatePool rule specifies that the driver calls:
ExAllocatePool,
ExAllocatePoolWithTag,
ExAllocatePoolWithQuota,
ExAllocatePoolWithQuotaTag and
ExAllocatePoolWithTagPriority
only when it is executing at IRQL <= DISPATCH_LEVEL. A caller
executing at DISPATCH_LEVEL must specify a NonPagedXxx value
for PoolType. A caller executing at IRQL <= APC_LEVEL can
specify any POOL_TYPE value.

MSDN_LINK: https://go.microsoft.com/fwlink/p/?linkid=216021

使用 !analyze-v 命令标识源代码中冲突的位置

当发现此冲突时,驱动程序验证程序将立即检查系统 bug。 !analyze 输出将显示当前 IRQL、当前堆栈、调用分配内存的点,如果源代码已启用 !analyze –v (详细) 输出还将显示发出分配请求的源文件和行号:

CURRENT_IRQL:  10

ANALYSIS_VERSION: 6.13.0016.1929 (debuggers(dbg).130725-1857) amd64fre

LAST_CONTROL_TRANSFER:  from 80ff159d to 80f751f4

STACK_TEXT:  
82f9eaa4 81dda59d 00000003 86fab4b0 00000065 nt!RtlpBreakWithStatusInstruction
82f9eaf8 81dda0b7 82fa0138 82f9eef8 82f9ef40 nt!KiBugCheckDebugBreak+0x1f
82f9eecc 81d5cdc6 000000c4 00020004 85435118 nt!KeBugCheck2+0x676
82f9eef0 81d5ccfd 000000c4 00020004 85435118 nt!KiBugCheck2+0xc6
82f9ef10 8542cb4e 000000c4 00020004 85435118 nt!KeBugCheckEx+0x19
82f9ef30 85425ded ffffffff 85425e0d 82f9ef60 VerifierExt!SLIC_abort+0x40
82f9ef38 85425e0d 82f9ef60 8210c19e 00000080 VerifierExt!SLIC_ExAllocatePoolWithTagPriority_internal_entry_IrqlExAllocatePool+0x6f
82f9ef40 8210c19e 00000080 00000000 00000000 VerifierExt!ExAllocatePoolWithTagPriority_internal_wrapper+0x19
82f9ef60 826c9e16 00000000 00000000 00000000 nt!VerifierExAllocatePoolWithTag+0x24
82f9efa8 81d0726c 833cba80 8a4b9480 00000000 MyDriver!HandleISR+0x146
82f9efbc 81d071c1 833cba80 8a4b9480 000000b8 nt!KiInterruptMessageDispatch+0x12
82f9efe4 81d71f29 00000001 525b61ea 00000224 nt!KiCallInterruptServiceRoutine+0x6d
82f9efe8 00000000 525b61ea 00000224 00000000 nt!KiInterruptDispatch+0x49

STACK_COMMAND:  kb

FOLLOWUP_IP: 
MyDriver!HandleISR+0x140
826c9e10 ff154440699b    call    dword ptr [IrqlExAllocatePool_ExAllocatePoolWithTag!_imp__ExAllocatePoolWithTag (9b694044)]

FAULTING_SOURCE_LINE:  d:\drvsrc\mydriver\isrhandler.c

FAULTING_SOURCE_FILE:  d:\drvsrc\mydriver\isrhandler.c

FAULTING_SOURCE_LINE_NUMBER:  206

修复 DDI 符合性冲突的原因

修复这些在0x00020022范围内具有 Arg1 值的 bug 检查0x00020000通常包括验证驱动程序是否满足相应文档中所述的 API 和 DDI 使用条件。

在此 (0x20004) 使用的示例中,ISR 中任何类型的内存分配将违反为 ExAllocatePoolWithTagPriority 例程设置的 IRQL 规则。

通常,应查看有关例程的文档,了解有关 IRQL 和正确用法的信息。 查看测试函数的特定 DDI 符合性规则 。 在这种情况下,规则为 IrqlExAllocatePool

使用 静态驱动程序验证程序 分析驱动程序源代码,并使用相同的规则 () 。 静态驱动程序验证程序是一种工具,它通过模拟各种代码路径的练习来扫描 Windows 驱动程序源代码并报告可能的问题。 静态驱动程序验证程序是一种出色的开发时实用工具,可帮助识别此类问题。

DDI 合规性检查

DDI 合规性规则

静态驱动程序验证程序

Bug 检查 0xC4:DRIVER_VERIFIER_DETECTED_VIOLATION