报告设备故障
有三种方法可以报告设备故障:
从设备对象回调函数返回时,驱动程序可以提供NT_SUCCESS (状态) 等于 FALSE 的返回值。
驱动程序可以调用 WdfDeviceSetFailed。
从其 EvtDriverDeviceAdd 回调例程返回时,函数驱动程序可以提供 NT_SUCCESS (状态) 等于 FALSE 的返回值。 如果作为 筛选器 安装的驱动程序未能通过 EvtDriverDeviceAdd,操作系统将跳过筛选器设备对象,并且不指示 PnP 错误。
上述每种方法都会导致框架有效地删除设备。 如果设备的驱动程序不支持系统上的其他设备,则 I/O 管理器将卸载驱动程序。
如果驱动程序的设备对象回调函数返回NT_SUCCESS (状态) 等于 FALSE 的值,框架会通知 PnP 管理器,然后 PnP 管理器通过请求总线驱动程序重新运行其设备来尝试重启设备。 如果驱动程序已卸载,则会重新加载驱动程序。
如果驱动程序调用 WdfDeviceSetFailed,它将提供一个输入参数,用于确定是否将重启设备。 参数值为 WdfDeviceFailedAttemptRestart 和 WdfDeviceFailedNoRestart。
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 函数。