Comprobador de controladores

Cómo utilizar el comprobador de controladores para solucionar problemas de controladores de Windows.

El comprobador de controladores se incluye en Windows 2000, Windows XP y Windows Server 2003 para promover la estabilidad y confiabilidad; puede utilizar esta herramienta para solucionar problemas de los controladores. Los componentes en modo de núcleo de Windows pueden causar daños o errores en el sistema como resultado de un controlador cuyo código se haya escrito incorrectamente, como una versión anterior de un controlador del Modelo de controlador de Windows (WDM, Windows Driver Model). En este artículo se describe cómo utilizar el comprobador de controladores para aislar y solucionar prolemas de un controlador en el sistema.


En este artículo se tratan los siguientes temas:

Capacidades del comprobador de controladores

Para utilizar el comprobador de controladores, puede ejecutar Verifier.exe y reiniciar a continuación el equipo. No tiene que hacer ningún otro cambio para comenzar a analizar los controladores del sistema.

El comprobador de controladores proporciona las funciones siguientes.

Asignaciones de bloques

Intente repartir todas las asignaciones de bloques de un controlador desde un bloque especial. En lugar de compartir las asignaciones de bloques con el resto del sistema, las asignaciones de este controlador se aislan y se limitan mediante permisos Sin acceso. Esta capacidad determina si un controlador asigna más que la parte del bloque que le corresponde y, por lo tanto, ocasiona daños y la inestabilidad del sistema. Cuando habilita esta capacidad y el equipo de destino tiene suficiente memoria física y virtual, todas las asignaciones del controlador se redirigen automáticamente hacia el bloque especial.

Someter a una presión extrema a la memoria

Se puede someter a una presión extrema a la memoria en un controlador concreto sin afectar a otros controladores (independientemente del tamaño de la memoria del sistema). Para ello, puede indicar al sistema de administración de memoria que invalide el código paginable y los datos de todo el controlador, así como los datos, el código y el bloque paginado del sistema. Esto permite detectar un controlador que contenga bloqueos de bucle (spin lock) incorrectamente o genere IRQL, y, a continuación, obtenga acceso a datos o código paginado. Puede utilizar la presión extrema de la memoria para detectar problemas intermitentes y aislar la causa.

Validación de parámetros

Todas las llamadas a bloqueos de bucle (spin lock), IRQL y asignación de bloques que hace el controlador se someten a una validación automática de los parámetros. Esto significa que se realizan comprobaciones para garantizar lo siguiente:

  • Un IRQL generado lo es realmente (el IRQL actual es menor que el IRQL de destino).
  • Un IRQL menor lo es realmente.
  • La doble generación de un bloqueo de bucle.
  • La adquisición o liberación de bloqueos de bucle se realizan en el IRQL apropiado.
  • La asignación y liberación del bloque paginado se realizan en el IRQL correcto (APC_LEVEL o por debajo).
  • La asignación y liberación del bloque no paginado se realizan en el IRQL correcto (DISPATCH_LEVEL o por debajo).
  • No se especifica ningún valor aleatorio (sin inicializar) para estas interfaces de programación de aplicaciones (API).

Errores en la inyección de la asignación del bloque

Las asignaciones de bloques que el controlador no ha marcado como MUST_SUCCEED pueden no producirse de forma aleatoria para garantizar que el controlador pueda controlar correctamente una situación en la que haya poca memoria.

El bloque que se libera

Todos los bloques que se liberan se examinan para garantizar que no hay ningún temporizador pendiente dentro de la asignación del bloque, ya que esto provocaría que el seguimiento de los bloqueos del sistema fuera sumamente difícil.

Detección de la pérdida de bloques

El seguimiento de todas las asignaciones del bloque del controlador se realiza automáticamente. En el momento de descargar el controlador, se activa un error si ninguna de las asignaciones se han liberado. Entonces puede utilizar el comando de depuración del núcleo !verifier 3 para mostrar todas las asignaciones que no se han liberado. También puede utilizar este comando antes de la descarga para ver las asignaciones pendientes que el controlador tiene en cualquier momento.

