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 está en un estado de alimentación 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.

parámetros de DRIVER_POWER_STATE_FAILURE

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 libera todavía tiene una solicitud de alimentación pendiente que no se ha completado.
0x2 El objeto de dispositivo del dispositivo de destino, si está disponible El objeto de dispositivo Objeto de controlador, si está disponible El objeto de dispositivo completó el paquete de solicitud de E/S (IRP) para la solicitud de estado de alimentación del sistema, pero no llamó a PoStartNextPowerIrp.
0x3 Objeto de dispositivo físico (PDO) de la pila nt!_TRIAGE_9F_POWER. IRP bloqueado Un objeto de dispositivo ha estado bloqueando un IRP durante demasiado tiempo.
0x4 Valor de tiempo de espera, en segundos. Subproceso que contiene actualmente el bloqueo Plug-and-Play (PnP). ¡Nt! TRIAGE_9F_PNP. La transición de estado de energía agota el tiempo de espera para sincronizarse con el subsistema PnP.
0x5 Objeto de dispositivo físico de la pila Objeto POP_FX_DEVICE Reservado: 0 El dispositivo no pudo completar una transición de energía dirigida dentro del período de tiempo necesario.
0x6 Objeto POP_FX_DEVICE Indica si se trata 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 Objeto de dispositivo El objeto de dispositivo completó el IRP para la solicitud de estado de alimentación del sistema, pero no llamó a PoStartNextPowerIrp.

Causa

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

  • Objeto de dispositivo liberado w/ solicitud de alimentación no completa pendiente
  • Se agota el tiempo de espera de la transición de estado de energía
  • Objeto de dispositivo que bloquea un IRP
  • Completado IRP, pero no llamó a PoStartNextPowerIrp

Resolución

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

Comprobación de errores de depuración 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 de comprobación de errores inicial. El análisis detallado muestra la dirección del nt! TRIAGE_9F_POWER estructura, que se encuentra 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 (display debugger object model expression), un comando del depurador, para mostrar esto: dx KiBugCheckDriver.

¡El nt! TRIAGE_9F_POWER estructura proporciona información adicional de 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 irP de energía y un puntero a la cola de trabajo del sistema retrasada.

    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 presentación) muestra la estructura. Puede usar varios comandos del depurador para seguir los campos de LIST_ENTRY para examinar la lista de IRP pendientes y los subprocesos de trabajo de IRP de energía.

  • Use el comando !irp para examinar el IRP bloqueado. La dirección de este IRP se encuentra 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
  • Use el comando !devstack con la dirección PDO de Arg2 para mostrar información asociada al controlador con 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 trabajas con un controlador KMDF, usa las extensiones de Windows Driver Framework (!wdfkd) para recopilar información adicional.

    Use !wdfkd.wdflogdump<el nombre> del controlador para ver si KMDF está esperando a ACK las solicitudes pendientes.

    Use !wdfkd.wdfdevicequeues<su WDFDEVICE> para examinar todas las solicitudes pendientes y en qué estado están.

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

  • Para ayudarle a determinar la causa del error, tenga en cuenta las siguientes preguntas:

    • ¿Cuáles son las características del controlador de objeto de dispositivo físico (Arg2)?
    • ¿Puede encontrar el subproceso bloqueado? Al examinar el subproceso con el comando !thread debugger, ¿de qué consta el subproceso?
    • ¿Hay alguna E/S asociada al subproceso que la bloquee? ¿Qué símbolos hay en la pila?
    • Al examinar el IRP de energía bloqueado, ¿qué nota?
    • ¿Cuál es el código de función secundaria PnP del IRP de energía?

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 de comprobación de errores inicial. 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 de 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 enviados (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 presentación) muestra la estructura. Puede usar comandos del depurador para seguir los campos de LIST_ENTRY para examinar la lista de IRP de PnP pendientes.

Para ayudarle a determinar la causa del error, tenga en cuenta las siguientes preguntas:

  • ¿Hay un IRP asociado al 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.

Comentarios

Si no está equipado para depurar este problema mediante las técnicas descritas anteriormente, puede usar 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é ha cambiado en el sistema que provocó que aparezca el nuevo código de comprobación de errores.

  • Busque en 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 cualquier controlador con errores. Pruebe a actualizar el controlador relacionado.

  • Compruebe el inicio de sesión del sistema Visor de eventos si hay mensajes de error adicionales que pueden ayudar a identificar el dispositivo o el controlador que está causando el error. Para obtener más información, vea Abrir Visor de eventos. 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 alimentación. 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 ACPI/BIOS del sistema actualizado u otro firmware.

Vea 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)