在启用驱动程序验证程序的情况下处理 Bug 检查

驱动程序验证程序 在运行时检测驱动程序错误。 可以使用驱动程序验证程序以及 !analyze 调试器命令来检测和显示有关驱动程序中的错误的信息。

在 Windows 8 中,驱动程序验证程序已使用新功能(包括 DDI 符合性检查)进行了增强。 下面提供了一个演示 DDI 符合性检查的示例。

使用以下过程进行设置。

  1. 在主机和目标计算机之间建立内核模式调试会话。
  2. 在目标计算机上安装驱动程序。
  3. 在目标计算机上,打开命令提示符窗口并输入命令 验证程序。 使用 驱动程序验证程序管理器 为驱动程序启用驱动程序验证程序。
  4. 重新启动目标计算机。

当驱动程序验证程序检测到错误时,它会生成一个 bug 检查。 然后,Windows 进入调试器并显示错误的简短说明。 下面是驱动程序验证程序生成 bug 检查 DRIVER_VERIFIER_DETECTED_VIOLATION (C4) 的示例。

Driver Verifier: Extension abort with Error Code 0x20005
Error String ExAcquireFastMutex should only be called at IRQL <= APC_LEVEL.

*** Fatal System Error: 0x000000c4
                       (0x0000000000020005,0xFFFFF88000E16F50,0x0000000000000000,0x0000000000000000)

Break instruction exception - code 80000003 (first chance)

A fatal system error has occurred.
Debugger entered on first try; Bugcheck callbacks have not been invoked.

A fatal system error has occurred.

nt!DbgBreakPointWithStatus:
fffff802`a40ef930 cc              int     3

在调试器中,输入 !analyze -v 以获取错误的详细说明。

0: kd> !analyze -v
Connected to Windows 8 9200 x64 target at (Thu Oct 11 13:48:31.270 2012 (UTC - 7:00)), ptr64 TRUE
Loading Kernel Symbols
...............................................................
................................................................
...................
Loading User Symbols
..................................................
Loading unloaded module list
............
*******************************************************************************
*                                                                             *
*                        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: 0000000000020005, ID of the 'IrqlExApcLte1' rule that was violated.
Arg2: fffff88000e16f50, A pointer to the string describing the violated rule condition.
Arg3: 0000000000000000, An optional pointer to the rule state variable(s).
Arg4: 0000000000000000, Reserved (unused)

## Debugging Details:

...

DV_VIOLATED_CONDITION:  ExAcquireFastMutex should only be called at IRQL <= APC_LEVEL.

DV_MSDN_LINK: !url https://go.microsoft.com/fwlink/p/?linkid=216022

DV_RULE_INFO: !ruleinfo 0x20005

BUGCHECK_STR:  0xc4_IrqlExApcLte1_XDV

DEFAULT_BUCKET_ID:  WIN8_DRIVER_FAULT

PROCESS_NAME:  TiWorker.exe

CURRENT_IRQL:  9

在前面的输出中,可以看到违反的规则 IrqlExApcLte1 的名称和说明,并且可以选择指向描述 IrqlExApcLte1 规则 (wdm) 的引用页的链接。 还可以选择调试器命令链接 !ruleinfo 0x20005以获取有关规则的信息。 在这种情况下,规则指出,如果 IRQL) 中断请求级别 (大于 APC_LEVEL,则无法调用 ExAcquireFastMutex 。 输出显示当前 IRQL 为 9,在 wdm.h 中,可以看到APC_LEVEL的值为 1。 有关 IRQL 的详细信息,请参阅 管理硬件优先级

!analyze -v 的输出继续执行堆栈跟踪和有关导致错误的代码的信息。 在以下输出中,可以看到 MyDriver.sys 名为 ExAcquireFastMutexOnInterrupt 例程。 OnInterrupt 是一个在大于 APC_LEVEL 的 IRQL 上运行的中断服务例程,因此此例程调用 ExAcquireFastMutex 是一种冲突。

LAST_CONTROL_TRANSFER:  from fffff802a41f00ea to fffff802a40ef930

STACK_TEXT:  
... : nt!DbgBreakPointWithStatus ...
... : nt!KiBugCheckDebugBreak+0x12 ...
... : nt!KeBugCheck2+0x79f ...
... : nt!KeBugCheckEx+0x104 ...
... : VerifierExt!SLIC_abort+0x47 ...
... : VerifierExt!SLIC_ExAcquireFastMutex_entry_irqlexapclte1+0x25 ...
... : VerifierExt!ExAcquireFastMutex_wrapper+0x1a ...
... : nt!ViExAcquireFastMutexCommon+0x1d ...
... : nt!VerifierExAcquireFastMutex+0x1a ...
... : MyDriver!OnInterrupt+0x69 ...
... : nt!KiScanInterruptObjectList+0x6f ...
... : nt!KiChainedDispatch+0x19a ...
...

STACK_COMMAND:  kb

FOLLOWUP_IP: 
MyDriver!OnInterrupt+69 ...
fffff880`16306649 4c8d0510040000  lea     r8,[MyDriver! ?? ::FNODOBFM::`string' (fffff880`16306a60)]

FAULTING_SOURCE_LINE:  c:\MyDriverwdm03\cpp\MyDriver\pnp.c

FAULTING_SOURCE_FILE:  c:\MyDriverwdm03\cpp\MyDriver\pnp.c

FAULTING_SOURCE_LINE_NUMBER:  26

FAULTING_SOURCE_CODE:  
    22:    if(1 == interruptStatus)
    23:    {
    24:       ...
    25:       ExAcquireFastMutex( &(fdoExt->fastMutex) );
>   26:       ...
    27:       ExReleaseFastMutex( &(fdoExt->fastMutex) );
    28:       ...
    29:       return TRUE;
    30:    }
    31:    else


SYMBOL_STACK_INDEX:  9

SYMBOL_NAME:  MyDriver!OnInterrupt+69

FOLLOWUP_NAME:  ...

MODULE_NAME: MyDriver

IMAGE_NAME:  MyDriver.sys

DEBUG_FLR_IMAGE_TIMESTAMP:  50772f37

BUCKET_ID_FUNC_OFFSET:  69

FAILURE_BUCKET_ID:  0xc4_IrqlExApcLte1_XDV_VRF_MyDriver!OnInterrupt

BUCKET_ID:  0xc4_IrqlExApcLte1_XDV_VRF_MyDriver!OnInterrupt

另请参阅

静态驱动程序验证程序