Windows IoT Coreで自作ドライバーを導入するには

タクトスイッチをマウスクリック、タッチパネル信号を受信したらタッチ操作。電子パーツからの信号よりGUIを操作したいとは思うものの、Windows IoT CoreのGUIアプリはUWPベースのため、SendInputなどの入力操作をシミュレートするAPIはサポートされていません。マイクロソフトは何らかの対応を検討しているようですが、2017年4月の時点では代替APIは実装されていません。

現時点でマイクロソフトが提案しているのはソフトウェアドライバーを組み込むという方法です。Windows IoT CoreはGUIアプリではUWPベースのものしか作れませんが、CUIであればWin32 APIを使ったプログラムを動かすことができます。ちなみに、マイクロソフトが公開しているソースを読む限り、Arduino Wired ProjectのGPIO処理がほかの言語に比べて異様に早いのは、ウィンドウズランタイムを介さずに、I/O制御のWin32 APIを直接実行しているためのようです。

マイクロソフトはGitHubでソフトウェアドライバーのサンプルを公開しています。このプログラムにはキーボード入力、マウス操作、マルチタッチのHIDデバイスのシミュレートが一通り行え、趣味の電子工作であれば十分実用的なので、このドライバーを使った制御方法をご紹介します。

まずはドライバーのビルドから始めましょう。基本的に、Windows Driver Kitをインストールしてから、プロジェクトを読み込んでARM向けにコンパイルすれば、Visual Studio以外の開発ツールをインストールしているなどの特殊な状況でない限り、ドライバーファイルはすぐにできます。ただし、Windows 10向けのドライバーが開発できるのはVisual Studio 2015のみで、今のところVS2017はサポートしていません。これだけのために開発環境を導入するのは面倒だという方は、管理人が独自にビルドしたドライバーを用意していますので、こちらをダウンロードしてください。

次にドライバーのインストールです。デスクトップOSではセキュリティーを理由に、電子署名のないドライバーはテストモードでないと動作しないなど、導入の壁は高い一方で、趣味の電子機器制御を前提にしたWindows IoT Coreは導入の制約がかなり緩いです。

まずはデスクトップOSよりパワーシェル(PowerShell)を管理者権限で起動したら、デバイスへのアクセスの許可を与えるコマンドを実行します。一度有効にしたら次回以降はこのコマンドの入力は不要です。「192.168.0.5」はWindows IoT Coreの保有するローカルアドレスを指していますので、Windows IoT Coreの環境に応じて適時置き換えてください。
net start WinRM
Set-Item WSMan:\localhost\Client\TrustedHosts -Value 192.168.0.5


続いて、デバイスに接続します。コマンドを実行するとパスワードが要求されるので、WinIoTのログインパスワードを入力してください(初期設定では、アカウント名が「administrator」でパスワードが「p@ssw0rd」)。
Enter-PSSession -ComputerName 192.168.0.5 -Credential administrator


接続に成功すると約30秒くらいで次のコマンドの入力ができるようになります。

続いてIoTデバイスにドライバーファイルをコピーします。エクスプローラーのアドレスに「\\192.168.0.5\C$」と入力すると、IoTのディレクトリーを開くことができます。ここから「C:\Windows\System32\Drivers」に移動し、「HidInjector.inf」と「HidInjector.sys」をコピーします(Raspberry Pi2の場合)。

パワーシェルに戻り、以下のコマンドを入力してドライバーのインストールを実行します。
cd C:\Windows\System32\Drivers
devcon install HidInjector.inf root\\HidInjector

メッセージの最後に「Drivers installed successfully.」と表示されればインストールは完了です。しばらくすると自動で再起動されますが、始まらない場合は「shutdown /r /t 0」と入力して手動で再起動してください。

デバイスの確認はパワーシェルより以下のコマンドで行えます。なお、起動直後は「Enter-PSSession」の実行が再度必要です。
devcon hwids root\\HidInjector
(※結果例)
ROOT\DEVCON\0000
    Hardware IDs:
        root\\HidInjector
1 matching device(s) found.


ちなみにこちらがアンインストールするコマンドになります。
devcon -remove root\\HidInjector


もしドライバーの問題でブートができなくなってしまい、OSの再インストールをせざるを得ない際は、以下の方法でSDカードをフォーマットします(マイクロソフトのFAQサイトからの引用。通常のフォーマットではドライバーのデータが残ることがあり、問題が解決しないことがあります)。
diskpart
list disk (このリストで表示されたSDカードのディスク番号を書き留める)
select disk <number>(<number>をSDカードのディスク番号に置き換える)
clean
create partition primary
format fs=ntfs quick
, | 2017年5月3日