Comprobación de la descarga del controlador

La comprobación de la descarga del controlador se realiza para detectar controladores que se descargan y no limpian los recursos que usan (lo que aumenta la posibilidad de que se active un error del sistema poco después de que se descargue el controlador). Los recursos que el controlador no puede eliminar incluyen listas de búsquedas adicionales (look-aside), llamadas a procedimiento diferido (DPC, Deferred Procedure Call) pendientes, subprocesos de trabajo, colas, temporizadores y otros recursos.

Comprobador de E/S

Si activa el indicador del comprobador de E/S con la herramienta Verifier o la clave del Registro VerifyDriverLevel (para obtener más información, remítase a la sección «Habilitar la comprobación de controladores» de este artículo), se activan algunas comprobaciones del Administrador de E/S. Esto incluye:

  • Todas las IRPS asignadas a través de IoAllocateIrp se asignan desde un bloque especial.
  • Se realizan comprobaciones en IoCallDriver, IoCompleteRequest e IoFreeIrp para capturar los mensajes de error del controlador.
  • Todos los errores del comprobador de E/S se activan con el código DRIVER_VERIFIER_IOMANAGER_VIOLATION (0xC9).

Requisitos del comprobador de controladores

El único requisito es que se debe instalar Windows 2000, Windows XP o Windows Server 2003. Puede habilitar el comprobador de controladores en las versiones comerciales y revisadas de Windows. Vea el artículo 251233 de Microsoft Knowledge Base para obtener información sobre qué se debe considerar antes de habilitar el Administrador del comprobador de controlador en servidores de producción. Si está instalado Norton AntiVirus, no habilite la detección de interbloqueos del comprobador de controladores debido a las recomendaciones del artículo 325672 de Microsoft Knowledge Base.

Habilitar el comprobador de controladores

Puede habilitar el comprobador de controladores con Verifier.exe. Verifier.exe se incluye con cada copia de Windows y se instala automáticamente en la carpeta System32. Verifier.exe tiene interfaces de GUI y de línea de comandos, por lo que puede especificar controladores y niveles adecuados de comprobación. También puede ver las estadísticas del comprobador de controladores en tiempo real. Para obtener información adicional, remítase a la sección «Administrador de comprobador de controlador» de este artículo.

Depurar infracciones del comprobador de controladores

Tanto el comando !verifier del depurador del núcleo como la herramienta Verifier.exe muestran la configuración del comprobador de controladores actual y estadísticas en tiempo real.

Todas las infracciones del comprobador de controladores provocan que se activen errores; los más comunes son los siguientes:

  • IRQL_NOT_LESS_OR_EQUAL 0xA
  • PAGE_FAULT_IN_NONPAGED_AREA 0x50
  • PAGE_FAULT_IN_NONPAGED_AREA 0x50
  • ATTEMPTED_WRITE_TO_READONLY_MEMORY 0xBE
  • SPECIAL_POOL_DETECTED_MEMORY_CORRUPTION 0xC1
  • DRIVER_VERIFIER_DETECTED_VIOLATION 0xC4
  • DRIVER_CAUGHT_MODIFYING_FREED_POOL 0xC6
  • TIMER_OR_DPC_INVALID 0xC7
  • DRIVER_VERIFIER_IOMANAGER_VIOLATION 0xC9

El comprobador de controladores y los controladores gráficos

Los controladores de gráficos en modo de núcleo de Windows (como las DLL de impresoras y de controladores de vídeo) no pueden llamar directamente al punto de entrada del bloque. En su lugar, las asignaciones del bloque se realizan indirectamente utilizando devoluciones de llamada a la interfaz del controlador de dispositivos (DDI) gráficos a Win32k.sys. Por ejemplo, EngAllocMem es la devolución de llamada a la que un controlador de gráficos llama para asignar explícitamente la memoria del bloque. Además, otras devoluciones de llamadas especializadas como EngCreatePalette y EngCreateBitmap devuelven la memoria del bloque.

