Переименование образа запущенного процесса 'в Windows - PullRequest
2 голосов
/ 29 апреля 2009

У меня есть приложение-служба Windows на Vista SP1, и я обнаружил, что пользователи переименовывают его исполняемый файл (пока он работает), а затем перезагружаются, в результате чего он не запускается при следующей загрузке, поскольку диспетчер служб больше не может найти exe-файл, так как он был переименован.

Кажется, я помню, что в старых версиях Windows вы не могли этого сделать, потому что ОС установила блокировку файла. Даже с Vista SP1 я все еще не могу скопировать существующий файл во время его работы - Windows сообщает, что файл используется - имеет смысл. Так почему мне следует разрешить переименовать его? Что произойдет, если Windows потребуется страница в новой кодовой странице из exe, но файл был переименован с момента его запуска? Я запустил Process Monitor при переименовании exe-файла и т. Д., Но Process Mon не сообщил ничего странного и просто зарегистрировал изменение имени файла, как и любой другой файл.

Кто-нибудь знает, что здесь происходит за кулисами? Кажется нелогичным, что Windows позволит изменить имя файла запущенного процесса (или его зависимые библиотеки DLL). Что мне здесь не хватает?

Ответы [ 6 ]

2 голосов
/ 29 апреля 2009

Ваша концепция неверна ... имя файла не является центром вселенной file-io ... дескриптор открытого файла. файл не перемещается в другой раздел диска при его переименовании, он все еще находится в том же месте, и часть диска, внутренняя структура данных для открытого файла все еще указывает на то же место. Суть в том, что ваши наблюдения верны. Вы можете переименовать работающую программу, не вызывая проблем. вы можете создать новый файл с тем же именем, что и запущенная программа, после того, как вы его переименовали. это действительно полезное поведение, если вы хотите обновить программное обеспечение во время его работы.

1 голос
/ 29 апреля 2009

Пока файл все еще там, Windows все еще может читать с него - важен файл, а не его имя.

Я могу с радостью переименовать исполняемые файлы на моем компьютере с XP.

0 голосов
/ 16 февраля 2015

Есть два аспекта понятия file здесь:

  1. Данные на диске - это фактический файл.

  2. Имя файла (может быть несколько или ни одного), которое вы можете передать этим данным - так называемые записи каталога.

То, что вы переименовываете, это запись каталога , которая все еще ссылается на те же данные . Windows не заботится о том, чтобы вы это делали, поскольку она по-прежнему может обращаться к данным, когда это необходимо. Запущенный процесс сопоставляется с данными , а не с именем.

0 голосов
/ 29 апреля 2009

Возможно, вы захотите, чтобы ваша служба прослушивала изменения в каталоге, в котором установлена ​​ваша служба. Если он обнаружит переименование, он может переименовать себя обратно в то, что он должен быть.

0 голосов
/ 29 апреля 2009

Возможно, это глупый вопрос, но почему пользователи имеют доступ к переименованию файла, если они не предполагают переименовывать файл? Но да, это разрешено, потому что, как указывают хорошие ответы, открытый дескриптор файла не теряется до тех пор, пока приложение не закроется. И для этого тоже есть несколько применений, хотя я не уверен, что обновление приложения путем переименования его файла является хорошей практикой.

0 голосов
/ 29 апреля 2009

ОС сохраняет открытый дескриптор файла .exe. Переименование файла просто изменяет некоторые метаданные файловой системы о файле, не делая недействительными открытые дескрипторы. Поэтому, когда ОС переходит на страницу с большим количеством кода, она просто использует дескриптор файла, который у нее уже открыт.

Замена файла (перезапись его содержимого) - это совсем другое дело, и я предполагаю, что ОС открывается с установленным флагом FILE_SHARE_WRITE, поэтому другие процессы не могут записывать в файл .exe.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...