次の方法で共有


WinUSB デバイス

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

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

WinUSB デバイスとは

WinUSB デバイスは、"WINUSB" を互換性のある ID として報告する特定の 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 を読み取ります。 "WINUSB" が互換性のある ID の場合、Windows はそれをデバイス識別子として使用し、更新されたインボックス Winusb.inf で一致するものを見つけ、デバイスのファンクション ドライバーとして Winusb.sys を読み込みます。

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

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 クラスの下にインストールされている場合、Windows はデバイスにデバイスの説明を照会し、デバイス マネージャー文字列をクエリで取得したものに設定します。 その場合、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 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 以降では、デバイスの電源設定を指定できます。 そのデバイスの WinUSB の機能を有効または無効にする拡張プロパティ OS 機能記述子を使用して値を報告できます。 構成できる機能には、選択的な中断とシステム ウェイクの 2 つがあります。 選択的な中断により、デバイスはアイドル状態のときに低電力状態になります。 システム ウェイクとは、システムが低電力状態のときにシステムをウェイクアップするデバイスの機能を指します。

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

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

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

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

HKEY_LOCAL_MACHINE\システム\CurrentControlSet\Enum\USB\<Device Identifier>\<Instance Identifier>\Device Parameters

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

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

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