替换运行中的文件

自删除技术详解 要整理页面文件,首先将页面文件从原先所在的驱动器移动到其他驱动器,然后对原来驱动器进行整理,最后再将页面文件移回到原驱动器上,此时页面文件就会存放在连续的磁盘空间中了。,但是还没有创建页面文件,在这个时间节点下,可以说话用户是还没有完全进入操作系统的,那么这时候就可以删除在正常情况下删除不了的文件,我的理解是在没有创建页面文件的时候,其实操作系统是还没有启动完全的,所以这时候可执行文件其实是没有完全加载好的。如果当前进程的任务是将程序注入到其他进程,在其他进程的地址空间中运行,然后关掉当前进程。... 阅读详情

by dancefire: dancefire at 263 dot net

2004/06/17

这是今天瞎琢磨的一点收获。

一、引入

凡事总喜欢刨根问底,一直问自己为什么,问到实在没什么可问了为止,当然也有问到自己是在懒得再问了为止的时候。因为一个软件的自动更新老出问题,有时候出现无法自动更新,分析后发现原来是在替换正在运行的程序时出了问题。无知的我就开始对替换正在运行中的程序的方法进行分析。

虽大言不惭自称深入浅出,其实只不过对一个问题想深入进去,分析到自己因技术不佳无法继续分析的时候,浅浅的出来而已。但是仍旧希望这篇文章能够对和我一样思考这个问题的人有一点点帮助。

言归正传,首先从xfocus的bgate的文章《在Win2000/XP上安静地替换正在使用的系统文件》中获得启发。

他对替换正在使用的系统文件进行了研究,分析了微软的一个工具zap,这个工具可以替换系统文件。经过分析后,这个工具其实是先把正在使用的文件移动到一个临时目录中去,然后再把这个文件删除,但是标记为下次启动的时候删除。此时系统文件目录已经腾出了空间,这样再把新的文件移动过来就可以了。

实现部分代码示意如下:

    if(szFileToDel[1] == ':'){
        sprintf(cTempPathName, "%c://", szFileToDel[0]);
    }
    else{
        GetModuleFileName(NULL, cFileName, 0x100);
        sprintf(cTempPathName, "%c://", cFileName[0]);
    }

    if(GetTempFileName(cTempPathName, "_@", 0, cTempFileName) == 0) return FALSE;
    if(MoveFileEx(szFileToDel, cTempFileName, MOVEFILE_REPLACE_EXISTING) == 0) return FALSE;
    if(MoveFileEx(cTempFileName, NULL, MOVEFILE_DELAY_UNTIL_REBOOT) == 0) return FALSE;
if(MoveFileEx(szSrcFile, cTempPathName) == 0) return FALSE;

其中
winbase.h:

#define MOVEFILE_REPLACE_EXISTING   0x00000001
#define MOVEFILE_COPY_ALLOWED       0x00000002
#define MOVEFILE_DELAY_UNTIL_REBOOT 0x00000004
#define MOVEFILE_WRITE_THROUGH      0x00000008

二、MoveFileEx分析

为了了解MoveFileEx()到底是如何在下次重新启动的时候进行的文件移动操作的,我查阅了操作系统源代码。
1、MoveFileEx()实际上是调用的MoveFileWithProgressW(),只不过NULL了两个回调参数。
2、MoveFileWithProgressW()中针对dwFlag=MOVEFILE_DELAY_UNTIL_REBOOT的,调用了BasepMoveFileDelayed()函数
3、BasepMoveFileDelayed()是通过修改注册表的方法,让操作系统重新启动时进行文件操作的。
它修改的键值是
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Session Manager/PendingFileRenameOperations
这是一个REG_MULTI_SZ的键值。
格式是:

szDstFile/0/0
szSrcFile/0szDstFile/0/0
szSrcFile/0!szDstFile/0/0

有些文章中所说的源文件和目标文件中间是换行,这并不是最合理的,虽然也可以,中间是Unicode的/0,也就是 00 00

而且需要注意的是,如果指定了MOVEFILE_REPLACE_EXISTING属性的话,目标文件前会加注一个叹号。

这个键值我是在分析完源代码后,才发现原来MSDN中已经给出这个键值了。

后来我打开我的这个键值,发现里面有一堆,还没有来得及删除的文件,在等着我下一次重新启动的时候删除呢。

