2009年11月17日火曜日

Vista 64bit でトランスバイブレータ(Trance Vibrator)を制御

Vista 64bit でトランスバイブレータ(Trance Vibrator)を制御してみる。

名前から、なんか「いけない物」を想像してしまいがちだが、そうじゃない。断じて!
PS2 の Rez という音ゲー(エロゲじゃないぞ!)に付いてきた装置なのだ。
この装置は、プレイ中の音と同期して振動する。
振動は、強弱がついていて、プレイ中の没入感を高めてくれる。
なんともいえない心地よさなのだ。



これを Vista 64bit 上で動作させてみるわけだが、当然、専用のデバイスドライバは提供されていない。
しかも、用意しなければならないデバイスドライバは、64bit 版のドライバで、かつ、署名されている必要がある。いろいろ調べまわって、ようやく(他人のフンドシで)動かせるようになった。
以下の内容は、基本的には、偉大なる先人の知恵(サイトの情報)をそのまま実施している。

デバイスドライバには、uusbd という汎用USBデバイスドライバを感動しつつ利用させていただく。
前述の通り、Vista 64bit で使用する場合には、64bit 版でなければならないので、
(試しに入れようとしたら、ドライバとして認識されなかった)
VH7PC用 64bit版ドライバのページから 64bit 版としてコンパイルし直したもの(uusbd64.zip) を感謝しつつ拝借(ありがたや~)。
しかし、これもそのままでは、使用できない。
(ドライバとして認識はするが、ドライバに署名がされていないので、動作しない)

インストールするには、uusbd64.sys に署名を施す必要がある。
HaioH:変遷備忘録
Windows 7 RC x64 でQRS-UT100Bを使う中の【uusbd64.sysのドライバ署名】の手順を尊敬しつつそのまま実施。

ドライバインストール後、Diary - Quadrilateral space の [prog]トランスバイブレーターをPCからブルブルさせるページの偉業を称えつつ、実際にトランスバイブレータを動作させてみる。


では、実際に実施した内容を以下に記述する。


【使用したもの】
  • トランスバイブレータ(Trance Vibrator)
  • uusbdv20beta.zip
    ドライバを利用するためのライブラリやインクルードファイルが含まれる。
  • uusbd64.zip
    ドライバ(uusbd.sys)の 64bit 版。
  • Windows SDK(6.0.6001.18000.367-KRMSDK_EN.iso)
    Windows Server 2008 および .NET Framework 3.5 用 Microsoft Windows SDK (英語)
    ドライバへ署名をするために利用。
  • MinGW
    トランスバイブレータを制御するプログラムをコンパイルするために利用。
  • Eclipse
    統合開発環境。MinGWだけでもコンパイルできるが、より便利になる。
  • CDT
    Eclipse の C/C++ 開発用プラグイン

では、デバイスドライバのインストールを行う。


【Windows SDK をインストール】
今回ダウンロードしたものは、ISOイメージなので、DVDに焼くか、仮想ドライブでインストールする。今回は、Virtual Clone Drive という仮想ドライブツールを利用した。


【uusbdv20beta.zip を解凍】
適当なディレクトリに解凍する。
今回は、F:\Archive\uusbdv20beta に解凍した。


【uusbd64.zip を解凍】
適当なディレクトリに解凍する。
今回は、F:\Archive\uusbd64 に解凍した。


【uusbd64.inf の修正】
F:\Archive\uusbd64\uusbd64.inf をエディタで開く。

[UUSBD64_SYS.NTamd64] セクション中の
%USB.DeviceDesc% = UUSBD64.Dev,USB\VID_0B28&PID_1001
の VID と PID をトランスバイブレータの VID と PID に書き換える。

VID と PID を調べる方法は、トランスバイブレータを接続する、
ドライバインストール画面が表示されるが、キャンセルする、
コントロールパネルからハードウェアとサウンド -> デバイスマネージャ を選択する。
デバイスの中の ASCII Vib のプロパティを開き、
詳細タブでプロパティのハードウェアIDを選択すると、
値の VID と PID を inf ファイルに記述する。
%USB.DeviceDesc% = UUSBD64.Dev,USB\VID_0B49&PID_064F と変更した。


【uusbd64.sys に署名】
Windows SDK を利用して、ドライバへ署名する。署名は、オレオレ証明書で行う。
スタートメニュー > すべてのプログラム > Microsoft Windows SDK v6.1 > CMD Shell を右クリックして、管理者として実行を選択。

起動したシェル中で、uusbd64.zip を解凍したディレクトリ(F:\Archive\uusbd64)に移動

プライベート・キー(uusbd64.pvk)ファイルと認証(uusbd64.cer)ファイルを作成。途中でパスワードを2箇所設定する。同じパスワードを設定しておくと楽。
makecert -sv uusbd64.pvk -a sha1 -eku 1.3.6.1.5.5.7.3.3 -r -ss Root -len 1024 -sr localMachine -n CN="uusbd64.sys" uusbd64.cer

