Posted on 26-08-2009
Filed Under (技术) by waterlin

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

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

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

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

2. 具体的实现方法

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

下面就以用放在目录 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工具,这些工具的详细使用方法,可以看帮助说明。

© 2009, 浏忙大爆炸. All rights reserved.
除非注明,浏忙大爆炸文章均为原创,转载请以链接形式标明本文地址。

Comments

[…] 5. 用MoveFileEx()并且带上MOVEFILE_DELAY_UNTIL_REBOOT的参数,也可以实现通过Windows注册表来实现开机时文件替换。 […]


[…] 之前文章中提到的通过 Windows 注册表来实现开机时文件替换的方法,好像只对位于同一个文件分区的两个文件有效,而对于两个处在不同文件分区的文件,则没有办法。 […]


Post a Comment
Name:
Email:
Website:
Comments: