HOME > ソフテックだより > 第157号(2012年3月7日発行) 技術レポート「WinUSBを用いたWindowsアプリケーション開発」

「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。

ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ


ソフテックだより 第157号(2012年3月7日発行)
技術レポート

「WinUSBを用いたWindowsアプリケーション開発」

1. はじめに

ご存知のとおり、USBはパソコンとその周辺機器との接続で最も普及しているインターフェイスです。
最近では、マウス、キーボード、光学ドライブ、プリンタといったパソコン周辺機器の他に、携帯電話や家電といった組み込み機器とも接続できる標準的なインターフェイスになっています。

以前、USBを題材としたテーマでご紹介させていただきました([ソフテックだより第21号] RS-232CからUSBへの移行)ように、特殊な用途のデバイス機器を接続する場合には、専用のプロトコルを決めてUSBドライバを開発するか、USBデバイス用の汎用ドライバを利用する必要があります。

今回のソフテックだよりでは、 WindowsアプリケーションでUSBデバイスを簡単に制御する方法の一例として、WinUSBを用いたWindowsアプリケーション開発方法についてご紹介させていただきます。

2. WinUSBドライバの特徴

WinUSBは、WDF(Windows Driver Foundation)で提供されるUSBデバイス用の汎用ドライバになります。

以下のような、ユーザモードで動作する『 WinUSB API(WinUSB.dll)』とカーネルモードで動作する『 デバイスファンクションドライバ(WinUSB.sys)』で構成されます。アプリケーション(ユーザモードソフトウェア)は、WinUSB APIを介してUSBデバイスにアクセスすることが可能です。

WinUSBの構造
図1. WinUSBの構造

WinUSBには、個別に開発する必要があるUSBドライバに必要な標準機能がほとんどサポートされています。WinUSBを利用することで、以下のような利点があります。

  • ドライバ開発よりも少ない労力でUSBの標準的な機能が利用できる。
    (WinUSB APIを利用して容易にUSBデバイス制御が実現可能で、カーネルモードのドライバ開発に比べてデバックが容易です)
  • ドライバとして安定しており、個別に開発するUSBドライバ(カーネルモード)に比べて、エラーによるシステム障害を引き起こす心配がない。
  • ドライバ更新手続きが不要。
  • アプリケーション部(ユーザモード)で、USBデバイス処理に関する詳細なエラーハンドリングが可能。
  • カーネルモードレベルのデバイスへの直アクセスが制限されるので、セキュリティ面の脅威を軽減できる。

WinUSBは、デバイスファンクションドライバとしてWinUSB.sysをインストールして、WinUSB API(WinUSB.dll)を用いてUSBデバイスへのアクセスを実現します。
以下、項目に分けてWinUSB利用方法について後続の章で詳細な説明をいたします。

(1)WinUSBドライバパッケージの作成

デバイスファンクションドライバとしてWinUSB.sysをインストールするため、専用のドライバインストーラを用意します。

(2)WinUSB APIを使ってユーザモードアプリケーションを作成

WinUSB API(WinUSB.dll)を利用してUSBデバイスアクセスを行うアプリケーションを作成します。

尚、WinUSBを利用するには、マイクロソフト社から無償ダウンロードできるWDK(Windows Driver Kit)パッケージに含まれる再頒布可能ファイルが必要になります。

3. WinUSBドライバ パッケージの作成

デバイスファンクションドライバとしてWinUSB.sysをインストールするために、専用のドライバインストーラが必要になります。

ドライバパッケージの作成方法について、簡単にまとめました。
ご紹介させていただく例では、USBデバイスを接続する前にドライバをインストールできる利点のある"DPInst"ツールを利用いたします。

3-1. ドライバパッケージに必要なもの

分類 ファイル 備考
ドライバインストール DPInst.exe ※  
ドライバ環境一式
(INF, SYS, CoInstaller)
WdfCoInstaller*.dll,
WinUSBCoInstaller*.dll ※

****.inf インストール対象のUSBデバイスを識別する情報を設定したINFファイルを自前で準備します。

表1. ドライバパッケージに必要なもの

INFファイルを除いて、WDK(Windows Driver Kit)パッケージに含まれるファイルで再頒布可能です。OS/CPU種類毎に用意されているので、適切なものを利用する必要があります。

3-2. ドライバ インストールパッケージ 構成例

ドライバインストールの際には、インストール対象のOS/CPU種類後にドライバ環境が異なりますので、適切な環境をインストールする必要があります。
VBS(VB Script)を用いて、インストール対象のOS/CPUをチェックして、適切な環境がインストールされるようなドライバインストールパッケージの構成例をご紹介します。

