このブログは、株式会社フィックスターズのエンジニアが、あらゆるテーマについて自由に書いているブログです。
https://msdn.microsoft.com/en-us/library/windows/hardware/dn653559(v=vs.85).aspx
で公開されている文書に記載されているとおり、Windows Vista以降のWindowsでは、64bit版 (x64) のカーネルモードドライバはデジタル署名がついていないとロードされないようになっています。実際に製品としてドライバを出荷するためには正式なデジタル署名が必要になりますが、開発途中でビルドしたドライバに毎回正規のデジタル署名を付加するのは手間が大きいため、開発段階で簡易的にテストを行うためのテスト署名の仕組みが提供されています。
https://docs.microsoft.com/en-us/windows-hardware/drivers/install/signing-drivers-during-development-and-test
本稿では、テスト署名の具体的な使い方について確認していきます。
以前の投稿で作成した簡単なドライバを用いて動作を確認しました。ドライバのビルド自体はx64用のビルド環境を使用することで、32bit版 (x86) と同様に行うことができます。また、ドライバのインストールも同じ手順で可能ですが、ドライバを起動しようとすると、以下のようなエラーメッセージが表示されて、開始することができません。
OS起動時のAdvanced Boot Optionsで「Disable Driver Signature Enforcement」を選択することで、一時的にデジタル署名のチェックを無効にすることができますが、起動のたびにF8キーを押して選択画面を表示する必要があり、PCの再起動を自動的に繰り返すテストなどを考えれば、実際の開発に適用するのは現実的ではないと考えられます。
以下で、テスト署名を用いて64bit版Windowsのドライバを動作させる手順について説明します。テスト署名を使用するためには、ビルドしたドライバにテスト署名を付加する作業のほか、実際にドライバを動作させる側でテスト署名機能を有効にしてやる必要があります。
ドライバにテスト署名をつけるには、WDK (Windows Driver Kit) に付属の以下のツールを使用します。
上記ツールを使用し、以下の手順でビルドしたドライバにテスト署名を行ってみました。
Z:\Projects\WinDrvSample>makecert -r -pe -ss PrivateCertStore -n "CN=fixstars.com(Test)" testcert.cer
Succeeded
Z:\Projects\WinDrvSample>signtool sign /ac testcert.cer /s PrivateCertStore sample1.sys
Done Adding Additional Store
Successfully signed: sample1.sys
署名を付加したドライバファイルのプロパティを表示すると、以下のようにテスト署名がついていることがわかります。
テスト用のデジタル署名を付加しただけでは、ドライバのロードは行われません。
テスト署名つきのドライバをロードするためには、実際にドライバを動作させる環境において、起動オプションでテスト署名機能を有効にしてやる必要があります。
C:\Windows\system32
bcdedit /set testsigning on
この状態でドライバを起動しようとしたところ、テスト署名がないドライバはロードされませんでしたが、テスト署名つきのドライバは正常にロードされました。
テスト署名なし
C:\Setup\sample1>copy original\sample1.sys \windows\system32\drivers
Overwrite \windows\system32\drivers\sample1.sys? (Yes/No/All): y
1 file(s) copied.
C:\Setup\sample1>sc start sample1
[SC] StartService FAILED 577:
Windows cannot verify the digital signature for this file. A recent hardware or
software change might have installed a file that is signed incorrectly or damage
d, or that might be malicious software from an unknown source.
テスト署名つき
C:\Setup\sample1>copy signed\sample1.sys \windows\system32\drivers
Overwrite \windows\system32\drivers\sample1.sys? (Yes/No/All): y
1 file(s) copied.
C:\Setup\sample1>sc start sample1
SERVICE_NAME: sample1
TYPE : 1 KERNEL_DRIVER
STATE : 4 RUNNING
(STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
PID : 0
FLAGS :
テスト署名であってもドライバの動作自体は特に変わらず、各種評価を実施可能であることを確認することができました。
コンピュータビジョンセミナーvol.2 開催のお知らせ - ニュース一覧 - 株式会社フィックスターズ in Realizing Self-Driving Cars with General-Purpose Processors 日本語版
[…] バージョンアップに伴い、オンラインセミナーを開催します。 本セミナーでは、...
【Docker】NVIDIA SDK Managerでエラー無く環境構築する【Jetson】 | マサキノート in NVIDIA SDK Manager on Dockerで快適なJetsonライフ
[…] 参考:https://proc-cpuinfo.fixstars.com/2019/06/nvidia-sdk-manager-on-docker/ […]...
Windowsカーネルドライバを自作してWinDbgで解析してみる① - かえるのほんだな in Windowsデバイスドライバの基本動作を確認する (1)
[…] 参考:Windowsデバイスドライバの基本動作を確認する (1) - Fixstars Tech Blog /proc/cpuinfo ...
2021年版G検定チートシート | エビワークス in ニューラルネットの共通フォーマット対決! NNEF vs ONNX
[…] ONNX(オニキス):Open Neural Network Exchange formatフレームワーク間のモデル変換ツー...
YOSHIFUJI Naoki in CUDAデバイスメモリもスマートポインタで管理したい
ありがとうございます。別に型にこだわる必要がないので、ユニバーサル参照を受けるよ...