仮想マシン上でWindowsデバイスドライバをデバッグする

はじめに

前回までは、簡単なデバイスドライバを作成し、DbgPrint関数によるログ出力だけでドライバの基本動作を確認するというものでしたが、今回は本格的なカーネルデバッグを行うための手順について紹介します。Windowsのカーネルデバッグは、
https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/getting-started-with-windows-debugging
に記載されているように、実際にドライバを動作させるターゲットPCと、デバッガを起動してデバッグ作業を行うホストPCとを接続し、PC間の通信によって行います。実ハードウェアを制御するデバイスドライバの開発においては、ターゲットPCはホストPCとは物理的に独立しており、外部インタフェース(例えば、シリアルケーブルやIEEE 1394、USBなど)を通して接続した構成でデバッグを行いますが、今回は仮想マシン環境でゲストOSをターゲットとしてホストOSと接続しながらデバッグを行います。

最新のWDKは、Visual Studioと連携した統合開発環境になっており、デバッグ作業もVisual Studio上で行うことができますが、ここでは前回までと同様Windows 7以前のWDKを使用していることから、Windows Debugger (以下、WinDbg) を用いてデバッグを行います。

環境設定

仮想マシン環境でカーネルデバッグを行うためには、仮想マシン上のゲストOSがホストOSと通信するために、以下のように名前つきパイプを用いた仮想的なシリアルポートを用意します。

シリアルポート設定

この設定により、ゲストOS側では名前つきパイプがシリアルポートとして見えるため、物理的なシリアルポートを用いた通常のカーネルデバッグと同様、以下の手順でカーネルデバッグを有効にします。ここで、具体的なシリアルポートの番号は環境に依存します。

実行

WinDbgでカーネルデバッグを有効にするには「File」メニューの「Kernel Debug…」を選択し、以下のダイアログ上でカーネルデバッグの設定を行った上で、「OK」ボタンをクリックして実行します。「Port」には、仮想マシンのシリアルポート設定におけるパイプの名前を指定します。

WinDbg設定

WinDbgを実行してターゲットPCに接続されると、WinDbgのコマンドウィンドウ上にその旨を示すメッセージが出力されます。

WinDbg接続画面

ドライバのダウンロード

ホストPC側でドライバを修正して再ビルドすると、そのドライバファイルをターゲットPCにコピーしてドライバを再起動する必要がありますが、カーネルデバッグ環境を使えば、ホストPCとターゲットPC間の接続を通してドライバのファイル(.sysファイル)を自動的にダウンロードすることができます。
このためには、まず、対象のドライバファイル名 (ターゲットPC上のパス) と、ホストPC側のパスを以下のように関連づけて記述した.iniファイルを作成する必要があります。

その後、WinDbgをターゲットPCに接続した後、作成した.iniファイルを読み込むことによって、ダウンロードが可能になります。

ターゲットPC上でドライバの起動が行われる際には、自動的にドライバファイルがホストPCからダウンロードされて実行されます。

WinDbgのコマンド

WinDbgを用いたデバッグは、GUIのメニューを用いて行うこともできますが、今回はコマンドウィンドウ上のコマンド入力により行う方法をいくつか紹介します。

  1. BreakPointの設定
  2. 設定済みBreakPointの表示
  3. スタックトレースの表示
  4. 構造体変数のメンバー表示

おわりに

今回は、Windowsドライバのカーネルデバッグの基本手順を、前回の投稿で作成した簡単なドライバを用いて紹介しました。通常は、ドライバを動かすターゲットPCとデバッガを実行するホストPCとを物理的に接続した構成でデバッグを行いますが、名前つきパイプによりホストOSとゲストOSを接続することで、ホストPCと同一ハードウェア上の仮想マシンでデバッグを行えることを確認しました。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です