Compartir a través de


Comprobación de errores 0x9F: DRIVER_POWER_STATE_FAILURE

La comprobación de errores de DRIVER_POWER_STATE_FAILURE tiene un valor de 0x0000009F. Esta comprobación de errores indica que el controlador se encuentra en un estado de energía incoherente o no válido.

Importante

Este artículo es para 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.

DRIVER_POWER_STATE_FAILURE Parámetros

El parámetro 1 indica el tipo de infracción.

Parámetro 1 Parámetro 2 Parámetro 3 Parámetro 4 Causa
0x1 El objeto de dispositivo Reservado Reservado El objeto de dispositivo que se está liberando todavía tiene una solicitud de energía pendiente que no se ha completado.
0x2 El objeto de dispositivo del dispositivo de destino, si está disponible El objeto de dispositivo El objeto driver, si está disponible El objeto de dispositivo completó el paquete de solicitud de E/S (IRP) para la solicitud de estado de energía del sistema, pero no llamó a PoStartNextPowerIrp.
0x3 El objeto de dispositivo físico (PDO) de la pila nt!_TRIAGE_9F_POWER. El IRP bloqueado Un objeto de dispositivo ha estado bloqueando un IRP durante demasiado tiempo.
0x4 Valor de tiempo de espera, en segundos. El subproceso que actualmente mantiene el bloqueo Plug-and-Play (PnP). nt!_TRIAGE_9F_PNP. Se agotó el tiempo de espera de la transición de estado de energía para sincronizarse con el subsistema PnP.
0x5 Dispositivo físico Objeto de la pila El objeto POP_FX_DEVICE Reservado: 0 El dispositivo no pudo completar una transición de energía dirigida dentro del período de tiempo requerido.
0x6 El objeto POP_FX_DEVICE Indica si se trató de una finalización de Apagado dirigido(1) o Encendido (0). Reservado: 0 El dispositivo no completó correctamente su devolución de llamada de transición de energía dirigida.
0x500 Reservado El objeto de dispositivo del dispositivo de destino, si está disponible Device (objeto) El objeto de dispositivo completó el IRP para la solicitud de estado de energía del sistema, pero no llamó a PoStartNextPowerIrp.

Causa

Para obtener una descripción de las posibles causas, consulte la descripción de cada código en la sección Parámetros. Las causas más comunes son:

  • Objeto de dispositivo liberado con solicitud de energía pendiente incompleta
  • Se agotó el tiempo de espera de la transición de estado de energía
  • Objeto de dispositivo que bloquea un IRP
  • Se completó el IRP, pero no se llamó a PoStartNextPowerIrp

Resolución

Para determinar la causa específica y crear una corrección de código, se requiere experiencia en programación y acceso al código fuente del módulo de fallas.

Depuración de la comprobación de errores 0x9F cuando el parámetro 1 es igual a 0x3

  • En un depurador de kernel, use el comando !analyze -v para realizar el análisis inicial de comprobación de errores. El análisis detallado muestra la dirección del nt! TRIAGE_9F_POWER estructura, que está en Arg3.
kd>!analyze -v
*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************

    DRIVER_POWER_STATE_FAILURE (9f)
    A driver has failed to complete a power IRP within a specific time.
    Arguments:
    Arg1: 0000000000000003, A device object has been blocking an Irp for too long a time
    Arg2: fffffa8007b13440, Physical Device Object of the stack
    Arg3: fffff8000386c3d8, nt!_TRIAGE_9F_POWER on Win7 and higher, otherwise the Functional Device Object of the stack
    Arg4: fffffa800ab61bd0, The blocked IRP

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 (expresión del modelo de objetos del depurador de pantalla), un comando del depurador, para mostrar lo siguiente: dx KiBugCheckDriver.

