微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

存在重命名的当前可执行文件的 CreateProcess

如何解决存在重命名的当前可执行文件的 CreateProcess

是否可以在 Windows 10 中调用 CreateProcess() 并确保它启动与当前进程完全相同的可执行文件,即使当前可执行文件可以随时重命名?例如,如果当前进程的可执行文件最初被称为 name.exe,但随后在进程运行时将其重命名name_old.exe,则子进程应使用 name_old.exe?

我可以使用 QueryFullProcessImageName() 检测当前进程的名称更改。问题是这不是原子性的,因为重命名可能恰好发生在该调用CreateProcess 之间。

这样做的背景是我们正在为我们的应用程序实施实时更新。更新过程在检测到应用程序可执行文件正在使用时,将可执行文件重命名name_old.exe,然后将新版本复制为 name.exe。然后,当用户使用 name_old.exe 关闭应用程序的最后一个实例时,旧版本将被删除

这几乎有效。问题在于应用程序启动子工作进程。那些应该使用与主应用程序完全相同的可执行文件,因为更新可以改变父子交互的协议。所以我们必须防止子进程使用新的可执行文件而父进程使用旧的。

解决方法

使用解决方案回答自己的问题,该解决方案适用于我们将单个可能的重命名为已知名称的情况。诀窍是将 CreateProcess()CREATE_SUSPENDED 标志一起使用。然后检查 name_old.exe 是否存在。如果文件不存在,我们知道没有重命名,我们可以恢复刚刚创建的进程。如果有这个名字,我们就杀死创建的进程,然后使用 CreateProcess 和 `name_old.exe` 作为可执行文件。

最初我认为上述的变体也可以用于任意重命名。这个想法是首先使用 QueryFullProcessImageName() 来查找父可执行文件的当前名称,然后如上所述创建一个具有该名称的挂起子进程,然后使用 QueryFullProcessImageName() 再次查找父进程的路径。如果它与原始匹配,那么据说调用之间没有重命名,并且可以恢复孩子。在不匹配时杀死孩子并重复。

但是如果允许真正的任意重命名,这将不起作用。例如,可以重命名父级,在旧名称下创建临时可执行文件,然后将临时性重命名为另一个名称,然后将父级重命名回原始名称。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。