(转)Windows重启延迟删除,重命名技术原理
延迟删除/重命名的基本实现原理是这样的: 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 "\\?".
(转)Windows重启延迟删除,重命名技术原理的更多相关文章
- [转]Windows系统下批量重命名文件(bat命令版本)
原文地址:https://jingyan.baidu.com/article/6dad507524bdcba122e36e44.html 我们有时候会遇到大量文件需要重命名,Windows系统下右键菜 ...
- VC 复制移动删除重命名文件文件
说明: 1.以下封装了4个函数_CopyFile,_DeleteFile,_MoveFile,_ReNameFile 2.每个函数都先拷贝了原来的路径,保证了路径是以2个\0\0结尾.(如果不以2个\ ...
- Linux_文件及文件夹[创建][复制][移动][删除][重命名]
一.文件/文件夹创建 1.文件的创建 touch , vi/vim/nano , ... 语 法: touch [-acfm][-d <日期时间>][-r <参考文件或目 录&g ...
- windows聚焦图片文件重命名bash脚本
win10聚焦路径为: %localappdata%\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalStat ...
- conda 添加bioconda源,创建/删除/重命名环境
1.conda安装 在https://repo.continuum.io/miniconda/选择conda版本 wget "https://repo.continuum.io/archiv ...
- windows下使用php重命名目录下的文件
rename函数一直报错,最后发现是windows下文件名的编码问题,如果项目文件是utf-8的话,一定要经过一步转码 $dir = $path . '/../resource/logo'; $han ...
- postgresql数据库primary key约束/not null约束/unique约束及default值的添加与删除、列的新增/删除/重命名/数据类型的更改
如果在建表时没有加primary key约束.not null约束.unique约束.default值,而是创建完表之后在某个字段添加的话 1.primary key约束的添加与删除 给red_pac ...
- intellij idea 重命名或复制一个项目(不用重启)
Idea 内无法直接修改Explorer 里文件夹的名称,只能手动改文件夹的名称. 目前找到的最好的方法: 1)重命名一个项目 在Idea 项目关闭状态下,在 Explorer (Windows) / ...
- 3、File类之创建、删除、重命名、判断方法
一般我们调用内置类的方法,都是指调用其成员方法,故而以下几种方法都是File类的成员方法,常用的有以下3种, 分别是 //创建 public boolean createNewFile() publi ...
随机推荐
- Qt编写端口扫描工具
Qt提供了QTcpSocket类,可以方便地建立TCP连接.利用这一功能,Maxiee编写了一个简单地端口扫描工具. 软件的功能就是,扫描某一网段的固定端口,如80端口,若目的地址开放了这一端口,那么 ...
- Hotel(线段树合并)
Hotel Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 14958 Accepted: 6450 Descriptio ...
- Ultra-QuickSort(归并排序)
Ultra-QuickSort Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 49267 Accepted: 18035 ...
- 投资学第一章 investments-introduction
转载请注明来自souldak,微博:@evagle 砖搬多了有点累,今天学学投资学. 这章主要是一些重要的概念. real assets / financial assets , fixed-in ...
- Unity5UGUI 官方教程学习笔记(四)UI Image
Image Source image:源图片 需要显示的图片 Color:颜色 会与图片进行颜色的混合 Material:材质 Image Type: Simple 精灵只会延伸到适合Rec ...
- CKEditor + CKFinder 实现编辑上传图片配置 (二)
CKEditor + CKFinder 实现编辑上传图片配置 (二) 上传图片时,如果上传的图片过大,默认情况情况下回自动裁剪,代码如图 \ckfinder\config.php 目录下的配置文件co ...
- JavaSE复习日记 : 递归函数
/* * 递归函数 * 什么是递归? * 在一个方法的内部,对自身进行调用,又叫做递归调用 * * 递归和循环的编写都包括三部分: * 1. 初始值; * 2. 终止条件; * 3. 前进步长; * ...
- Linux流量监控工具使用总结 - iftop
在类Unix系统中可以使用top查看系统资源.进程.内存占用等信息.查看网络状态可以使用netstat.nmap等工具.若要查看实时的网络流量,监控TCP/IP连接等,则可以使用iftop. 一.if ...
- eclipse run on server 浏览器启动设置
- JQuery实战学习--在dreamweaver 8中配置Jquery自动提示
最近在学习jQuery,然后在网上找到了自动提示的方法,记之. 1,首先下载jQuery_API.mxp这个扩展文件. 2,打开DW,点击命令-->扩展管理-->文件-->安装扩展, ...