ドライバー ファイルのマッピング

ドライバー ファイルの置き換えは困難な場合があります。 多くの場合、Microsoft Windows の 安全なビルドを起動し、ドライバー バイナリを置き換えてから、もう一度起動する必要があります。

マッピング ファイルを使用する別の方法が存在します。 このマッピング方法を使用すると、任意のカーネル モード ドライバー (ディスプレイ ドライバーを含む)、Windows サブシステム ドライバー、またはその他のカーネル モード モジュールを置き換えることができます。 わかりやすくするために、これらのファイルは、任意のカーネル モード モジュールでこのメソッドを使用できますが、このトピックでは ドライバー と呼ばれます。

WinDbg または KD がカーネル デバッガーとしてアタッチされている場合は常に、このメソッドを使用できます。 ブート ドライバーでこの方法を使用することもできますが、より困難です。 ブート ドライバーでこの方法を使用する方法の詳細については、「ブート ドライバーの置き換え」を参照してください。

ドライバー置換マップを使用してドライバー ファイルを置き換えるには、次の操作を行います。

  1. ドライバーの置換マップ ファイルを 作成します。 このファイルは、ターゲット コンピューター上のドライバーと、ホスト コンピューター上の代替ドライバーの一覧を示すテキスト ファイルです。 ドライバーはいくつでも置き換えることができます。 たとえば、次の情報を含むホスト コンピューターの d:\Map_Files ディレクトリにMymap.iniという名前のファイルを作成できます。

    map
    \Systemroot\system32\drivers\videoprt.sys
    \\myserver\myshare\new_drivers\videoprt.sys
    

    このファイルの構文の詳細については、「ドライバーの置換マップ ファイル形式」を参照してください。

  2. ターゲット コンピューターへのカーネル デバッグ接続を設定し、ホスト コンピューターでカーネル デバッガー (KD または WinDbg) を起動します。 (ターゲット コンピューターに実際に侵入する必要はありません)。

  3. 次のいずれかの操作を行って、ドライバーの置換マップ ファイルを読み込みます。

    • カーネル デバッガーを開始する前に、 _NT_KD_FILES 環境変数 を設定します。

      D:\Debugging Tools for Windows> set _NT_KD_FILES=d:\Map_Files\mymap.ini
      D:\Debugging Tools for Windows> kd
      
    • カーネル デバッガーを起動した 後 .kdfiles (ドライバー置き換えマップの設定) コマンドを使用します。

      D:\Debugging Tools for Windows> kd
      kd> .kdfiles d:\Map_Files\mymap.ini
      KD file associations loaded from 'd:\Map_Files\mymap.ini'
      

      .kdfiles コマンドを使用して、現在のドライバー置換マップ ファイルを表示したり、ドライバーの置換マップを削除したりすることもできます。 このコマンドを使用しない場合、デバッガーを終了するまでマップは保持されます。

この手順を完了すると、ドライバーの交換マップが有効になります。

ターゲット コンピューターがドライバーの読み込みを行うたびに、カーネル デバッガーに対してクエリを実行して、このドライバーがマップされているかどうかを確認します。 ドライバーがマップされている場合、置換ファイルはカーネル接続経由で送信され、古いドライバー ファイルにコピーされます。 その後、新しいドライバーが読み込まれます。

ドライバー置換マップのファイル形式

各ドライバー ファイルの置換は、ドライバー置換マップ ファイル内の 3 行で示されます。

  • 最初の行は、"map" という単語で構成されます。

  • 2 行目は、ターゲット コンピューター上の古いドライバーのパスとファイル名を指定します。

  • 3 行目は、新しいドライバーの完全なパスを指定します。 このドライバーは、ホスト コンピューターまたは他のサーバーに配置できます。

この情報パターンは、何度でも繰り返すことができます。

パスとファイル名では大文字と小文字が区別されず、実際のドライバー ファイル名は異なる場合があります。 3 行目に指定したファイルは、ターゲット コンピューターがそのドライバーを読み込もうとしているときに、2 行目に指定したファイルにコピーされます。

Kdfiles は、Service Control Manager (SCM) データベースに格納されているファイル名の照合を試みます。 SCM データベース内の名前は、MmLoadSystemImage に渡された名前と同じです。

Windows 10 以降のバージョンのデバッグ ツールでは、ドライバーマッピングはドライバー名と動的に一致し、適切なパスを決定するために機能します。 完全なパスを指定する必要はありません。ファイル拡張子は省略可能です。 これらのエントリのいずれかを使用して、NT ファイル システム ドライバーと一致させることができます。

  • ntfs
  • NTFS
  • ntfs.sys
  • windows\system32\drivers\ntfs.sys

これらのエントリのいずれかを使用して、NT カーネル ドライバと一致させることができます。

  • ntoskrnl
  • NTOSKRNL
  • ntoskrnl.sys
  • windows\system32\drivers\ntoskrnl.sys

マップ ファイルには空白行を含め、番号記号 (#) で始まるコメント行を含めることができます。 ただし、ファイルに "map" が表示された後、次の 2 行は古いドライバーと新しいドライバーである必要があります。 空白行とコメント行は、3 行のマップ ブロックを分割できません。

次の例は、ドライバーの置換マップ ファイルを示しています。

# Use the # for comments like this one
map
\Systemroot\system32\drivers\videoprt.sys
e:\MyNewDriver\binaries\videoprt.sys
map
\Systemroot\system32\mydriver.sys
\\myserver\myshare\new_drivers\mydriver0031.sys

# This is replacing a beep driver
map
\??\c:\windows\system32\beep.sys
\\myserver\myshare\new_drivers\new_beep.sys

ドライバー置換マップ ファイルはテキスト ファイルである必要がありますが、任意のファイル名とファイル名拡張子 (.ini、.txt、.map など) を使用できます。

追加情報

ドライバーの置換が発生すると、カーネル デバッガーにメッセージが表示されます。

Ctrl + D (KD の場合) または Ctrl + Alt + D (WinDbg の場合) を使用すると、置換要求に関する詳細情報が表示されます。 この情報は、一覧表示した名前が SCM データベースの名前と一致するかどうかわからない場合に役立ちます。

bcdedit bootdebug オプションを有効にして、カーネル、hal、またはブート ドライバーの交換に役立つ初期ブート情報を表示できます。

bcdedit -bootdebug on

詳細については、「 BCDEditオプション リファレンス 」を参照してください。

カーネル デバッガーが終了すると、ドライバーの置き換えは行われません。 ただし、既に置き換えられているドライバーは、ドライバー ファイルが実際に上書きされるため、古いバイナリに戻りません。

このドライバーの置換機能は、Windows ファイル保護 (WFP) を自動的にバイパスします。

ターゲット コンピューターを再起動する必要はありません。 ドライバーの交換は、再起動されたかどうかに関係なく、ターゲット コンピューターがドライバーを読み込むたびに発生します。 もちろん、ほとんどのドライバーはブート プロセス中に読み込まれるので、実際にはマップ ファイルが読み込まれた後にターゲット コンピューターを再起動する必要があります。

_NT_KD_FILES変数が定義されている場合、カーネル デバッガーの起動時に、指定したドライバー置換マップ ファイルが読み取られます。 .kdfiles コマンドを発行すると、指定したファイルが直ちに読み取られます。 この時点で、デバッガーは、ファイルに基本的なマップ/行/行形式があることを確認します。 ただし、実際のパスとファイル名は、置換が行われるまで検証されません。

マップ ファイルが読み取られた後、デバッガーはその内容を格納します。 この後にこのファイルを変更しても、変更は無効になります ( .kdfiles コマンドを再発行しない限り)。