根据关于MOVEFILE_DELAY_UNTIL_REBOOT的解释,操作系统会在系统重新启动的时候,在Autochk检查完成后,并且在建立任何PageFile文件之前,立即进行指定的文件移动。而且要确保所要操作的文件能够被LocalSystem或者管理员组所操作。

我同时也注意到了另外一个我不熟悉的问题,就是为什么文件被移动了,但是应用程序还可以继续执行,而删除则不行。我没有细考虑这个问题,但是我感觉一定是有什么东西没有变化,比如某种链接。虽然位置变了,但是链接依旧能够跟踪到映像的位置,所以所有指向该链接的操作都是生效的。但是删除文件的时候,该链接就会被删除,从而会导致操作失败,为了避免这种失败,所以禁止删除正在被占用的文件。

三、操作系统启动过程中相关操作

关注了一下NT的启动过程,想了解系统在启动的时候是如何执行上面提到的移动或者删除行为的。

在初始化内核阶段,ntoskrnl.exe从NTLDR手中接管了控制权,在最后一步,Session Manager启动了Windows XP的高级子系统以及服务,Session Manager启动控制所有输入、输出设备以及访问显示器屏幕的Win32子系统以及Winlogon进程,初始化内核完毕。

Session Manager实际上就是smss.exe,我们经常可以在内存进程中看到他的身影。反汇编的时候,在sub_48584D01中看到XP有考虑识别的CPU有:

0 x86
1 MIPS
2 ALPHA
3 PPC
4 IA64
5 ALPHA64
other UNKNOWN

我在smss.exe里面找到了PendingFileRenameOperations,可见应该是此文件负责了在引导的时候执行其中的文件移动操作。只可惜,我没有找到何处调用了PendingFileRenameOperations,反汇编功底不佳啊。

从sysinternals.com中看到一段关于Session Manager调用PendingFileRenameOperations的话

