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

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

Как загрузить файл exe в память полностью? [D7, WinXP]


Woolen ©   (2004-10-13 10:21:00) 

Кто знает, подскажите как сделать так, чтобы exe полностью загружался в память и подгрузка не требовалась? Возможно есть другие решения задачи... Она состоит в следующем: продукт должен размещаться на дисках CD, в колличестве не стеснен (думаю, будет штук 10), при этом DVD недопустим и установка софта на жесткий диск тоже. Я предполагаю, что exe можно как-то загрузить полностью с первого CD. Если это так, подскажите, как это сделать. Спасибо.


-SeM-   (2004-10-13 18:03:00) [1]

Woolen ©   (13.10.04 17:43) [18]

Встретиться может что угодно.
Чтобы найти PE-заголовок нужно перейти по смещению, указанном в значением e_lfanew.

ЗЫ А вообще не плохо было бы почитать о структуре РЕ-файла.


Woolen   (2004-10-13 17:43:00) [2]

Понял свою ошибку. Виндовый екзешник начинается после досовского. Но как найти начало виндового экзешника? Может ли до его начала встретиться 'PE'#0#0?


Woolen   (2004-10-13 16:12:00) [3]

Опять ступор... Может я неправильно понимаю?
Думал написать прогу для выставления этого флага. Решил начать с того, чтобы найти этот флаг. Неи нашел. Думал, просмотреть в отладчике, что оттуда читается в поток. Решил сделать так:

FS: TFileStream;
INH: TImageNtHeaders;

ZeroMemory(@INH,SizeOf(INH));
if OpenExeDialog.Execute then
 begin
 FS := TFileStream.Create
  (OpenExeDialog.FileName,fmOpenReadWrite);
 FS.Read(INH.Signature,SizeOf(INH.Signature));
 FS.Read(INH.FileHeader,SizeOf(INH.FileHeader));
 FS.Free;
 end;

В отладчике после этого Characteristics = 0. Только я собирал екзешник в VS и в параметрах компоновщика явно выставил опцию Swap Run From CD, которая и отвечает у мелкомягких за вставку этого флага. Что я делаю не так? Может экзешник начинается не так, как я себе представляю?


Lin7   (2004-10-13 14:33:00) [4]


> SammIk ©   (13.10.04 14:20) [15]

Я могу ошибаться, но по-моему при запуске EXE-шника с дискеты винда копирует его во временный файл и запускает этот файл с винта. - это заложено в винде.


SammIk   (2004-10-13 14:20:00) [5]

Если не использовать длл'ки с тогоже диска что и прога, то работает. Проверял на дискете. С длл'ками просто не пробовал.
Но наверное если установить им выше названные флаги, то будет работать.


-SeM-   (2004-10-13 13:51:00) [6]

Woolen ©   (13.10.04 13:24) [13]


> Есть ли способ этот флаг туда добавить при написании программы на Delphi?

Вряд ли ...


> Может быть, после компиляции?

Ага любым редактором PE-файлов :)


> воспринимает ли система компакт-диск как REMOVABLE при загрузке
> исполняемого файла?

На это ответить нечего. Знаний не хватает. Может Мастера объяснят?

Еще как вариант - пожать екзешник упаковщиком. Говорят он потом весь в память грузится ;)


Woolen   (2004-10-13 13:24:00) [7]


> Как предположение: а IMAGE_NT_HEADERS - IMAGE_FILE_HEADER
> - Characteristics Run from swap (removeable & net) случаем
> не поможет?

Спасибо огромное! Идея свехценная. Ведь в винде действительно предусмотрен мой случай! Я и не догадывался, что там есть такой флаг как IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP! Еще один вопрос. Ведь Delphi сама не позволяет изменять флаги в IMAGE_FILE_HEADER. Есть ли способ этот флаг туда добавить при написании программы на Delphi? Может быть, после компиляции? И еще, воспринимает ли система компакт-диск как REMOVABLE при загрузке исполняемого файла?


-SeM-   (2004-10-13 12:57:00) [8]

Как предположение: а IMAGE_NT_HEADERS - IMAGE_FILE_HEADER - Characteristics Run from swap (removeable & net) случаем не поможет?


Erik1   (2004-10-13 12:54:00) [9]

Тогда только хакерские способы, например засунуть часть своего кора в Explorer, с помощю CreateRemoteThread. И следить за удалением нужных файлов. Или вовсе экстремальные способы как забратся в ring 0 как драйвер работать с файловай системой, отслеживать завершение процеса и выполнять зачистку. Еще способ: можно реагировать на собщения WM_CLOSE и пр... и производить выход с удалением. Такой код есть, могу поделится, едесь на форуме проходил.


