Manipulando uma verificação de bugs quando o verificador de driver está habilitado

O Verificador de Driver detecta erros de driver em tempo de execução. Você pode usar o Verificador de Driver junto com o comando !analyze debugger para detectar e exibir informações sobre erros no driver.

Em Windows 8, o Verificador de Driver foi aprimorado com novos recursos, incluindo Verificação de Conformidade da DDI. Aqui, damos um exemplo que demonstra a Verificação de Conformidade da DDI.

Use o procedimento a seguir para configurar.

  1. Estabeleça uma sessão de depuração no modo kernel entre um host e um computador de destino.
  2. Instale o driver no computador de destino.
  3. No computador de destino, abra uma janela do Prompt de Comando e insira o verificador de comandos. Use o Gerenciador de Verificador de Driver para habilitar o Verificador de Driver para o driver.
  4. Reinicialize o computador de destino.

Quando o Verificador de Driver detecta um erro, ele gera um bug marcar. Em seguida, o Windows divide o depurador e exibe uma breve descrição do erro. Aqui está um exemplo em que o Verificador de Driver gera DRIVER_VERIFIER_DETECTED_VIOLATION de Verificação de Bugs (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

No depurador, insira !analyze -v para obter uma descrição detalhada do erro.

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

Na saída anterior, você pode ver o nome e a descrição da regra , IrqlExApcLte1, que foi violada, e você pode selecionar um link para a página de referência que descreve a regra IrqlExApcLte1 (wdm). Você também pode selecionar um link de comando do depurador, !ruleinfo 0x20005, para obter informações sobre a regra. Nesse caso, a regra declara que você não poderá chamar ExAcquireFastMutex se o IRQL (nível de solicitação de interrupção) for maior que APC_LEVEL. A saída mostra que o IRQL atual é 9 e, em wdm.h, você pode ver que APC_LEVEL tem um valor de 1. Para obter mais informações sobre IRQLs, consulte Gerenciando prioridades de hardware.

A saída de !analyze -v continua com um rastreamento de pilha e informações sobre o código que causou o erro. Na saída a seguir, você pode ver que a rotina OnInterrupt no MyDriver.sys chamada ExAcquireFastMutex. OnInterrupt é uma rotina de serviço de interrupção executada em um IRQL maior que APC_LEVEL, portanto, é uma violação para essa rotina chamar 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

Confira também

Verificador de Driver Estático