MB 挂起检测
移动宽带 (MB 或 MBB) 挂起检测是Windows 10 版本 1809及更高版本中的一项技术,可帮助 MBB 客户端驱动程序检测控制路径中的挂起情况并从中恢复。 它是 基于设备的重置和恢复 功能的一部分,旨在从 MBB 设备和驱动程序的各种可能的错误条件中恢复。
本主题中的流程图使用 USB 作为基础总线,但如果 ACPI 和总线堆栈定义本页中所述的接口,则重置机制与总线无关。
以下流程图一般适用于微型端口驱动程序的所有 NDIS 对象标识符 (OID) 和回调。 在某些情况下,如果 NDIS 不完全支持重置恢复,则此过程的恢复部分可能不起作用。
此挂起检测和重置流序列由 3 个阶段组成:
- 挂起检测
- 获取状态以供进一步调试的任何潜在日志记录
- 重置 - 意外删除处理
挂起检测
服务层向驱动程序提供提示,以在用户层上检测到错误时启动恢复,因为 WWANSvc
有一个状态机管理手机适配器的连接状态。 为了支持这一点,定义了驱动程序用于触发重置操作的专用接口。 在某些情况下,驱动程序将自己的命令发往设备,以确保状态机有效。 如果这些命令中的任何一个超时,则从驱动程序本身触发重置/恢复,而无需将操作传回用户模式以启动恢复操作。
有关 UDE 客户端驱动程序可用于触发重置操作的专用接口的详细信息,请参阅 MB 基于设备的重置和恢复。
此示例使用 OID_WWAN_CONNECT 作为演练挂起检测流的示例。
- 通过协议驱动程序 (NDIS) 接收 OID_WWAN_CONNECT。
- NDIS 将OID_WWAN_CONNECT向下传递到类驱动程序。
- 类驱动程序为 Connect 请求构造 MBIM 消息。
- 类驱动程序通过 USB 总线将 MBIM 消息发送到 MBIM 函数。
- 固件命令超时,这可能是因为固件已挂起或 MBIM 命令需要很长时间才能完成。
- 类驱动程序返回 NDIS 命令,而无需固件完成并NDIS_NOTIFICATION_REQUIRED。 OID_WWAN_CONNECT的结果通过状态设置为Timeout 的NDIS_STATUS_WWAN_CONTEXT_STATE从驱动程序请求的通知中返回,指示基础设备未响应命令。
- NDIS 完成对协议驱动程序的 OID 请求。
- 协议驱动程序将调用返回给服务,该服务发现命令失败。
- 该服务使用新的 OID 接口在设备上触发重置操作。
- 在此之后,FDO 调用总线以意外删除并重新枚举 MBB 设备。 如果基础总线是 USB,则 FDO 将调用相应的函数来重置设备。
- 如果在 UEFI 中定义了适当的 ACPI 方法,则将触发 FLDR 或 PLDR。
有关 FLDR 和 PLDR 的详细信息,请参阅 MB 基于设备的重置和恢复。
重置 (意外删除)
重置恢复可以继续后,总线会导致即插即用 (PnP) 管理器生成意外删除 IRP,前提是支持在 ACPI/UEFI 级别存在。 NDIS 在收到意外删除 IRP 时,将调用 回 , WMBCLASS
以获取意外删除 PnP 事件回调。 WMBCLASS
处理意外删除操作。 此时,所有命令等。必须完成,数据包必须成功返回 NDIS。 否则,意外删除操作将不会完成。 其余的流与总线上的实际设备意外移除相同,例如 USB。
- NDIS 调用 PnP 事件进行意外删除。
WMBCLASS
忽略挂起 MBIM 命令的返回并返回原始 NDIS 命令。WMBCLASS
返回用于意外删除的 NDIS PnP 回调。
恢复
意外删除后,堆栈中的所有驱动程序(包括 WMBCLASS
)必须释放所有资源,以便总线可以删除和重新枚举设备对象。 否则,设备将不会重新枚举,也不会恢复。