UMDF 如何处理驱动程序故障

当 UMDF 驱动程序出现故障时,UMDF 和操作系统将执行以下操作:

  • 操作系统通知反射器 (WUDFRd.sys)。

  • 反射器在主机进程中跟踪未完成的 I/O:
    • 反射器完成带有 STATUS_DRIVER_PROCESS_TERMINATED 错误代码的未完成的 I/O。
    • Microsoft Win32 应用程序接收未完成的 I/O 的 ERROR_DRIVER_PROCESS_TERMINATED 错误代码。

    注意   在 Microsoft Windows XP 上运行的反射器完成带有 STATUS_DRIVER_INTERNAL_ERROR 的未完成的 I/O,而 Win32 应用程序继而接收未完成的 I/O 的 ERROR_IO_DEVICE 错误代码。因此,在 Windows XP 上运行的应用程序不应使用 ERROR_IO_DEVICE 检测驱动程序故障,因为它们不能确定从典型的 I/O 请求返回的状态(例如,从对 Win32 DeviceIoControl 函数的调用返回的状态)的任何差异。

  • 在操作系统报告主机进程的问题之后,反射器将 GUID_WUDF_DEVICE_HOST_PROBLEM 自定义即插即用 (PnP) 事件发送到操作系统。

    如果应用程序以前调用了 Win32 RegisterDeviceNotification 函数来为设备注册 GUID_WUDF_DEVICE_HOST_PROBLEM,则应用程序将在主机进程失败时接收 DBT_CUSTOMEVENT 通知。有关 RegisterDeviceNotification 和 DBT_CUSTOMEVENT 的更多信息,请参见 Microsoft Windows SDK 文档。

  • 操作系统将在系统事件日志中写入一个日志项以指示驱动程序失败。它还指示操作系统将重新启动驱动程序的次数。当前只在 Windows Vista 上支持此功能。操作系统将以下事件编号写入到系统事件日志中以指示指定的问题:

    • 如果主机进程出现故障,则为 10110
    • 如果设备进入脱机状态并重新启动,则为 10111
    • 如果设备进入脱机状态并且未重新启动,则为 10112

    框架会尝试重新启动失败的驱动程序。UMDF 代码验证程序提供了一个用于控制尝试重新启动的次数的注册表值。如果用户在设备管理器中禁用和启用设备,或者拔出和插入设备,则操作系统将创建一个新的设备实例,并且框架将重置重新启动计数器。

  • 操作系统将卸载设备堆栈中的内核驱动程序。

    注意   在旧的设备堆栈的所有句柄已经关闭之前,操作系统将不会拆除并重新启动设备堆栈。应用程序将检测设备故障和设备的突然移除的通知 (DBT_REMOVEDEVICEPENDING)。但是,如果有任何旧的堆栈句柄保持打开状态,则不会重新启动设备。

  • 驱动程序管理器将重新启动设备或禁用设备。如果禁用设备,则操作系统在设备管理器中显示一个黄色的感叹号。

请注意,在 UMDF 驱动程序失败之后,以下操作可以按任意顺序发生:

  • 操作系统拆除并重新启动设备。

  • 反射器将 GUID_WUDF_DEVICE_HOST_PROBLEM PnP 事件发送到操作系统。

  • 反射器完成带有 STATUS_DRIVER_PROCESS_TERMINATED 的未完成的 I/O。

因此,在操作系统已经重新启动设备之后,应用程序可能接收未完成的 I/O 的 ERROR_DRIVER_PROCESS_TERMINATED。在接收 ERROR_DRIVER_PROCESS_TERMINATED 之后,应用程序可能还会接收从 GUID_WUDF_DEVICE_HOST_PROBLEM 事件产生的 DBT_CUSTOMEVENT 通知。

 

 

社区附加资源

添加
显示:
© 2015 Microsoft