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

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

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

  1. デバイスが受信トレイ ドライバーを含む USB デバイス Windowsに属している場合は、ドライバーを記述する必要があります。
  2. デバイスに Microsoft が提供するクラス ドライバーが存在しない場合に、デバイスが 1 つのアプリケーションからアクセスされる場合は、関数ドライバーとして WinUSB を読み込む必要があります。
  3. 同時実行アプリケーションによってデバイスにアクセスする必要がある場合に、デバイスに同一のエンドポイントが存在しない場合は、UMDF ベースのクライアント ドライバーを作成します。
  4. クラス ドライバー、WinUSB、または UMDF ソリューションが自分に合うオプションではない場合は、KMDF ベースのクライアント ドライバーを記述します。
  5. 特定の機能が KMDF でサポートされていない場合は、WDM ルーチンを呼び出すハイブリッド ドライバーを作成します。

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

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

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

次の場合 は、 ドライバーを記述する必要が生じない場合があります。

  • お使いのデバイスは、Microsoft でサポートされている USB デバイス クラスに属しています。

    その場合、対応するクラス ドライバーがデバイス ドライバーとして読み込まれます。 受信トレイ ドライバーを含むデバイス クラスの一覧Windowsに含まれる USB デバイス クラス ドライバーに関するページをWindows。

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

    このようなデバイスの場合は、デバイスの機能を評価して、Microsoft 提供の WinUSB (Winusb.sys) をデバイスの関数ドライバーとして読み込めるかどうかを判断します。 WinUSB の使用は、次の場合に最適なソリューションです。

    • デバイスは 1 つのアプリケーションによってアクセスされます。
    • デバイスは、一括、割り込み、または同一時エンドポイントをサポートしています。
    • デバイスは、Service Pack 2 (SP2) 以降のバージョンの Windows XP を実行しているターゲット コンピューターとWindows。

    WinUSB を関数ドライバーとして読み込む方が、カスタム USB ドライバーの実装に代わる簡単な方法です。 たとえば、WinUSB は、デバイスと一緒にパッケージ化されたアプリケーションによってのみアクセスされる電子気象ステーションに推奨されるアプローチです。 また、デバイスとの診断通信やファームウェアのフラッシュにも役立ちます。

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

    次の場合、WinUSB はオプションではありません。

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

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

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

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

ドライバーを作成する場合は、次のオプションを選択します。

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

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

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

    • デバイスは、複数のアプリケーションによって同時にアクセスされます。
    • デバイスでは、一括転送または割り込み転送がサポートされます。

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

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

    UMDF ベースのクライアント ドライバーは、同一のエンドポイントをサポートする USB デバイスのオプションではありません。

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

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

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

    特定の機能が KMDF を介して公開されない場合、ドライバーは WDM ルーチンを呼び出す必要があります。 ドライバーは WDM インフラストラクチャ全体を実装する必要はないが、KMDF メソッドを使用して WDM ルーチンの選択セットにアクセスします。 たとえば、同一時転送を実行するために、KMDF ベースのクライアント ドライバーは、要求を記述する WDM スタイルの URB を USB ドライバー スタックに送信できます。 このようなドライバーは、このドキュメント セットではハイブリッド ドライバーと呼ばれるものがあります。

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

    純粋な WDM ドライバーは、記述が難しく、複雑であり、堅牢ではありません。 KMDF の進化に応じて、この種類のドライバーを記述する必要がなくなりました。

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

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

WinUSB、UMDF、KMDF 機能の比較

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

特徴量 WinUSB UMDF KMDF
複数の同時実行アプリケーションをサポート いいえ はい はい
アプリケーション のアドレス空間からドライバーのアドレス空間を分離します いいえ はい いいえ
一括転送、割り込み転送、制御転送をサポート はい はい はい
Isochronous 転送をサポートします はい いいえ はい
USB スタック上の上層として、フィルター ドライバーなどのカーネル モード ドライバーのインストールをサポートします いいえ いいえ はい
選択的中断と待機/ウェイク状態をサポートします はい はい はい

次の表は、さまざまなバージョンのアプリケーションでサポートされている WDF オプションをまとめたWindows。

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

注:
はい ○: WinUSB と UMDF は、x86 ベースおよび x64 ベースのバージョンの Windows。

はい ○: WINUSB と UMDF は、service Pack 2 (SP2) 以降のバージョンの Windows XP でサポートWindows。

はい ○: KMDF は 2000 Windows SP4 以降のバージョンの 2000 年にサポートWindows。

はい: 以降のバージョンの Windows 8.1では、同一の転送がWindows。

SP2support WinUSB を使用する 32 ビット バージョンの Windows XP のすべてのクライアント SKU。 WinUSB は XP を使用Windowsではありません。WinUSB 共同インストーラーと共にインストールする必要があります。 すべての Windows Vista SKU 以降のバージョンでは、WinUSB Windowsサポートされます。

USB クライアント ドライバー開発の概要
WinUSB
初めての USB クライアント ドライバー (UMDF) を作成する
初めての USB クライアント ドライバー (KMDF) を作成する