Verificación de E/S

El Comprobador de controladores tiene dos niveles de comprobación de E/S:

  • La comprobación de E/S de nivel 1 siempre está activa cada vez que se selecciona comprobación de E/S.

  • La comprobación de E/S de nivel 2 siempre está activa cada vez que la comprobación de E/S está seleccionada en Windows XP y versiones posteriores.

Consulte también: Comprobación mejorada de E/S en Windows 7 y versiones posteriores del sistema operativo Windows, la comprobación mejorada de E/S se activa automáticamente al seleccionar Verificación de E/S. No está disponible o es necesario seleccionarlo como una opción independiente.

Comprobación de E/S de nivel 1

Cuando la comprobación de E/S de nivel 1 está habilitada, se asignan todos los IRP obtenidos a través de IoAllocateIrp desde un grupo especial y se realiza el seguimiento de su uso.

Además, el Comprobador de controladores comprueba si hay llamadas de E/S no válidas, entre las que se incluyen:

  • Intenta liberar un IRP cuyo tipo no es IO_TYPE_IRP

  • Pasa objetos de dispositivo no válidos a IoCallDriver

  • Pasa un IRP a IoCompleteRequest que contiene un estado no válido o que todavía tiene un conjunto de rutinas de cancelación

  • Cambios en IRQL en una llamada a la rutina de distribución del controlador

  • Intenta liberar un IRP que permanece asociado a un subproceso

  • Pasa un objeto de dispositivo a IoInitializeTimer que ya contiene un temporizador inicializado

  • Pasa un búfer no válido a IoBuildAsynchronousFsdRequest o IoBuildDeviceIoControlRequest

  • Pasa un bloque de estado de E/S a un IRP, cuando se asigna este bloque de estado de E/S en una pila que tiene demasiado desenlazada

  • Pasa un objeto de evento a un IRP, cuando este objeto de evento se asigna en una pila que tiene demasiado desenlazada

Dado que el grupo de IRP especial tiene un tamaño limitado, la comprobación de E/S es más eficaz cuando solo se usa en un controlador a la vez.

Los errores del nivel 1 de comprobación de E/S provocan que se emita la comprobación de errores 0xC9. El primer parámetro de esta comprobación de errores indica qué infracción se ha producido. Consulte Comprobación de errores 0xC9 (DRIVER_VERIFIER_IOMANAGER_VIOLATION) para obtener una lista completa de parámetros.

Comprobación de E/S de nivel 2

Los errores de nivel 2 de comprobación de E/S se muestran de diferentes maneras: en la pantalla azul, en un archivo de volcado de memoria y en un depurador de kernel.

En la pantalla azul, estos errores se indican mediante el mensaje ERROR DE COMPROBACIÓN DEL SISTEMA DE E/S y la cadena WDM DRIVER ERRORXXX, donde XXX es un código de error de E/S.

En un archivo de volcado de memoria, la mayoría de estos errores se indican mediante el mensaje BugCheck 0xC9 (DRIVER_VERIFIER_IOMANAGER_VIOLATION), junto con el código de error de E/S. En este caso, el código de error de E/S aparece como el primer parámetro de la comprobación de errores 0xC9. El resto se indica mediante el mensaje comprobación de errores 0xC4 (DRIVER_VERIFIER_DETECTED_VIOLATION) junto con un código de error del comprobador de controladores. En este caso, el código de error del comprobador de controladores aparece como el primer parámetro de la comprobación de errores 0xC4.

En un depurador de kernel (KD o WinDbg), estos errores se indican mediante el mensaje WDM DRIVER ERROR y una cadena de texto descriptivo. Cuando el depurador de kernel está activo, es posible omitir los errores de nivel 2 y reanudar la operación del sistema. (Esto no es posible con ninguna otra comprobación de errores).

La pantalla azul, el archivo de volcado de memoria y el depurador de kernel también muestran información adicional. Para obtener una descripción completa de la mayoría de los mensajes de error del nivel de comprobación de E/S 2, consulte Comprobación de errores 0xC9. Para el resto, consulte Comprobación de errores 0xC4.

A partir de Window Vista, la opción Comprobación de E/S comprueba si hay los siguientes errores de controlador:

A partir de Windows 7, la opción Comprobación de E/S comprueba si hay los siguientes errores de controlador:

Además, puede usar esta opción para detectar otro error común del controlador, reinicializando los bloqueos de eliminación. Quitar las estructuras de datos de bloqueos debe asignarse dentro de las extensiones de dispositivo. Esto garantiza que el administrador de E/S libere la memoria que contiene la estructura IO_REMOVE_LOCK solo cuando se elimina el objeto de dispositivo. Si el controlador realiza los tres pasos siguientes, es posible que después del paso 2, una aplicación o un controlador sigan manteniendo una referencia a Device1:

  • Asigna la estructura IO_REMOVE_LOCK que corresponde a Device1, pero realiza la asignación fuera de la extensión de Device1.
  • Llama a IoReleaseRemoveLockAndWait cuando se quita Device1.
  • Llama a IoInitializeRemoveLock para que el mismo bloqueo lo reutilice como bloqueo de eliminación para Device2.

Es posible que, después del paso 2, una aplicación o controlador todavía contenga una referencia a Device1. La aplicación o el controlador todavía pueden enviar solicitudes a Device1, aunque este dispositivo se haya quitado. Por lo tanto, no es seguro reutilizar la misma memoria que un nuevo bloqueo de eliminación hasta que el administrador de E/S elimina Device1. Reinicializar el mismo bloqueo mientras que otro subproceso intenta adquirirlo puede provocar daños en el bloqueo, con resultados imprevisibles para el controlador y todo el sistema.

En Windows 7 y versiones posteriores del sistema operativo Windows, la comprobación mejorada de E/S se activa automáticamente al seleccionar Verificación de E/S.

Activación de esta opción

Puede activar la característica Comprobación de E/S para uno o varios controladores mediante el Administrador de comprobadores de controladores o la línea de comandos Verifier.exe. Para obtener más información, consulte Seleccionar opciones del comprobador de controladores.

  • En la línea de comandos.

    En la línea de comandos, la opción Verificación de E/S se representa mediante Bit 4 (0x10). Para activar la comprobación de E/S, use un valor de marca de 0x10 o agregue 0x10 al valor de marca. Por ejemplo:

    verifier /flags 0x10 /driver MyDriver.sys
    

    La característica estará activa después del siguiente arranque.

    También puede activar y desactivar la comprobación de E/S sin reiniciar el equipo agregando el parámetro /volatile al comando. Por ejemplo:

    verifier /volatile /flags 0x10 /adddriver MyDriver.sys
    

    Esta configuración es efectiva inmediatamente, pero se pierde al apagar o reiniciar el equipo. Para obtener más información, consulte Uso de la configuración volátil.

    La característica Comprobación de E/S también se incluye en la configuración estándar. Por ejemplo:

    verifier /standard /driver MyDriver.sys
    
  • Uso del Administrador de comprobadores de controladores

    1. Seleccione Crear configuración personalizada (para desarrolladores de código) y, a continuación, haga clic en Siguiente.
    2. Seleccione Seleccionar configuración individual en una lista completa.
    3. Seleccione (comprobar) comprobación de E/S.

    La característica Comprobación de E/S también se incluye en la configuración estándar. Para usar esta característica, en El Administrador del comprobador de controladores, haga clic en Crear configuración estándar.