次の方法で共有


USB クライアント ドライバー開発のためのドライバー モデルの選択

このトピックでは、デバイスのファンクション ドライバーとして動作する USB クライアント ドライバーの開発に最適なドライバー モデルを選択するためのガイドラインを示します。

USB デバイスの製造元は多くの場合、アプリケーションがデバイスの機能にアクセスする方法を提供する必要があります。 USB デバイスにアクセスするための最適なメカニズムを選択するには、最も単純なアプローチから始めて、必要に応じてより複雑なソリューションに移行します。 次の一覧は、このトピックで説明する選択肢をまとめたものです。

  1. デバイスが属する USB デバイス クラスが、Windows のインボックス ドライバーが含まれているデバイス クラスであれば、ドライバーを作成する必要はありません。
  2. デバイスに Microsoft 提供のクラス ドライバーがなく、デバイスが 1 つのアプリケーションによってアクセスされる場合は、WinUSB をファンクション ドライバーとして読み込みます。
  3. デバイスが同時実行アプリケーションによってアクセスされる必要があり、デバイスにアイソクロナス エンドポイントがない場合は、UMDF ベースのクライアント ドライバーを作成します。
  4. クラス ドライバー、WinUSB、または UMDF ソリューションが適切に機能しない場合は、KMDF ベースのクライアント ドライバーを作成します。
  5. 特定の機能が KMDF でサポートされていない場合は、WDM ルーチンを呼び出すハイブリッド ドライバーを作成します。

最も一般的なアプローチは、デバイス ドライバー (このドキュメントでは USB クライアント ドライバーと呼ぶ) を実装し、Microsoft 提供の USB ドライバー スタックの上のデバイス スタックにドライバーをファンクション ドライバーとしてインストールする、インストール パッケージを提供することでした。 クライアント ドライバーは、アプリケーションがデバイスのファイル ハンドルを取得するために使用できるデバイス インターフェイスを公開します。 アプリケーションはこのファイル ハンドルを使用して、Windows API を呼び出すことによりドライバーと通信できます。

デバイスの要件に合わせてカスタマイズしたドライバーを作成することは、USB デバイスへのアクセスを提供する最も柔軟な方法です。 しかし、ドライバーを実装するには多くの作業が必要です。 ドライバーは、新しいデバイスが検出されたときのドライバーの初期化、電源管理、I/O 操作、デバイスの突然の取り外し時の処理、状態管理、デバイスの通常取り外し時のクリーンアップなど、複雑なタスクを実行する必要があります。 ドライバーを作成することを選択する前に、次の質問に答えましょう。

Microsoft 提供のドライバーを使用できるか?

次の場合は、必ずしもドライバーを作成する必要はありません

  • デバイスが Microsoft によってサポートされている USB デバイス クラスに属している。

    その場合、対応するクラス ドライバーがデバイス ドライバーとして読み込まれます。 Windows のインボックス ドライバーが含まれているデバイス クラスの一覧については、「Windows に付属の USB デバイス クラス ドライバー」を参照してください。

  • デバイスがデバイス クラスに属していない。

    そのようなデバイスの場合は、デバイスの機能を評価して、Microsoft 提供の WinUSB (Winusb.sys) をデバイスのファンクション ドライバーとして読み込むことができるかどうかを判断します。 次の場合、WinUSB を使用するのが最適な解決策です。

    • デバイスが 1 つのアプリケーションによってアクセスされる。

    • デバイスがバルク、割り込み、またはアイソクロナス エンドポイントをサポートしている。

    • デバイスが、Windows XP Service Pack 2 (SP2) 以降のバージョンの Windows を実行しているターゲット コンピューターで動作することを目的としている。

      WinUSB をファンクション ドライバーとして読み込むことは、カスタム USB ドライバーを実装するよりもシンプルな選択肢となります。 たとえば、デバイスに同梱されたアプリケーションによってのみアクセスされる電子気象ステーションには、WinUSB が推奨されるアプローチです。 また、デバイスとの診断通信やファームウェアのフラッシュにも便利です。

      アプリケーションから Winusb.sys への要求を送信しやすくするために、Winusb.dll というユーザー モード DLL を提供し、WinUSB 関数を公開します。 アプリケーションはこれらの関数を呼び出して、デバイスにアクセスし、構成して、デバイスのエンドポイントにデータを転送できます。

      WinUSB は以下の場合に選択肢になりません。

    • デバイスが複数のアプリケーションからアクセスされている。

    • デバイスの機能が既に Windows オペレーティング システムのカーネル モードでサポートされている。 たとえば、モデム機能 (TAPI がサポート) や LAN 機能 (NDIS がサポート) の場合、ユーザー モード ソフトウェアでモデム デバイスを管理するには、Usbser.sys ドライバーがサポートするインターフェイスを使用する必要があります。

      Windows 8 では、WinUSB インストール用の INF に新しい互換性 ID が追加されました。 デバイスのファームウェアに互換性 ID が含まれている場合、WinUSB がデバイスのファンクション ドライバーとして既定で読み込まれます。 これは、ハードウェア製造元が WinUSB デバイス用の INF ファイルを配布する必要がないことを意味します。 詳細については、「WinUSB デバイス」を参照してください。

