WinUSB デバイス

この記事では、WinUSB デバイスが Windows によって認識される方法について説明します。

この記事の情報は、OEM または独立系ハードウェア ベンダー (IHV) で、Winusb.sysをファンクション ドライバーとして使用するデバイスを開発していて、カスタム INF を指定しなくてもドライバーを自動的に読み込む場合に適用されます。

WinUSB デバイスとは

WinUSB デバイスは、互換性のある ID を "WINUSB" と報告する特定の Microsoft オペレーティング システム (OS) 機能記述子をファームウェアで定義するユニバーサル シリアル バス (USB) デバイスです。

WinUSB デバイスの目的は、Windows がカスタム INF ファイルを使用せずにデバイスのファンクション ドライバーとしてWinusb.sysを読み込できるようにすることです。 WinUSB デバイスの場合、デバイス用の INF ファイルを配布する必要はありません。そのため、ドライバーのインストール プロセスはエンド ユーザーにとって簡単です。 逆に、カスタム INF を指定する必要がある場合は、デバイスを WinUSB デバイスとして定義し、INF でデバイスのハードウェア ID を指定しないでください。

Microsoft では、USB デバイスのデバイス ドライバーとしてWinusb.sysをインストールするために必要な情報を含む Winusb.inf を提供しています。

Windows 8する前に、Winusb.sysを関数ドライバーとして読み込むには、カスタム INF を指定する必要があります。 カスタム INF は、デバイス固有のハードウェア ID を指定し、また、インボックス Winusb.inf のセクションも含まれています。 これらのセクションは、サービスのインスタンス化、受信トレイ バイナリのコピー、デバイスを見つけて通信するためにアプリケーションが必要とするデバイス インターフェイス GUID の登録に必要です。 カスタム INF の記述の詳細については、「 WinUSB (Winusb.sys) のインストール」を参照してください。

Windows 8では、Windows が INF と WinUSB デバイスを自動的に照合できるように、インボックス Winusb.inf ファイルが更新されました。

インボックス Winusb.inf を使用した WinUSB デバイスのインストール

Windows 8では、インボックス Winusb.inf ファイルが更新されました。 INF には、"USB\MS_COMP_WINUSB" という互換性のある ID を参照するインストール セクションが含まれています。

[Generic.Section.NTamd64]
%USB\MS_COMP_WINUSB.DeviceDesc%=WINUSB,USB\MS_COMP_WINUSB 

更新された INF には、"USBDevice" と呼ばれる新しいセットアップ クラスも含まれています。

"USBDevice" セットアップ クラスは、Microsoft がインボックス ドライバーを提供していないデバイスで使用できます。 通常、このようなデバイスは、オーディオ、Bluetooth などの適切に定義された USB クラスに属していないため、カスタム ドライバーが必要です。 デバイスが WinUSB デバイスである場合、ほとんどの場合、デバイスは USB クラスに属していません。 そのため、デバイスは "USBDevice" セットアップ クラスの下にインストールする必要があります。 更新された Winusb.inf により、その要件が容易になります。

USBDevice クラスの使用について

"USB" セットアップ クラスは、未分類のデバイスには使用しないでください。 このクラスは、コントローラー、ハブ、および複合デバイスをインストールするために予約されています。 "USB" クラスを誤って使用すると、信頼性とパフォーマンスに関する重大な問題が発生する可能性があります。 未分類のデバイスの場合は、"USBDevice" を使用します。

Windows 8で、"USBDevice" デバイス クラスを使用するには、INF にこれを追加するだけです。

  ...
  [Version] 
  Class=USBDevice 
  ClassGuid={88BAE032-5A81-49f0-BC3D-A4FF138216D6}
  ...

デバイス マネージャーに新しいノード USB ユニバーサル シリアル バス デバイスが表示され、そのノードの下にデバイスが表示されます。

Windows 7 では、上記の行に加えて、INF で次のレジストリ設定を作成する必要があります。

  ;---------- Add Registry Section ----------
  [USBDeviceClassReg] 
  HKR,,,,"Universal Serial Bus devices"
  HKR,,NoInstallClass,,1
  HKR,,SilentInstall,,1 
  HKR,,IconPath,%REG_MULTI_SZ%,"%systemroot%\system32\setupapi.dll,-20"

デバイス マネージャーでは、USB ユニバーサル シリアル バス デバイスの下にデバイスが表示されます。 ただし、デバイス クラスの説明は、INF で指定されたレジストリ設定から派生します。

"USBDevice" クラスは WinUSB に限定されないことに注意してください。 デバイス用のカスタム ドライバーがある場合は、カスタム INF で "USBDevice" セットアップ クラスを使用できます。