Para proporcionar el mismo tipo de pruebas automatizadas para los controladores de gráficos, en Win32k.sys se permiten utilizar algunas funciones del comprobador de controladores. Sin embargo, dado que los controladores de gráficos están más limitados que otros controladores en modo de núcleo, sólo requieren un subconjunto de la funcionalidad del comprobador de controladores. En concreto, no se necesitan la comprobación de IRQL y la de E/S. El resto de la funcionalidad, en concreto el uso de un bloque especial, la incapacidad aleatoria de realizar asignaciones en el bloque y el seguimiento del bloque, se admiten en diferentes grados en las distintas devoluciones de llamada DDI de gráficos.

Las funciones de devolución de llamada de DDI de gráficos siguientes tienen la capacidad de no realizarse de forma aleatoria:

  • EngAllocMem
  • EngAllocUserMem
  • EngCreateBitmap
  • EngCreateDeviceSurface
  • EngCreateDeviceBitmap
  • EngCreatePalette
  • EngCreateClip
  • EngCreatePath
  • EngCreateWnd
  • EngCreateDriverObj
  • BRUSHOBJ_pvAllocRbrush
  • CLIPOBJ_ppoGetPath

Además, en EngAllocMemse se admite el uso de bloques especiales y el seguimiento de los bloques.

Habilitar el comprobador de controladores para los controladores de gráficos es igual que para los demás controladores (remítase a la sección «Habilitar el comprobador de controladores» de este artículo para obtener información adicional). Se pasan por alto los indicadores no admitidos, por ejemplo, la comprobación de IRQL. Además, puede utilizar el comando del depurador del núcleo !gdikdx.verifier para examinar el estado actual del comprobador de controladores y las trazas de bloques de los controladores de gráficos.

NOTA
Sólo debería utilizar la opción de incapacidad aleatoria de asignación en las pruebas de eficacia. El uso de esta opción puede provocar mensajes de error de proceso, por lo que no debería utilizarla con pruebas de comprobación que determinen la exactitud de la implementación del controlador de gráficos (por ejemplo, comparando la salida del controlador de gráficos con una imagen de referencia).

Administrador del comprobador de controlador (Verifier.exe)

El uso de la herramienta Administrador de comprobador de controlador (Verifier.exe) constituye el mejor modo de crear y modificar la configuración del comprobador de controladores y recopilar sus estadísticas. Verifier.exe se encuentra en la carpeta %WinDir%\System32 de cada instalación de Windows.

Estado del controlador

La página de propiedades de Estado de controlador ofrece una imagen del estado actual del comprobador de controladores. Puede ver qué controladores detecta el comprobador. El estado puede ser uno de los siguientes:

  • Cargado: el controlador está cargado y se ha comprobado.
  • Descargado: el controlador no está cargado ahora pero se cargó por lo menos una vez desde que se reinició el equipo.
  • No cargado: nunca se ha cargado el controlador. Este estado puede indicar que se daña el archivo de imagen del controlador o que especificó un nombre de controlador que no está en el sistema.

Puede hacer clic en el encabezado de la lista para ordenarla por el nombre o el estado del controlador. En el área superior derecha del cuadro de diálogo, puede ver los tipos actuales de la comprobación que se está realizando. El estado de los controladores se actualiza automáticamente si no cambia al modo de actualización manual. Puede modificar la frecuencia de actualización con los botones de opción del área inferior izquierda del cuadro de diálogo. También puede forzar una actualización del estado haciendo clic en Actualizar ahora.

Si habilita el indicador Bloque especial y al bloque especial se dirigen menos del 95 por ciento de las asignaciones de bloque, en esta página aparece un mensaje de advertencia. Esto significa que tiene que seleccionar un bloque más pequeño de controladores que comprobar o agregar más memoria física al equipo para que la comprobación de las asignaciones de bloques abarque más.

Contadores globales

