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

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

Хранение данных в EXE... [D6, Win95/98, Win2k, WinXP]


Страницы:   1 2

MetalFan ©   (2004-06-23 17:01:00) 

как можно читать/писать в ресурс EXE файла.
сочиняю нечто типа SFX архива.
подскажите, в какую сторону двигаться?!
спасибо за внимание!


8ung   (2004-06-23 20:17:00) [21]


> MetalFan ©   (23.06.04 17:46) [7]
> а вот еще вопросик!
> можно ли запустить EXE на выполнение не сохраняя его на
> диске?
> типа вытащили "засунутуй" exe (например в memorystream)и
> сразу запустили...

Теоретически(скорей всего и практически) невозможно, я тоже хоте добиться этого(и, кажись, даже знаю, зачем тебе это)


MetalFan   (2004-06-23 17:46:00) [22]

а вот еще вопросик!
можно ли запустить EXE на выполнение не сохраняя его на диске?
типа вытащили "засунутуй" exe (например в memorystream)и сразу запустили...


MetalFan   (2004-06-23 17:28:00) [23]


> wicked ©   (23.06.04 17:23) [5]

big thnx! буду разбираться!


wicked   (2004-06-23 17:23:00) [24]

пример на cbuilder'е....
запись:
bool __fastcall MergeStreams(TStream * deststream, TStream * exestream, TStream * albumstream)
{
int albumsize = albumstream->Size;
bool result = true;
try{
 deststream->CopyFrom(exestream, 0);
 deststream->CopyFrom(albumstream, albumsize);
 MergeStreamsData(deststream, exestream->Size, albumstream->Size);
}
catch(...){
 result = false;
}
return result;
}

bool __fastcall MergeStreamsData(TStream * deststream, int exesize, int albumsize)
{
int totalsize = exesize + albumsize + sizeof(int) * 3;
bool result = true;
try{
 deststream->Write(&totalsize, sizeof(int));
 deststream->Write(&exesize, sizeof(int));
 deststream->Write(&albumsize, sizeof(int));
}
catch(...){
 result = false;
}
return result;
}


здесь MergeStreams соединяет два потока, а MergeStreamsData - дописывает нужную информацию в конец файла...

проверка правильности потока (возвращает размер присоединенных данных):
int __fastcall EXEValidStream(TStream * stream)
{
int totalsize = 0, exesize = 0, albumsize = -1;
int orgpos = stream->Position;
try{
 int pos = stream->Seek(-((signed int)(sizeof(int)*3)), soFromEnd);
 stream->Read(&totalsize, sizeof(int));
 stream->Read(&exesize, sizeof(int));
 stream->Read(&albumsize, sizeof(int));
 if(totalsize != (exesize + albumsize + ((signed int)sizeof(int) * 3)))
  albumsize = -1;
 else {
  pos -= albumsize;
  stream->Position = pos;
// тут начинается проверка сигнатуры, skipped....
 }
}
catch(...){
 albumsize = -1;
}
stream->Position = orgpos;
return albumsize;
}


чтение данных:
TCustomMemoryStream * __fastcall GetAlbumStream(TCustomMemoryStream * stream)
{
if(!stream) return NULL;

int albumsize = EXEValidStream(stream);
TCustomMemoryStream * result = NULL;
try{
 if(albumsize < 0) result = stream;
 else {
  void * start = ((char *)stream->Memory) + ((int)stream->Size - (albumsize + (sizeof(int) * 3)));
  result = new TwacROMemoryStream(start, albumsize);
 }
}
catch(...){
 if(result != stream){
  delete result;
 }
 result = NULL;
}
return result;
}


здесь TwacROMemoryStream - read-only поток в памяти с адресом start и размером albumsize....

во всех примерах читать album, как "данные".... ;)


MetalFan   (2004-06-23 17:18:00) [25]


> Значит exe будешь формировать "с нуля"?

ну не так сложно...
мысль двигается так: пишется некий екзешник-обертка, который будет уметь "извлекать" из себя хранимый exeшник, запускать его, ждать закрытия и прибиваться) а другая прога должна будет уметь "засунуть" любой файл в "обертку". воть)
какие будут советы?


evvcom   (2004-06-23 17:09:00) [26]


> сочиняю нечто типа SFX архива

Значит exe будешь формировать "с нуля"? Тогда ищи формат исполняемых файлов (формат PE).


MetalFan   (2004-06-23 17:07:00) [27]


> дописывать с сигнатурой в конец екзешника

а пример можно где-нибудь подсмотреть?


wicked   (2004-06-23 17:05:00) [28]

BeginUpdateResource/UpdateResource/EndUpdateResource...
но работает тока на NT...

или как вариант - дописывать с сигнатурой в конец екзешника - сигнатура, потом данные и служ. инфо (размер всего, размер ориг екзешника и размер данных).... служебная информация нужна для проверки целостности и для корректного извлечения данных из файла...


Страницы:   1 2

Наверх

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