Поделиться через


0x9F проверки ошибок: DRIVER_POWER_STATE_FAILURE

Проверка ошибок DRIVER_POWER_STATE_FAILURE имеет значение 0x0000009F. Эта ошибка проверка указывает на то, что драйвер находится в несогласованном или недопустимом состоянии питания.

Важно!

Эта статья предназначена для программистов. Если вы являетесь клиентом, который получил код ошибки синего экрана во время работы с компьютером, см. статью Устранение ошибок синего экрана.

Параметры DRIVER_POWER_STATE_FAILURE

Параметр 1 указывает тип нарушения.

Параметр 1 Параметр 2 Параметр 3 Параметр 4 Причина
0x1 Объект устройства Зарезервировано Зарезервировано Освобождаемый объект устройства по-прежнему имеет незавершенный запрос на питание, который не был выполнен.
0x2 Объект устройства целевого устройства, если он доступен Объект устройства Объект драйвера, если он доступен Объект устройства выполнил пакет запроса ввода-вывода (IRP) для запроса состояния питания системы, но не вызвал PoStartNextPowerIrp.
0x3 Объект физического устройства (PDO) стека nt!_TRIAGE_9F_POWER. Заблокированное IRP Объект устройства слишком долго блокирует IRP.
0x4 Значение времени ожидания в секундах. Поток, удерживающий блокировку Plug-and-Play (PnP). Nt! TRIAGE_9F_PNP. Время ожидания перехода состояния питания истекло, чтобы синхронизироваться с подсистемой PnP.
0x5 Объект физического устройства стека Объект POP_FX_DEVICE Зарезервировано — 0 Устройству не удалось выполнить направленный переход питания в течение необходимого периода времени.
0x6 Объект POP_FX_DEVICE Указывает, было ли выполнено выключение питания (1) или выключение питания (0). Зарезервировано — 0 Устройство не завершило обратный вызов перехода с направленным питанием.
0x500 Зарезервировано Объект устройства целевого устройства, если он доступен Объект устройства Объект устройства завершил IRP для запроса состояния питания системы, но не вызвал PoStartNextPowerIrp.

Причина

Описание возможных причин см. в описании каждого кода в разделе Параметры. Наиболее вероятные причины:

  • Освобожден объект устройства с незавершенным незавершенным запросом на питание
  • Истекло время ожидания перехода состояния питания
  • Объект устройства, блокирующий IRP
  • Выполнено IRP, но не был вызван Метод PoStartNextPowerIrp

Решение

Чтобы определить конкретную причину и создать исправление кода, требуется интерфейс программирования и доступ к исходному коду модуля сбоя.

Ошибка отладки проверка 0x9F, когда параметр 1 равен 0x3

  • В отладчике ядра используйте команду !analyze -v, чтобы выполнить первоначальный анализ ошибок проверка. Подробный анализ отображает адрес nt! TRIAGE_9F_POWER структура, которая находится в 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

Если драйвер, ответственный за ошибку, можно определить, его имя выводится на синем экране и сохраняется в памяти в расположении (PUNICODE_STRING) KiBugCheckDriver. Вы можете использовать dx (отображение выражения объектной модели отладчика) — команду отладчика, чтобы отобразить следующее: dx KiBugCheckDriver.

Nt! TRIAGE_9F_POWER структура предоставляет дополнительные сведения об ошибках проверка, которые могут помочь определить причину этой ошибки проверка. Структура может предоставить список всех невыполненных irP питания, список всех рабочих потоков IRP питания и указатель на отложенную очередь системных рабочих ролей.

  • Используйте команду dt (Тип отображения) и укажите nt! TRIAGE_9F_POWER структуру с использованием адреса из 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

