Всем доброго времени суток! Открываю здесь эту тему потому что поиском по форуму ничего ен обнаружил (хотя может быть и не те слова для поиска подбирал), но все же. У меня возникла необходимость произвести запись непосредственно в запущенный исполняемый файл (ну т.е. как бы писать в собственный образ), но открыть файл ещё раз не получается, т.к. по умолчанию он считается открытым этим же процессом. Я так понимаю, что если мой процесс уже открыл исполняемый файл, значит в таблице открытых файлов (или в таблице дескрипторов) должен быть дескриптор этого файла (ведь ProcessExplorer его находит!!!), стало быть задача сводится к тому, чтобы этот дескриптор найти, зная путь и имя файла, дескриптор которого мы ищем. Ну в общем одна задача, вылилась в подзадачу. Может быть кто-то знает кк разрешить первое, ну или второе. P.S.: Не спрашивайте зачем мне нужно писать в файл собственного образа...Знаю что это глупо но надо)
Я это нашел почти сразу. Но там обратная задача, и тем более для чужого процесса. Там имеют дескриптор, и получают имя файла. А я знаю имя файла, мне нужно найти дескриптор. Хотя в прицнипе можно получить все дескрипторы своего процесса, и тупо перебирать их на соотвествие имени файла. Но: мне не нужно дублировать дескриптор, потому что он итак принадлежит моему процессу, мне нужно разве что поставить там режим sharemode в ReadWrite и открыть файл ещё раз. Или же использовать этот дескриптор как он есть, но я не знаю, читается ли файл образа после того как он был спроецирован в память процесса. Если нет - то я могу прямо работать с уже существующим дескриптором. В любом случае я начну то что написано в этой статье, но тему не считаю закрытой.
Как вариант задача обновления запущенного ехе файла. Код (Text): WCHAR BUF[MAX_PATH],NEW_FILE[MAX_PATH]={0}; //получаем имя программы GetModuleFileName(GetModuleHandle(NULL),BUF,sizeof(BUF)); wcscat(NEW_FILE,BUF); wcscat(NEW_FILE,TEXT(".bak")); MoveFileEx(BUF,NEW_FILE,MOVEFILE_REPLACE_EXISTING); //теперь мы можем спокойно создать файл с именем программы //скачиваем новую версию и сохраняем ее. DownloadAndSave(BUF,URL); //делаем перезапуск программы ShellExecute(NULL,TEXT("open"),BUF,TEXT("-updated"),NULL,SW_SHOW); //удаляем старую версию после перезагрузки MoveFileEx(NEW_FILE,NULL,MOVEFILE_REPLACE_EXISTING|MOVEFILE_DELAY_UNTIL_REBOOT);
Спасибо за предложение. Но вот именно цель, для которой я собираюсь писать в исполняемый файл, не дает мне сделать так как вы говорите. Я ведь не трояна делаю и не вирус, и перезапуска программы я допустить не могу к сожалению. Насчет статьи "3 способа работы с занятыми файлами". К сожалению способ с изменением приоритета доступа дескриптора через драйвер отпадает для моей задачи сразу (т.к. это юзер-мод приложение, и не гоже ему лепить свои дрова на ОС), а вот дескриптор я файла я получил. Правда теперь не знаю чего с ним делать)) Может быть заюзаю мега способ через прямую работу с диском. Но это изврат для того, чтобы подправить 3-4 байта файла.. Ладно, спрошу ещё вот такой вопрос у всих: Зачем после запуска процесса и проецирования образа исполняемого файла в память этого процесса, сам исполняемый файл остается открытым до завершения этого процесса?? Какой в этом вообще смысл, если проецирование образа скажем происходит сразу и целиком, а обращения к ресурсам исполняемого файла в работе программы не происходит?
Смысл проецирования в том и заключается, что файл загружается в оперативную память не "сразу и целиком", а постранично по мере реального обращения к конкретным страницам. А также при нехватке памяти страницы могут быть просто и безболезненно выброшены из ОЗУ и затем подгружены заново по первому требованию