(转)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 ...
随机推荐
- Android updater-scripts(Edify Script)各函数详细说明(转)
这是Android系统来运行updater-scripts的Edify语言的基本介绍. 大部分的Edify命名都是函数,当调用这些函数结束的时候,会返回数据给脚本.当然,你也可以使用这些函数的返回值来 ...
- [虚拟化/云][全栈demo] 为qemu增加一个PCI的watchdog外设(五)
目的: 1. 了解PCI的基本知识,为完成watchdog的设备做准备. 准备知识: 简单的说,PCI 设备分3个空间. 配置空间,IO空间,内存地址空间. PCI设备厂家决定了外设是使用IO空间还是 ...
- c++链接数据库测试,中文有问题
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <Windows.h& ...
- opencv 图像修复函数
void cv::inpaint( const Mat& src, const Mat& mask, Mat& dst, double inpaintRange, int fl ...
- [Java 8 Lambda] java.util.stream 简单介绍
包结构例如以下所看到的: 这个包的结构非常easy,类型也不多. BaseStream接口 全部Stream接口类型的父接口,它继承自AutoClosable接口,定义了一些全部Stream都具备的行 ...
- sql server dateadd()
定义和用法 DATEADD() 函数在日期中添加或减去指定的时间间隔. 语法 DATEADD(datepart,number,date) date 参数是合法的日期表达式.number 是您希望添加的 ...
- oracle基础代码使用
create or replace procedure pr_test1 is v_case ) :;--定义变量 begin -- /*判断语句 then dbms_output.put_line( ...
- EAX、ECX、EDX、EBX寄存器的作用(转)
一般寄存器:AX.BX.CX.DXAX:累积暂存器,BX:基底暂存器,CX:计数暂存器,DX:资料暂存器 索引暂存器:SI.DISI:来源索引暂存器,DI:目的索引暂存器 堆叠.基底暂存器:SP.BP ...
- 怎样使用Markdown
转自:http://wowubuntu.com/markdown/basic.html 段落.标题.区块代码 一个段落是由一个以上的连接的行句组成,而一个以上的空行则会划分出不同的段落(空行的定义是显 ...
- 《JavaScript+DOM编程艺术》的摘要(四)appendChild与insertBefore的区别
基本知识点: // 1.js里面为什么要添加window.onload=function (){} // 保证html文档都加载完了,才开始运行js代码,以防html文档没有加载完,找不到相应的元素 ...