WinUSBドラバパッケージ構成例
図2. WinUSBドラバパッケージ構成例

3-3. ドライバINFファイルの作成例

WinUSBは、個別に開発するクラス別のドライバと異なり、インストール対象のデバイスを識別する情報(クラスID)がありませんのでINFファイルを作成する必要があります。

以下に、INFファイル作成例を示します。ご紹介しているインストールパッケージの構成例の想定で、インストール対象のプラットフォーム(OS/CPU種類)に応じて適切なドライバ環境がインストールされるようなINFファイル設定となっております。

"(省略)"箇所については、Microsoft社 「How to Use WinUSB to Communicate with a USB Device.docx」(2010年3月9日版)のINFファイル例と同じになりますので、そちらをご参照ください。
対応ポイント(適宜設定が必要な箇所)は、赤字で示し、吹き出しで簡単なご説明をしております。設定項目に関する詳細な情報は、"(省略)"箇所と同様にMicrosoft社提供のマニュアルをご一読ください。

3-4. セットアップ実行スクリプトファイル(*.VBS)の例

VBS(VB Script)を利用して、インストール対象のOS/CPUをチェックして、適切な環境がインストールされるコード例を以下に示します。

4. WinUSB APIを使ってWindowsアプリケーションを作成

WinUSB API(WinUSB.dll)を利用してUSBデバイスアクセスを行うWindowsアプリケーションを作成します。
開発言語Visual Studio C++で利用する場合のポイントをご説明します。

4-1. WinUSB APIの利用に必要なもの

分類 ファイル 備考
DLL インクルード
ファイル
winusb.h,
winusbio.h
場所: %WDKインストール先%\inc\<umdf_ver>
usb.h,
usb100.h,
usb200.h
場所: %WDKインストール先%\inc\api
DLL リンクファイル WinUsb.lib,
Setupapi.lib
場所: %WDKインストール先%\lib\<os_ver>\<arch>

表2. WinUSB APIの利用に必要なファイル

4-2. WinUSB APIについて

Win32 APIを使ってシリアル通信処理を実装するのと同じ感覚で、WinUSB APIを利用できます。WinUSB APIの詳細な利用方法については、マイクロソフト社「How to Use WinUSB toCommunicate with a USB Device.docx」の資料をご一読いただくのが良いと思います。

5. WinUSB利用時の注意点

WinUSBには、以下のような制約もありますのでシステムへの導入時には注意が必要です。
事前に良くご検討のうえで、WinUSBの利用を決めるのが良いと思います。

5-1. サポートOS 一覧

サポートOS 利用可否
Windows 7
Windows Server 2008
Windows Vista
Windows Server 2003 ×
Windows XP
Windows 2000 ×

表3. WinUSB APIの利用に必要なファイル

5-2. サポートUSB標準機能 一覧

USB標準機能 利用可否
コントロール転送
バルク転送
アイソクロナス転送 ×
インタラプト転送
選択サスペンド
リモートウェイクアップ
複合デバイス対応
共有I/O ×

表4. WinUSBサポート機能一覧

6. 最後に

弊社でも実際のシステム開発でWinUSBを利用したことがございますが、WinUSBドライバパッケージを作成するだけで個別のUSBドライバを開発する必要がないのはQCD面で大きなメリットとなりました。
また、ユーザモードアプリケーション部のUSBデバイスとの通信機能実装においては、Win32 APIを使ったシリアル通信処理と同じ感覚でWinUSB APIを利用できます。シリアル通信処理の開発経験があれば、ほとんど抵抗なくUSBデバイスとの通信機能は実装できる点も魅力の一つだと思います。

関連した技術には汎用的に利用できる『Windows 7 インボックス・ドライバ』などもございますので、今回取り上げさせていただいたWinUSBと比較するのも良いかもしれません。

今回のソフテックだよりで取り上げさせていただいた内容が、USBデバイスとやり取りを行う要件をもったWindowsアプリケーション開発時にご検討材料のひとつになれば幸いです。

(M.S.)

[参考文献]
Microsoft社 「How to Use WinUSB to Communicate with a USB Device.docx」(2010年3月9日版)
CQ出版 「Interface2010年2月号」 (WinUSBを使ったUSBターゲット機器の制御プログラミング)
CQ出版 「Interface2011年8月号」 (Windows用の汎用USBドライバ WinUSBの基本的な使い方)

関連ページへのリンク

関連するソフテックだより

ページTOPへ