Произвести запись в исполяемый файл

Тема в разделе "WASM.WIN32", создана пользователем Praetor11, 18 сен 2010.

  1. Praetor11

    Praetor11 New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2009
    Сообщения:
    80
    Всем доброго времени суток!

    Открываю здесь эту тему потому что поиском по форуму ничего ен обнаружил (хотя может быть и не те слова для поиска подбирал), но все же. У меня возникла необходимость произвести запись непосредственно в запущенный исполняемый файл (ну т.е. как бы писать в собственный образ), но открыть файл ещё раз не получается, т.к. по умолчанию он считается открытым этим же процессом.

    Я так понимаю, что если мой процесс уже открыл исполняемый файл, значит в таблице открытых файлов (или в таблице дескрипторов) должен быть дескриптор этого файла (ведь ProcessExplorer его находит!!!), стало быть задача сводится к тому, чтобы этот дескриптор найти, зная путь и имя файла, дескриптор которого мы ищем.

    Ну в общем одна задача, вылилась в подзадачу. Может быть кто-то знает кк разрешить первое, ну или второе.

    P.S.: Не спрашивайте зачем мне нужно писать в файл собственного образа...Знаю что это глупо но надо)
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    поищи не на форуме, а на сайте по словам "3 метода работы с занятыми файлами"
     
  3. Praetor11

    Praetor11 New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2009
    Сообщения:
    80
    Я это нашел почти сразу. Но там обратная задача, и тем более для чужого процесса. Там имеют дескриптор, и получают имя файла. А я знаю имя файла, мне нужно найти дескриптор. Хотя в прицнипе можно получить все дескрипторы своего процесса, и тупо перебирать их на соотвествие имени файла. Но: мне не нужно дублировать дескриптор, потому что он итак принадлежит моему процессу, мне нужно разве что поставить там режим sharemode в ReadWrite и открыть файл ещё раз. Или же использовать этот дескриптор как он есть, но я не знаю, читается ли файл образа после того как он был спроецирован в память процесса. Если нет - то я могу прямо работать с уже существующим дескриптором. В любом случае я начну то что написано в этой статье, но тему не считаю закрытой.
     
  4. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Как вариант задача обновления запущенного ехе файла.
    Код (Text):
    1. WCHAR BUF[MAX_PATH],NEW_FILE[MAX_PATH]={0};
    2. //получаем имя программы
    3. GetModuleFileName(GetModuleHandle(NULL),BUF,sizeof(BUF));
    4. wcscat(NEW_FILE,BUF);
    5. wcscat(NEW_FILE,TEXT(".bak"));
    6. MoveFileEx(BUF,NEW_FILE,MOVEFILE_REPLACE_EXISTING);
    7. //теперь мы можем спокойно создать файл с именем программы
    8.  
    9. //скачиваем новую версию и сохраняем ее.
    10. DownloadAndSave(BUF,URL);
    11.  
    12. //делаем перезапуск программы
    13. ShellExecute(NULL,TEXT("open"),BUF,TEXT("-updated"),NULL,SW_SHOW);
    14.  
    15. //удаляем старую версию после перезагрузки
    16. MoveFileEx(NEW_FILE,NULL,MOVEFILE_REPLACE_EXISTING|MOVEFILE_DELAY_UNTIL_REBOOT);
     
  5. Praetor11

    Praetor11 New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2009
    Сообщения:
    80
    Спасибо за предложение. Но вот именно цель, для которой я собираюсь писать в исполняемый файл, не дает мне сделать так как вы говорите. Я ведь не трояна делаю и не вирус, и перезапуска программы я допустить не могу к сожалению.

    Насчет статьи "3 способа работы с занятыми файлами". К сожалению способ с изменением приоритета доступа дескриптора через драйвер отпадает для моей задачи сразу (т.к. это юзер-мод приложение, и не гоже ему лепить свои дрова на ОС), а вот дескриптор я файла я получил. Правда теперь не знаю чего с ним делать)) Может быть заюзаю мега способ через прямую работу с диском. Но это изврат для того, чтобы подправить 3-4 байта файла..

    Ладно, спрошу ещё вот такой вопрос у всих: Зачем после запуска процесса и проецирования образа исполняемого файла в память этого процесса, сам исполняемый файл остается открытым до завершения этого процесса?? Какой в этом вообще смысл, если проецирование образа скажем происходит сразу и целиком, а обращения к ресурсам исполняемого файла в работе программы не происходит?
     
  6. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Смысл проецирования в том и заключается, что файл загружается в оперативную память не "сразу и целиком", а постранично по мере реального обращения к конкретным страницам. А также при нехватке памяти страницы могут быть просто и безболезненно выброшены из ОЗУ и затем подгружены заново по первому требованию