Controlar una comprobación de errores cuando el comprobador de controladores está habilitado
El comprobador de controladores detecta errores de controlador en tiempo de ejecución. Puede usar el Comprobador de controladores junto con el comando !analyze debugger para detectar y mostrar información sobre los errores en el controlador.
En Windows 8, el Comprobador de controladores se ha mejorado con nuevas características, incluida la comprobación de cumplimiento de DDI. Aquí se proporciona un ejemplo que muestra la comprobación de cumplimiento de DDI.
Use el procedimiento siguiente para configurarlo.
- Establezca una sesión de depuración en modo kernel entre un equipo host y de destino.
- Instale el controlador en el equipo de destino.
- En el equipo de destino, abra una ventana del símbolo del sistema y escriba el comprobador de comandos. Use el Administrador del comprobador de controladores para habilitar el comprobador de controladores para el controlador.
- Reinicie el equipo de destino.
Cuando el Comprobador de controladores detecta un error, genera una comprobación de errores. A continuación, Windows se divide en el depurador y muestra una breve descripción del error. Este es un ejemplo en el que el Comprobador de controladores genera la comprobación de errores 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
En el depurador, escriba !analyze -v para obtener una descripción detallada del error.
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
En la salida anterior, puede ver el nombre y la descripción de la regla IrqlExApcLte1, que se infringió y puede seleccionar un vínculo a la página de referencia que describe la regla IrqlExApcLte1 (wdm). También puede seleccionar un vínculo de comando del depurador, !ruleinfo 0x20005, para obtener información sobre la regla. En este caso, la regla indica que no se puede llamar a ExAcquireFastMutex si el nivel de solicitud de interrupción (IRQL) es mayor que APC_LEVEL. La salida muestra que el IRQL actual es 9 y en wdm.h puede ver que APC_LEVEL tiene un valor de 1. Para obtener más información sobre los IRQL, consulte Administración de prioridades de hardware.
La salida de !analyze -v continúa con un seguimiento de pila e información sobre el código que provocó el error. En la salida siguiente, puede ver que la rutina OnInterrupt en MyDriver.sys denominada ExAcquireFastMutex. OnInterrupt es una rutina de servicio de interrupción que se ejecuta en un IRQL mayor que APC_LEVEL, por lo que es una infracción para esta rutina llamar a 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