仮想HIDドライバvmulti (1) : コンパイルからインストールまで

仮想HIDデバイスドライバとして有名らしい「vmulti(Virtual Maltiple HID Driver)」について、日本語の情報が一切引っかからなかったので備忘録として書いていきます。今回はVisual Studio 2012でのコンパイル方法と、OSへのインストール方法をまとめてみました。どなたかのためになれば幸いです。

vmulti(Virtual Maltiple HID Driver)で何が可能なのか

以下のデバイスの入力をエミュレートすることができます。

  • マルチタッチ
  • マウス
  • ディジタイザ
  • キーボード
  • ジョイスティック

例えば、このドライバに対して「マウスを相対位置指定で(100, 100)に移動させてくれ」とリクエストを投げると、実際にマウスドライバの動作をエミュレートしてくれて、マウスがちゃんと移動します。
マクロをドライバレベルで動作させたりする用途にも利用できると思います。

Windows Driver Kit(WDK)のインストール

注意: Visual Studioをインストールしていない場合は、先にVisual Studioをインストールしてください。
(そうしないと、Project作成画面にWDKが表示されません)

Windows Driver Kit Downloads

ソースのダウンロード

Google Project Hostingからソースをダウンロード/チェックアウトします。

下記ページからzipでも落とせます
/ - vmulti - Virtual Multiple HID Driver - Google Project Hosting

ソースは以下の4つのプロジェクトを含んでいます。

  • vmulti: vmultiドライバ
  • hidkmdf: Hid miniport to be used as an upper layer for supporting KMDF based driver for HID devices. (よくわからん)
  • vmulticlient: vmultiドライバにアクセスするための静的ライブラリ
  • testvmulti: 上記の静的ライブラリを用いて、実際にドライバを使ってみるテストアプリケーション

ソリューションを開く(vmulticlient, testvmulti)

ダウンロードしたzip内にあるソリューションファイル(vmulticlient.sln)を開きます。
Visual Studio 2012で開くと、アップグレードを要求されるので、OKしておきます。

このソリューションにはvmulticlientとtestvmultiのプロジェクトが入っています。
vmultiとhidkmdfは別ディレクトリにプロジェクトファイルのみが存在します。

vmultiとhidkmdfをVisual Studioで開き、コンパイルする

ファイル → 開く → Conver Sources/Dirs...
vmulti: ./vmulti/sys/sources
hidkmdf: ./vmulti/hidmapper/sources

一度これを行うと、それぞれのディレクトリにプロジェクトが作成されます。
これを、vmulticlientなどのソリューションに追加することで、ひとつのソリューション内で全て開発できます。

vmulti/hidkmdfのコンパイル

それぞれのプロジェクトでビルドすれば以下のファイルが生成されます。

  • vmulti.sys
  • vmulti.inf
  • hidkmdf.sys

ビルドするときは、動作対象のWindowsバージョンとx64/x86を適切に選択しましょう。

vmulticlient/testvmultiをコンパイルする

普通にそのままビルドしても私の環境だとできなかったので、プロパティを少々変更しました。

windows.hが開けない

fatal error C1083: include ファイルを開けません。'windows.h': No such file or directory

プロジェクト → プロパティ → 構成プロパティ → C/C++ → 全般
にある「追加のインクルードディレクトリ」に以下を追加

$(WindowsSDK_IncludePath)

excpt.hが開けない

fatal error C1083: include ファイルを開けません。'excpt.h': No such file or directory

上記と同様に「追加のインクルードディレクトリ」に以下を追加

C:\Program Files %28x86%29\Microsoft Visual Studio 11.0\VC\include

ドライバのインストール

64bitOSを利用している場合、デフォルトだとドライバに署名がないとインストール出来ません。
自己署名をすることで回避可能だと思うのですが、うまく行かなかったので、苦肉の策として採用した、OSのテストモード化の方法と、自己署名作業を途中まで記しておきます。
いつか、自己署名が出来たら更新します。

テストモード

テストモードにすることで、未署名ドライバを動作可能です。ただしセキュリティ的によろしくありません。

bcdedit /set TESTSIGNING ON

その後、ドライバをインストールします

devcon.exe install vmulti.inf djpnewton\vmulti 

自己署名

下記の方法でうまく行かなかったため、なにか間違っていると思われます。
どなたかご教授いただければ幸いです。

makecert

証明書を作成します。

makecert -r -n "CN=LocalSign" -ss LocalCertStore -sr LocalMachine -pe

mmc

作成した証明書を登録します。

  1. プログラムを指定して実行「mmc.exe」
  2. ファイル → スナップインの追加と削除 にて「証明書(コンピュータアカウント)」を追加
  3. LocalCertStore/証明書/LocalSignが存在するか確認する
  4. LocalSignを「信頼されたルート証明書」と「信頼された発行元」にコピー

inf2cat

カタログファイルを作成します

c:\Program Files (x86)\Windows Kits\8.0\Tools\x64> inf2cat /driver:"c:\tmp\vmulti" /os:7_x64

signtool

署名します

signtool sign /s LocalCertStore /n "LocalSign" /t http://timestamp.verisign.com/scripts/timestamp.dll vmulti.cat
signtool sign /s LocalCertStore /n "LocalSign" /t http://timestamp.verisign.com/scripts/timestamp.dll vmulti.sys
signtool sign /s LocalCertStore /n "LocalSign" /t http://timestamp.verisign.com/scripts/timestamp.dll hidkmdf.sys

devcon.exe

ドライバをインストールします

devcon.exe install vmulti.inf djpnewton\vmulti 

うまくインストール出来たかどうかやエラーなどは以下のログファイルに出力されています。

c:\Windows\inf\setupapi.dev.log