Compartir a través de


Comprobaciones automáticas

El Comprobador de controladores realiza las siguientes comprobaciones cada vez que comprueba uno o varios controladores. No puede activar ni desactivar estas comprobaciones. A partir de la Windows 10, versión 1709, estas comprobaciones automáticas se han movido a marcas estándar pertinentes. Como resultado, los usuarios que habilitan el Comprobador de controladores con las marcas estándar no deberían ver ninguna reducción en las comprobaciones aplicadas.

Supervisión de rutinas de IRQL y memoria

El Comprobador de controladores supervisa el controlador seleccionado para las siguientes acciones prohibidas:

  • Generar IRQL mediante una llamada a KeLowerIrql

  • Reducir IRQL mediante una llamada a KeRaiseIrql

  • Solicitud de una asignación de memoria de tamaño cero

  • Asignar o liberar un grupo paginado con IRQL > APC_LEVEL

  • Asignar o liberar un grupo no paginado con IRQL > DISPATCH_LEVEL

  • Intentar liberar una dirección que no se devolvió de una asignación anterior

  • Intentar liberar una dirección que ya estaba libre

  • Adquirir o liberar una exclusión mutua rápida con IRQL > APC_LEVEL

  • Adquirir o liberar un bloqueo de número con IRQL no es igual a DISPATCH_LEVEL

  • Liberación doble de un bloqueo de giro.

  • Marcar una solicitud de asignación MUST_SUCCEED. Ninguna de estas solicitudes es permisible.

Si el Comprobador de controladores no está activo, es posible que estas infracciones no provoquen un bloqueo inmediato del sistema en todos los casos. El Comprobador de controladores supervisa el comportamiento del controlador y emite la comprobación de errores 0xC4 si se produce alguna de estas infracciones. Consulte Comprobación de errores 0xC4 (DRIVER_VERIFIER_DETECTED_VIOLATION) para obtener una lista de los parámetros de comprobación de errores.

Supervisión de la conmutación de pila

El comprobador de controladores supervisa el uso de la pila por parte del controlador que se está comprobando. Si el controlador cambia su pila y la nueva pila no es una pila de subprocesos ni una pila DPC, se emite una comprobación de errores. (Será la comprobación de errores 0xC4 con el primer parámetro igual a 0x90). La pila mostrada por el comando del depurador de KB normalmente revelará el controlador que realizó esta operación.

Comprobación de la descarga del controlador

Después de comprobar la descarga de un controlador, el Comprobador de controladores realiza varias comprobaciones para asegurarse de que el controlador se ha limpiado.

En concreto, el Comprobador de controladores busca:

  • Temporizadores no eliminados

  • Llamadas a procedimientos diferidos pendientes (DPC)

  • Listas de lookaside noletadas

  • Subprocesos de trabajo no eliminados

  • Colas no desletadas

  • Otros recursos similares

Los problemas, como estos, pueden provocar que las comprobaciones de errores del sistema se emita un tiempo después de que el controlador se descargue, y la causa de estas comprobaciones de errores puede ser difícil de determinar. Cuando el comprobador de controladores está activo, estas infracciones provocarán que la comprobación de errores 0xC7 se emita inmediatamente después de descargar el controlador. Consulte Comprobación de errores 0xC7 (TIMER_OR_DPC_INVALID) para obtener una lista de los parámetros de comprobación de errores.

Supervisión del uso de la lista de descriptores de memoria (MDL)

En Windows Vista, el Comprobador de controladores también supervisa el controlador seleccionado para las siguientes acciones prohibidas:

  • Llamar a MmProbeAndLockPages o MmProbeAndLockProcessPages en una MDL que no tiene las marcas adecuadas. Por ejemplo, es incorrecto llamar a MmProbeAndLockPages para una MDL que se ha creado mediante MmBuildMdlForNonPagedPool.

  • Llamar a MmMapLockedPages en una MDL que no tiene las marcas adecuadas. Por ejemplo, es incorrecto llamar a MmMapLockedPages para un MDL que ya está asignado a una dirección del sistema o mdl que no está bloqueado.

  • Llamar a MmUnlockPages o MmUnmapLockedPages en un MDL parcial, es decir, y MDL creado mediante IoBuildPartialMdl.

  • Llamar a MmUnmapLockedPages en una MDL que no está asignada a una dirección del sistema.

