报告设备故障

有三种方法可以报告设备故障:

上述每种方法都会导致框架有效地删除设备。 如果设备的驱动程序不支持系统上的其他设备,则 I/O 管理器将卸载驱动程序。

如果驱动程序的设备对象回调函数返回NT_SUCCESS (状态) 等于 FALSE 的值,框架会通知 PnP 管理器,然后 PnP 管理器通过请求总线驱动程序重新运行其设备来尝试重启设备。 如果驱动程序已卸载,则会重新加载驱动程序。

如果驱动程序调用 WdfDeviceSetFailed,它将提供一个输入参数,用于确定是否将重启设备。 参数值为 WdfDeviceFailedAttemptRestartWdfDeviceFailedNoRestart

UMDF 在 UMDF 2.15 之前,UMDF 驱动程序必须将此值设置为 WdfDeviceFailedNoRestart。 从 UMDF 版本 2.15 开始,UMDF 驱动程序可以通过调用 WdfDeviceSetFailed 来请求基础总线驱动程序重新枚举它,并将 FailedAction 设置为 WdfDeviceFailedAttemptRestart。 有关详细信息,请参阅 WdfDeviceSetFailed

有关这些参数值的详细信息,请参阅 WDF_DEVICE_FAILED_ACTION。 在驱动程序的设备对象回调函数返回NT_SUCCESS (状态) 等于 FALSE 的值之前,回调函数可以通过使用 WdfDeviceFailedNoRestart 的输入参数调用 WdfDeviceSetFailed 来阻止重启。 否则,这些回调函数不必调用 WdfDeviceSetFailed

如果在短时间内,由于重新启动的驱动程序再次报告错误) , (多次连续重启尝试失败,框架将停止尝试重启设备。

如果总线驱动程序的 EvtDeviceD0Entry 函数返回NT_SUCCESS (状态) 等于 FALSE 的值,则框架仍可能调用与总线驱动程序的子设备关联的驱动程序的 EvtDeviceD0Entry 函数。