適用於 USB 裝置的 Windows 傳統型應用程式
在本文中,您將瞭解應用程式如何呼叫 WinUSB 函式 來與 USB 裝置通訊。 針對這類應用程式, WinUSB (Winusb.sys) 必須安裝為裝置的功能驅動程式。 裝置核心模式堆疊中的 WinUSB。 此驅動程式包含在 \Windows\System32\drivers 資料夾中的 Windows 中。
如果您使用 Winusb.sys 作為 USB 裝置的函式驅動程式,您可以從應用程式呼叫 WinUSB 函式 來與裝置通訊。 這些函式由使用者模式 DLL Winusb.dll公開,可簡化通訊程式。 應用程式會呼叫對等的 WinUSB 函式,而不是建構裝置 I/O 控制要求來執行標準 USB 作業(例如設定裝置、傳送控制要求,以及從裝置傳輸數據。
Winusb.dll會使用應用程式提供的數據來建構適當的裝置 I/O 控制要求,然後將要求傳送至Winusb.sys進行處理。 為了與 USB 堆棧通訊,WinUSB 函式會使用與應用程式要求相互關聯的適當 IOCTL 呼叫 DeviceIoControl 函式。 要求完成時,WinUSB 函式會將Winusb.sys傳回的任何資訊(例如從讀取要求的數據)傳回呼叫進程。 如果對 DeviceIoControl 的呼叫成功,則會傳回非零值。 如果呼叫失敗或擱置中(未立即處理), DeviceIoControl 會傳回零值。 如果發生錯誤,應用程式可以呼叫 GetLastError 以取得更詳細的錯誤訊息。
使用 WinUSB 函式與裝置通訊比實作驅動程式更簡單。 不過,請注意下列限制:
WinUSB 函式一次允許一個應用程式與裝置通訊。 如果您需要多個應用程式同時與裝置通訊,則必須實作函式驅動程式。
在Windows 8.1之前,WinUSB 函式不支援將數據串流至非時程端點或從不時點來回串流。
WinUSB 函式不支援已經支援內核模式的裝置。 這類裝置的範例包括分別由電話語音 API (TAPI) 和 NDIS 支援的數據機和網路適配器。
針對多功能裝置,您可以使用裝置的 INF 檔案,分別為每個 USB 函式指定內建內核模式驅動程式或Winusb.sys。 不過,您只能指定特定函式的其中一個選項,而不是兩者。
注意
WinUSB 函式需要 Windows XP 或更新版本。 您可以在 C/C++ 應用程式中使用這些函式來與 USB 裝置通訊。 若要撰寫使用 WinUSB API 的 UWP 應用程式,請參閱 USB 裝置的 UWP 應用程式。
開始使用
取得為裝置撰寫 Windows 傳統型應用程式所需的工具
- 請遵循下載 Windows 驅動程式套件中的指示。
取得測試 USB 裝置及其硬體規格。
撰寫基本架構應用程式,以取得裝置的句柄。
撰寫第一個應用程式的方法有兩種:
根據 Visual Studio 中包含的 WinUSB 範本撰寫。 如需詳細資訊,請參閱 根據 WinUSB 範本撰寫 Windows 傳統型應用程式。
呼叫 SetupAPI 例程以取得裝置的句柄,並藉由呼叫 WinUsb_Initialize加以開啟。 如需詳細資訊,請參閱 如何使用 WinUSB 函式存取 USB 裝置。
為您的裝置安裝Winusb.sys。
如果使用 Visual Studio,請使用 Visual Studio 部署,在目標電腦上安裝驅動程式套件。 如需指示,請參閱 根據 WinUSB 範本撰寫 Windows 傳統型應用程式。 否則,請撰寫自定義 INF,在 裝置管理員 中手動安裝驅動程式。 如需詳細資訊,請參閱 WinUSB (Winusb.sys) 安裝。
取得裝置的相關信息,並檢視其描述項。
如需概念資訊,請參閱 所有USB開發人員的概念。 讀取每個支援的替代設定的組態描述元、介面描述元及其端點描述元,以取得裝置功能的相關信息。 如需詳細資訊,請參閱 查詢裝置的USB描述元。
傳送USB控件傳輸。
將標準控制要求和廠商命令傳送至您的裝置。 如需詳細資訊,請參閱 將控制傳送至預設端點。
傳送大量或中斷傳輸。
對裝置支援的大量、中斷和不時點端點執行讀取和寫入作業。 如需詳細資訊,請參閱 問題 I/O 要求。
傳送隨機傳輸。
傳送隨機讀取和寫入要求,主要用於串流數據。 此功能僅適用於 Windows 8.1和更新版本。 如需詳細資訊,請參閱 從 WinUSB 傳統型應用程式傳送 USB 隨機傳輸。