WinUSB デバイス

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

この記事の情報は、Winusb.sys をファンクション ドライバーとして使用し、カスタム INF を提供せずにドライバーを自動的に読み込むデバイスを開発している OEM または独立系ハードウェア ベンダー (IHV) を対象としています。

WinUSB デバイスとは

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

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

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

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

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

インボックス 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 デバイスとして定義された単一インターフェイス MUTT デバイスに関するものです。結果として、Winusb.sys がデバイスのファンクション ドライバーとして読み込まれます。

Screenshot of Windows Device Manager showing a WinUSB device.

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

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

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

デバイス マネージャーでデバイスを一意に識別して区別できるように、Windows 8 では、デバイス クラスに新しいプロパティが提供されています。このプロパティは、デバイスから報告されたデバイス説明 (iProduct 文字列記述子内) を INF 内の説明よりも優先するようにシステムに指示します。 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 つのヘッダー セクションが含まれ、これに 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 00 43 00 36 00 42 00 46 00 45 00 34 00 37 00 35 00 7D 00 00 00 プロパティ値は {8FE6D4D7-49DD-41E7-9486-49AFC6BFE475} です。

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

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

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

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

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

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

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

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

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Enum\USB\<デバイス識別子>\<インスタンス識別子>\Device Parameters

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

Screenshot of Windows Registry Editor showing settings for a WinUSB device.

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