USB クライアント ドライバーを作成する場合、どのドライバー モデルが最適か?

答えは、デバイスの設計によって異なります。 まず、特定のドライバー モデルが要件を満たしているかどうかを判断します。 USB デバイスに複数のアプリケーションから同時にアクセスするようにするかどうか、アイソクロナス エンドポイントを介したデータ ストリーミングをサポートするかどうかによって、いくつかの設計上の考慮事項があります。

ドライバーを作成することを選択した場合は、次の選択肢があります。

  • ユーザー モード ドライバー フレームワーク (UMDF)

    UMDF は、クライアント ドライバーがプラグ アンド プレイ マネージャーや電源マネージャーなどの Windows コンポーネントと統合するために使用できるデバイス ドライバー インターフェイス (DDI) を提供します。 UMDF はまた、USB デバイス用に特化したターゲット オブジェクトを提供します。これにより、ユーザー モードでハードウェアが抽象化され、ドライバーの I/O 操作が簡素化されます。 UMDF インターフェイスに加えて、WDF はユーザー モード ドライバー用に拡張されたデバッガー拡張機能とトレース ツールを提供します。 UMDF はコンポーネント オブジェクト モデル (COM) に基づいており、C++ 開発者にとってユーザー モード ドライバーの開発がより簡単になります。

    次の場合は、USB デバイス用に UMDF ベースのクライアント ドライバーを実装します。

    • デバイスは複数のアプリケーションによって同時にアクセスされます。

    • デバイスはバルク転送または割り込み転送をサポートしています。

      ユーザー モードで実行されるドライバーは、(仮想) ユーザー アドレス空間にのみアクセスできるため、システムに対するリスクが大幅に低くなります。 カーネル モード ドライバーはシステム アドレス空間と内部システム構造にアクセスできます。 カーネル モード ドライバーが正しくコーディングされていないと、他のドライバーまたはシステムに影響する問題が発生し、最終的にコンピューターがクラッシュする可能性があります。 したがって、ユーザー モード ドライバーはセキュリティと安定性の点でカーネル モード ドライバーよりも安全だと言えます。

      ユーザー モード ドライバーのもう 1 つの利点は、すべての Win32 API を活用できることです。 たとえば、ドライバーは Winsock、Compression、Encryption などの API を呼び出すことができます。 これらの API はカーネル モード ドライバーでは利用できません。

      UMDF ベースのクライアント ドライバーは、アイソクロナス エンドポイントをサポートする USB デバイスには適していません。

      注: Windows 8.1 では、UMDF バージョン 2.0 が導入されています。 UMDF バージョン 2.0 以降では、KMDF ドライバーで使用できる多くのメソッドを呼び出す C プログラミング言語で UMDF ドライバーを作成できます。 UMDF バージョン 2.0 を使用して USB 用の下位フィルター ドライバーを作成することはできません。

  • カーネル モード ドライバー フレームワーク (KMDF)

    KMDF は、新しいタイプのハードウェアをサポートするためにドライバー モデルを簡単に拡張できるように設計されました。 KMDF には、以前の Windows Driver Model (WDM) ドライバーよりもカーネル モード USB ドライバーの実装を容易にする DDI とデータ構造体が用意されています。 さらに KMDF には、特殊な入出力 (I/O) ターゲットも用意されており、Microsoft USB ドライバー スタックを使用する完全に機能するクライアント ドライバーの作成に使用できます。

    特定の機能が KMDF を通じて公開されていない場合、ドライバーは WDM ルーチンを呼び出す必要があります。 ドライバーは WDM インフラストラクチャ全体を実装する必要はありませんが、KMDF メソッドを使用して、選択した一連の WDM ルーチンにアクセスします。 KMDF ベースのクライアント ドライバーは、WDM スタイルの URB を利用することができます。この URB には、USB ドライバー スタックに対するリクエストの内容が記述されています。 このようなドライバーは、このドキュメントではハイブリッド ドライバーと呼びます。

    KMDF は、ポート - ミニポート ドライバー モデルもサポートしています。 たとえば、上位エッジでカーネル ストリーミングを使用するカーネル ストリーミング ミニポート ドライバー (USB Web カメラなど) は、KMDF USB I/O ターゲット オブジェクトを使用して、要求を USB ドライバー スタックに送信できます。 NDIS ドライバーは、USB などのプロトコル ベースのバス用に KMDF を使用して作成することもできます。

    純粋な WDM ドライバーは、作成が難しく複雑であり、堅牢ではありません。 KMDF の大幅な機能向上により、このタイプのドライバーを作成する必要はなくなりました。