La página de propiedades Contadores globales muestra el valor actual de algunos contadores que mantiene el comprobador de controladores. Un valor cero en un contador puede señalar que el indicador del comprobador de controladores asociado no está habilitado. Por ejemplo, el valor cero del contador Other/Faults señala que el indicador de simulación de pocos recursos no está habilitado. Puede supervisar la actividad del comprobador porque los valores de los contadores se actualizan automáticamente (de forma predeterminada). Puede cambiar la frecuencia de actualización, cambiar a la actualización manual o forzar una actualización utilizando el grupo de controles del área inferior izquierda del cuadro de diálogo.

Seguimiento de bloques

Esta página de propiedades muestra más estadísticas recopiladas por el comprobador de controladores. Todos los contadores mostrados en esta página están relacionados con el indicador Seguimiento de bloques del comprobador. La mayor parte de ellos son contadores de cada controlador (por ejemplo, las asignaciones actuales, los bytes asignados actualmente, etcétera). Esto significa que debe seleccionar un nombre de controlador en el cuadro de combinaciones superior para ver los contadores de ese controlador concreto.

Configuración

Puede utilizar esta página para crear y modificar la configuración del comprobador de controladores. La configuración se guarda en el Registro y debe reiniciar el equipo para que surta efecto. Puede utilizar la lista para ver los controladores instalados actualmente. Cada controlador puede estar en uno de los estados siguientes:

  • Comprobador habilitado: el controlador se ha comprobado.
  • Comprobador deshabilitado: el controlador no se ha comprobado.
  • Comprobador habilitado (Es necesario reiniciar): el controlador se comprueba únicamente después del siguiente reinicio.
  • Comprobador deshabilitado (Es necesario reiniciar): El controlador se comprueba ahora pero no se comprueba después del siguiente reinicio.

Puede seleccionar uno o varios controladores en la lista y cambiar el estado utilizando los dos botones debajo de la lista. También puede hacer clic con el botón secundario del mouse en un nombre de controlador para mostrar el menú contextual, que lo permite alternar el estado.

En la parte inferior del cuadro de diálogo, puede especificar controladores adicionales (separados por espacios) que desea que se comprueben después del próximo reinicio. Normalmente suele usarse este control de edición cuando se desea instalar un controlador nuevo que aún no está cargado.

Si el grupo de botones de opción de la parte superior de la lista se establece en Comprobar todos los controladores, la lista y los botones Comprobar y No comprobar, y el control de edición no están disponibles. Esto significa que después del siguiente reinicio, se comprueban todos los controladores del sistema.

Puede establecer el tipo de comprobación utilizando las casillas de verificación del área superior derecha del cuadro de diálogo. Puede habilitar la comprobación de E/S en el nivel 1 o en el nivel 2. La comprobación de nivel 2 es más extensa que la de nivel 1.

Debe guardar cualquier modificación de la configuración haciendo clic en Aplicar. Hay dos botones más en esta página:

  • Configuración preferida: selecciona algunas opciones utilizadas normalmente (y se comprueban todos los controladores).
  • Restablecer todos: borra todas las opciones del comprobador de controladores para que no se compruebe ningún controlador.

Después de hacer clic en Aplicar, debe reiniciar el equipo para que los cambios surtan efecto.

Configuración volátil

Puede utilizar esta página de propiedades para cambiar los indicadores del comprobador de controladores inmediatamente. Únicamente puede alternar el estado de algunos indicadores y no puede cambiar la lista de los controladores que se comprueban. Después de cambiar el estado de algunas casillas de verificación, debe hacer clic en Aplicar para que los cambios surtan efecto. Los cambios surten efecto inmediatamente y duran hasta que realiza cambios adicionales o reinicia el equipo.

Interfaz de la línea de comandos

