USB クライアント ドライバー開発のためのドライバー モデルの選択
この記事では、デバイスのファンクション ドライバーとして機能する USB クライアント ドライバーを開発するための最適なドライバー モデルを選択するためのガイドラインを提供します。
USB デバイスの製造元は多くの場合、アプリケーションがデバイスの機能にアクセスする方法を提供する必要があります。 USB デバイスにアクセスするための最適なメカニズムを選択するには、最も簡単な方法から始めて、必要な場合にのみ、より複雑なソリューションに移行します。 次の一覧は、この記事で説明する選択肢をまとめたものです。
- デバイスが属する USB デバイス クラスが、Windows のインボックス ドライバーが含まれているデバイス クラスであれば、ドライバーを作成する必要はありません。
- デバイスに Microsoft が提供するクラス ドライバーが存在せず、1 つのアプリケーションのみがデバイスにアクセスする場合は、WinUSB を関数ドライバーとして読み込みます。
- デバイスが同時実行アプリケーションによってアクセスされ、デバイスに等時性エンドポイントがない場合は、UMDF ベースのクライアント ドライバーを記述します。
- クラス ドライバー、WinUSB、または UMDF ソリューションが最適なオプションでない場合は、KMDF ベースのクライアント ドライバーを記述します。
- 特定の機能が 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 デバイスのオプションではありません。
Note
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 には、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 11 | はい | イエス | はい |
Windows 10 | はい | イエス | はい |
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 でサポートされています。
SP2 を使用する Windows XP の 32 ビット バージョンのすべてのクライアント SKU では、WinUSB がサポートされます。 WinUSB は Windows XP にネイティブではなく、WinUSB コインストーラーと共にインストールする必要があります。 Windows Vista 以降のバージョンの Windows のすべての SKU は WinUSB をサポートしています。