UMDF 如何處理驅動程式失敗

本主題描述在 UMDF 驅動程式失敗時,User-Mode Driver Framework (UMDF) 和作業系統採取的動作。 這同時適用于 UMDF 第 1 版和 2 版。

下列事件會依呈現的順序發生:

  • 作業系統會通知反映器 (WUDFRd.sys) 。

  • 反映器會追蹤主機程式中未處理的 I/O:

    • 反映器會以STATUS_DRIVER_PROCESS_TERMINATED錯誤碼完成未處理的 I/O。
    • Microsoft Win32 應用程式會收到未完成 I/O 的ERROR_DRIVER_PROCESS_TERMINATED錯誤碼。

    注意 在 Microsoft Windows XP 上執行的反映器會完成未處理的 I/O 與 STATUS_DRIVER_INTERNAL_ERROR,以及 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通知。