Команда dt (тип отображения) отображает структуру. Вы можете использовать различные команды отладчика, чтобы следовать полям LIST_ENTRY, чтобы изучить список невыполненных irP и рабочие потоки power IRP.

  • Используйте команду !irp для проверки заблокированного IRP. Адрес этого IRP находится в 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
  • Используйте команду !devstack с адресом PDO в Arg2, чтобы отобразить сведения, связанные с драйвером сбоя.
    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"
  • Используйте команду !poaction, чтобы отобразить потоки, обрабатывающие операции питания, и все выделенные irp питания.
    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
  • Если вы работаете с драйвером KMDF, используйте расширения Windows Driver Framework (!wdfkd) для сбора дополнительных сведений.

    Используйте !wdfkd.wdflogdump<свое имя> драйвера, чтобы узнать, ожидает ли KMDF от вас ACK всех ожидающих запросов.

    Используйте !wdfkd.wdfdevicequeues<WDFDEVICE> для проверки всех невыполненных запросов и состояния, в которых они находятся.

  • Используйте расширение !stacks для проверки состояния каждого потока и поиска потока, который может удерживать переход состояния питания.

  • Чтобы определить причину ошибки, рассмотрите следующие вопросы:

    • Каковы характеристики драйвера физического объекта устройства (PDO) (Arg2)?
    • Можно ли найти заблокированный поток? Из чего состоит поток при проверке потока с помощью команды отладчика !thread ?
    • Есть ли операции ввода-вывода, связанные с потоком, который блокирует его? Какие символы находятся в стеке?
    • Что вы заметили при проверке заблокированного ip-адреса питания?
    • Что такое код вспомогательной функции PnP для power IRP?

Ошибка отладки проверка 0x9F, когда параметр 1 равен 0x4

  • В отладчике ядра используйте команду !analyze -v, чтобы выполнить первоначальный анализ ошибок проверка. Подробный анализ отображает адрес nt! TRIAGE_9F_PNP структуры, которая находится в параметре 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

Nt! TRIAGE_9F_PNP структура предоставляет дополнительные сведения об ошибках проверка, которые могут помочь определить причину ошибки. Nt! TRIAGE_9F_PNP структура предоставляет указатель на структуру, содержащую список отправленных (но не завершенных) PnP IRP и указатель на отложенную очередь системных рабочих ролей.

  • Используйте команду dt (Тип отображения) и укажите nt! TRIAGE_9F_PNP структуру и адрес, найденный в Arg4.
    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

Команда dt (тип отображения) отображает структуру. Вы можете использовать команды отладчика, чтобы следовать полям LIST_ENTRY, чтобы изучить список невыполненных PnP IRP.

Чтобы определить причину ошибки, рассмотрите следующие вопросы:

  • Связана ли функция IRP с потоком?

  • Есть ли операции ввода-вывода в CompletionQueue?

  • Какие символы находятся в стеке?

  • Дополнительные методы, описанные выше, см. в разделе 0x3 параметров.

Комментарии

Если вы не готовы отлаживать эту проблему с помощью описанных выше методов, можно использовать некоторые основные методы устранения неполадок.

  • Если недавно были добавлены новые драйверы устройств или системные службы, попробуйте удалить или обновить их. Попробуйте определить, что изменилось в системе, вызвавшее появление новой ошибки проверка кода.

  • Просмотрите диспетчер устройств, чтобы узнать, помечены ли какие-либо устройства восклицательным знаком (!). Просмотрите журнал событий, отображаемый в свойствах драйвера для любого неисправного драйвера. Попробуйте обновить соответствующий драйвер.

  • Проверьте Просмотр событий системного входа на наличие дополнительных сообщений об ошибках, которые могут помочь определить устройство или драйвер, которые вызывают ошибку. Дополнительные сведения см. в разделе Открытие Просмотр событий. Ищите критические ошибки в системном журнале, которые появились примерно в то же время, что и "синий экран".

  • Чтобы попытаться изолировать причину, временно отключите энергопотребление с помощью панели управления и параметров питания. Некоторые проблемы с драйверами связаны с различными состояниями гибернации системы, приостановкой и возобновлением питания.

  • Если вы недавно добавили оборудование в систему, попробуйте удалить или заменить его. Или обратитесь к производителю, чтобы узнать, доступны ли какие либо исправления.

  • Можно попробовать запустить средство диагностики оборудования, предоставленное производителем системы.

  • Обратитесь к производителю, чтобы узнать, доступна ли обновленная система ACPI/BIOS или другое встроенное ПО.

См. также

Анализ аварийного дампа с помощью отладчиков Windows (WinDbg)

Анализ файла дампа Kernel-Mode с помощью WinDbg

Bug Check Code Reference (Справочник с кодами критических ошибок)