![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Хранение данных в EXE... [D6, Win95/98, Win2k, WinXP]
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...
или как вариант - дописывать с сигнатурой в конец екзешника - сигнатура, потом данные и служ. инфо (размер всего, размер ориг екзешника и размер данных).... служебная информация нужна для проверки целостности и для корректного извлечения данных из файла...