デバイスの列挙中に、USB ドライバー スタックは、デバイスから互換性のある ID を読み取ります。 互換性のある ID が "WINUSB" の場合、Windows はそれをデバイス識別子として使用し、更新されたインボックス Winusb.inf で一致するものを検索し、デバイスのファンクション ドライバーとしてWinusb.sysを読み込みます。

このイメージは、WinUSB デバイスとして定義され、その結果、Winusb.sysデバイスのファンクション ドライバーとして読み込まれる 1 つのインターフェイス MUTT デバイス用です。

WinUSB デバイスを示す Windows デバイス マネージャーのスクリーンショット。

Windows 8より前のバージョンの Windows の場合、更新された Winusb.inf はWindows Updateを通じて使用できます。 コンピューターがドライバーの更新プログラムを自動的に取得するように構成されている場合、WinUSB ドライバーは、新しい INF パッケージを使用してユーザーの介入なしにインストールされます。

WinUSB デバイスのデバイスの説明を変更する方法

WinUSB デバイスの場合、デバイス マネージャーはデバイスの説明として "WinUsb デバイス" と表示されます。 その文字列は Winusb.inf から派生します。 複数の WinUSB デバイスがある場合、すべてのデバイスで同じデバイスの説明が取得されます。

デバイス マネージャーのデバイスを一意に識別して区別するために、Windows 8は、INF の説明よりも(iProduct 文字列記述子で) デバイスによって報告されたデバイスの説明を優先するようにシステムに指示する、デバイス クラスの新しいプロパティを提供します。 Windows 8で定義されている "USBDevice" クラスは、このプロパティを設定します。 つまり、"USBDevice" クラスの下にデバイスがインストールされている場合、システムはデバイスに対してデバイスの説明を照会し、デバイス マネージャー文字列をクエリで取得したものに設定します。 その場合、INF で指定されたデバイスの説明は無視されます。 前の画像のデバイスの説明文字列 "MUTT" に注目してください。 文字列は、USB デバイスによって製品文字列記述子に提供されます。

新しいクラス プロパティは、以前のバージョンの Windows ではサポートされていません。 以前のバージョンの Windows でデバイスの説明をカスタマイズするには、独自のカスタム INF を記述する必要があります。

WinUSB デバイスを構成する方法

USB デバイスを WinUSB デバイスとして識別するには、デバイスファームウェアに Microsoft OS 記述子が必要です。 記述子の詳細については、「 Microsoft OS 記述子」で説明されている仕様を参照してください。

拡張機能記述子のサポート

USB ドライバー スタックでデバイスが拡張機能記述子をサポートしていることを認識するには、デバイスで、文字列インデックス 0xEEに格納される OS 文字列記述子を定義する必要があります。 列挙中に、ドライバー スタックは文字列記述子を照会します。 記述子が存在する場合、ドライバー スタックは、デバイスに 1 つ以上の OS 機能記述子と、それらの機能記述子を取得するために必要なデータが含まれていると想定します。

取得された文字列記述子には、 bMS_VendorCode フィールド値があります。 値は、USB ドライバー スタックが拡張機能記述子を取得するために使用する必要があるベンダー コードを示します。

OS 文字列記述子を定義する方法については、「Microsoft OS 記述子」で説明されている仕様の「 OS 文字列記述子」を参照してください。

互換性のある ID の設定

インボックス Winusb.inf と一致し、WinUSB ドライバー モジュールを読み込むのに必要な拡張互換性 ID OS 機能記述子。

拡張互換 ID OS 機能記述子には、ヘッダー セクションと、デバイスが複合デバイスか非複合デバイスかに応じて、1 つ以上の関数セクションが含まれます。 ヘッダー セクションは、記述子全体の長さ、関数セクションの数、およびバージョン番号を指定します。 非複合デバイスの場合、ヘッダーの後に、デバイスの唯一のインターフェイスに関連付けられている 1 つの関数セクションが続きます。 そのセクションの compatibleID フィールドでは、フィールド値として "WINUSB" を指定する必要があります。 複合デバイスの場合、複数の関数セクションがあります。 各関数セクションの compatibleID フィールドには、"WINUSB" を指定する必要があります。

デバイス インターフェイス GUID の登録

デバイス インターフェイス GUID を登録するために必要な拡張プロパティ OS 機能記述子。 GUID は、アプリケーションまたはサービスからデバイスを検索し、デバイスを構成し、I/O 操作を実行するために必要です。

以前のバージョンの Windows では、デバイス インターフェイス GUID の登録はカスタム INF を介して行われます。 Windows 8以降、デバイスは拡張プロパティ OS 機能記述子を使用してインターフェイス GUID を報告する必要があります。