También puede ejecutar Verifier.exe desde una línea de comandos (para obtener más información, escriba verifier.exe /? en un símbolo del sistema). La lista siguiente muestra los indicadores de la línea de comandos que más se usan:

  • verifier.exe /flags valor [/iolevel 2]
    Especifica un valor decimal de los indicadores del comprobador de controladores y posiblemente el nivel de la comprobación de E/S (para obtener una lista de los indicadores disponibles, escriba
    verifier.exe /? en un símbolo del sistema o haga referencia a la sección «Habilitar el comprobador de controladores» de este artículo).

    Reemplace el parámetro valorcon uno de los valores de bit de la comprobación siguientes: 0 – comprobación del bloque especial
    1 – forzar la comprobación de IRQL
    2 – simulación de pocos recursos
    3 – seguimiento de los bloques
    4 – comprobación de E/S
    5 – detección de interbloqueos
    6 – comprobación de E/S mejorada
    7 – comprobación de DMA
    Por ejemplo, escriba el comando siguiente: c:\verifier /flags 3 /iolevel 2 NOTA
    El nivel de comprobación de E/S predeterminado es 1. Se omite el valor si el bit de comprobación de E/S no se establece en los indicadores.
  • verifier.exe /all
    Comprueba todos los controladores del sistema.
  • verifier.exe /volatile /flags valor
    Cambia inmediatamente los indicadores del comprobador.
  • verifier.exe /reset
    Borra todas las opciones actuales del comprobador de controladores.
  • verifier /query
    Vuelca el estado actual del comprobador de controladores y los contadores en la salida estándar.
  • verifier.exe /log LOG_FILE_NAME [/interval segundos]
    Graba el estado y contadores del comprobador de controladores en un archivo de registro (donde
    segundos es el período que especifique).

Información adicional para desarrolladores de controladores

En las secciones que siguen se describen detalles adicionales sobre las opciones del comprobador de controladores que pueden ser de interés para desarrolladores de controladores. Los profesionales de informática (IT) no suelen necesitar estas opciones.
Advertencia
La utilización incorrecta del Editor del Registro puede provocar problemas graves que hagan necesario volver a instalar el sistema operativo. Microsoft no garantiza que pueda solucionar los problemas resultantes del uso incorrecto del Editor del Registro. Utilice el Editor del Registro bajo su responsabilidad.
Para habilitar el comprobador de controladores modificando el Registro, siga estos pasos:

  1. Inicie el Editor del Registro (Regedt32.exe).
  2. Busque la siguiente clave del Registro:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\VerifyDrivers
  3. Modifique la clave REG_SZ.

Establezca la clave REG_SZ en el nombre (sin distinción entre mayúsculas y minúsculas) de los controladores que desee probar. Puede especificar varios controladores, pero use sólo un controlador. Así, se puede asegurar de que no se agotan prematuramente los recursos del sistema disponibles. El agotamiento prematuro de los recursos no produce ningún problema de confiabilidad del sistema, pero puede hacer que algún controlador que se esté comprobando se pase por alto.

La lista siguiente muestra ejemplos de valores para la clave REG_SZ:

  • Ntfs.sys
  • Win32k.sys ftdisk.sys
  • *.sys

Puede especificar el nivel de comprobación del controlador en la clave del Registro siguiente: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\VerifyDriverLevel La lista siguiente muestra los valores del campo de bit para esta clave. Puede combinar libremente estos valores:

  • 0x01: intenta satisfacer todas las asignaciones del bloque especial.
  • 0x02: somete a presión a la memoria de este controlador para validar el uso de IRQL sobre cómo tener acceso a los datos y al código paginable.
  • 0x04: provoca que no se lleven a cabo aleatoriamente varias solicitudes de asignación del bloque. Esta acción sólo se efectúa después de que el sistema se haya iniciado y haya alcanzado un punto donde el problema se pueda tratar ya que se deben controlar las situaciones razonables.
  • 0x08: habilita el seguimiento de la asignación del bloque. Cada asignación se debe liberar antes de descargar el controlador o de que el sistema active un error.
  • 0x10: habilita el comprobador de E/S.

NOTA
El valor predeterminado es 3 si la clave no existe o si no especifica un nivel de comprobación del controlador. El valor predeterminado es 0x1B si utiliza la opción Preferida en el comprobador. Para realizar el seguimiento de las pérdidas de memoria, pruebe con el valor 0xB. Este valor se obtiene con facilidad activando la casilla de verificación
configuración preferida y desactivando la casilla de verificación Comprobación de E/S.