(转)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 ...
随机推荐
- 蓝桥杯之K好数问题
问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数的数目.例如K = 4,L = 2的时候,所有K好数为11.13.20.22 ...
- poj2583---Series Determination
#include <stdio.h> #include <stdlib.h> int main() { int x,y,z,a,b,c; while(scanf("% ...
- 错误解决一_call time pass-by-reference removed
我的操作: 定义function my_function(&$param) 调用 my_function(&$value)错误来了:Call-time pass-by-referenc ...
- Hibernate 数据的批量插入、更新和删除
4.2 Hibernate的批量处理 Hibernate完全以面向对象的方式来操作数据库,当程序里以面向对象的方式操作持久化对象时,将被自动转换为对数据库的操作.例如调用Session的delete ...
- ubuntu 安装mysql, 以及全然又一次安装的方法
sudo apt-get install mysql-server 装完后 是无法远程訪问的. 要先改动 sudo vim /etc/mysql/my.cnf 找到 bind-address = 12 ...
- mac 版本号控制工具SmartSVN7.5.4(破解版)
SmartSVN7.5.4和破解工具,下载地址:http://download.csdn.net/detail/pearlhuzhu/7407319 操作步骤: 1.在MAC上选中smartsvn-m ...
- ADO知识的运用二(Day 28)
可能是最近有些沉迷于电视剧了,所以,好多天都没写总结了.我知道这样不好,但又老管不住自己,也许是我自控力太差了吧......呵呵,如果在不写总结,可能以后就会成为习惯了.所以今天要赶紧补上...... ...
- gulp+browserfy模块化工具环境搭建
1.下载ruby,在ruby环境下安装sass; 2.安装nodejs; 3.进入当前项目所在目录,在cmd命令行中输入npm install; 4.安装browserify和gulp 安装brows ...
- justAP1.3.0版发布了
justAP是一个简单的.易于使用的php运行环境,适合php开发人员使用.与wamp.xampp等不同,它仅仅包含Apache httpd和Php,这也是它名字的来由(justAP=just Apa ...
- SQL Server 排名函数实现
在SQL Server 中有四大排名函数分别是: 1.row_number() 2.ntile() 3.rank() 4.dense_rank() -------------------------- ...