UMDF 如何处理驱动程序故障

本主题介绍在 UMDF 驱动程序发生故障时User-Mode驱动程序框架 (UMDF) 和操作系统执行的操作。 它适用于 UMDF 版本 1 和 2。

以下事件按显示的顺序发生:

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

  • 反射器跟踪主机进程中未完成的 I/O:

    • 反射器完成未完成的 I/O,STATUS_DRIVER_PROCESS_TERMINATED错误代码。
    • 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的详细信息,请参阅 Windows SDK 文档。

  • 操作系统将一个条目写入系统事件日志,指示驱动程序失败。 它还指示操作系统将重启驱动程序的次数。 操作系统将以下事件编号写入系统事件日志,以指示指定的问题:

    • 如果主机进程出错,则为 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通知。