【问题标题】:Renaming A Running Process' File Image On Windows在 Windows 上重命名正在运行的进程的文件映像
【发布时间】:2010-10-22 10:17:33
【问题描述】:

我在 Vista SP1 上有一个 Windows 服务应用程序,我发现用户正在重命名其可执行文件(在它运行时)然后重新启动,从而导致它在下次启动时无法启动,因为服务管理器无法再启动找到重命名后的 exe 文件。

我似乎记得在旧版本的 Windows 中您无法执行此操作,因为操作系统在文件上设置了锁定。即使使用 Vista SP1,我仍然无法在现有文件运行时复制它 - Windows 报告该文件正在使用中 - 是有道理的。那么为什么我应该被允许重命名呢?如果 Windows 需要从 exe 中调入新的代码页,但文件自启动后已被重命名,会发生什么情况?我在重命名 exe 文件等时运行了 Process Monitor,但 Process Mon 没有报告任何奇怪的东西,只是像其他文件一样记录了更改文件名。

有人知道幕后发生了什么吗? Windows 允许更改正在运行的进程的文件名(或其依赖的 DLL)似乎违反直觉。我在这里错过了什么?

【问题讨论】:

    标签: windows service process filenames


    【解决方案1】:

    只要文件仍然存在,Windows 仍然可以从中读取 - 重要的是底层文件,而不是它的名称。

    我可以愉快地重命名我的 XP 机器上正在运行的可执行文件。

    【讨论】:

      【解决方案2】:

      你的概念是错误的......文件名不是文件io宇宙的中心......打开文件的句柄是。重命名文件时,文件不会移动到磁盘的不同部分,它仍然在同一个位置,并且打开文件的内部数据结构的磁盘部分仍然指向同一个位置。底线是你的观察是正确的。您可以重命名正在运行的程序而不会引起问题。重命名后,您可以创建一个与正在运行的程序同名的新文件。如果您想在软件运行时更新软件,这实际上是有用的行为。

      【讨论】:

        【解决方案3】:

        操作系统保留.exe 文件的打开句柄。重命名文件只会更改有关文件的一些文件系统元数据,而不会使打开的句柄无效。因此,当操作系统进入更多代码页面时,它只使用它已经打开的文件句柄。

        替换文件(覆盖其内容)完全是另一回事,我猜操作系统打开时FILE_SHARE_WRITE 标志未设置,因此没有其他进程可以写入.exe 文件。

        【讨论】:

          【解决方案4】:

          可能是一个愚蠢的问题,但是,如果用户不打算重命名文件,为什么他们有权重命名文件?但是,是的,这是允许的,因为正如好的答案所指出的那样,文件的打开句柄在应用程序退出之前不会丢失。它也有一些用途,尽管我不相信通过重命名应用程序文件来更新应用程序是一个好习惯。

          【讨论】:

            【解决方案5】:

            您可能会考虑让您的服务监听您的服务安装目录的更改。如果它检测到重命名,那么它可以将自己重命名回它应该是的。

            【讨论】:

              【解决方案6】:

              这里文件的概念有两个方面:

              1. 磁盘上的数据 - 那是实际的文件。

              2. 您可以提供该数据的文件名(可以是多个或没有) - 称为目录条目。

              您要重命名的是目录条目,它仍然引用相同的数据。 Windows 并不关心您这样做,因为它仍然可以在需要时访问数据。正在运行的进程映射到数据,而不是名称。

              【讨论】:

                猜你喜欢
                • 2019-01-25
                • 1970-01-01
                • 2021-01-09
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-12-10
                • 2019-08-31
                • 1970-01-01
                相关资源
                最近更新 更多