El nt! TRIAGE_9F_POWER estructura proporciona información adicional sobre la comprobación de errores que puede ayudarle a determinar la causa de esta comprobación de errores. La estructura puede proporcionar una lista de todos los IRP de energía pendientes, una lista de todos los subprocesos de trabajo de IRP de energía y un puntero a la cola de trabajo del sistema retrasada.

  • Utilice el comando dt (Tipo de visualización) y especifique el comando nt! TRIAGE_9F_POWER estructura utilizando la dirección de Arg3.
    0: kd> dt nt!_TRIAGE_9F_POWER fffff8000386c3d8
       +0x000 Signature        : 0x8000
       +0x002 Revision         : 1
       +0x008 IrpList          : 0xfffff800`01c78bd0 _LIST_ENTRY [ 0xfffffa80`09f43620 - 0xfffffa80`0ad00170 ]
       +0x010 ThreadList       : 0xfffff800`01c78520 _LIST_ENTRY [ 0xfffff880`009cdb98 - 0xfffff880`181f2b98 ]
       +0x018 DelayedWorkQueue : 0xfffff800`01c6d2d8 _TRIAGE_EX_WORK_QUEUE

El comando dt (Tipo de visualización) muestra la estructura. Puede usar varios comandos del depurador para seguir los campos LIST_ENTRY para examinar la lista de IRP pendientes y los subprocesos de trabajo de IRP avanzados.

  • Use el comando !irp para examinar el IRP que se bloqueó. La dirección de este IRP está en Arg4.
    0: kd> !irp fffffa800ab61bd0
    Irp is active with 7 stacks 6 is current (= 0xfffffa800ab61e08)
     No Mdl: No System Buffer: Thread 00000000:  Irp stack trace.  
         cmd  flg cl Device   File     Completion-Context
     [N/A(0), N/A(0)]
                0  0 00000000 00000000 00000000-00000000    

                Args: 00000000 00000000 00000000 00000000
     [N/A(0), N/A(0)]
                0  0 00000000 00000000 00000000-00000000    

                Args: 00000000 00000000 00000000 00000000
     [N/A(0), N/A(0)]
                0  0 00000000 00000000 00000000-00000000    

                Args: 00000000 00000000 00000000 00000000
     [N/A(0), N/A(0)]
                0  0 00000000 00000000 00000000-00000000    

                Args: 00000000 00000000 00000000 00000000
     [N/A(0), N/A(0)]
                0  0 00000000 00000000 00000000-00000000    

                Args: 00000000 00000000 00000000 00000000
    >[IRP_MJ_POWER(16), IRP_MN_SET_POWER(2)]
                0 e1 fffffa800783f060 00000000 00000000-00000000    pending
               \Driver\HidUsb
                Args: 00016600 00000001 00000004 00000006
     [N/A(0), N/A(0)]
                0  0 00000000 00000000 00000000-fffffa800ad00170    

                Args: 00000000 00000000 00000000 00000000
  • Utilice el comando !devstack con la dirección PDO en Arg2 para mostrar la información asociada con el controlador de errores.
    0: kd> !devstack fffffa8007b13440
      !DevObj           !DrvObj            !DevExt           ObjectName
      fffffa800783f060  \Driver\HidUsb     fffffa800783f1b0  InfoMask field not found for _OBJECT_HEADER at fffffa800783f030

    > fffffa8007b13440  \Driver\usbhub     fffffa8007b13590  Cannot read info offset from nt!ObpInfoMaskToOffset

    !DevNode fffffa8007ac8a00 :
      DeviceInst is "USB\VID_04D8&PID_0033\5&46fa7b7&0&1"
      ServiceName is "HidUsb"
  • Use el comando !poaction para mostrar los subprocesos que controlan las operaciones de energía y los IRP de energía asignados.
    3: kd> !poaction
    PopAction: fffff801332f3fe0
      State..........: 0 - Idle
      Updates........: 0 
      Action.........: None
      Lightest State.: Unspecified
      Flags..........: 10000003 QueryApps|UIAllowed
      Irp minor......: ??
      System State...: Unspecified
      Hiber Context..: 0000000000000000

    Allocated power irps (PopIrpList - fffff801332f44f0)
      IRP: ffffe0001d53d8f0 (wait-wake/S0), PDO: ffffe00013cae060
      IRP: ffffe0001049a5d0 (wait-wake/S0), PDO: ffffe00012d42050
      IRP: ffffe00013d07420 (set/D3,), PDO: ffffe00012daf840, CURRENT: ffffe00012dd5040
      IRP: ffffe0001e5ac5d0 (wait-wake/S0), PDO: ffffe00013d33060
      IRP: ffffe0001ed3e420 (wait-wake/S0), PDO: ffffe00013c96060
      IRP: ffffe000195fe010 (wait-wake/S0), PDO: ffffe00012d32050

    Irp worker threads (PopIrpThreadList - fffff801332f3100)
      THREAD: ffffe0000ef5d040 (static)
      THREAD: ffffe0000ef5e040 (static), IRP: ffffe00013d07420, DEVICE: ffffe00012dd5040

    PopAction: fffff801332f3fe0
      State..........: 0 - Idle
      Updates........: 0 
      Action.........: None
      Lightest State.: Unspecified
      Flags..........: 10000003 QueryApps|UIAllowed
      Irp minor......: ??
      System State...: Unspecified
      Hiber Context..: 0000000000000000

    Allocated power irps (PopIrpList - fffff801332f44f0)
      IRP: ffffe0001d53d8f0 (wait-wake/S0), PDO: ffffe00013cae060
      IRP: ffffe0001049a5d0 (wait-wake/S0), PDO: ffffe00012d42050
      IRP: ffffe00013d07420 (set/D3,), PDO: ffffe00012daf840, CURRENT: ffffe00012dd5040
      IRP: ffffe0001e5ac5d0 (wait-wake/S0), PDO: ffffe00013d33060
      IRP: ffffe0001ed3e420 (wait-wake/S0), PDO: ffffe00013c96060
      IRP: ffffe000195fe010 (wait-wake/S0), PDO: ffffe00012d32050

    Irp worker threads (PopIrpThreadList - fffff801332f3100)
      THREAD: ffffe0000ef5d040 (static)
      THREAD: ffffe0000ef5e040 (static), IRP: ffffe00013d07420, DEVICE: ffffe00012dd5040
  • Si está trabajando con un controlador KMDF, use las extensiones de marco de controladores de Windows (!wdfkd) para recopilar información adicional.

    Use !wdfkd.wdflogdump<su nombre> de controlador para ver si KMDF está esperando que confirme las solicitudes pendientes.

    Use !wdfkd.wdfdevicequeues<su WDFDEVICE> para examinar todas las solicitudes pendientes y el estado en el que se encuentran.

  • Use la extensión !stacks para examinar el estado de cada subproceso y buscar un subproceso que pueda estar retrasando la transición del estado de energía.

  • Para ayudarle a determinar la causa del error, considere las siguientes preguntas:

    • ¿Cuáles son las características del controlador de objeto de dispositivo físico (PDO) (Arg2)?
    • ¿Puedes encontrar el hilo bloqueado? Al examinar el subproceso con el comando !thread debugger, ¿en qué consiste el subproceso?
    • ¿Hay E/S asociada con el subproceso que lo está bloqueando? ¿Qué símbolos hay en la pila?
    • Cuando examina el IRP de energía bloqueada, ¿qué observa?
    • ¿Cuál es el código de función menor PnP del IRP de alimentación?

Comprobación de errores de depuración 0x9F cuando el parámetro 1 es igual a 0x4

  • En un depurador de kernel, use el comando !analyze -v para realizar el análisis inicial de comprobación de errores. El análisis detallado muestra la dirección del nt! TRIAGE_9F_PNP estructura, que se encuentra en el parámetro 4 (arg4).
    kd> !analyze -v
    *******************************************************************************
    *                                                                             *
    *                        Bugcheck Analysis                                    *
    *                                                                             *
    *******************************************************************************

    DRIVER_POWER_STATE_FAILURE (9f)
    A driver has failed to complete a power IRP within a specific time (usually 10 minutes).
    Arguments:
    Arg1: 00000004, The power transition timed out waiting to synchronize with the Pnp
            subsystem.
    Arg2: 00000258, Timeout in seconds.
    Arg3: 84e01a70, The thread currently holding on to the Pnp lock.
    Arg4: 82931b24, nt!TRIAGE_9F_PNP on Win7

El nt! TRIAGE_9F_PNP estructura proporciona información adicional sobre la comprobación de errores que puede ayudarle a determinar la causa del error. El nt! TRIAGE_9F_PNP estructura proporciona un puntero a una estructura que contiene la lista de IRP PnP distribuidos (pero no completados) y proporciona un puntero a la cola de trabajo del sistema retrasada.

    kd> dt nt!_TRIAGE_9F_PNP 82931b24
       +0x000 Signature        : 0x8001
       +0x002 Revision         : 1
       +0x004 CompletionQueue  : 0x82970e20 _TRIAGE_PNP_DEVICE_COMPLETION_QUEUE
       +0x008 DelayedWorkQueue : 0x829455bc _TRIAGE_EX_WORK_QUEUE

El comando dt (Tipo de visualización) muestra la estructura. Puede usar los comandos del depurador para seguir los campos LIST_ENTRY para examinar la lista de IRP de PnP pendientes.

Para ayudarle a determinar la causa del error, considere las siguientes preguntas:

  • ¿Hay un IRP asociado con el subproceso?

  • ¿Hay alguna E/S en CompletionQueue?

  • ¿Qué símbolos hay en la pila?

  • Consulte las técnicas adicionales descritas anteriormente en el parámetro 0x3.

Observaciones

Si no está equipado para depurar este problema mediante las técnicas descritas anteriormente, puede utilizar algunas técnicas básicas de solución de problemas.

  • Si recientemente se han agregado nuevos controladores de dispositivo o servicios del sistema, pruebe a quitarlos o actualizarlos. Intente determinar qué es lo que ha cambiado en el sistema que ha provocado que aparezca el nuevo código de comprobación de errores.

  • Busque en el Administrador de dispositivos para ver si algún dispositivo está marcado con el signo de exclamación (!). Revise el registro de eventos que se muestra en las propiedades del controlador para ver si hay algún controlador con errores. Pruebe a actualizar el controlador relacionado.

  • Consulte el Visor de eventos de registro del sistema para ver si hay mensajes de error adicionales que puedan ayudar a identificar el dispositivo o el controlador que está causando el error. Busque en el registro del sistema errores críticos que se hayan producido en la misma ventana de tiempo que la pantalla azul.

  • Para intentar aislar la causa, deshabilite temporalmente el ahorro de energía mediante el panel de control, opciones de energía. Algunos problemas de controladores están relacionados con los distintos estados de hibernación del sistema y la suspensión y reanudación de la energía.

  • Si ha agregado recientemente hardware al sistema, intente quitarlo o reemplazarlo. O bien, póngase en contacto con el fabricante para ver si hay revisiones disponibles.

  • Puede intentar ejecutar los diagnósticos del hardware proporcionados por el fabricante del sistema.

  • Consulte con el fabricante para ver si hay disponible un sistema ACPI/BIOS actualizado u otro firmware.

Consulte también

Análisis de volcado de memoria mediante los depuradores de Windows (WinDbg)

Análisis de un archivo de volcado de Kernel-Mode con WinDbg

Bug Check Code Reference (Referencia de código de comprobación de errores)