Compartir a través de


Comprobación de errores 0xD1: DRIVER_IRQL_NOT_LESS_OR_EQUAL

La comprobación de errores DRIVER_IRQL_NOT_LESS_OR_EQUAL tiene un valor de 0x000000D1. Esto indica que un controlador en modo kernel intentó acceder a la memoria paginable en un proceso IRQL demasiado alto.

Importante

Este artículo va dirigido a programadores. Si es un cliente que ha recibido un código de error de pantalla azul mientras usa el equipo, consulte Solución de errores de pantalla azul.

Parámetros de DRIVER_IRQL_NOT_LESS_OR_EQUAL

Parámetro Descripción

1

Memoria a la que se hace referencia.

2

IRQL en el momento de la referencia.

3

  • 0 - Lectura
  • 1 - Escritura
  • 2 - Ejecución
  • 8 - Ejecución

4

Dirección a la que hace referencia la memoria. Use ln (enumerar símbolos más cercanos) en esta dirección para ver el nombre de la función.

Causa

Para determinar la causa se requiere el depurador de Windows, experiencia en programación y acceso al código fuente del módulo que falla.

Normalmente, cuando se produce este error, significa que un controlador ha intentado acceder a una dirección que se puede paginar (o que es completamente no válida), mientras que el nivel de petición de interrupción (IRQL) era demasiado alto. Esto se puede producir por:

  • Desreferenciar un puntero no válido (como un puntero incorrecto o un puntero libre) mientras se ejecuta en DISPATCH_LEVEL o encima de él.

  • Acceder a datos paginables que se encuentren en DISPATCH_LEVEL, o en un nivel superior.

  • Ejecutar código paginable que se encuentre en DISPATCH_LEVEL, o en un nivel superior.

Si se puede identificar un controlador responsable del error, su nombre se imprime en la pantalla azul y se almacena en la memoria en la ubicación (PUNICODE_STRING) KiBugCheckDriver. Puede usar dx (mostrar expresión de modelo de objeto depurador), un comando del depurador, para mostrar esto: dx KiBugCheckDriver.

Esta comprobación de errores suele deberse a controladores que han usado direcciones de memoria incorrectas.

Entre las posibles causas del error de la página se incluyen los siguientes eventos:

  • La función se marcó como paginable y se estaba ejecutando en un IRQL con privilegios elevados (lo que incluye obtener un bloqueo).

  • La llamada de función se realizó a una función en otro controlador y ese controlador se descargó.

  • Se llamó a la función mediante un puntero de función que era un puntero no válido.

Para obtener más información sobre los IRQL de Windows, consulte Windows Internals 7th Edition Part 1 de Pavel Yosifovich, Mark E. Russinovich, David A. Solomon y Alex Ionescu.

Solución

Si el problema se debe al controlador que está desarrollando, asegúrese de que la función que se estaba ejecutando en el momento de la comprobación de errores:

  • No está marcada como paginable
  • No llama a ninguna otra función insertada que se pueda paginar.

La extensión del depurador !analyze indica información sobre la comprobación de errores y puede resultar útil para determinar la causa raíz. El ejemplo siguiente es la salida de !analyze.

DRIVER_IRQL_NOT_LESS_OR_EQUAL (d1)
An attempt was made to access a pageable (or completely invalid) address at an
interrupt request level (IRQL) that is too high.  This is usually
caused by drivers using improper addresses.
If kernel debugger is available get stack backtrace.
Arguments:
Arg1: fffff808add27150, memory referenced
Arg2: 0000000000000002, IRQL
Arg3: 0000000000000000, value 0 = read operation, 1 = write operation
Arg4: fffff808adc386a6, address which referenced memory

Si se puede identificar un controlador responsable del error, su nombre se imprime en la pantalla azul y se almacena en la memoria en la ubicación (PUNICODE_STRING) KiBugCheckDriver. Puede usar dx (mostrar expresión de modelo de objeto depurador), un comando del depurador, para mostrar esto: dx KiBugCheckDriver.

0: kd> dx KiBugCheckDriver
KiBugCheckDriver                 : 0xffffc6092de892c8 : "Wdf01000.sys" [Type: _UNICODE_STRING *]

Si hay disponible un marco de captura en el archivo de volcado, use el comando .trap para establecer el contexto en la dirección proporcionada.

Para iniciar la depuración de este tipo de comprobación de errores, examine el seguimiento de la pila mediante los comandos k, kb, kc, kd, kp, kP, kv (mostrar seguimiento de pila).

En el depurador, ejecute el comando !irql para mostrar información sobre el IRQL de un procesador en el equipo de destino antes de que se interrumpa el depurador. Por ejemplo:

0: kd> !irql
Debugger saved IRQL for processor 0x0 -- 2 (DISPATCH_LEVEL)

En la mayoría de los casos de este tipo de comprobación de errores, el problema no es el nivel de IRQL, sino la memoria a la que se accede.

Dado que esta comprobación de errores suele deberse a que los controladores han usado direcciones de memoria incorrectas, use los parámetros 1, 3 y 4 para investigar más a fondo.

Use ln (enumerar símbolos más cercanos) con el parámetro 4 para ver el nombre de la función a la que se llamó. Examine también la salida de !analyze para ver si se identifica el código de error.

Use !pool en la dirección del parámetro 1 para ver si se trata de un grupo paginado. Use !address y el comando avanzado !pte para obtener más información sobre esta área de memoria.

Use los comandos de memoria de pantalla para examinar la memoria a la que se hace referencia en el comando en el parámetro 1.

Use los comandos u, ub, uu (desensamblar) para examinar el código de la dirección a la que se hace referencia a la memoria en el parámetro 4.

Use el comando lm t n para enumerar los módulos que se cargan en la memoria. Use !memusage para examinar el estado general de la memoria del sistema.

Comprobador de controladores

El Comprobador de controladores es una herramienta que se ejecuta en tiempo real para examinar el comportamiento de los controladores. Por ejemplo, el Comprobador de controladores comprueba el uso de recursos de memoria, como los grupos de memoria. Si identifica errores en la ejecución del código de controlador, crea proactivamente una excepción para permitir que esa parte del código del controlador se examine aún más. El Administrador del comprobador de controladores está integrado en Windows y está disponible en todos los equipos Windows.

Para iniciar el Administrador del comprobador de controladores, escriba verifier en un símbolo del sistema. Puede configurar qué controladores comprobar. El código que comprueba los controladores añade sobrecarga a medida que se ejecuta, así que intente comprobar el menor número de controladores posible. Para obtener más información, consulte Comprobador de controladores.

Comentarios

Si no está equipado para usar el depurador de Windows para trabajar con este problema, puede usar algunas técnicas básicas de solución de problemas.

  • Compruebe el registro del sistema en el Visor de eventos para ver si hay mensajes de error adicionales que puedan ayudar a identificar el dispositivo o controlador que está causando este error.

  • Si se identifica un controlador en el mensaje de verificación de errores, deshabilítelo o consulte al fabricante para obtener actualizaciones del controlador.

  • Confirme que todo el hardware nuevo que se instale sea compatible con la versión instalada de Windows. Por ejemplo, puede obtener información sobre el hardware necesario en Cómo buscar las especificaciones del equipo y los requisitos del sistema para Windows 10.

Para obtener información adicional sobre la solución de problemas generales, consulte Análisis de los datos de la comprobación de errores de la pantalla azul.