Microsoft Visual Studio 2012 には、UMDF および KMDF USB クライアント ドライバーのスターター コードをそれぞれ生成する、USB ユーザー モード ドライバーUSB カーネル モード ドライバーのテンプレートが含まれています。 テンプレート コードは、USB ターゲット デバイス オブジェクトを初期化して、ハードウェアとの通信を有効にします。 詳細については、次のトピックを参照してください。

UMDF および KMDF ドライバーの実装方法については、Microsoft Press の書籍「Developing Drivers with the Windows Driver Foundation」を参照してください。

WinUSB、UMDF、KMDF の機能比較

次の表は、WinUSB、UMDF ベースの USB ドライバー、および KMDF ベースの USB ドライバーの機能をまとめたものです。

機能 WinUSB UMDF KMDF
複数の同時実行アプリケーションをサポート いいえ はい はい
ドライバー アドレス空間をアプリケーション アドレス空間から隔離 いいえ はい いいえ
バルク転送、割り込み転送、コントロール転送をサポート はい はい はい
アイソクロナス転送をサポート はい 4 いいえ はい
USB スタックの上位層としてフィルター ドライバーなどのカーネル モード ドライバーのインストールをサポート いいえ いいえ はい
セレクティブ サスペンドと待機/ウェイク状態をサポート はい はい はい

次の表は、さまざまなバージョンの Windows でサポートされる WDF の選択肢をまとめたものです。

Windows バージョン WinUSB UMDF KMDF
Windows 8 はい はい はい
Windows 7 はい はい はい
Windows Vista 1 1 はい
Windows Server 2003 いいえ いいえ はい
Windows XP はい2 はい2 はい
Microsoft Windows 2000 いいえ いいえ 3

はい1: WINUSB と UMDF は、x86 ベースと x64 ベースの Windows でのみサポートされています。

はい2: WINUSB と UMDF は、Windows XP の Service Pack 2 (SP2) 以降のバージョンでサポートされています。

Yes3: KMDF は、Windows 2000 の SP4 以降のバージョンでサポートされています。

はい4: アイソクロナス転送は、Windows 8.1 以降のバージョンの Windows でサポートされています。

32 ビット バージョンの Windows XP SP2 のすべてのクライアント SKU は WinUSB をサポートしています。 WinUSB は Windows XP にネイティブではありません。そのため、WinUSB 共同インストーラーを使用してインストールする必要があります。 Windows Vista 以降のバージョンの Windows のすべての SKU は WinUSB をサポートしています。