Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

CreateProcess в памяти [D6, Win95/98, WinME, Win2k]


Samael6 ©   (2003-05-11 13:19:00) 

Здравствуйте, Мастера!
У меня такая проблема: нужно загрузить ЕХЕ-файл в память и там его выполнить . Причем приходится переписовать часть стандартного загрузчика, чтобы прога запускалась из памяти. С загрузкой ЕХЕшника проблем нет, а вот как его потом там выполнить незнаю. Поможите?


Samael6   (2003-05-13 10:24:00) [1]

Поясни, что следует понимать под "загрузить ЕХЕ-файл в память и там его выполнить". Стартовать из твоей проги или что-то иное?

Да, просто стартовать из своей проги, но не с диска! :)

Спасибо за разъяснения, а нет ли у кого-нибудь примеров практической реализации вопроса? Буду очень благодарен!
Заранее благодарен.


NightAngel   (2003-05-13 03:05:00) [2]

> Morfein © (12.05.03 02:47)
Ну таки программа - это не процедура! Просто так передать управление не выйдет хотя бы потому, что две программы по одному TSS работать не будут... а чтобы создать TSS, нужно добавить запись в GDT, а для этого надо привилегии нулевого кольца. Всё вышесказанное - ИМХО. Поправьте, если не прав...


Код любой Dll исполняется в контексте вызвавшего её процесса, а это тот-же PE файл (специфичный, конечно, но структура та-же).
А TSS (Task State Segment) - это всего лишь структура данных, которая определяет состояние (т.е. контекст) задачи. В ней хранится содержимое всех регистров общего назначения, сегментных и некоторых системных регистров а также некоторая дополнительная информация и используется для сохранения и восстановления состояния задачи (при переключении задач) и ничего более.


Vit@ly   (2003-05-12 19:58:00) [3]

2 Samael6 © (11.05.03 13:19)
Поясни, что следует понимать под "загрузить ЕХЕ-файл в память и там его выполнить". Стартовать из твоей проги или что-то иное?


Morfein   (2003-05-12 02:47:00) [4]

Ну таки программа - это не процедура! Просто так передать управление не выйдет хотя бы потому, что две программы по одному TSS работать не будут... а чтобы создать TSS, нужно добавить запись в GDT, а для этого надо привилегии нулевого кольца. Всё вышесказанное - ИМХО. Поправьте, если не прав...


NightAngel   (2003-05-12 02:19:00) [5]

> Samael6 © (11.05.03 13:19)
А чем не устраивает CreateProcess()?

> нужно загрузить ЕХЕ-файл в память и там его выполнить.
Принципиальных ограничений здесь нет.
Программы в формате PE в памяти, НЕ СООТВЕСТВУЮТсвоему образу на диске. Например, экзешник для DOS"а загружается в память КАК ЕСТЬ - то есть, если побайтно эмулировать его работу (не загружая его в память), то все смещения и переходы будут указывать в нужное место. Для PE файлов это не так. PE программа грузится в память вместе со всеми заголовками. Секции в файле на диске обычно выровнены на размер сектора, в памяти на размер страницы. Это нужно будет учесть при загрузке файла. В запускаемом файле должна присутствовать таблица фиксапов (секции .reloc или .fixup). Если нет - будут проблемы. Значение Image Base, то есть адрес по которому будет загружен PE файл, должно быть выравнено на границу 64 Кб (10000h).

Далее как запустить:
1. Считать файл в память выровнив заголовки и секции.
2. Перенастроить все VA адреса в программе (в соответствии с информацией в секциии .reloc или .fixup).
3. Загрузить все используемые библиотеки и настроить импорт.
4. Если есть Tls callback, то пройти по списку функций.
5. Передать управление программе по Entry point RVA - адрес, относительно Image Base по которому передается управление при запуске программы (предварительно настроив все регистры общего назначения).


MBo   (2003-05-11 16:05:00) [6]

Забудь пока что


Наверх

Титульная страница Поиск, карта сайта Написать письмо