選擇用於開發 USB 用戶端驅動程式的驅動程式模型
本文提供選擇最佳驅動程式模型的指導方針,以開發可做為裝置函式驅動程式的 USB 用戶端驅動程式。
USB 裝置製造商通常必須提供一種方式,讓應用程式存取裝置的功能。 若要選擇存取 USB 裝置的最佳機制,請從最簡單的方法開始,並在必要時才移至更複雜的解決方案。 下列清單摘要說明本文所討論的選項:
- 如果您的裝置屬於 Windows 包含收件匣驅動程式的 USB 裝置類別,則不需要撰寫驅動程式。
- 如果您的裝置沒有Microsoft提供的類別驅動程式,而且只有單一應用程式存取裝置,則請將 WinUSB 載入為函式驅動程式。
- 如果裝置是由並行應用程式存取,且您的裝置沒有不連續的端點,請寫入以 UMDF 為基礎的用戶端驅動程式。
- 如果類別驅動程式、WinUSB 或 UMDF 解決方案不是適合您的選項,請撰寫以 KMDF 為基礎的用戶端驅動程式。
- 如果 KMDF 不支援特定功能,請撰寫呼叫 WDM 例程的混合式驅動程式。
最常見的方法是實作設備驅動器(在本檔集中稱為 USB 用戶端驅動程式 ),並提供安裝套件,將驅動程式安裝為Microsoft提供的 USB 驅動程式堆疊上方裝置堆疊中的函式驅動程式。 用戶端驅動程式會公開裝置介面,應用程式可用來取得裝置的檔案句柄。 然後,應用程式可以使用這個檔案句柄來呼叫 Windows API 來與驅動程序通訊。
撰寫自定義為裝置需求的驅動程式,是提供 USB 裝置存取權的最彈性方式。 不過,實作驅動程式需要許多工作。 驅動程式必須執行複雜的工作,例如:
- 偵測到新裝置時的驅動程式初始化
- 電源管理
- I/O 作業
- 意外移除裝置
- 狀態管理
- 拿掉裝置時清除
選擇撰寫驅動程式之前,請先詢問下列問題:
您可以使用Microsoft提供的驅動程式嗎?
如果下列專案,您可能 不需要 撰寫驅動程式:
您的裝置屬於Microsoft支援的USB裝置類別。
在此情況下,對應的類別驅動程式會載入為設備驅動器。 如需 Windows 包含收件匣驅動程式的裝置類別清單,請參閱 Windows 中包含的 USB 裝置類別驅動程式。
您的裝置不屬於裝置類別。
針對這類裝置,請評估裝置功能,以判斷您是否可以將Microsoft提供的 WinUSB (Winusb.sys) 載入為裝置的功能驅動程式。 使用 WinUSB 是最佳解決方案,如果:
您的裝置是由單一應用程式存取。
您的裝置支援大量、中斷或非時序端點。
您的裝置是使用執行 Windows XP 與 Service Pack 2(SP2) 和更新版本的 Windows 的目標電腦。
將 WinUSB 載入為函式驅動程式提供實作自定義 USB 驅動程式更簡單的替代方案。 例如,WinUSB 是僅由使用裝置封裝的應用程式存取之電子氣象站的慣用方法。 它也適用於與裝置的診斷通訊,以及閃爍韌體。
為了讓應用程式輕鬆地將要求傳送至Winusb.sys,我們提供公開 WinUSB 函式的使用者模式 DLL Winusb.dll。 應用程式可以呼叫這些函式來存取裝置、進行設定,並將數據傳輸至裝置的端點。
如果:
您的裝置是由多個應用程式存取。
您的裝置具有已在 Windows 作業系統中具有核心模式支援的函式。 例如,對於數據機功能(TAPI 支援)或 LAN 功能(NDIS 支援),您必須使用Usbser.sys驅動程式支援的介面,以使用使用者模式軟體管理數據機裝置。
從 Windows 8 開始,我們已將相容的標識元新增至 INF for WinUSB 安裝。 如果裝置韌體包含該相容標識符,預設會載入 WinUSB 作為裝置的函式驅動程式。 這表示硬體製造商不需要發佈其 WinUSB 裝置的 INF 檔案。 如需詳細資訊,請參閱 WinUSB 裝置。
如果您撰寫 USB 用戶端驅動程式,哪一個驅動程式模型最好?
答案取決於您裝置的設計。 首先,判斷特定驅動程式模型是否符合您的需求。 某些設計考慮是根據您想要多個並行應用程式存取 USB 裝置,並支援透過不時針端點串流的數據。
如果您選擇撰寫驅動程式,以下是您的選項:
使用者模式驅動程式架構 (UMDF)
UMDF 提供設備驅動器介面 (DIS),用戶端驅動程式可用來與 Windows 元件整合,例如 隨插即用 Manager 和 Power Manager。 UMDF 也為 USB 裝置提供特製化目標物件,以將使用者模式中的硬體抽象化,並簡化驅動程式的 I/O 作業。 除了UMDF介面之外,WDF 還提供增強的調試程式延伸模組和使用者模式驅動程序的追蹤工具。 UMDF 是以元件物件模型 (COM) 為基礎,而開發使用者模式驅動程式會更容易C++開發人員。
在下列情況下,為 USB 裝置實作 UMDF 型用戶端驅動程式:
多個應用程式可同時存取裝置。
裝置支援大量或中斷傳輸。
以使用者模式執行的驅動程式只能存取 (虛擬) 用戶位址空間,並且對系統造成較低的風險。 內核模式驅動程式可以存取系統位址空間和內部系統結構。 程式代碼錯誤的內核模式驅動程式可能會導致影響其他驅動程式或系統的問題,最後損毀計算機。 因此,在安全性和穩定性方面,使用者模式驅動程式比內核模式驅動程式更安全。
使用者模式驅動程式的另一個優點是,他們可以使用所有的 Win32 API。 例如,驅動程式可以呼叫 API,例如 Winsock、壓縮、加密 API 等等。 這些 API 不適用於內核模式驅動程式。
UMDF 型用戶端驅動程式不是支援不時點端點的 USB 裝置選項。
注意
Windows 8.1 引進了 2.0 版的 UMDF。 使用UMDF 2.0版,您可以使用 C 程式設計語言撰寫UMDF驅動程式,以呼叫 KMDF 驅動程式可用的許多方法。 您無法使用 UMDF 2.0 版來撰寫 USB 的較低篩選驅動程式。
內核模式驅動程式架構 (KMDF)
KMDF 的設計目的是讓驅動程式模型易於擴充,以支援新類型的硬體。 KMDF 提供 DIS 和數據結構,讓核心模式 USB 驅動程式比先前的 Windows 驅動程式模型 (WDM) 驅動程式更容易實作。 此外,KMDF 提供特殊的輸入/輸出 (I/O) 目標,可讓您用來撰寫使用 Microsoft USB 驅動程式堆疊的完整功能用戶端驅動程式。
在某些情況下,特定功能不會透過 KMDF 公開,驅動程式必須呼叫 WDM 例程。 驅動程式不需要實作整個 WDM 基礎結構,而是使用 KMDF 方法來存取一組選取的 WDM 例程。 例如,若要執行隨機傳輸,KMDF 型用戶端驅動程式可以將描述要求的 WDM 樣式 URL 傳送至 USB 驅動程式堆疊。 這類驅動程式在此檔集中稱為 混合式驅動程式 。
KMDF 也支援埠迷你埠驅動程式模型。 例如,在上邊緣使用核心串流的核心串流迷你埠驅動程式(例如USB網路攝影機)可以使用 KMDF USB I/O 目標物件,將要求傳送至 USB 驅動程式堆疊。 NDIS 驅動程式也可以使用 KMDF 來撰寫通訊協定式總線,例如 USB。
純 WDM 驅動程式難以寫入、複雜且不健全。 隨著 KMDF 的演進,不再需要撰寫這種類型的驅動程式。
Microsoft Visual Studio 包含 USB 使用者模式驅動程式和 USB 核心模式驅動程式範本,分別產生 UMDF 和 KMDF USB 用戶端驅動程式的入門程序代碼。 範本程式代碼會初始化 USB 目標裝置物件,以啟用與硬體的通訊。 如需詳細資訊,請參閱下列文章:
如需如何實作 UMDF 和 KMDF 驅動程式的詳細資訊,請參閱使用 Windows Driver Foundation 開發驅動程式Microsoft出版社書籍。
WinUSB、UMDF、KMDF 功能比較
下表摘要說明 WinUSB、UMDF 型 USB 驅動程式和 KMDF 型 USB 驅動程式的功能。
功能 | WinUSB | UMDF | KMDF |
---|---|---|---|
支援多個並行應用程式 | No | .是 | Yes |
隔離驅動程式位址空間與應用程式位址空間 | No | .是 | No |
支援大量、中斷和控制傳輸 | Yes | .是 | Yes |
支援無時針傳輸 | 是 4 | No | Yes |
支援安裝核心模式驅動程式,例如篩選驅動程式,作為USB堆疊上的過度層 | No | 無 | Yes |
支援選擇性暫停和等候/喚醒狀態 | Yes | .是 | Yes |
下表摘要說明不同 Windows 版本支援的 WDF 選項。
Windows 版本 | WinUSB | UMDF | KMDF |
---|---|---|---|
Windows 11 | Yes | .是 | 是 |
Windows 10 | 是 | .是 | 是 |
Windows 8 | 是 | .是 | Yes |
Windows 7 | Yes | .是 | Yes |
Windows Vista | 是1 | 是1 | Yes |
Windows Server 2003 | No | 無 | Yes |
Windows XP | 是2 | 是2 | Yes |
Microsoft Windows 2000 | No | No | 是3 |
是1:只有 x86 型和 x64 型 Windows 版本才支援 WinUSB 和 UMDF。
是2:Windows XP 支援 Service Pack 2 (SP2) 或更新版本的 Windows 支援 WINUSB 和 UMDF。
是3:WINDOWS 2000 SP4 或更新版本的 Windows 支援 KMDF。
是4:Windows 8.1 或更新版本的 Windows 支援無時針傳輸。
具有 SP2 之 32 位版本的 Windows XP 的所有用戶端 SKU 都支援 WinUSB。 WinUSB 不是 Windows XP 的原生版本,它必須與 WinUSB 硬幣機一起安裝。 所有 Windows Vista SKU 和更新版本的 Windows 都支援 WinUSB。