【问题标题】:BSOD due to DRIVER_POWER_STATE_FAILURE (9f) with virtual NIC driver由于带有虚拟网卡驱动程序的 DRIVER_POWER_STATE_FAILURE (9f) 导致蓝屏
【发布时间】:2018-02-05 20:44:06
【问题描述】:

我正在开发一个不处理 IRP_MJ_POWER 或 IRP_MN_SET_POWER 的 NDIS 6 微型端口虚拟 NIC 驱动程序。驱动程序没有在 IRP_MJ_POWER 的 DispatchPower 函数中注册。它将其设置为 NULL。驱动程序使用 OID_PNP_CAPABILITIES 和 OID_PNP_SET_POWER 进行电源管理。

最近我观察到 Windows 7 机器发生崩溃,代码为 DRIVER_POWER_STATE_FAILURE (9f)。在做了一些分析后,我观察到崩溃的发生是因为驱动程序没有处理 Power IRP (IRP_MJ_POWER) 超过 10 分钟。这是我第一次发现这个问题。

我也很想知道更多关于向司机交付 IRP_MJ_POWER/IRP_MN_SET_POWER 的信息。 NDIS 驱动程序是否必须处理这些 IRP。我见过多个没有为 IRP_MJ_POWER 注册调度功能的微型端口驱动程序。如果不是强制的,驱动也不需要为IRP_MJ_POWER注册dispatch函数,在什么情况下会出现这样的问题。

【问题讨论】:

    标签: ndis


    【解决方案1】:

    NDIS 微型端口不(也不能)直接处理 IRP。 NDIS 代表微型端口处理它们。通常,当您看到系统表现出一些 WDM 行为(例如讨论 IRP 的错误检查)时,您需要在心理上将其转换为等效的 NDIS 概念和回调。不幸的是,这一点一开始并不总是显而易见的——与 NDIS 合作需要几年时间才能掌握这一点。

    在 9F 的特殊情况下——这是一个非常常见的网络适配器错误检查。大约 70% 的时间是因为微型端口驱动程序泄漏了 NET_BUFFER_LIST 并且没有完成 NBL 返回 NDIS。这是一个常见的代码错误,因为在其他情况下不会出现泄漏 NBL 的症状,而且完全忽略了一个小泄漏。

    大约 20% 的情况下,网络中的 9F 是由其他一些问题引起的,例如卡住的 OID 或 MiniportPause 中的死锁。其余百分之几的网络 9F 是由过滤器驱动程序中的错误(也倾向于泄漏 NBL)和偶尔的操作系统错误引起的。

    在网络驱动程序中调试 9F 时,您应该专注于 (1) 确定具体未完成的事情(NBL、OID、函数调用等),然后 (2) 找出 为什么 它没有完成。有时你很幸运,内核调试器命令!stacks 2 ndis! 使所有堆栈都处于一个整洁的小死锁中,供你解开。其他时候,您需要添加一些诊断/计数器来缩小 NBL 发生的范围。

    祝你好运。

    【讨论】:

    • 感谢您的回复!这真的很有帮助。在我的情况下,司机没有完成 NBL。
    猜你喜欢
    • 2018-05-09
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    相关资源
    最近更新 更多