Skip navigation.
ホーム
BLOG-ROMMER 日高のブログ

古いUSBドライバーをWindows 10 で使いたい

Windows 7のサポート期限 が近づいて来て、ここ最近聞く様になったのが古いOS用のUSBドライバーを Windows 10 で使いたいという話だ。

どれぐらい古いかと言うと、Windows 2000 とか Windows XP だったりする。当然 32bit Only、そして使いたいのは最新の Windows 10 64bit版。ご存知の方も多いと思うが、昔の Windows 32bit版のドライバーは、結構そのまま Windows 7 (32bit)にインストールできて動作してしまう。しかし Windows 10 のカーネルモードで動作する一般的な USB ドライバーは、 KMCS (Kernel Mode Code Signing) ポリシーや、sha2署名UEFIセキュアブート での厳格な署名制限があり、単純に古い WDM (WDFでも同じ) のUSBドライバーを再ビルドしただけでは、問題無く動作するとは言えない。そこでその大昔のドライバーを Windows 10用 に対応させるためにどの様な方法があるかを、一から開発し直すことも含めて整理した。

まず現在のWindowsのUSBドライバーの状況については、次の様にWindows XP の頃と比べて進化がある。

これらをふまえて考えたのが前述のチャートである。USBドライバー開発を検討する際に最初に確認すべき出発点の Windows 10 に含まれる最新のUSBクラスドライバーは次の通り。

Windows に含まれる USB デバイス クラス ドライバー

注目すべきは、長い間 USB モデムドライバーとしては知られていた Usbser.sys が、Windos 10ではUSBシリアルアダプターで利用できるINFファイルとともにプレインストールになった事だ。これにより、もしかすると自前のドライバーやINFが不要になっているかも知れない。それはさておき、前述のチャートを説明する。

WinUSB

WinUSB は、USB 規格の Control, Bulk, Interrupt, Isochronous の各転送を、条件付きながら全て Windows アプリケーションから利用できる様にした汎用ドライバーとそれを利用するAPIである。従ってWinUSBを利用する場合、以前USBドライバーがやっていた処理を全てアプリケーション側で記述する必要がある。逆に考えると、アプリケーションが使う USB転送関連の処理を自前で書けば、特別なデバイスドライバーは不要となるわけだ。しかしそのアプリケーションが使用する USBデバイスの Vendor ID と Product ID を記した INF が必要で、INFが必要ならば署名付きカタログ(.CAT)ファイルも必要となる。

OS ディスクリプタ

そこで登場したのが、Microsoft OSディスクリプタである。Index番号 0xEE の特別な String Descriptor で、WinUSBに対応しているデバイスであること示す機能を提供する。従ってデバイスのファームウェアを OS ディスクリプタ対応にしておけば、デバイスがWindows PCに接続されたときに、WinUSBドライバーが自動インストールされる仕組みを提供できる。

Microsoft OS Descriptors for USB Devices


USB デバイス向けの Microsoft OS 記述子(上記の日本語)

既存USBドライバーのWindows 10 / 64bit対応化作業チャート

チャートの最初の選択肢は、Windos 10 対応に伴いアプリケーション改変が可能かどうかである。

ドライバー開発で対応

アプリケーション改変が不可能な場合、自動的に Windows 10 用ドライバー開発 で対応するしかない。既存ドライバーのアップデートが必要であり、同時にドライバーの x64 版対応や、もしかすると x86 や ARM64 対応も行う必要がある。開発の際は可能であれば是非、ユーザーモードドライバー (UMDF2) での実装を検討頂きたい。UMDFの USBドライバーは Windows 10 から WinUSBを使わない Native 実装になり、性能が向上している。ドライバーの配布には、 構成証明書署名 を付加する必要がある。署名については、 Windows ハードウェア互換性プログラム による署名を使用することも可能である。

WinUSBで対応

アプリケーション改変が可能な場合は、この機会に WinUSB で対応することを推奨する。Windows 10 では UWP, .NET Framework, Win32 のアプリケーションからの利用がサポートされている。つまり前項のドライバーで対応する方法とは違い、各プラットフォーム別の対応を気にする必要がほぼなくなる。

INFドライバーパッケージで対応

WinUSBで対応する場合は、対象デバイス用にWinUSBドライバーをどの様にしてインストールするかと言う課題がある。一般的なのは、INFドライバーパッケージを作成して対応することだ。INFのほかにセキュリティカタログ(.CATファイル)を作成して、それに構成証明書署名を付加する必要があるが、INFパッケージは次の様に Visual Studio のテンプレートを選択して容易に作成できる。構成証明書署名については 別記事 を参照されたい。

ファームウェア改変で対応

WinUSB 対応のお勧めは、デバイス側のファームウェアで前述のOSディスクリプタに対応することである。これにより基本的にはどの Windows であっても、WinUSBドライバーが自動インストールされる様になる。ドライバーパッケージや署名の心配は無用だ。課題はファームウェア開発だけなのだが、String Descriptor を追加するだけなので大変ではない。これについては別の機会に取り上げる。

.NET 対応

.NET Core 3.0 は残念ながら WinUSB や UsbDevice クラスには対応していない。しかし MSDN Magazine 等によると、.NET 5は既存の.NET Framework 4.8 に代わる地位を占めるとの事で、統合が予定されているようだ。Linux や Mac で WinUSB が利用できるようになれば大進化だと期待している。