Поделиться через


Обработка проверки на наличие ошибок при включенном средстве проверки драйвера

Средство проверки драйверов обнаруживает ошибки драйвера во время выполнения. Средство проверки драйверов можно использовать вместе с командой отладчика !analyze для обнаружения и отображения сведений об ошибках в драйвере.

В Windows 8 средство проверки драйверов улучшено с новыми функциями, включая проверку соответствия DDI. Ниже приведен пример проверки соответствия DDI.

Чтобы выполнить настройку, используйте следующую процедуру.

  1. Установите сеанс отладки в режиме ядра между узлом и целевым компьютером.
  2. Установите драйвер на целевом компьютере.
  3. На целевом компьютере откройте окно командной строки и введите средство проверки команд. Используйте Диспетчер проверки драйверов, чтобы включить средство проверки драйверов для вашего драйвера.
  4. Перезагрузите целевой компьютер.

Когда средство проверки драйверов обнаруживает ошибку, она создает проверку ошибок. Затем Windows переходит в режим отладки и отображает краткое описание ошибки. Ниже приведен пример, в котором средство проверки драйверов создает проверку ошибок 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, чтобы получить сведения о правиле. В этом случае правило указывает, что нельзя вызывать ExAcquireFastMutex , если уровень запроса прерывания (IRQL) больше APC_LEVEL. В выходных данных показано, что текущий IRQL равен 9, а в wdm.h можно увидеть, что APC_LEVEL имеет значение 1. Дополнительные сведения об IRQLs см. в разделе "Управление приоритетами оборудования".

Выходные данные !analyze -v содержат трассировку стека и информацию о коде, вызвавшем ошибку. В следующих выходных данных мы видим, что подпрограмма OnInterrupt в MyDriver.sys вызвала ExAcquireFastMutex. OnInterrupt — это подпрограмма обслуживания прерываний, которая выполняется на уровне IRQL выше APC_LEVEL, поэтому вызов 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

См. также

Средство проверки статических драйверов