有三種方式可以報告裝置失敗:
從裝置物件回呼函式傳回時,驅動程式可以提供傳回值,使NT_SUCCESS(status)等於FALSE。
驅動程式可以呼叫 WdfDeviceSetFailed。
從其 EvtDriverDeviceAdd回呼例程返回時,函式驅動程式可以提供一個傳回值,其中NT_SUCCESS(status) 等於FALSE。 如果安裝為 篩選 的驅動程序失敗 EvtDriverDeviceAdd,則作系統會略過篩選裝置物件,而不會指出 PnP 錯誤。
上述每個方法都會導致架構有效地移除裝置。 如果裝置的驅動程式不支持系統上的其他裝置,I/O 管理員會卸除驅動程式。
如果驅動程式的裝置物件回呼函式傳回的值,NT_SUCCESS(status)等於FALSE, 框架會通知 PnP 管理員,然後要求匯流排驅動程式重新列舉其裝置來嘗試重新啟動裝置。 如果您的驅動程式已被卸除,則將會重新載入。
如果您的驅動程式呼叫 WdfDeviceSetFailed,它會提供輸入自變數,以判斷裝置是否會重新啟動。 自變數值為 WdfDeviceFailedAttemptRestart 和 WdfDeviceFailedNoRestart。
UMDF UMDF 2.15 之前,UMDF 驅動程式必須將此值設定為 WdfDeviceFailedNoRestart。 從 UMDF 2.15 版開始,UMDF 驅動程式可以呼叫 WdfDeviceSetFailed 並將 FailedAction 設定為 WdfDeviceFailedAttemptRestart,以要求基礎總線驅動程式重新列舉它。 如需詳細資訊,請參閱 WdfDeviceSetFailed。
如需這些自變數值的詳細資訊,請參閱 WDF_DEVICE_FAILED_ACTION。 在驅動程式的裝置物件回呼函式返回 NT_SUCCESS(status)等於 FALSE 的值之前,回呼函式可以透過呼叫 WdfDeviceSetFailed 並用 WdfDeviceFailedNoRestart 作為輸入參數來防止重新啟動。 否則,這些回呼函式不需要呼叫 WdfDeviceSetFailed。
如果在短時間內,連續幾次重新啟動嘗試失敗(因為重新啟動的驅動程式再次回報錯誤),架構會停止嘗試重新啟動裝置。
如果總線驅動程式的 EvtDeviceD0Entry 函式傳回值,NT_SUCCESS(status) 等於 FALSE,架構仍可能會呼叫與總線驅動程式子裝置相關聯之驅動程式的 EvtDeviceD0Entry 函式。