[http://www.sysinternals.com/ntw2k/info/regboot.shtml]

After you pass the point in the log where boot and system driver initialization is complete you'll begin to see records created by the smss.exe process, which is called the Session Manager. Session Manager is the first user-mode process launched during a boot. You'll see it immediately check to see if there are any rename operations it should perform before the system is up and running by looking at the value HKLM/System/CurrentControlSet/Control/Session Manager/PendingFileRenameOperations. Next you'll see it determine what DOS device mappings it should create (e.g. COM1, LPT1), what environment variables are defined, what DLL's it "knows about" (standard DLLs in the system32 directory), and which protected subsystems it should start (e.g. OS/2, POSIX).

Session Manager typically launches Chkdsk (autocheck.exe), which is specified in the Session Manager's BootExecute value along with direction to run other boot-time native applications. After Autocheck finishes Session Manager starts Winlogon and the Win32 subsystem (CSRSS.EXE). Both of these generate interleaved Registry accesses as they start up concurrently. Winlogon can be seen querying the .Default key's display settings, including colors and mouse settings under HKU/.Default/Control Panel. The .Default key's contents are user preferences that are active when no one is logged in, and Winlogon uses them for the screen on which it displays the logon dialog box.

不过这个和微软所说的先Autochk,然后再PendingFileRenameOperations,不同。

从另一份文档中(http://freehost02.websamba.com/brittanyfoo/BootProcess.html),提到了初始化进程问题:

Smss 的主线程进行以下的初始化步骤:

1、创建 LPC 端口对象( /SmApiPort )和两个等待客户请求的线程。客户请求包括装载一个新的子系统或者创建一个会话等。

2、为 MS-DOS 设备名,如 COM1 和 LPT1 定义符号链接。

3、如果安装了终端服务(Terminal Services),在对象管理器的名字空间创建 /Sessions 目录。

4、运行 HKLM/SYSTEM/CurrentControlSet/ Control/Session Manager/BootExecute 定义的程序,典型的是运行 Autochk (Chkdsk在引导其间的版本)。

5、按照 HKLM/SYSTEM/CurrentControlSet/Control/Session Manager/PendingFileRenameOperations 的指令,进行延迟文件改名操作。挂起文件删除在 PendingFileRenameOperations2 。

6、打开已知的 DLL 。

7、创建另外的分页文件。

8、初始化注册表。配置管理器刷新注册表, 为HKLM/SAM, HKLM/SECURITY, 和 HKLM/SOFTWARE 关键字装载注册文件。HKLM/SYSTEM/ CurrentControlSet/Control/hivelist 在硬盘上搜索注册表文件,配置管理器在 /Winnt/System32/Config 寻找。

9、创建系统环境变量。

10、装载Win32子系统内核模式部分(Win32k.sys)。Smss 在 HKLM/SYSTEM/CurrentControlSet/Control/Session Manager 下寻找 Win32k.sys 和其它要装载组件的路径,确定它们的位置。Win32k.sys 中的初始化代码使用视频驱动程序,屏幕的分辨率转换到缺省概貌文件定义的值。因此,屏幕从引导视频驱动程序使用的VGA模式转到系统选择的缺省的分辨率。

11、启动子系统进程,包括 Csrss 。

12、启动登陆进程 (Winlogon) 。

13、为调试事件信息创建LPC口(DbgSsApiPort 和 DbgUiApiPort),并创建监听这些口的线程。

这个算是描述最清楚的了。


四、总结

至此,对替换正在使用中的文件有了初步的理解。

既MoveFileExW -> MoveFileWithProgressW -> BasepMoveFileDelayed -> HKLM/System/CurrentControlSet/Control/Session Manager/PendingFileRenameOperations

然后,ntldr引导,ntoskrnl.exe结果引导权,启动smss.exe(Session Manager),在Autochk之后,检查PendingFileRenameOperations,然后执行其中的文件替换操作。最后smss启动Winlogon进程,允许用户登录。

因此此种方法可以替换几乎所有的系统文件,因为smss是系统的第一个UserMode的进程,此时被使用的文件极少,不可能有人在它之前占用文件。

如果是替换系统文件的话,比如smss.exe,就使用微软的办法,先把smss.exe移动到临时文件夹去,然后把新的smss.exe放到正确的目录中。把临时文件家里的smss.exe移动到NULL,并且是MOVEFILE_DELAY_UNTIL_REBOOT。这样如果系统重新启动的话,自然使用的是新的smss.exe,然后它再把临时文件夹里的垃圾清除掉即可。其实此时不清除,等起来之后再清除也是可以的了,因为已经没有东西在占用那个临时文件夹里的垃圾了。

如果是替换普通应用程序的话,只需要重新启动应用程序即可,因为此时应用程序目录里的东西已经为新的文件了。重新启动只不过是为了删除那个临时文件夹里的垃圾而已。

TIA Portal V16安装总报错?别急着重装系统,先试试这几步(解决PendingFileRenameOperations重启问题) 本文详细解析了TIA Portal V16安装过程中常见的PendingFileRenameOperations重启问题,提供了一套从注册表清理到系统服务调整的全链路排查方案。通过深度解析注册表机制、系统级预处理和实时监控策略,帮助用户高效解决安装报错,避免不必要的系统重装。特别适用于西门子博途V16用户遇到的安装难题。 阅读详情

相关推荐

Python对指定文件内容进行全局替换

关于对指定文件内容进行全局替换的Python实现具体解释都附在代码里了 代码如下: import os import sys cs = sys.argv old_cs = cs[1] # 将要替换掉的值赋给old_cs new_cs = cs[2] # 将要替换成的值赋给new_cs filename = cs[3] # 将操作的文件名赋给filename new_file...

m0_46252978的博客 1138

Windows注册表基础知识

Windows注册表基础知识1、注册表简介注册表主键HKEY_CLASSES_ROOTHKEY_CURRENT_USERHKEY_LOCAL_MACHINEHKEY_USERSHKEY_CURRENT_CONFIG2、注册表危险项[^1]Windows LoadWindows Run特殊的16位可执行文件类型Windows ShellPending File Rename Operations3、优化注册表清理多余的DLL文件安装卸载应用程序的垃圾信息系统安装时产生的无用信息4、总结 1、注册表简介 注册表

weixin_45817476的博客 3853

把目录下的所有文件的字符串替换-python

由于工作的需要,需要把百万行代码中的某个方法名替换为另一个,方法被用到的地方还挺多。本打算用软件改,夜深人静 时!感觉不行,我可是一只程序猿!怎么能堕落呢,于是乎… 自己下手撸一个脚本 python 把当前目录下所有的文件都遍历,把文件中的字符替换! 使用命令: python main.py old_string new_string ”’ Created on 2018-09-...

Inc.Cool 1108

替换运行中的文件(深入浅出)

 文章作者:Dancefire at 263 dot net这是今天瞎琢磨的一点收获。一、引入凡事总喜欢刨根问底,一直问自己为什么,问到实在没什么可问了为止,当然也有问到自己是在懒得再问了为止的时候。因为一个软件的自动更新老出问题,有时候出现无法自动更新,分析后发现原来是在替换正在运行的程序时出了问题。无知的我就开始对替换正在运行中的程序的方法进行分析。虽大言不惭自称深入浅出,其实只不过对一个

http://www.cppx.net 732

TIA portal西门子博途安装时一直提示重启怎么办?

TIA portal西门子博途安装时一直提示重启怎么办? 在安装西门子的某些软件的时候,经常提示要重启,而且重启之后依然提示重启,让人比较烦恼,这个问题是由以下原因引起的: 一般系统文件无法删除时,比如其他程序正在占用等等,系统会把这些文件保存在注册表该减值下面,以便下次重启后直接删除,有时候有一些未知的原因导致这些文件在重启后无法删除,这些文件记录还在,西门子的软件安装时检测到后就会提示重启电脑,所以这个时候,我们手动删除这个键值基本就能解决这个问题。 方法一:在windows系统下,按下组合键:WIN+

Robot_PLC_HMI_Automation 5万+

BAT032:批量替换当前目录下文件的部分字符

摘要:编写批处理程序,实现批量替换当前目录下文件的部分字符。

qq_31762031的博客 2335

windows10系统下替换、修改jar中的文件并重新打包成jar文件然后运行

windows10系统下替换或者修改jar中的文件并重新打包成jar文件然后运行

m0_50736744的博客 1万+

Ubuntu20.04下运行VINS系列:VINS-Mono、VINS-Fusion和GVINS

安装好了VINS-Mono所需的ROS noetic、Eigen3.4.0、Ceres2.10和OpenCV4.2.0等。VINS-Mono是在ROS melodic以及Ceres1的环境下开发的,因此需要适配高版本的环境。

zardforever123的博客 2万+

程序文件升级自动更新时,替换正在运行中的文件的分析

在进行程序文件升级自动更新时,总会有些文件在被使用中,这时如何进行替换: [转载]替换正在运行中的文件的分析 作者:Dancefirefrom:xfocus 一、引入 凡事总喜欢刨根问底,一直问自己为什么,问到实在没什么可问了为止,当然也有问到自己是在懒得再问了为止的时候。因为一个软件的自动更新老出问题,有时候出现无法自动更新,分析后发现原来是在替换正在运行的程序时出了问题。无知的我就开...

weixin_30832143的博客 1232

Proteus仿真AT89C51驱动DHT11:温湿度数据采集与LCD1602显示的5个调试坑点总结

本文总结了在Proteus仿真环境下使用AT89C51驱动DHT11温湿度传感器并通过LCD1602显示的5个常见调试坑点,包括DHT11时序问题、LCD1602初始化错误、数据校验失败、仿真特有差异及系统稳定性问题,提供了详细的解决方案和优化代码示例,帮助开发者高效完成温湿度采集项目。

weixin_30335575的博客 356

可信数据空间:可信空间、区域功能节点、业务功能节点、连接器的关联关系

可信数据空间通过分层架构实现安全数据共享:可信空间作为顶层制定全局规则;区域功能节点协调辖区内功能节点协作;功能节点提供具体数据服务;连接器作为唯一通信通道确保安全交互。系统采用"规则自上而下约束,数据自下而上流动"机制,通过分层治理和标准化连接,在保证数据主权的同时实现跨域协作,具有策略分级执行、去中心化治理等特性,支持灵活扩展业务场景。

友莘居士的博客 1686

Linux下替换运行中的程序或so文件的问题

今天被朋友问及“Linux下可以替换运行中的程序么?”,以前依稀记得Linux下是可以的(而Windows就不让),于是随口答道“OK”。结果朋友发来一个执行结果:(test正在运行中) # cp test2 test cp: cannot create regular file `test': Text file busy 看起来是程序被占用,无法覆盖。于是自己又再做了几个实验: (1)先

wei_yongtao的专栏 7456

MacBook 本地化部署 Dify 指南

dify 怎么安装部署 有哪些坑 !

weixin_44542598的博客 1524

python替换txt指定内容_Python实现替换文件中指定内容的方法

本文实例讲述了Python实现替换文件中指定内容的方法。,具体如下:这里使用python编写的程序,实现如下功能:将文件中的指定子串 修改为 另外的子串编写的python程序,文件名是file_replace.py,具体代码如下:#!/usr/bin/env python#_*_ coding:utf-8 _*_import sys,osif len(sys.argv)5:sys.exit('Th...

weixin_39790686的博客 2030

CMake接口库实战:如何用add_library的INTERFACE选项管理跨项目依赖

本文深入探讨了CMake中add_library的INTERFACE选项在管理跨项目依赖时的实战应用。通过创建不包含源代码的接口库,开发者可以集中管理头文件路径、编译定义、链接库等公共配置,并将其声明式地传递给依赖目标。文章以构建模块化跨平台网络应用为例,详细展示了如何利用接口库实现配置的集中化、依赖关系的显式化,从而提升大型项目的可维护性和可移植性。

water的专栏 1040

芯片散热技术突破:多尺度结构与VC集成方案解析

在半导体技术快速发展的背景下,芯片散热成为制约性能提升的关键瓶颈。传统散热技术如风冷和水冷已接近物理极限,而两相浸没式液冷技术凭借其超高传热系数成为新的解决方案。通过多尺度表面结构设计与真空腔均热板(Vapor Chamber)的集成创新,可以显著提升沸腾性能,降低沸腾起始温差(ONB)并突破临界热流密度(CHF)限制。这种技术在数据中心、高性能计算(HPC)和边缘计算等高热流密度场景中具有重要应用价值,能有效提升能效比(PUE)并降低能耗。

weixin_36288992的博客 155

DOS脚本入门实例003-替换指定文件中的指定内容

在这段代码中,你需要指定要替换的文件路径,以及要查找和替换的文本内容。运行该脚本后,它将打开指定的文件并依次查找每行内容中的 find_text 并将其替换为 replace_text,然后将已替换的行写入一个临时文件中。脚本完成后,它将删除原始文件并将临时文件更名为原始文件的名称。以下是一个可以替换指定文件中指定内容的 DOS 脚本,你需要将 script.bat 替换为你自己的文件名和内容。注意,使用脚本之前一定要备份您要替换的文件!

m0_49521873的博客 1035

微信文件自动归档!手把手教你用OpenClaw搭个自己的“数字员工”,告别重复劳动

很多人说“AI是未来”,但未来不是靠喊口号的。OpenClaw的真正价值,是让你把重复劳动交出去,把时间留给真正需要创造力的事。这事真能干,而且不难。下载OpenClaw(GitHub仓库按我写的步骤跑一遍遇到坑,评论区留言——我亲自帮你看作者后记:上周五,我让AI自动归档了文件后,终于在5点准时下班。回家路上,我给它发了条消息:“干得漂亮”。它没回,但我知道——它在默默等我的下一条指令。

2601_94871597的博客 414

java txt替换内容_使用Java替换文件中的文本

我有一个名为FormatString.java的文本文件。它包含一些单词。在所有这些单词中,我想将单词oldstring替换为newstring,并将最终结果重命名为t.txt。我已经编写了代码。从技术上讲,它应该起作用。问题是我不知道在哪里保存FormatString.java文件。我是否将其保存在保存了ReplacingText程序的同一类文件夹中,还是将其保存在其他地方。我转到命令提示符,然...

weixin_32371243的博客 2083

基于环形槽谐振器与PIN二极管的频率可重构Vivaldi天线设计与CST仿真研究

摘要 本文设计了一种基于FR4基板的频率可重构Vivaldi天线,通过集成环形槽谐振器(CSRR)和PIN二极管开关实现超宽带(UWB,2-8 GHz)与窄带(2.4/3.5/5.2 GHz)模式的电控切换。天线采用指数渐变槽线结构,结合CSRR的滤波特性和PIN二极管的开关功能,利用CST仿真优化参数。结果表明,UWB模式下S11<-10 dB,窄带模式下目标频点谐振显著,其他频段抑制良好,验证了设计的可行性。该方案为多频段无线通信系统提供了紧凑、低成本的可重构天线解决方案。 关键词:频率可重构天线

huanghm88的专栏 217

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

换运行中的文件(深入浅出)

文章作者:Dancefire at 263 dot net这是今天瞎琢磨的一点收获。一、引入凡事总喜欢刨根问底,一直问自己为什么,问到实在没什么可问了为止,当然也有问到自己是在懒得再问了为止的时候。因为一个软件的自动更新老出问题,有时候出现无法自动更新,分析后发现原来是在替换正在运行的程序时出了问题。无知的我就开始对替换正在运行中的程序的方法进行分析。虽大言不惭自称深入浅出,其实只不过对一个问题想

1683

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

上一篇: 我的Blog开张了
下一篇: using和Enviroment.NewLine
DanceFire
博客等级 码龄26年 91粉丝 42原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值