在 UMDF 驅動程式中使用裝置共用
User-Mode Driver Framework (UMDF) 1.11 和 2.0 版
如果您的 User-Mode Driver Framework (UMDF) 驅動程式是使用 1.11 版或 2.0 版建置,而且是在 Windows 8 或更新版本上執行,則架構會建立可裝載多個裝置堆疊的 Wudfhost 單一實例。 這項技術稱為 裝置共用。 裝置共用的主要優點是減少具有多個 UMDF 裝置的環境中的記憶體耗用量。
如果集區裝置失敗,架構會終止 Wudfhost 的實例,並嘗試重新開機先前在集區中的所有裝置。 如果裝置在集區時再次失敗,架構會為裝置建立個別的 Wudfhost 程式,並嘗試再次啟動裝置。
如果裝置在個別主機進程中失敗,架構會嘗試將它重新開機最多五次。 架構會在上次失敗後經過 30 分鐘時,將裝置錯誤計數重設為 1。
如果系統重新開機,架構會重新緩衝處理裝置,但不同進程中執行時失敗的裝置除外。
若要停用特定裝置的裝置共用,請在 INF 的 WDF 特定DDInstall區段中使用UmdfHostProcessSharing指示詞。 如需 UmdfHostProcessSharing的相關資訊,請參閱 在 INF 檔案中指定 WDF 指示詞。
如果您的驅動程式使用 直接 I/O,您必須將 UmdfHostProcessSharing 設定為 ProcessSharingDisabled。 否則,您的驅動程式可能無法啟動。 如果選取 WdfDeviceIoBufferedOrDirect 且裝置已集區,架構會將緩衝區存取方法變更為 緩衝 I/O。 如果選取 WdfDeviceIoBufferedOrDirect 且裝置未集區,架構會將緩衝區存取方法變更為直接 I/O。
若要選取緩衝區存取方法,您的驅動程式必須從其IDriverEntry::OnDeviceAdd回呼函式呼叫IWDFDeviceInitialize2::SetIoTypePreference方法。 如需存取方法的相關資訊,請參閱 存取UMDF-Based驅動程式中的資料緩衝區。
UMDF 1.9 版和更早版本
如果您的驅動程式是以 UMDF 1.9 版或更早版本所建置,架構會為每個裝置堆疊建立個別的主機進程實例 (Wudfhost) 。
如果裝置無法啟動,架構會嘗試重新開機最多五次。 架構會在上次失敗後經過 30 分鐘時,將裝置錯誤計數重設為 1。
在非集區環境中,如果多個裝置堆疊共用相同的 UMDF 驅動程式:
- 每個裝置堆疊都會在不同的 WudfHost 程式中載入。
- 架構會針對每個裝置堆疊呼叫驅動程式的 IDriverEntry::OnInitialize 和 IDriverEntry::OnDeinitialize 方法一次。
- 架構會針對每個裝置堆疊呼叫驅動程式的 IDriverEntry::OnDeviceAdd 方法一次。 每個裝置物件都會與個別的驅動程式物件相關聯。
在集區環境中,如果多個裝置堆疊共用相同的使用者模式驅動程式:
- 每個裝置堆疊都會在相同的 WudfHost 程式中載入。
- 架構只會呼叫驅動程式的 IDriverEntry::OnInitialize 和 IDriverEntry::OnDeinitialize 方法一次。
- 架構會針對每個裝置堆疊呼叫驅動程式的 IDriverEntry::OnDeviceAdd 方法一次。 每個裝置物件都與相同的驅動程式物件相關聯。
因為集區組態中只有一個驅動程式物件,所以驅動程式不得將任何個別裝置內容儲存在全域變數或跨裝置共用的物件中,例如驅動程式回呼物件。 相反地,驅動程式必須將每個裝置內容儲存在裝置堆疊之間未共用的物件中,例如驅動程式的裝置回呼物件。