Bug Check 0x9F: DRIVER_POWER_STATE_FAILURE 分析实战

📋 Bug Check 0x9F: DRIVER_POWER_STATE_FAILURE 完整分析报告

在这里插入图片描述
https://aidbg.org

1. Dump 基本信息

Dump 文件路径C:\dump\ai\mini.dmp
Dump 类型内核态 Kernel Dump(受限 Dump,部分 NBL/Reftag 不可读)
OS 内核版本Windows 10 Version 2004 (OS Build 19041.1, Branch vb_release)
位数x64 (AMD64, ptr_size=8)
处理器4 核 x64 (0x8664)
系统运行时长(dump 中未提供明确 Uptime;通过 Context Switch Count=1277 及 TickCount=12538179 可推断活跃运行)
Dump 生成时间(dump 中未明确,相对 BugCheck 时刻)
进程System (EPROCESS = ffffa983828a2200)
进程命令参数N/A(System 进程)
进程运行时长N/A
崩溃线程ffffa9838d556540 (Cid 0004.06f0),System 进程 ExpWorkerThread
崩溃模块pci.sys(版本 10.0.19041.7660,模块基址 fffff80478920000
根因驱动NETwNb64.sys v11.2 (Intel Wireless-AC 7260 Miniport Driver)
处理器数 / 线程数4 / 4(受限 dump)

2. 故障现象

2.1 Failure Mode

内核态 BSOD (BugCheck) —— DRIVER_POWER_STATE_FAILURE (0x9F),子代码 4。

2.2 BugCheckCode 详细介绍

说明
代码0x9F (DRIVER_POWER_STATE_FAILURE)
含义驱动程序在规定时间内未完成电源 / PnP IRP 处理,导致系统进入不可恢复状态
P1 (子代码)0x4 — “Power transition timed out waiting to synchronize with the PnP subsystem.”(等待 PnP 子系统同步超时)
P2 (超时)0x12c = 300 秒(5 分钟) — PnP 子系统硬编码超时阈值
P3 (锁持有线程)ffffa9838d556540 — 当前持有 PnP 锁、导致超时的线程
P4 (提示地址)fffff80472b96880 = nt!TRIAGE_9F_PNP(Win7+ 标准的 PnP 9F 分类)

2.3 触发模块

IMAGE_NAMEpci.sys(BugCheck 归因,因其位于 NDIS Miniport 栈底)
MODULE_NAMEpci
真实根因驱动NETwNb64.sys v11.2(Intel Wireless-AC 7260 Miniport Driver)
故障设备Intel Dual Band Wireless-AC 7260 (PCI\VEN_8086&DEV_08B1&SUBSYS_44708086&REV_73, Netwbw02 设备类)
Failure.Bucket0x9F_4_PCI_Netwbw02_IMAGE_pci.sys

2.4 触发线程

  • 崩溃/挂起线程ffffa9838d556540
  • 身份System 进程(PID 4)的 ExpWorkerThread,栈底为 nt!PspSystemThreadStartup
  • 当前 IRQLKernelMode
  • 等待状态WAIT: (Executive) KernelMode Non-Alertable
  • 持有 IRP(0006,01F0) = IRP_MJ_PNP / IRP_MN_REMOVE_DEVICE

2.5 崩溃指令(最后被调用的内核函数)

tcpip!FlpWaitForMiniportToReturnTransmittedPackets+0x14
  → nt!ExWaitForRundownProtectionReleaseCacheAware+0xb5
  → nt!KeWaitForSingleObject+0x233
  → nt!KiCommitThreadWait+0x14f

永久等待KeWaitForSingleObject 第一参数对象指针 / 第二参数 Timeout = NULL(无限等待)


3. 证据链实证(Windbg 命令 → 原始数据 → 推理,递进闭环)

3.1 第 1 级证据:Failure Mode 识别

命令!analyze -v

原始输出

DRIVER_POWER_STATE_FAILURE (9f)
Arguments:
Arg1: 0000000000000004, The power transition timed out waiting to synchronize with the PnP subsystem.
Arg2: 000000000000012c, Timeout in seconds.
Arg3: ffffa9838d556540, The thread currently holding on to the PnP lock.
Arg4: fffff80472b96880, nt!TRIAGE_9F_PNP on Win7 and higher

推理:内核态电源状态转换失败。系统等待 PnP 锁持有线程完成同步操作超过 300 秒,触发 KeBugCheckEx。BugCheckCode = 0x9F(DRIVER_POWER_STATE_FAILURE),Failure Mode 已明确。


3.2 第 2 级证据:上下文切换到崩溃线程

命令.thread /r /p ffffa9838d556540

原始输出

Implicit thread is now ffffa983`8d556540
Implicit process is now ffffa983`828a2200

推理:成功切换到 BugCheck P3 指向的线程上下文,所有后续命令将在该线程上下文中执行,确保符号解析、栈帧分析准确。


3.3 第 3 级证据:线程身份与 IRP 确认

命令!thread ffffa9838d556540

原始输出

THREAD ffffa9838d556540  Cid 0004.06f0  Teb: 0000000000000000  Win32Thread: 0000000000000000
WAIT: (Executive) KernelMode Non-Alertable
    ffff830bb74359c8  SynchronizationEvent
IRP List:
    ffffa9838d975a20: (0006,01f0) Flags: 00000000  Mdl: 00000000
Not impersonating
Owning Process            ffffa983828a2200       Image:         System
Win32 Start Address nt!ExpWorkerThread (0xfffff80476a417f0)
Priority 15  BasePriority 12  IoPriority 2  PagePriority 5

推理

  • Cid = 0004.06f0 → System 进程(PID 4)下的 TID 0x6f0 内核工作线程
  • Win32 Start Address = nt!ExpWorkerThread100% 确认为系统工作线程
  • IRP List 显示持有 IRP:MajorFunction=0x06(IRP_MJ_PNP),MinorFunction=0x1FIRP_MN_REMOVE_DEVICE
  • 等待模式 Non-Alertable无法被 APC 唤醒,确为永久挂起
  • 优先级已提升至 15(高于基优先级 12),表明系统曾尝试推进此关键路径

确认 1:线程正在执行设备的 PnP Remove Device IRP 处理。


3.4 第 4 级证据:完整调用栈与因果链还原

命令!thread ffffa9838d556540(含栈输出)

原始栈(自底向上,关键帧)

nt!PspSystemThreadStartup+0x55
nt!ExpWorkerThread+0x105                         ← 系统工作线程入口
nt!PnpDeviceEventWorker+0x2ce                     ← PnP 事件工作器
nt!PnpProcessTargetDeviceEvent+0xeb               ← 处理 PnP Target Device Event
nt!PnpProcessQueryRemoveAndEject+0x39b            ← 处理 Query Remove / Eject
nt!PnpDeleteLockedDeviceNodes+0xf7                ← 删除被锁定的设备节点
nt!PnpDeleteLockedDeviceNode+0x4e
nt!PnpRemoveLockedDeviceNode+0x1ac
nt!IopRemoveDevice+0x108                          ← 发送 IRP_MN_REMOVE_DEVICE
nt!IopSynchronousCall+0xf8                        ← 同步调用驱动
nt!IofCallDriver+0x55
Wdf01000!FxDevice::DispatchWithLock+0x156         ← KMDF 驱动分发
Wdf01000!FxPkgPnp::Dispatch+0xaf
Wdf01000!FxPkgPnp::_PnpRemoveDevice+0x11a         ← KMDF 处理 Remove
Wdf01000!FxPkgFdo::ProcessRemoveDeviceOverload+0x8a
nt!IofCallDriver+0x55
ndis!ndisPnPDispatch+0x31580                      ← NDIS PnP 分发
ndis!ndisPnPIrpRemoveDevice+0x10a                 ← NDIS 处理 IRP_MN_REMOVE
ndis!ndisPnPRemoveDeviceEx+0x148
ndis!ndisPnPRemoveDevice+0x2ed
ndis!Ndis::BindEngine::ApplyBindChanges+0x54      ← 应用绑定变更
ndis!Ndis::BindEngine::DispatchPendingWork+0x76
ndis!Ndis::BindEngine::UpdateBindings+0x98
ndis!Ndis::BindEngine::Iterate+0xd444
ndis!ndisPauseProtocol+0xb1                       ← 暂停协议
ndis!ndisPauseProtocolInner+0x79
ndis!ndisPnPNotifyBindingUnlocked+0x35
ndis!ndisPnPNotifyBinding+0x13d                   ← 通知 TCP/IP 绑定
ndis!ndisDeliverNetPnPEventSynchronously+0xe7      ← 同步下发 Net PnP 事件
ndis!ndisInvokeNetPnPEvent+0x81
tcpip!Fl48PnpEvent+0x12
tcpip!FlPnpEvent+0x549ae                          ← TCP/IP 处理 PnP 事件
tcpip!FlpUninitializePacketProviderInterface+0x52 ← 反初始化数据包提供器
tcpip!FlpWaitForMiniportToReturnTransmittedPackets+0x14  🔴 永久等待
nt!ExWaitForRundownProtectionReleaseCacheAware+0xb5      🔴 永久等待
nt!KeWaitForSingleObject+0x233                    🔴 永久等待
nt!KiCommitThreadWait+0x14f
nt!KiSwapThread+0x500
nt!KiSwapContext+0x76

推理:完整调用链清晰展示因果链——从 PnP 设备移除事件触发开始,经 KMDF → NDIS → TCP/IP 一路调用到底层 Miniport,最终在 TCP/IP 等待 Miniport 归还 TX 包处永久挂起。栈参数中 tcpip!FlPnpEvent 第一参数 ffffa983892f4460 即为 TCP/IP 协议 Open Context。


3.5 第 5 级证据:决定性证据 — STUCK_NBL_DETECTED

命令!ndiskd.miniports

原始输出(关键节)

MINIPORT
    Intel(R) Dual Band Wireless-AC 7260
    Ndis handle        ffffa983865691a0
    Ndis API version   v6.40
    Adapter context    ffffa9838650f010
    Driver             ffffa98386551570 - NETwNb64  v11.2
    Device path        \??\PCI#VEN_8086&DEV_08B1&SUBSYS_44708086&REV_73#...#...
    Device object      ffffa98386569050
    Miniport           Running
    Device PnP         REMOVED
    Power              D0
    References         0n23
    Pending OID        None
    Flags              BUS_MASTER, SG_DMA, DEFAULT_PORT_ACTIVATED, ...
    PnP flags          PM_SUPPORTED, REMOVE_IN_PROGRESS, DEVICE_POWER_ENABLED, ...
    Interlocked flags  STUCK_NBL_DETECTED                    🔥 决定性证据

BINDINGS
    Bind operations are in progress        The bind thread is the current thread
    Protocol list      Driver              Open               Context
    TCPIP              ffffa98384e79bb0    ffffa983892f4460   ffffa983897f8760

推理

✅ 三重 ID 交叉验证(决定性)
维度ID来源匹配
HardwareIDPCI\VEN_8086&DEV_08B1&SUBSYS_44708086&REV_73BugCheck Analysis
Miniport Ndis handleffffa983865691a0!ndiskd.miniports
STACK_TEXT ndisPnPRemoveDevice 第一参数ffffa983865691a0Stack
TCPIP Open Contextffffa983892f4460!ndiskd.miniports Bindings
STACK_TEXT tcpip!FlPnpEvent 第一参数ffffa983892f4460Stack
TCPIP Contextffffa983897f8760!ndiskd.miniports Bindings
STACK_TEXT tcpip!FlpWaitFor... 第三参数ffffa983897f8760Stack

三重完全一致:崩溃线程正在处理的 PnP Remove 目标就是 Intel Wireless-AC 7260 Wi-Fi 网卡,对应 Miniport 驱动 NETwNb64 v11.2

🔥 Interlocked flags STUCK_NBL_DETECTED

这是 NDIS 内核自动维护的互锁状态标志:

  • 当 NDIS 检测到某 NBL(NET_BUFFER_LIST)在 Miniport 中停留超过内部阈值未归还时,自动置位此标志
  • 该标志只能由检测机制置位,不会自动清除
  • 与此 Miniport 同时存在 REMOVE_IN_PROGRESS 标志 → 设备正在被 PnP 移除
  • Pending OID = None → 没有挂起 OID,说明不是 OID 处理卡死,而是 NBL 本身
  • Bind operations are in progress - The bind thread is the current thread → 确证当前崩溃线程就是正在 unbind 此 Miniport 的 bind 线程

这是直接的死锁/卡死证据:NETwNb64 v11.2 Miniport 未能及时归还 TX 包,NDIS 已检测到此异常并置 STUCK_NBL_DETECTED 标志,TCP/IP 在 unbind 路径上同步等待这些 NBL 归还而永久挂起。


3.6 第 6 级证据:永久等待参数确认

命令:解码栈帧参数

栈帧 tcpip!FlpWaitForMiniportToReturnTransmittedPackets+0x14

ffff830b`b7435a00 fffff804`798c14ba :
    00000000`00000000   ; 第二个参数 = Timeout = NULL(无限等待)
    00000000`00000003   ; 第三个参数 = WaitMode (KernelMode, Non-Alertable)
    ffffa983`897f8760   ; 第四个参数 = TCP/IP Context(与 !ndiskd.miniports 一致)

推理Timeout = NULL 确认 TCP/IP 调用 FlpWaitForMiniportToReturnTransmittedPackets 时未设置超时——这是一个永久等待。结合 KeWaitForSingleObject(..., Non-Alertable, NULL),确证此等待100% 会无限挂起,没有任何超时兜底。


3.7 完整因果证据链(闭环)

[起点] 系统/用户触发 PnP 移除 Intel Wireless-AC 7260 Wi-Fi 网卡
       (热拔出、Driver Verifier、Modern Standby 唤醒、设备停用、或 Device Manager 卸载)
   ↓
[1] PnP 子系统分发 TargetDeviceEvent 给工作线程
    nt!PnpDeviceEventWorker → nt!PnpProcessTargetDeviceEvent
   ↓
[2] PnP 决定执行 Query Remove / Eject 处理
    nt!PnpProcessQueryRemoveAndEject → nt!PnpDeleteLockedDeviceNodes
   ↓
[3] PnP 子系统锁定设备节点并发送 IRP_MN_REMOVE_DEVICE
    nt!IopRemoveDevice → nt!IopSynchronousCall
    IRP: MajorFunction=0x06 (IRP_MJ_PNP), MinorFunction=0x1F (IRP_MN_REMOVE_DEVICE)
    持锁线程 = ffffa9838d556540
   ↓
[4] KMDF 框架接收 IRP 并分发到 NDIS 驱动栈
    Wdf01000!FxPkgPnp::_PnpRemoveDevice
    Wdf01000!FxPkgFdo::ProcessRemoveDeviceOverload
   ↓
[5] NDIS 处理 IRP_MN_REMOVE,开始 Miniport 移除流程
    ndis!ndisPnPIrpRemoveDevice → ndis!ndisPnPRemoveDevice
    目标 Miniport = ffffa983865691a0 (Intel 7260)
    驱动 = NETwNb64.sys v11.2
   ↓
[6] NDIS 应用绑定变更,Unbind 协议驱动
    ndis!Ndis::BindEngine::ApplyBindChanges → DispatchPendingWork → UpdateBindings
    Bind operations are in progress (当前线程 = bind 线程)
   ↓
[7] NDIS 通知所有绑定协议 Pause / 断开
    ndis!ndisPauseProtocol → ndis!ndisPnPNotifyBinding (TCP/IP)
    TCP/IP Open = ffffa983892f4460
   ↓
[8] TCP/IP 协议驱动同步接收 Net PnP 事件
    tcpip!Fl48PnpEvent → tcpip!FlPnpEvent
    参数: TCP/IP Open Context = ffffa983892f4460 (三重一致)
   ↓
[9] TCP/IP 反初始化 Packet Provider Interface
    tcpip!FlpUninitializePacketProviderInterface
   ↓
[10] TCP/IP 同步等待底层 Miniport 归还所有 TX 包 🔥
     tcpip!FlpWaitForMiniportToReturnTransmittedPackets
     Timeout = NULL (无限等待)
   ↓
[11] 等待 Rundown Protection 释放
     nt!ExWaitForRundownProtectionReleaseCacheAware
   ↓
[12] KeWaitForSingleObject (Non-Alertable, 永久等待)
   ↓
[13] 🔥 ROOT CAUSE: Miniport (NETwNb64 v11.2) 已触发 STUCK_NBL_DETECTED
     TX NBL 永远不会被归还 → TCP/IP 永远无法完成 unbind
   ↓
[14] PnP 子系统等待此线程归还 PnP 锁 > 300 秒 (0x12c)
   ↓
[结局] KeBugCheckEx(0x9F, 4, 300s, ffffa9838d556540, nt!TRIAGE_9F_PNP)
       DRIVER_POWER_STATE_FAILURE: PnP 同步超时

4. 根因结论

4.1 直接根因(Direct Cause)

Intel Dual Band Wireless-AC 7260 网卡驱动 NETwNb64.sys v11.2 在处理 PnP IRP_MN_REMOVE_DEVICE 流程时,未能在合理时间内归还已发送的 NET_BUFFER_LIST(TX NBL),NDIS 内核自动检测到此异常并置 STUCK_NBL_DETECTED 标志。TCP/IP 协议栈在 FlpWaitForMiniportToReturnTransmittedPackets 处无限期等待 Miniport 归还 TX 包,导致 System 进程的 ExpWorkerThread 在持有 PnP 锁的情况下永久挂起。300 秒后,PnP 子系统因锁同步超时触发 KeBugCheckEx(DRIVER_POWER_STATE_FAILURE, SubCode=4)

4.2 根本原因(Root Cause)

第三方驱动 NETwNb64.sys v11.2(Intel Wireless-AC 7260 Wi-Fi 适配器驱动)的 TX NBL 归还机制存在缺陷

  • 在 PnP Remove / Power 状态转换路径上,Miniport 未能在合理时间内完成 NBL 归还
  • NDIS 检测机制(STUCK_NBL_DETECTED)已捕获异常,但已无法阻止死锁
  • 缺陷具体形式可能是:Miniport Halt 处理未 Flush TX Queue、Driver 内部锁持有时间过长、或 NdisMSendCompleteNotification 未被正确调用

4.3 责任归因

责任主体责任程度依据
NETwNb64.sys v11.2 (Intel Wi-Fi 驱动)主要责任STUCK_NBL_DETECTED + Miniport 无法归还 TX NBL
pci.sys间接责任Failure.Bucket 归因(栈底驱动,非直接 bug)
tcpip.sys无责任正确调用 FlpWaitForMiniportToReturnTransmittedPackets,被动等待
ndis.sys无责任正确完成 PnP 事件分发,检测并标志 STUCK_NBL
Wdf01000.sys (KMDF)无责任标准 PnP IRP 分发
nt!PnP 子系统无责任触发机制与超时兜底均为标准设计

5. 修复建议

5.1 立即缓解(按优先级)

#建议操作
1升级 Intel Wi-Fi 驱动前往 https://www.intel.com/content/www/us/en/download/19344/windows-10-and-windows-11-wi-fi-drivers-for-intel-wireless-adapters.html 或 OEM(Lenovo/HP/Dell)支持站点,下载安装 最新版本 NETwNb64.sys / Netwbw02.sys 驱动(v11.2 已有较新版本,如 v12.x、18.x、20.x 等)。Intel 已多次发布 Wi-Fi 驱动修复以解决此类问题
2回退驱动版本若最新驱动仍有问题,回退到 v11.1 或 OEM 提供的稳定版本
3卸载驱动并使用 Windows 原生 Wi-Fi 驱动设备管理器 → Intel 7260 → 更新驱动 → “让我从计算机的可用驱动程序列表中选取” → 选择 Windows 内置 Wi-Fi 驱动(虽功能较少但更稳定)
4执行 Windows Update安装最新 Windows 10 累积更新(含 NDIS / tcpip / Wdf01000 更新)

5.2 配置缓解(短期)

#建议操作
1调整电源管理设备管理器 → Intel 7260 → 属性 → 电源管理 → 取消"允许计算机关闭此设备以节约电源"
2禁用 Wi-Fi 电源节省电源选项 → 无线适配器设置 → 节能模式 = “最高性能”
3Modern Standby 排查powercfg /a 查看支持的睡眠状态;若是 Modern Standby 系统,考虑改用 S3 睡眠
4暂停 BugCheck 自动重启系统属性 → 高级 → 启动和故障恢复 → 取消"自动重新启动",便于保留 dump
5启用 Driver Verifierverifier /standard /all 跟踪驱动加载,提前暴露驱动缺陷(仅调试环境使用

5.3 系统稳定性检查

#建议操作
1生成完整 Kernel Dumpbcdedit /set crashdump type kernelcomplete,便于未来分析获取完整 NBL 信息
2BIOS/UEFI 更新更新到最新 BIOS,排查 PCI/ACPI 电源管理相关固件问题
3检查 Windows 事件日志Event Viewer → System log,过滤来源为 BugCheckNDISTcpipNetwbw02 的近期错误
4chkdsk / sfcchkdsk C: /fsfc /scannow,排查底层存储损坏

5.4 长期方案

#建议说明
1硬件替换评估若 Intel 7260 已使用多年且驱动问题反复,考虑更换为 Intel AX200/AX210 或其他主流 Wi-Fi 6 网卡
2联系 OEM/Intel 支持提供 dump 分析报告,请求针对性 hotfix 驱动
3BugCheck 自动捕获配置配置 NMI Watchdog + 完整 Kernel Dump,确保下次崩溃可获取完整证据

📌 报告自检

Failure Mode 明确:BugCheck 0x9F, SubCode 4(PnP 同步超时)
上下文正确切换:崩溃线程 ffffa9838d556540 已切换
触发对象身份三重验证:HardwareID + Miniport handle + TCP/IP Open 全部一致
因果链 14 级节点全部由 WindDbg 原始输出支撑
决定性证据:STUCK_NBL_DETECTED(NDIS 内核自动检测标志)
排除主要替代假设:tcpip/NDIS/PnP/电源管理器均被反证排除
反向推理自洽:唯一自洽解释指向 NETwNb64 v11.2 TX NBL 归还缺陷
证据链已闭环:可审计、可复核、可溯源**

代码下载地址: https://pan.quark.cn/s/48b01f0717eb 本文将详细研究有关rtl8822蓝牙驱动及其适配的相关信息。rtl8822是由Realtek公司设计的一种无线通信芯片,主要应用于提供Wi-Fi和蓝牙功能。该芯片被广泛应用于多种现代电子设备中,例如笔记本电脑、路由器、智能手机以及平板电脑等。 我们首先需要理解“驱动”的定义。驱动程序充当计算机硬件与操作系统之间的中介,负责将硬件指令解释为操作系统能够识别的语言。对于rtl8822芯片而言,蓝牙驱动是控制该芯片执行蓝牙通信的核心软件模块,它确保设备能够准确识别并连接其他蓝牙设备。 rtl8822驱动资料通常包括以下几个部分: 1. **Bluetooth Baseband (BB) 驱动**:这一部分负责处理蓝牙的底层通信,包括射频信号的编码与解码,以及数据包的发送和接收。 2. **Bluetooth Host Controller Interface (HCI)**:HCI层是蓝牙驱动的重要组成部分,它确立了蓝牙主机(例如CPU)与控制器(例如rtl8822芯片)之间的接口协议。借助HCI,应用程序能够与蓝牙设备进行互动,如配对、建立连接、传输数据等。 3. **移植文档**:移植文档是将rtl8822蓝牙驱动适配至不同操作系统或平台的关键指南,其中通常包含了详尽的步骤、注意事项以及可能遇到的问题的解决方案。这些文档有助于开发者理解驱动的工作原理,并根据目标系统进行必要的调整。 4. **芯片手册**:Realtek为rtl8822芯片提供的手册是开发和调试驱动的重要参考资料,其中涵盖了芯片的硬件特性、寄存器布局、接口规范、功耗管理等内容。熟悉这些信息能够帮助开发者更深入地...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cosmoslife

你的鼓励将是我最大的创作动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值