拡張プロパティ OS 機能記述子には、1 つ以上のカスタム プロパティ セクションが続くヘッダー セクションが含まれています。 ヘッダー セクションでは、拡張プロパティ記述子全体 (その全長、バージョン番号、カスタム プロパティ セクションの数など) について説明します。 デバイス インターフェイス GUID を登録するには、 bPropertyName フィールドを "DeviceInterfaceGUID" に設定し、 wPropertyNameLength を 40 バイトに設定するカスタム プロパティ セクションを追加します。 GUID ジェネレーターを使用して一意のデバイス インターフェイス GUID を生成し、 bPropertyData フィールドを "{8FE6D4D7-49DD-41E7-9486-49AFC6BFE475}" などのその GUID に設定します。 GUID は Unicode 文字列として指定され、文字列の長さは 78 バイト (null ターミネータを含む) です。

       
bPropertyData 78 バイト 7B 00 38 00 46 00 45 00 36 00 44 00 34 00 44 00 37 00 2D 00 34 00 39 00 00 44 00 2D 00 34 00 31 00 45 00 37 00 2D 00 39 00 34 00 38 00 36 00 2D 00 34 00 39 00 41 00 46 0 0 43 00 36 00 42 00 46 00 45 00 34 00 37 00 35 00 7D 0000 00 プロパティ値は {8FE6D4D7-49DD-41E7-9486-49AFC6BFE475} です。

デバイスの列挙中に、USB ドライバー スタックは拡張プロパティ OS 機能記述子から DeviceInterfaceGUID 値を取得し、デバイスのハードウェア キーにデバイスを登録します。 アプリケーションは、 SetupDiXxx API を使用して値を取得できます ( 「SetupDiOpenDevRegKey」を参照)。 詳細については、「 WinUSB 関数を使用して USB デバイスにアクセスする方法」を参照してください。

WinUSB 電源管理機能の有効化または無効化

Windows 8する前に、WinUSB の電源管理機能を構成するには、HW にレジストリ エントリ値を記述する必要がありましたカスタム INF の AddReg セクション。

Windows 8以降では、デバイスで電源設定を指定できます。 そのデバイスの WinUSB の機能を有効または無効にする拡張プロパティ OS 機能記述子を使用して値を報告できます。 構成できる機能は、選択的サスペンドとシステム ウェイクの 2 つあります。 選択的サスペンドを使用すると、デバイスはアイドル状態のときに低電力状態になります。 システム ウェイクとは、システムが低電力状態のときに、デバイスがシステムをウェイクアップする機能を指します。

WinUSB の電源管理機能の詳細については、「 WinUSB Power Management」を参照してください。

プロパティ名 説明
DeviceIdleEnabled この値は、アイドル状態 (選択的中断) 時にデバイスの電源を切ることができることを示す 1 に設定されます。
DefaultIdleState この値は、既定でアイドル状態のときにデバイスを中断できることを示すために 1 に設定されます。
DefaultIdleTimeout この値は、デバイスがアイドル状態であると判断するまでの待機時間 (ミリ秒単位) を示すために、5000 ミリ秒に設定されます。
UserSetDeviceIdleEnabled USB 選択的中断を有効または無効にするデバイスの機能をユーザーが制御できるようにするには、この値を 1 に設定します。 チェック ボックス デバイスの電源管理プロパティ ページでこのデバイスの電源をオフにすることをコンピューターに許可し、ユーザーはチェック ボックスをオンまたはオフにして、USB 選択的中断を有効または無効にすることができます。
SystemWakeEnabled この値を 1 に設定すると、ユーザーは低電力状態からシステムをスリープ解除するデバイスの機能を制御できます。 有効にすると、デバイスの電源管理プロパティ ページ に [このデバイスでコンピューターのスリープ解除を許可 する] チェック ボックスが表示されます。 ユーザーは、USB システム ウェイクを有効または無効にするボックスをオンまたはオフにすることができます。

たとえば、デバイスで選択的な中断を有効にするには、 bPropertyName フィールドを Unicode 文字列 "DeviceIdleEnabled" と wPropertyNameLength に 36 バイトに設定するカスタム プロパティ セクションを追加します。 bPropertyData フィールドを "0x00000001" に設定します。 プロパティ値は、リトルエンディアンの 32 ビット整数として格納されます。

列挙中に、USB ドライバー スタックは拡張プロパティ機能記述子を読み取り、このキーの下にレジストリ エントリを作成します。

Hkey_local_machine\システム\CurrentControlSet\Enum\Usb\<デバイス識別子>\<インスタンス識別子>\デバイス パラメーター

この画像は、WinUSB デバイスのサンプル設定を示しています。

WinUSB デバイスの設定を示す Windows レジストリ エディターのスクリーンショット。

その他の例については、 Microsoft OS 記述子の仕様を参照してください。