Запуск файла из оперативной памяти.

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Eugie, Romeo, Hawk

Вячеслав
Сообщения: 3
Зарегистрирован: 22 ноя 2004, 20:15
Контактная информация:

08 сен 2005, 19:13

Здравствуйте !
Известно, что при помощи функции Win32Api ShellExecute можно например запустить какой либо файл на выполнение, либо открыть файл, если он например является текстовым.
Но как сделать, чтобы можно было запустить файл на выполнение, если он на данный момен находится не на жестком диске, а в оперативной памяти.
Заранее спасибо.
Вячеслав Вадимович Вовк
Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 14:02
Откуда: Минск

09 сен 2005, 15:57

То есть в оперативной памяти ???
любой файл при запуске находится в оперативной памяти.
В SAD - все в SAD.
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

09 сен 2005, 16:34

Самый просто вариант: сохранить на диск в Windows Temp директорию и запустить оттуда. Так, например делает Total Commander с архивами. Вполне приемлемый подход. Чтобы не ломать голову как назвать временный файл и не "испортить" случайно жизнь другим приложениям, предлагаю воспользоваться функцией GetTempFileName.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Вячеслав
Сообщения: 3
Зарегистрирован: 22 ноя 2004, 20:15
Контактная информация:

10 сен 2005, 11:31

Неа, я так уже делал, но это не совсем одходит. Теерь задача как запустить exe файл прямо из оперативной памяти, не сбрасывая его на жесткий диск
Вячеслав Вадимович Вовк
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

12 сен 2005, 11:24

Дело в том, что загрузку выполняемого файла в память выполняет операционная система. Помимо "тупого" копирования данных с диска в оперативку выполняется множество дополнительных действий, как-то: инициализация сегмента данных, стека, кучи, настройка дебаг регистров и ещё куча чёрт знает каких экшенов, некоторые из которых специфичны для конкретной OS. Думаю, даже если получится раздобыть соответствующую доку и ты не поленишься прочитать её и потратить пару месяцев на кодинг, всё равно получившийся продукт будет неимоверно хрупким, всё будет падать при смене OS либо каких-то иных, незадокументированных факторов.

Я бы ни за что не взялся реализовывать системные процессы!
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Eugie
Сообщения: 707
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

13 сен 2005, 01:06

Вячеслав, чтобы представить объем работы, который выполняет системный загрузчик exe-файлов, советую почитать статью М.Питрека http://msdn.microsoft.com/msdnmag/issues/02/02/PE/
bombur
Сообщения: 5
Зарегистрирован: 18 сен 2005, 23:59

20 сен 2005, 01:39

Но если речь идёт о DLL-файле (или запуске кода в адресном пространстве текущего процесса), то вполне можно написать самому полный аналог LoadLibrary. Можно даже автономный ELF-файл загрузить при желании... ;-)
drmist
Сообщения: 32
Зарегистрирован: 03 авг 2004, 22:34

22 сен 2005, 19:51

Вячеслав
Забудь. Невозможно.
Еще никто не реализовал приложение, которое делало бы это вместо ОС.
В каких целях ты собираешься использовать возможность запуска из памяти? ;)
dobrodij
Сообщения: 1
Зарегистрирован: 29 сен 2005, 20:05
Откуда: Украина, Нежин

29 сен 2005, 20:16

вполне можно написать самому полный аналог LoadLibrary
Подскажи плз. где взять документацию по данному вопросу. Или может кто-то подобное уже делал и может дать пару советов? Тема довольно интересна, особенно вызов длл из памяти, а не из файла.
Шануймося
bombur
Сообщения: 5
Зарегистрирован: 18 сен 2005, 23:59

10 окт 2005, 14:44

dobrodij писал(а):Подскажи плз. где взять документацию по данному вопросу.
MSDN: поиск "Pietrek loader", "MapViewOfFile", "PE relocation", "COFF format".
dobrodij писал(а):Или может кто-то подобное уже делал и может дать пару советов?
Я делал ("ручная" загрузка кода из COFF PE, COFF Obj, ELF), и могу помочь, если есть вопросы...
Ответить