MB 挂起检测

移动宽带 (MB 或 MBB) 挂起检测是Windows 10 版本 1809及更高版本中的一项技术,可帮助 MBB 客户端驱动程序检测控制路径中的挂起情况并从中恢复。 它是 基于设备的重置和恢复 功能的一部分,旨在从 MBB 设备和驱动程序的各种可能的错误条件中恢复。

本主题中的流程图使用 USB 作为基础总线,但如果 ACPI 和总线堆栈定义本页中所述的接口,则重置机制与总线无关。 

以下流程图一般适用于微型端口驱动程序的所有 NDIS 对象标识符 (OID) 和回调。 在某些情况下,如果 NDIS 不完全支持重置恢复,则此过程的恢复部分可能不起作用。

说明高级挂起检测和重置流的示意图。

此挂起检测和重置流序列由 3 个阶段组成:

  1. 挂起检测
  2. 获取状态以供进一步调试的任何潜在日志记录
  3. 重置 - 意外删除处理

挂起检测

服务层向驱动程序提供提示,以在用户层上检测到错误时启动恢复,因为 WWANSvc 有一个状态机管理手机适配器的连接状态。 为了支持这一点,定义了驱动程序用于触发重置操作的专用接口。 在某些情况下,驱动程序将自己的命令发往设备,以确保状态机有效。 如果这些命令中的任何一个超时,则从驱动程序本身触发重置/恢复,而无需将操作传回用户模式以启动恢复操作。 

有关 UDE 客户端驱动程序可用于触发重置操作的专用接口的详细信息,请参阅 MB 基于设备的重置和恢复

此示例使用 OID_WWAN_CONNECT 作为演练挂起检测流的示例。 

描述挂起检测过程中OID_WWAN_CONNECT重置流的流程图。

  1. 通过协议驱动程序 (NDIS) 接收 OID_WWAN_CONNECT
  2. NDIS 将OID_WWAN_CONNECT向下传递到类驱动程序。
  3. 类驱动程序为 Connect 请求构造 MBIM 消息。
  4. 类驱动程序通过 USB 总线将 MBIM 消息发送到 MBIM 函数。 
  5. 固件命令超时,这可能是因为固件已挂起或 MBIM 命令需要很长时间才能完成。
  6. 类驱动程序返回 NDIS 命令,而无需固件完成并NDIS_NOTIFICATION_REQUIRED。 OID_WWAN_CONNECT的结果通过状态设置为TimeoutNDIS_STATUS_WWAN_CONTEXT_STATE从驱动程序请求的通知中返回,指示基础设备未响应命令。 
  7. NDIS 完成对协议驱动程序的 OID 请求。
  8. 协议驱动程序将调用返回给服务,该服务发现命令失败。
  9. 该服务使用新的 OID 接口在设备上触发重置操作。 
  10. 在此之后,FDO 调用总线以意外删除并重新枚举 MBB 设备。 如果基础总线是 USB,则 FDO 将调用相应的函数来重置设备。 
  11. 如果在 UEFI 中定义了适当的 ACPI 方法,则将触发 FLDR 或 PLDR。

有关 FLDR 和 PLDR 的详细信息,请参阅 MB 基于设备的重置和恢复

重置 (意外删除)

重置恢复可以继续后,总线会导致即插即用 (PnP) 管理器生成意外删除 IRP,前提是支持在 ACPI/UEFI 级别存在。 NDIS 在收到意外删除 IRP 时,将调用 回 , WMBCLASS 以获取意外删除 PnP 事件回调。 WMBCLASS 处理意外删除操作。 此时,所有命令等。必须完成,数据包必须成功返回 NDIS。 否则,意外删除操作将不会完成。 其余的流与总线上的实际设备意外移除相同,例如 USB。 

  1. NDIS 调用 PnP 事件进行意外删除。
  2. WMBCLASS 忽略挂起 MBIM 命令的返回并返回原始 NDIS 命令。 
  3. WMBCLASS 返回用于意外删除的 NDIS PnP 回调。

恢复

意外删除后,堆栈中的所有驱动程序(包括 WMBCLASS )必须释放所有资源,以便总线可以删除和重新枚举设备对象。 否则,设备将不会重新枚举,也不会恢复。

MB 基于设备的重置和恢复

基于 MB 设备的重置和恢复跟踪