标签:
延迟删除/重命名的基本实现原理是这样的: 1. 如果有任何应用程序需要使用延迟删除/重命名功能,那么该应用程序会使用一个 特殊的参数MOVEFILE_DELAY_UNTIL_REBOOT 来命令Win32 API 函数 MoveFileEx()在系统里面注册一个延迟删除/重命名操作。注册的记录放在注册表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations 和PendingFileRenameOperations2 键值下面。该键值是一个REG_MULTI_SZ 类型的键值,注册表编辑器无法直接 编辑这种类型的键值。 警告!不要使用注册表编辑器直接编辑这个键值,这样会造成系统无法判定是 该执行延迟删除操作还是延迟重命名操作。 2. 操作系统在下次启动的时候,由smss.exe 对上述的注册表键值进行读取分析并 完成相应的操作。需要注意的是,在执行延迟操作的时候,Win32 子系统并没有 启动,也就是说延迟操作是在没有Win32 子系统干扰的情形下完成的。这样设计 的一个最大好处就是可以替换任何受Win32 子系统保护的文件。 3. 如果上述键值指定了一个文件需要被删除,那么smss.exe 将执行删除操作,如 果指定的是重命名操作,那么smss.exe 执行的是重命名操作。 注意!如果执行重命名操作的时候,和新文件名同名的文件存在,那么原有的文 件将被覆盖掉。例如:假设有一个文件C:\1.DLL 存在,而延迟重命名里面的记 录是把C:\2.DLL 改名为C:\1.DLL,那么原来的C:\1.DLL 将被C:\2.DLL 覆盖掉。 4. 当所有的记录完成以后,系统自动把上述的注册表键值删除掉,不会存留任何痕 迹的。现在说说软件开发人员是如何使用这个功能的。以安装Windows Service Pack 为例。在Service Pack 安装完成以后,安装程序肯定会提示用户重新启动。其实,重新启动的过程就是一个执行延迟删除/重命名的过程。由于在安装Service Pack 的时候,很多文件不能够被新版本的文件替换,如果碰到这个情况,安装程序将会把新版本文件改名并放到和旧版本文件同样的目录下面,然后在系统里面注册一个延迟重命名操作。系统在下次启动的时候,将执行这个延迟重命名操作以便让旧版本文件被新版本文件替换掉从而完成Service Pack 的安装。 对于延迟删除来说,和延迟重命名类似。如果发现有一个文件不能够被立即删除,则 软件会注册一个延迟删除,让操作系统在下次启动的时候自动把文件删除掉。
对于延迟删除/重命名功能来说,软件开发人员把这个功能用于以下方面: 􀁺 新版本文件的替换 􀁺 删除不能立即删除的文件 对于一般用户而言,什么时候需要这个功能呢? 􀁺 无法重命名一个总是被某个进程占用的文件 􀁺 无法删除一个文件。特别是要删除一个计算机病毒体文件的时候。 以上两种情况都可以使用延迟操作,让操作系统按照你的设想完成你需要的操作。 回过头说说安装程序是如何发现由未完成的重启的。由于延迟操作是记录在注册表特 定键值下的,因此只需要检测特定的键值就可以发现有未完成的重启操作。
MoveFileEx(szDstFile, NULL, MOVEFILE_DELAY_UNTIL_REBOOT); MoveFileEx(szSrcFile, szDstFile, MOVEFILE_DELAY_UNTIL_REBOOT);
MOVEFILE_DELAY_UNTIL_REBOOT:
The system does not move the file until the operating system is restarted. The system moves the file immediately after AUTOCHK is executed, but before creating any paging files. Consequently, this parameter enables the function to delete paging files from previous startups.
This value can be used only if the process is in the context of a user who belongs to the administrators group or the LocalSystem account.
This value cannot be used with MOVEFILE_COPY_ALLOWED.
Windows Server 2003 and Windows XP: For information about special situations where this functionality can fail, and a suggested workaround solution, see "Files are not exchanged when Windows Server 2003 restarts if you use the MoveFileEx function to schedule a replacement for some files" in the Help and Support Knowledge Base at http://support.microsoft.com/kb/948601.
Windows 2000: If you specify the MOVEFILE_DELAY_UNTIL_REBOOT flag for dwFlags, you cannot also prepend the file name that is specified by lpExistingFileName with "\\?".
标签:
原文地址:http://www.cnblogs.com/wanxianga/p/4495201.html