(转)Windows重启延迟删除,重命名技术原理

所谓重启延迟删除技术,就是在操作系统启动前删除或者替换文件! 说起重启延迟删除,大家可能都很陌生,但是实际上,该功能已经被各种软件所采用:如安装Windows 补丁程序(如:HotFix、Service Pack)、安装Office 补丁程序、反病毒软件的的清除、软件的升级,文件强制删除工具软件等等等等…… 本文将首先介绍延迟删除/重命名的工作机制,然后介绍如何使用这个功能维护你的系统。 一、 什么是重启延迟删除/重命名 很多人可能都碰到过下面的一种情形:在安装某个软件的时候,安装程序正在初始化,突然,安装程序弹出一个类似于下面所描述的警告提示:发现有重启操作没有完成,在重启系统之前安装过程不能继续。然后安装程序自动退出。这类提示最常发生在安装Microsoft SQL Server 的时候。之所以出现这种提示,是因为安装程序检测到了有未完成的重启。那么安装程序是如何发现有未完成的重启呢?这就是本文的要点所在:Windows 2000/XP /Server 2003 的延迟删除/重命名功能。对于软件开发人员来说,Windows 2000/XP/Server 2003 的延迟删除/重命名功能并不是什么新鲜玩意,但是其实行的机制倒很少有人会关注。本文不想过多地涉及Windows 内 部的实现机制,但是仅从一个侧面简单的描述一下Windows 2000/XP/Server 2003 的延迟删除/重命名功能的原理和适用范围。对于 Windows 操作系统而言,要想成功的删除一个文件或重命名一个文件,需要满足一个条件:文件不能被占用。可是有的时候,要删除/重命名的文件总是被某个进程占用着,这样一来操作者就无法对这个文件进行删除和重命名。要解决这个问题,微软在Windows操作系统里面提出了一个延迟删除/重命名的功能。需要说明的是,这个功能不仅存在于Windows 2000/XP/Server 2003 操作系统里面,对于Windows 9X,这个功能也是存在的。只不过本文的重点在于介绍延迟删除的故事

延迟删除/重命名的基本实现原理是这样的: 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 "\\?".

时间: 2024-08-29 13:54:46

(转)Windows重启延迟删除,重命名技术原理的相关文章

Java文件/文件夹 创建-删除-重命名

文件.文件夹: 创建-删除-重命名 import java.io.File; import java.io.IOException; public class Test2 { //创建文件 [如果目录不存在则创建失败!] public static void createFile() throws IOException { String folderPath="F:\\temp"; String fileName="Test.java"; //创建文件夹路径对象

Linux_文件及文件夹[创建][复制][移动][删除][重命名]

一.文件/文件夹创建 1.文件的创建 touch , vi/vim/nano , ... 语   法: touch [-acfm][-d <日期时间>][-r <参考文件或目 录>][-t <日期时间>] [--help] [--version][文件或目录...] 或 touch [-acfm][--help][--version][日期时 间][文件或目录...] 补充说明:使用touch指令可更改文件或目录的日期时间,包括存取时间和更改时间. 参 数:  -a或–

3、File类的方法之创建、删除、重命名

一般我们调用内置类的方法,都是指调用其成员方法,故而以下几种方法都是File类的成员方法,常用的有以下3种, 分别是 //创建 public boolean createNewFile() public boolean mkdir() public boolean mkdirs() //删除 public boolean delete() //重命名 public boolean rannameTo(File dest) /* 需要注意的是,这些方法都是File内置方法,jdk里已经有了,所以并

git --删除文件、重命名

修改最后一次提交 git commit --amend -m "" 删除文件:. git rm <需要删除的文件> 只是删除当前工作目录和暂存区的文件,也就是取消跟踪.在下次提交时不纳入版本管理. git rm --cached  文件名   只删除暂存区的文件 git rm -f  文件名     //暴力删除,全部删除 重命名文件: git mv    文件名     新的文件名

Git使用七:修改最后一次提交、删除文件和重命名文件

修改最后一次提交: 在实际开发中,可能会遇到以下两种情景:情景一:版本刚一提交(commit)到仓库,突然想起漏掉两个文件还没有添加(add).情景二:版本刚一提交(commit)到仓库,突然想起版本说明写得不够全面,无法彰显你本次修改的重大意义…… 执行带 --amend 选项的 commit 提交命令,Git 就会“更正”最近的一次提交. 之前修改的文件只是提交到了暂存区,并没有提交到仓库 执行:git commit --amend就会进入到此次提交版本的编辑说明中 也可以直接git com

win10更新后文件夹无法移动和重命名,提示找不到指定文件

可以说,经历了那么多的windows系统,但是版本最多的,还是这个win10系统,但是不得不说,现在的win10系统在经历了众多版本的升级之后,也开始变得越发的完善了,不过其中的问题似乎也是蛮显著的,在一次又一次的升级过程中,Windows用户遇到的问题也是不少的. 最近有很多朋友发现了一问题,win10更新系统后出现文件夹无法移动和重命名,提示找不到指定文件的现象:          在 Windows 10 中,重命名文件或者文件夹总是自动闪掉,导致无法正常对文件夹或者文件夹进行重命名.或者

Minifilter过滤,功能实现对驱动目录的监控,包括创建,重命名,删除并实现hips

注意下:我的这套过滤只能用在nt6系统上 原因是使用一个nt6上才有的函数 见函数 PsGetProcessFullName 其实没必要自己来写获取全路径 因为minifilter已经给我们提供了获取全路径的函数 FltGetFileNameInformation 我就不改了,哈哈 说说遇到的问题吧 在监控创建的时候,我在卸载post中的,我拒绝后,在弹窗,2-3次吧,以前就是会请求2-3次,我的解决方法是记录上一次拒绝的文件全路径,然后下一次来的时候来比对 这里可以将处理过的文件加入链表或者h

delphi 文件的操作:重命名、复制、移动、删除

Delphi 文件的操作:重命名.复制.移动.删除第一种方法: RenameFile('Oldname', 'Newname'); CopyFile(PChar('Oldname'), PChar('Newname'), False); MoveFile(PChar('Oldname'), PChar('Newname')); DeleteFile(文件名); 第二种方法: 在Delphi可以使用ShellApi单元中的函数SHFileOperation来实现消息上传控件的制作, SHFileO

文件的创建、删除、重命名

-------------siwuxie095 工程结构目录如下: 1.文件的创建: 代码: package com.siwuxie095.file; import java.io.File; import java.io.IOException; public class HelloFile { public static void main(String[] args) { //由于只指定了文件名,而没有指定路径,即相对路径 //对于一个工程而言,其相对路径即工程本身的文件夹(目录) Fil