forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Библиотеки (http://forum.boolean.name/forumdisplay.php?f=28)
-   -   KirpArc - очередной упаковщик (http://forum.boolean.name/showthread.php?t=16531)

Кирпи4 25.03.2012 00:09

KirpArc - очередной упаковщик
 
Вложений: 1
Всем привет.
Выкладываю на ваш суд свой небольшой проектец, плод работы одного дня.

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

З.ы. в проекте формат моделек а-ля MDL, т.е. все ресы и анимации в одном файле.

Кирпи4 25.03.2012 00:11

Ответ: KirpArc - очередной упаковщик
 
Впринципе можно попробовать его на пуряк перегнать, он тогда вообще шустрый будет

Жека 25.03.2012 07:59

Ответ: KirpArc - очередной упаковщик
 
Вложений: 2
Если прогу запустить на семёрке из program files, не как админ, то не работает. С правами администратора работает.

Сначала я подумал, что это из-за того, что ты создаёшь временный файл при загрузке в той же папке проекта, а этого винда не терпит, сделал выгрузку в реальный темп системы
Код:

......
Local temp$ = GetEnv("TEMP")+"\"
st$ = temp + Handle(t)+"Temp"+t\tempc
......

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

Function ARC_Open(file$,pass%)
Local t.tarc = New TArc
f = ReadFile(file$)
If f=0 RuntimeError "ARC Lib:"+Chr(13)+"Can't find archive file!"
SeekFile f,pass+4
t\count = ReadShort(f)
For i=0 To t\count
        t\files$[i] = ReadString(f)
        t\size[i]  = ReadInt(f)
        t\pos[i]  = FilePos(f)
        SeekFile f,FilePos(f)+t\size[i]
        Print ("file = "+t\files[i])
        Print ("size = "+t\size[i])
        Print ("pos = "+t\pos[i])
Next
t\f = f
Return Handle(t)
End Function

я не смог додуматься почему так происходит.
почему?

Ещё: судя по функции ExtractFileName$(sFilePath$) вложенные папки не поддерживаются, точнее одинаковые имена во вложенных папках. зачем это нужно? писал бы весь путь, и искал по целому пути, разницы же нет. :)

Кирпи4 25.03.2012 10:17

Ответ: KirpArc - очередной упаковщик
 
Окей, сегодня попробую исправить все недочёты. А насчёт скорости есть какие-либо замечания?

UPD: Взялся писать папки. Апдейт будет ближе к вечеру.

Жека 25.03.2012 21:24

Ответ: KirpArc - очередной упаковщик
 
Скорость тут зависит от оборотов винта и есть ли антивирус:) проходом по массиву со сравнением строк я думаю можно пренебречь. В реалтайме один фиг никто не грузит в блитце, так что нормально.

Кирпи4 26.03.2012 01:20

Ответ: KirpArc - очередной упаковщик
 
Вложений: 1
Блин, оболочку на B+ я откровенно затрахался писать, поэтому забросил. Пока что буду вести доработку только самого пакера.

Учтены все пожелания, добавлены папки (именно с ними затрах в оболочке). Теперь распаковывает в темп, плюс проверочка на одинаковые файлы в директориях.

Жека 26.03.2012 06:43

Ответ: KirpArc - очередной упаковщик
 
На счёт графического интерфейса: можно и без него; например, паковать путём перетаскивания папки на ехе-шник, и на выходе получать архив имя_папки.arc. Плюс кроме перетаскивания можно сделать файл с настройками, из которого считывать: нужно ли паковать вложенные папки, типы файлов для упаковки или для исключения из упаковки (по расширению), пароли и т.д.

LLI.T.A.L.K.E.R. 27.03.2012 03:09

Ответ: KirpArc - очередной упаковщик
 
Цитата:

Теперь распаковывает в темп
Т.е. можно будет скомуниздить?

Жека 27.03.2012 07:15

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

Платон Александрович 27.03.2012 15:17

Ответ: KirpArc - очередной упаковщик
 
Цитата:

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

Тормозишь процесс каким-нибудь отладчиком (например OllyDBG) на CloseHandle и спокойно все копируешь.

Чтобы можно было читать\писать ресурсы напрямую, без темп-файлов, надо перехватить функции CreateFile ReadFile\WriteFile CloseHandle из Kernel32, т.к. очевидно что внутри всяких LoadMesh и подобных используется I\O сишного рантайма (msvcrt) - обертка над вышеуказанными winapi функциями.
Берешь хендл подгруженной в процесс kernel32
Код:

Kernel32 = GetModuleHandle ( "kernel32.dll" )
получаешь адрес нужной функции
Код:

CreateFileA = GetProcAddress ( Kernel32, "CreateFileA" )
и делаешь редирект на свою аналогичную функцию, например техникой сплайсинга - заменяешь в начале CreateFileA 6 байт
т.е. сохраняешь старые 6 байт (чтобы по окончании восстановить) и пишешь две инструкции
Код:

$63 - push
адрес_твоей_функции
$C3 - ret

Когда процесс вызовет эту функцию, благодаря записаному коду, он перепрыгнет на твою. Например в CreateFile по переданому имени определяешь файл в архиве, и если его нет - восстанавливаешь обратно оригинальные 6 байт и вызываешь родную CreateFile, сразу же заменяешь обратно.

Жека 27.03.2012 17:59

Ответ: KirpArc - очередной упаковщик
 
Там у него удаляются не на закрытии проги, а после загрузки порции картинок, но суть та же.:)

Платон Александрович, кто ты такой?:) Поражаешь меня знанием всяких тонкостей/внутренностей.

Кирпи4 27.03.2012 18:00

Ответ: KirpArc - очередной упаковщик
 
Эмм, а не слишком ли это круто

Платон Александрович 29.03.2012 10:38

Ответ: KirpArc - очередной упаковщик
 
Цитата:

Сообщение от Жека (Сообщение 223794)
Платон Александрович, кто ты такой?:) Поражаешь меня знанием всяких тонкостей/внутренностей.

даж и незнаю что ответить :) Те кто на blitzgames.vov.ru и blitz.pp.ru был меня нарно еще помнят :)


Часовой пояс GMT +4, время: 14:42.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot