Compartir a través de


Depuración de errores de cumplimiento de DDI: DRIVER_VERIFIER_DETECTED_VIOLATION (C4): 0x20002: 0x20022

Cuando tenga seleccionada la opción comprobación de cumplimiento de DDI y comprobador de controladores detecta que el controlador infringe una de las reglas de cumplimiento de DDI, el comprobador de controladores genera la comprobación de errores 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION (con el parámetro 1 igual al identificador de la regla de cumplimiento específica).

Las reglas de cumplimiento de DDI garantizan que un controlador interactúe correctamente con el kernel del sistema operativo Windows. Por ejemplo, las reglas comprueban que el controlador realiza llamadas de función en el IRQL necesario para la función, o que el controlador adquiere y libera correctamente los bloqueos de número. En esta sección se describen algunas estrategias de ejemplo para depurar estas infracciones.

Depuración de infracciones de comprobación de cumplimiento de DDI

Use !analyze para mostrar información sobre la comprobación de errores

Al igual que sucede con cualquier comprobación de errores que se produzca, una vez que tenga el control del depurador, el primer paso es ejecutar el comando !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

Cada vez que comprobador de controladores detecta una infracción de comprobación de cumplimiento de DDI , se proporcionará información sobre la infracción en la salida !analyze .

En este ejemplo, comprobación de errores 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION tiene un valor de parámetro 1 (Arg1) de 0x20004, que indica que el controlador ha infringido la regla de cumplimiento irqlExAllocatePool .

La salida !analyze incluye la siguiente información:

DV_VIOLATED_CONDITION: Este campo proporciona una descripción de lo que provocó la infracción de la regla. En este ejemplo, la condición infringida era que un controlador intentó asignar memoria en un nivel IRQL muy alto o intentó asignar memoria del grupo paginado en DISPATCH_LEVEL. Por ejemplo, esto puede haber sido un controlador que estaba intentando llamar a ExAllocatePoolWithTagPriority en una rutina de servicio de interrupción (ISR) o un controlador que intentó asignar memoria del grupo paginado mientras mantiene un bloqueo de número.

DV_MSDN_LINK: En WinDBG, se trata de un vínculo en directo que hace que el depurador abra la página de MSDN que muestra más información sobre la regla IrqlExAllocatePool .

DV_RULE_INFO: En WinDBG, este es un vínculo en directo que mostrará información sobre esta regla de la ayuda disponible en el depurador.

Usar el comando de extensión !ruleinfo

El DV_RULE_INFO: campo de la salida !analyze muestra el comando que puede usar para encontrar más información sobre esta infracción de regla. En este ejemplo, puede usar el comando : !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

Use el comando !analyze-v para identificar la ubicación de la infracción en el código fuente.

Cuando se detecta esta infracción, el comprobador del controlador comprobará el sistema inmediatamente. La salida !analyze mostrará el IRQL actual, la pila actual, el punto donde se realizó la llamada para asignar memoria y, si el código fuente habilitado, la salida !analyze –v (para obtener detalles) también mostrará el archivo de origen y el número de línea donde se realizó la solicitud de asignación:

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

Corrección de la causa de la infracción de cumplimiento de DDI

Corregir estas comprobaciones de errores que tienen valores de Arg1 en el intervalo 0x00020000 a 0x00020022, generalmente consiste en comprobar que el controlador cumple las condiciones de uso de la API y DDI descritas en la documentación correspondiente.

En el ejemplo que hemos usado aquí (0x20004), una asignación de memoria de cualquier tipo en el ISR va a infringir las reglas IRQL establecidas para la rutina ExAllocatePoolWithTagPriority .

En general, debe revisar la documentación sobre la rutina para obtener información sobre IRQL y el uso adecuado. Revise las reglas de cumplimiento de DDI específicas que prueban la función. En este caso, la regla es IrqlExAllocatePool.

Use el Comprobador de controladores estáticos para analizar el código fuente del controlador mediante las mismas reglas. El comprobador de controladores estáticos es una herramienta que examina el código fuente del controlador de Windows e informa sobre posibles problemas simulando el ejercicio de varias rutas de acceso de código. Static Driver Verifier es una excelente utilidad en tiempo de desarrollo para ayudar a identificar estos tipos de problemas.

Comprobación de cumplimiento de DDI

Reglas de cumplimiento de DDI

Comprobador de controlador estático

Comprobación de errores 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION