WinUSB アーキテクチャとモジュール
WinUSB は 2 つの主要コンポーネントで構成されています。
- Winusb.sys はカーネル モード ドライバーであり、USB デバイスのカーネル モード デバイス スタック内のプロトコル ドライバーの上に、フィルター ドライバーまたはファンクション ドライバーとしてインストールできます。
- Winusb.dll はユーザー モード DLL であり、WinUSB 関数を公開します。 Winusb.sys がデバイスの機能ドライバーとしてインストールされている場合、アプリケーションはこれらの機能を使用して Winusb.sys と通信できます。
カスタム ファンクション ドライバーを必要としないデバイスの場合、Winusb.sys をファンクション ドライバーとしてデバイスのカーネル モード スタックにインストールできます。 ユーザー モード プロセスは、一連のデバイス I/O 制御要求を使用するか、WinUSB 関数を呼び出すことで、Winusb.sys と通信できます。
次の図では、Winusb.sys の複数のインスタンスを含む USB ドライバー スタックを示しています。
上記の図は、3 つのデバイス インターフェイス クラスを実装する WinUSB 構成の例を示しています。各クラスにはそれぞれ 1 つの登録済みデバイス インターフェイスがあります。
- Winusb.sys のインスタンス 1 はデバイス インターフェイス A を登録します。このインターフェイスは、ユーザーモード ドライバー (Usboem.dll) をサポートします。
- Winusb.sys のインスタンス 2 はデバイス インターフェイス B を登録します。このインターフェイスは、システム サービス (SVCHOST) を使用して Winusb.dll と通信するスキャナー (Usbscan.exe) のユーザーモード ドライバーをサポートします。
- Winusb.sys のインスタンス 3 はデバイス インターフェイス C を登録します。このインターフェイスは、ファームウェア更新ユーティリティ (Usbfw.exe) をサポートします。
Winusb.sys のインスタンスは 1 つだけ読み込まれています。 物理デバイス オブジェクト (PDO) は、非複合デバイス (図のインスタンス 1 など) を表現することも、複合デバイス上のインターフェイスまたはインターフェイス コレクション (インスタンス 2 および 3 など) を表現することもできます。 USB ワイヤレス モバイル通信デバイス クラス (WMCDC) デバイスの場合、PDO は複数のインターフェイス コレクションを表現することもできます。 (WMCDC デバイスの PDO の詳細については、「ワイヤレス モバイル通信デバイス クラスのサポート」を参照してください。)
ユーザー モード アプリケーションは、WinUSB ダイナミック リンク ライブラリ (Winusb.dll) を読み込み、このモジュールによって公開される WinUSB 関数を呼び出すことで、USB スタックと通信できます。