ソフトウェア発行元証明書(Software Publisher's Certificate)ファイルを作成。
このツールは、テスト用のオレオレ証明書を作成するために使用する。
cert2spc uusbd64.cer uusbd64.spc

Personal Information Exchange(uusbd64.pfx) ファイルを作成。password1 と password2 には上記で設定したものを指定。
pvk2pfx -pvk uusbd64.pvk -pi password1 -spc uusbd64.spc -pfx uusbd64.pfx -po password2

ドライバ(uusbd64.sys)へ署名
signtool sign /f uusbd64.pfx /p password2 /d "uusbd64.sys" /v uusbd64.sys

CMD Shell を閉じる。

Personal Information Exchange(uusbd64.pfx) ファイルを PC にインポート
uusbd64.pfx ファイルを右クリックして、PFX のインストールを選択。
上記で設定したパスワードを入力。
証明書ストア設定画面で、「物理ストアを表示する」チェックボックスをチェックして、「信頼されたルート証明機関\レジストリ」を選択


【Windows のモードを変更】
オレオレ証明書を使用可能なように Windows のモードを設定
コマンドプロンプトを管理者権限で実行して、以下のコマンドを実行する。
bcdedit /set TESTSIGNING ON

Windows を再起動する。再起動後、デスクトップ画面の四隅に「テストモード」と表示されている。


【uusbd64.sys をインストール】
デバイスマネージャで、ASCII Vib デバイスのドライバを更新するを選択し、uusbd64.sys のディレクトリを指定して、インストールを行う。


【動作確認】
Eclipse で動作確認用の C のプログラムをコンパイルする。
MinGW および Eclipse + CDT は設定済みとする。うちでは、Eclipse Classic 64bit に CDT をインストールして使用しているのだが、どうも MinGW をきちんと認識していないようなので、今後ちゃんと調査することにして、今回は簡単なポイントだけ記述する。

Eclipse 起動前に Windows の環境変数の PATH にMinGW の bin ディレクトリを追加しておく。
うちの環境では、環境変数の設定で納得いかない動作をするのだが・・・。

Eclipse を起動する。

「Window」 > 「Preferences」を選択。
「C/C++」 > 「Environment」を開く。
「Select」ボタンを押す。
リストの”Path[・・・”のチェックボックスをチェックする。
Path の値に、MinGW の bin ディレクトリがあることを確認。
ない場合は、Windows を再起動すると出てくる。(なんでだべ?)
OKを押す。

「File」 > 「New」 > 「C Project」を選択。
うちの環境だと、Toolchains に 「MinGW GCC」が表示されないので、
左下の「Show project types and toolchains only if they are supported on the platform」チェックボックスのチェックを外して、表示させて、選択する。
「Project type」を「Hello World ANSI C Project」を選択。
「Project name」を適当に設定して完了。

作成したプロジェクトを右クリックして「Properties」を選択。
「C/C++ Build」 > 「Settings」 を選択。
「Tool Settings」タブを選択。
「GCC C Compiler」 > 「Directories」を選択。
「Include paths (-I)」に"F:\Archive\uusbdv20beta\INC"を追加。

「MinGW C Linker」 > 「Libraries」を選択。
「Libraries (-l)」に"uusbd" を追加。
「Library search path (-L)」に"F:\Archive\uusbdv20beta\LIB"を追加

余談だが、うちの環境では、「C/C++ Build」の設定画面全般で”The configuration support is not installed on the system”とかいう警告が表示されるのだが・・・はて?どうしたもんだか・・・

これで、コンパイル準備OK。

では、プログラムを作成する。
作成したプロジェクトの src に作成された プロジェクト名.c のソースファイルを開く
中身を以下の内容にそっくり入れ替える。

#include "uusbd.h"

int main(void) {
HUSB husb;

// まずデバイスを開く
husb = Uusbd_Open_mask(UU_MASK_VENDOR | UU_MASK_PRODUCT, 0, 0, 0x0B49, 0x064F, 0x0100);

//VendorRequestで0xFF(最強)を送信し、5秒間振動を継続させる
Uusbd_VendorRequest(husb, 0, UU_RECIPIENT_INTERFACE, 1, 0xFF, 0, 0, 0);
Sleep(5000);

//0(無動作)を送信すると止まる
Uusbd_VendorRequest(husb, 0, UU_RECIPIENT_INTERFACE, 1, 0, 0, 0, 0);

// デバイスを閉じる
Uusbd_Close(husb);
return 0;
}


ビルドする。
ビルドされた exe ファイルを実行する。そのときに、uusbd.dll を参照できるように実行設定の環境変数に”path”を追加して、値は”F:\Archive\uusbdv20beta\LIB”とした。
実行すると、トランスバイブレータが5秒間振動するはず。

うちの環境では、Eclipse上から実行できなかったので、コマンドプロンプトから実行した。納得いかん。
でも、別の日に Eclipse 上から実行したらできた。なんでじゃ!