Share via


選擇用於開發 USB 用戶端驅動程式的驅動程式模型

本主題提供選擇最佳驅動程式模型的指導方針,以開發做為裝置函式驅動程式的 USB 用戶端驅動程式。

USB 裝置製造商通常必須提供一種方式,讓應用程式存取裝置的功能。 若要選擇存取 USB 裝置的最佳機制,請從最簡單的方法開始,並視需要移至更複雜的解決方案。 下列清單摘要說明本主題中討論的選項:

  1. 如果您的裝置屬於 Windows 包含收件匣驅動程式的 USB 裝置類別,則不需要撰寫驅動程式。
  2. 如果您的裝置沒有 Microsoft 提供的類別驅動程式,而且裝置是由單一應用程式存取,則載入 WinUSB 作為函式驅動程式。
  3. 如果裝置需要由並行應用程式存取,且您的裝置沒有時序端點,請寫入 UMDF 型用戶端驅動程式。
  4. 如果類別驅動程式、WinUSB 或 UMDF 解決方案不是適合您的選項,請撰寫以 KMDF 為基礎的用戶端驅動程式。
  5. 如果 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 型用戶端驅動程式可以傳送描述 USB 驅動程式堆疊要求的 WDM 樣式 URI。 這類驅動程式在此檔集中稱為 混合式驅動程式

    KMDF 也支援埠迷你埠驅動程式模型。 例如,核心串流迷你埠驅動程式 (例如使用上邊緣核心串流的 USB 網路攝影機) ,可以使用 KMDF USB I/O 目標物件將要求傳送至 USB 驅動程式堆棧。 您也可以使用 KMDF 來撰寫 NDIS 驅動程式,以用於以通訊協定為基礎的總線,例如 USB。

    純 WDM 驅動程式很難撰寫、複雜且不健全。 隨著 KMDF 的演進,不再需要撰寫這種類型的驅動程式。

Microsoft Visual Studio 2012 包含 USB User-Mode 驅動程式USB Kernel-Mode 驅動程式 範本,分別產生 UMDF 和 KMDF USB 用戶端驅動程式的入門程序代碼。 範本程式代碼會初始化 USB 目標裝置物件,以啟用與硬體的通訊。 如需詳細資訊,請參閱下列主題:

如需如何實作 UMDF 和 KMDF 驅動程式的資訊,請參閱 Microsoft Press book Developing Drivers with the Windows Driver Foundation

WinUSB、UMDF、KMDF 功能比較

下表摘要說明 WinUSB、UMDF 型 USB 驅動程式和 KMDF 型 USB 驅動程式的功能。

功能 WinUSB UMDF KMDF
支援多個並行應用程式 No Yes Yes
隔離驅動程式位址空間與應用程式位址空間 No No
支援大量、中斷和控制傳輸 Yes Yes Yes
支援連續傳輸 4 No Yes
支援安裝核心模式驅動程式,例如篩選驅動程式,作為USB堆疊上的過度層 No No Yes
支援選擇性暫停和等候/喚醒狀態 Yes Yes Yes

下表摘要說明不同 Windows 版本支援的 WDF 選項。

Windows 版本 WinUSB UMDF KMDF
Windows 8 Yes Yes
Windows 7 Yes
Windows Vista 1 1
Windows Server 2003 No No
Windows XP 2 2
Microsoft Windows 2000 No 3

1:Windows 的 x86 和 x64 版本僅支援 WinUSB 和 UMDF。

2:Windows XP 搭配 Service Pack 2 (SP2) 或更新版本的 Windows 支援 WINUSB 和 UMDF。

3:WINDOWS 2000 SP4 或更新版本的 Windows 支援 KMDF。

4:Windows 8.1 或更新版本的 Windows 支援異時傳輸。

具有SP2support WinUSB之32位版本 Windows XP 的所有用戶端 SKU。 WinUSB 不是 Windows XP 的原生專案;它必須與 WinUSB 共同安裝程式一起安裝。 所有 Windows Vista SKU 和更新版本的 Windows 都支援 WinUSB。