|
换运行中的文件(深入浅出)
这是今天瞎琢磨的一点收获。
一、引入
凡事总喜欢刨根问底,一直问自己为什么,问到实在没什么可问了为止,当然也有问到自己是在懒得再问了为止的时候。因为一个软件的自动更新老出问题,有时候出现无法自动更新,分析后发现原来是在替换正在运行的程序时出了问题。无知的我就开始对替换正在运行中的程序的方法进行分析。
虽大言不惭自称深入浅出,其实只不过对一个问题想深入进去,分析到自己因技术不佳无法继续分析的时候,浅浅的出来而已。但是仍旧希望这篇文章能够对和我一样思考这个问题的人有一点点帮助。
言归正传,首先从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
|