Si el Comprobador de controladores no está activo, es posible que estas infracciones no provoquen que el sistema deje de responder inmediatamente en todos los casos. El Comprobador de controladores supervisa el comportamiento del controlador y emite la comprobación de errores 0xC4 si se produce alguna de estas infracciones. Consulte Comprobación de errores 0xC4 (DRIVER_VERIFIER_DETECTED_VIOLATION) para obtener una lista de los parámetros de comprobación de errores.

Asignación de objetos de sincronización de memoria NonPagedPoolSession

A partir de Windows 7, el Comprobador de controladores comprueba si hay objetos de sincronización de la memoria de sesión.

Los objetos de sincronización deben ser no paginables. También deben residir en el espacio de direcciones virtuales global y en todo el sistema.

Un controlador de gráficos puede asignar memoria de sesión mediante una llamada a las API como EngAllocMem. A diferencia del espacio de direcciones global, el espacio de direcciones de sesión se virtualiza para cada sesión de Terminal Server. Esto significa que la misma dirección virtual que se usa en el contexto de dos sesiones diferentes hace referencia a dos objetos diferentes. El kernel de Windows debe poder acceder a los objetos de sincronización desde cualquier sesión de Terminal Server. Si se intenta hacer referencia a una dirección de memoria de sesión desde otra sesión, se producen resultados imprevisibles, como bloqueos del sistema o daños silenciosos de los datos de otra sesión.

A partir de Windows 7, cuando un controlador comprobado inicializa un objeto de sincronización mediante una llamada a las API como KeInitializeEvent o KeInitializeMutex, el Comprobador de controladores comprueba si la dirección del objeto se encuentra dentro del espacio de direcciones virtuales de la sesión. Si el Comprobador de controladores detecta este tipo de dirección incorrecta, emite un 0xC4 de comprobación de errores: DRIVER_VERIFIER_DETECTED_VIOLATION, con un valor de parámetro 1 de 0xDF.

Contador de referencia de objeto Cambia de 0 a 1

A partir de Windows 7, el Comprobador de controladores comprueba si hay clases adicionales de referencias de objetos incorrectas.

Cuando el administrador de objetos kernel de Windows crea un objeto, como un objeto File o un objeto Thread, el contador de referencia del nuevo objeto se establece en 1. El contador de referencia se incrementa mediante llamadas a api como ObReferenceObjectByPointer o ObReferenceObjectByHandle. Cada llamada ObDereferenceObject disminuye el contador de referencia para el mismo objeto.

Una vez que el contador de referencia alcanza el valor 0, el objeto se puede liberar. El administrador de objetos puede liberarlo inmediatamente o puede liberarlo más adelante. Llamar a ObReferenceObjectByPointer o ObDereferenceObject y cambiar el contador de referencia de 0 a 1 significa incrementar el contador de referencia de un objeto ya liberado. Esto siempre es incorrecto porque puede dañar la asignación de memoria de otra persona.

Bloqueos o retrasos del apagado del sistema

A partir de Windows 7, el Comprobador de controladores emite una interrupción en el depurador de kernel si el apagado del sistema no finaliza 20 minutos después de iniciarse. El Comprobador de controladores asigna el inicio del apagado del sistema como la hora en que el kernel de Windows comienza a apagar sus distintos subsistemas, como el Registro, Plug And Play o los subsistemas del administrador de E/S.

Si un depurador de kernel no está asociado al sistema, el Comprobador de controladores emite una comprobación de errores 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION, con un valor de parámetro 1 de 0x115, en lugar de este punto de interrupción.

Con frecuencia, un apagado del sistema que no puede finalizar en menos de 20 minutos indica que uno de los controladores que se ejecutan en ese sistema no funciona correctamente. La ejecución de !analyze -v desde el depurador de kernel muestra el seguimiento de pila del subproceso de trabajo del sistema responsable del apagado. Debe examinar ese seguimiento de pila y determinar si el subproceso de apagado está bloqueado por uno de los controladores que se están probando.

A veces, el sistema no puede apagarse porque está sujeto a pruebas de esfuerzo pesadas, aunque todos los controladores funcionen correctamente. El usuario puede optar por continuar la ejecución después de este punto de interrupción del comprobador de controladores y comprobar si el sistema finalmente se apaga.