- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
替换运行中的文件(深入浅出)
文章作者:Dancefire at 263 dot net
这是今天瞎琢磨的一点收获。
一、引入
凡事总喜欢刨根问底,一直问自己为什么,问到实在没什么可问了为止,当然也有问到自己是在懒得再问了为止的时候。因为一个软件的自动更新老出问题,有时候出现无法自动更新,分析后发现原来是在替换正在运行的程序时出了问题。无知的我就开始对替换正在运行中的程序的方法进行分析。
虽大言不惭自称深入浅出,其实只不过对一个问题想深入进去,分析到自己因技术不佳无法继续分析的时候,浅浅的出来而已。但是仍旧希望这篇文章能够对和我一样思考这个问题的人有一点点帮助。
言归正传,首先从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 0#define MOVEFILE_COPY_ALLOWED 0#define MOVEFILE_DELAY_UNTIL_REBOOT 0#define MOVEFILE_WRITE_THROUGH 0
二、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文件之前,立即进行指定的文件移动。而且要确保所要操作的文件能够被LocalSyst
您可能关注的文档
最近下载
- 青少年趣味编程(Python)第十一节多分支选择if-elif 课后服务.pptx VIP
- 金蝶云星空+V7.6产品培训_财务_税务管理.pptx VIP
- 药品生产质量管理题库(附答案).docx VIP
- 山东省青岛市李沧区九年级(上)期末化学试卷 (2).doc VIP
- 办公楼保洁项目重点难点及解决方案.pdf VIP
- 卫生院职能部门对药物临床应用进行监测与评价,有持续改进的成效.docx VIP
- 满足顾客需求培训(ppt 39页).ppt VIP
- 22S702 室外排水设施设计与施工-钢筋混凝土化粪池图集.pdf VIP
- 青少年趣味编程(Python)第十节 if-else条件语句 课后服务.ppt VIP
- 教学课件24 稀硝酸生产.ppt VIP
原创力文档


文档评论(0)