映射驱动程序文件

替换驱动程序文件可能很困难。 通常,必须引导到 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 命令来显示当前驱动程序替换映射文件或删除驱动程序替换映射。 如果不使用此命令,则映射将一直保留,直到退出调试器为止。

完成此过程后,驱动程序替换映射将生效。

每当目标计算机即将加载驱动程序时,它总会查询内核调试器以确定是否已映射此驱动程序。 如果已映射此驱动程序,则会通过内核连接发送替换文件,并将此文件复制到旧驱动程序文件。 然后加载新驱动程序。

驱动程序替换映射文件格式

驱动程序替换映射文件中的三个行表示每个驱动程序文件替换。

  • 第一行包括单词“map”。

  • 第二行指定目标计算机上的旧驱动程序的路径和文件名。

  • 第三行指定新驱动程序的完整路径。 此驱动程序可以位于主机或某个其他服务器上。

你可以任意多次重复此信息模式。

路径和文件名不区分大小写,并且实际驱动程序文件名可能不同。 目标计算机即将加载该驱动程序时,第三行上指定的文件将复制到第二行中指定的文件。

Kdfiles 将尝试匹配服务控制管理器 (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”后,接下来的两行必须是旧驱动程序和新驱动程序。 空行和注释行无法分解三行映射图块。

以下示例显示了驱动程序替换映射文件。

# 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 命令)。