1. 为什么需要通过注册表来实现开机时文件替换?

有一些文件,被系统的一些服务所独占,我们在热备份与热恢复系统的时候,没有办法直接替换掉。

也有一些程序以独占的方式(exclusive access)打开某个文件,在这个程序退出之前,按常规的方法,我们是不能替换掉这个文件。

这些情况下,我们可以通过注册表 (Windows Registry) 记录下需要替换的文件等相关信息,在下一次开机、应用程序启动之前进行替换掉。

  1. 具体的实现方法

记得在进行以下步骤之前,先备份一下你的注册表

下面就以用放在目录 C:\Temp 下的 Win32k.sys 文件,替换系统目录 %SystemRoot%\System32 下的 Win32k.sys 文件为例,详细介绍一下利用注册表来实现开机替换文件的操作。你可以通过这种方法来替换掉你 Windows 系统里的任何文件,当然,你的 Windows 应该是要能启动的。

  1. 启动注册表编辑器 (regedit.exe);

  2. 按下面的路径,在注册表里找到相关的key:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager

  3. 在 Session Manager 这个注册表目录下,通过以下方式新建一个值 (value):

    值名称(Value name):
        PendingFileRenameOperations

    类型(Data type):
        REG_MULTI_SZ(多字符串值)

    值数据(Value data):
        ??\c:\temp\win32k.sys
        !??\c:\winnt\system32\win32k.sys

    这里要特别注意,一定要分两行来填写值(填完后在注册表里会显示成一行),并且那个”!”必须放在第二行的开头。

    这种表达方式是用前面路径的文件来代替后面路径的文件。

  4. 退出注册表编辑器;

  5. 重新启动系统。

重启 Windows 系统后,如果第二个文件存在,则会把第一个文件的内容替换到第二个文件里,第二个文件的文件名保持不变,并且删除第一个文件;如果系统里原来就没有对应的第二个文件,则系统会自动新建一个和第二个文件名一模一样的文件,再把第一个文件里的内容拷贝进去。替换动作完成后,系统会自动清除注册表里添加的 PendingFileRenameOperations 值。

如果是要批量替换多个文件,则只需要按上面的值数据形式,在注册表变量值数据里添加要替换的多个文件信息即可,例如:

??\c:\test2\test2.txt
!??\c:\test1\test1.txt
??\c:\test2\test22.txt
!??\c:\test1\test11.txt

如果你的机器用上面的办法替换文件出错,则重点检查上面第三步的表达式是否有误。

除了往注册表里塞东西这个方法以外,你还可以使用Windows自带的mv.exe工具,或是下载与使用Inuse.exe工具,这些工具的详细使用方法,可以看帮助说明。