Erik1   (2004-10-13 12:54:00) [10]

Тогда только хакерские способы, например засунуть часть своего кора в Explorer, с помощю CreateRemoteThread. И следить за удалением нужных файлов. Или вовсе экстремальные способы как забратся в ring 0 как драйвер работать с файловай системой, отслеживать завершение процеса и выполнять зачистку. Еще способ: можно реагировать на собщения WM_CLOSE и пр... и производить выход с удалением. Такой код есть, могу поделится, едесь на форуме проходил.


Woolen   (2004-10-13 12:15:00) [11]


> Не знаю как там насчет таск мэнеджера, но можно пойти извращенным
> путем:
> прописать в реестре в ветке RunOnce путь к батнику во временной
> папке винды. Этот батник при следующей перезагрузке удалит
> все файлы и себя вместе с ними...

Это точно извращение.
Можно удалять файлы и без батника, а просто одной коммандой. Такой пример есть в FAQ. Комманда выглядит как: 'command.com /c del FILENAME.EXT'. Видимо под EXT подразумевали EXE. Это чуть менее извращенный способ. А, вообще, для этого есть функция MoveFileEx. Одна из ее функций - удаление файлов при перезагрузке (к сожалению, только в ОС с ядром из семейства NT).
Но выше перезагрузка уже обсуждалось. Это не проблема. Проблема - отруб экзешника без перезагрузки.
После того, как диск извлечен - ничего не должно оставаться.


DeadMeat   (2004-10-13 11:51:00) [12]

Не знаю как там насчет таск мэнеджера, но можно пойти извращенным путем:
прописать в реестре в ветке RunOnce путь к батнику во временной папке винды. Этот батник при следующей перезагрузке удалит все файлы и себя вместе с ними...


Woolen   (2004-10-13 11:25:00) [13]


> Значит, ТЗ составлена неправильно или же тебе придется писать
> свою ОС.

Не я придумал. ТЗ писали под заказчика и вовсе не я. Если бы все от меня зависело, я бы такого, мне кажется, не придумал.

> Как вариант, предлагаю после запуска распаковщика (назовем
> его так) из временной директории сразу же запускать функцию
> MoveFileEx с указанием пути распаковщика и с флагом MOVEFILE_DELAY_UNTIL_REBOOT
> - в этом случае удаление программы отложится до перезагрузки.

Спасибо за совет. К сожалению, если exe срубить из Task Manager, то файлы останутся до перезагрузки. Этого быть не должно.


BiN   (2004-10-13 10:52:00) [14]

..Если произойдет перезагрузка, то он там останется и не будет удален, а это противоречит требованиям ТЗ

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


Woolen   (2004-10-13 10:46:00) [15]


> Подобные программы (например, инсталяторы) копируют загрузчик
> (распаковщик) во временную папку, а затем уже запрашивают
> данные с дисков.

Если произойдет перезагрузка, то он там останется и не будет удален, а это противоречит требованиям ТЗ. Заказчик хочет, чтобы никаких файлов на компьютере не оставалось в явном виде. Даже при выключении электричества.

> Я так понял, что проблема в невозможности вставить все CD
> одновременно? :)

Примерно так. Если быть точным, проблема в невозможности вставить одновременно CD с программой и CD с данными, которые должны быть отображены. По требованию ТЗ все должно работать на компьютерах с одним приводом CD.


Дмитрий Ботвин   (2004-10-13 10:44:00) [16]

Тогда тока скопировать его, как сказано выше, во временную папку,
например винды, и запускать от туда


Woolen   (2004-10-13 10:38:00) [17]


> Ты это хочешь программно сделать, т.е. запустить чей-то
> ехе-файл. Или про свой ехе-шник говоришь???

Свой. Он, по моей задумке (пока что я думаю именно так), должен размещаться на первом CD, но отображать данные с разных CD и требовать и вставки по мере необходимости.


BiN   (2004-10-13 10:33:00) [18]

Подобные программы (например, инсталяторы) копируют загрузчик (распаковщик) во временную папку, а затем уже запрашивают данные с дисков.
Я так понял, что проблема в невозможности вставить все CD одновременно? :)


Дмитрий Ботвин   (2004-10-13 10:31:00) [19]

Ты это хочешь программно сделать, т.е. запустить чей-то ехе-файл. Или про свой ехе-шник говоришь???


Наверх

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