Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Пн дек 11, 2017 8:52 am

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 27 сообщений ]  На страницу 1 2 След.
Автор Сообщение
 Заголовок сообщения: Использование archiver.obj
СообщениеДобавлено: Ср май 22, 2013 3:48 pm 
Не в сети

Зарегистрирован: Пн май 20, 2013 12:51 pm
Сообщения: 7
Здравствуйте! Недавно начал пробовать писать под Колибри... Возник вопрос.

Цель: из архива формата zip один файл, имя которого и расположение в архиве известно и всегда одинаково, разархивировать в /tmp1/1 (я так понял, можно использовать как временную папку именно этот путь).

Средства: как я понимаю, это можно сделать с помощью archiver.obj. На настоящий момент написано не так уж много))
Код:
mcall 68, 19, arch
arch db '/rd/1/Lib/Archiver.obj',0

в памяти посмотрено на таблицу импорта, с адресами и именами функций.

Вопрос: что делать дальше? Расширенный вопрос: как, не изучая всех исходников (как я понимаю, http://websvn.kolibrios.org/listing.php ... f1d66fd3cf ), воспользоваться библиотекой для разархивации, если справочка (там же) есть только по разархивации кусков данных в памяти? В принципе, можно засесть за разбор структуры зипа, и приспособить то, что имеется в справочке, для нужных целей, но... Это же сложно, как я понимаю, требуемый функционал уже реализован, вопрос — как им воспользоваться...

Заранее спасибо за ответы.

_________________
колибри летает лучше пингвина, а пингвин летает, только если его пнуть


Вернуться к началу
 Заголовок сообщения: Re: Использование archiver.obj
СообщениеДобавлено: Ср май 22, 2013 4:01 pm 
Не в сети
Kernel Developer

Зарегистрирован: Вс фев 10, 2013 12:37 pm
Сообщения: 2329
1) Из примеров только KFAR и документации нет, так как другие программы используют только процедуру распаковки применяемую для PNG файлов - насколько мне это известно.
2) Я бы не стал рассчитывать на наличие /tmp1/1. Перед применением лучше проверить наличие директории ее чтением и проверить код ошибки, если нет то можно показать, например, OpenDialog.

_________________
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!


Вернуться к началу
 Заголовок сообщения: Re: Использование archiver.obj
СообщениеДобавлено: Ср май 22, 2013 4:17 pm 
Не в сети

Зарегистрирован: Пн май 20, 2013 12:51 pm
Сообщения: 7
В принципе, можно нужный файл распаковать прямо в память)) Всё равно его потом (по алгоритму) надо будет загрузить в память, а с диска удалить)) Остаётся вопрос, как это сделать :) для разбора чужого кода у меня скиллов не хватает.

_________________
колибри летает лучше пингвина, а пингвин летает, только если его пнуть


Вернуться к началу
 Заголовок сообщения: Re: Использование archiver.obj
СообщениеДобавлено: Ср май 22, 2013 4:40 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Чт сен 03, 2009 1:52 pm
Сообщения: 1601
Dartess, интерфейс плагинов kfar описан в http://websvn.kolibrios.org/filedetails ... %2Fapi.txt . Тебе нужно его прочитать с точки зрения "что бы я сделал, если бы был kfar'ом". Вызвать функцию plugin_load, передав ей указатель на структуру с функциями, читающими zip-архив. Вызвать функцию OpenFilePlugin, которая откроет zip-архив. Вызвать функцию open, которая откроет файл внутри zip-архива. Прочитать данные функцией read, сделать с ними что-нибудь. Потом закрыть всё, что наоткрывал, в обратном порядке.

_________________
Сделаем мир лучше!


Вернуться к началу
 Заголовок сообщения: Re: Использование archiver.obj
СообщениеДобавлено: Ср май 22, 2013 8:45 pm 
Не в сети

Зарегистрирован: Пн май 20, 2013 12:51 pm
Сообщения: 7
CleverMouse писал(а):
Вызвать функцию plugin_load, передав ей указатель на структуру с функциями, читающими zip-архив.

Загрузить .obj, получить указатель на структуру с функциями, читающими zip-архив, после чего найти в структуре адрес функции plugin_load, и вызвать её, передав тот самый указатель на структуру с функциями, читающими zip-архив, в которой надо было найти адрес функции plugin_load, которую мы вызываем с параметром виде указателя на структуру с функциями, полученную при загрузке .obj?

_________________
колибри летает лучше пингвина, а пингвин летает, только если его пнуть


Вернуться к началу
 Заголовок сообщения: Re: Использование archiver.obj
СообщениеДобавлено: Ср май 22, 2013 8:47 pm 
Не в сети

Зарегистрирован: Пн сен 24, 2007 11:11 am
Сообщения: 2814
Я так думаю, что нужно вызвать plugin_load со структурой, которая указана в справке - то есть с указателями на open, close, read, malloc, free и так далее, а после этого просто вызывать остальные функции archiver.obj. Верно?


Вернуться к началу
 Заголовок сообщения: Re: Использование archiver.obj
СообщениеДобавлено: Ср май 22, 2013 8:58 pm 
Не в сети

Зарегистрирован: Пн май 20, 2013 12:51 pm
Сообщения: 7
Значит, я не понял про структуру :) попробую вникнуть в справочку, спасибо за ответы.

С другой стороны, я не знаю, как получить структуру
SoUrcerer писал(а):
с указателями на open, close, read, malloc, free и так далее

, ибо в archiver.obj функций явно намного меньше...)

Кажется, я бред несу, просьба не воспринимать всерьёз :P

_________________
колибри летает лучше пингвина, а пингвин летает, только если его пнуть


Вернуться к началу
 Заголовок сообщения: Re: Использование archiver.obj
СообщениеДобавлено: Ср май 22, 2013 10:18 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Чт сен 03, 2009 1:52 pm
Сообщения: 1601
Dartress, самому написать её.

_________________
Сделаем мир лучше!


Вернуться к началу
 Заголовок сообщения: Re: Использование archiver.obj
СообщениеДобавлено: Ср май 22, 2013 11:06 pm 
Не в сети
Designer
Аватара пользователя

Зарегистрирован: Чт янв 25, 2007 3:33 pm
Сообщения: 4227
Давно хотел сам этот вопрос поднять. Спасибо, есть надежда, что когда-то и в Эолайте появится распаковка архивов.

_________________
Через тернии к звездам


Вернуться к началу
 Заголовок сообщения: Re: Использование archiver.obj
СообщениеДобавлено: Ср май 22, 2013 11:20 pm 
Не в сети

Зарегистрирован: Пн май 20, 2013 12:51 pm
Сообщения: 7
CleverMouse писал(а):
Dartress, самому написать её.

Написать то - понятно. А заполнять надо? Я не понимаю сути функции этой. Если ей нужна заполненная функция - смотреть память, искать, какие функции есть, и их адреса записывать в структуру? Немного бред) Или же эта функция сама должна записывать структуру?)

_________________
колибри летает лучше пингвина, а пингвин летает, только если его пнуть


Вернуться к началу
 Заголовок сообщения: Re: Использование archiver.obj
СообщениеДобавлено: Ср май 22, 2013 11:29 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Чт сен 03, 2009 1:52 pm
Сообщения: 1601
Dartess, и все функции, на которые она ссылается, тоже написать. plugin_load выражает "kfar - плагину: я kfar такой-то версии, у меня есть такие-то функции, вот, я их собрал в структуру, можешь их вызывать, приём".

_________________
Сделаем мир лучше!


Вернуться к началу
 Заголовок сообщения: Re: Использование archiver.obj
СообщениеДобавлено: Чт май 23, 2013 1:31 am 
Не в сети

Зарегистрирован: Пн май 20, 2013 12:51 pm
Сообщения: 7
но ведь plugin_load находится в одной библиотеке с "плагином" ? О_о
это жесть получается...
но хотя бы я смогу вызывать их после этого не по адресам, а через эту структуру?)

upd: а данная библиотека позиционируется как "личная" kfar'а, или же всё же как общесистемная? Если второе, то, может, имеет смысл вставить её структуру в 'STRUCT.INC'?

_________________
колибри летает лучше пингвина, а пингвин летает, только если его пнуть


Вернуться к началу
 Заголовок сообщения: Re: Использование archiver.obj
СообщениеДобавлено: Чт май 23, 2013 2:41 am 
Не в сети

Зарегистрирован: Пн май 20, 2013 12:51 pm
Сообщения: 7
Как понял я: нужно создать структуру, аналогичную описанной тут: http://websvn.kolibrios.org/filedetails ... %2Fapi.txt
После чего заполнить её адресами функций. но вот где такие взять?) Содержимое archiver.obj и полей структуры практически не пересекается. В общем, вот...

Спойлер: Показать
Код:
include "MACROS.INC"
include "PROC32.INC"

struc FORARCH StructSize, kfar_ver, open, open2, read, write, seek, tell, flush, filesize, close, pgalloc, pgrealloc, pgfree, getfreemem, pgalloc2, pgrealloc2, pgfree2, menu, menu_centered_in, DialogBox, SayErr, Message, hzchto{
   .StructSize         dd StructSize   
   .kfar_ver         dd kfar_ver      
                           
   .open            dd open       
   .open2            dd open2      
   .read            dd read       
   .write            dd write      
   .seek            dd seek       
   .tell            dd tell       
   .flush            dd flush      
   .filesize         dd filesize      
   .close            dd close      
                           
   .pgalloc         dd pgalloc      
   .pgrealloc         dd pgrealloc   
   .pgfree          dd pgfree      
   .getfreemem         dd getfreemem   
   .pgalloc2         dd pgalloc2      
   .pgrealloc2         dd pgrealloc2   
   .pgfree2         dd pgfree2     
                           
   .menu            dd menu
   .menu_centered_in   dd menu_centered_in
   .DialogBox         dd DialogBox
   .SayErr          dd SayErr
   .Message         dd Message
   .hzchto          dd hzchto
   }

MEOS_APP_START

CODE
mcall 68, 19, arch
mov ebx, [eax+open*8+4]
mov [info.open], ebx
mov ebx, [eax+read*8+4]
mov [info.read], ebx
mov ebx, [eax+close*8+4]
mov [info.close], ebx
stdcall dword [eax+plugin_load*8+4], info
mcall -1

DATA
version          = 0
plugin_load         = 1
OpenFilePlugin      = 2
ClosePlugin         = 3
ReadFolder         = 4
SetFolder         = 5
GetFiles         = 6
GetOpenPluginInfo   = 7
getattr          = 8
open            = 9
read            = 10
setpos            = 11
close            = 12
deflate_unpack      = 13
deflate_unpack2    = 14
arch   db '/rd/1/Lib/Archiver.obj', 0
info   FORARCH 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
UDATA

MEOS_APP_END


И чует мой неопытный в этих делах мозг, что что-то тут не так... В описании функции говорится, что функция возвращает 0, 1 или 2. 0 в случае успеха. Если возвращает в eax - то всё так :mrgreen: но что-то мне не верится в это)

_________________
колибри летает лучше пингвина, а пингвин летает, только если его пнуть


Вернуться к началу
 Заголовок сообщения: Re: Использование archiver.obj
СообщениеДобавлено: Пн окт 24, 2016 4:39 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Пн окт 27, 2008 10:10 pm
Сообщения: 751
Очень хотелось чтобы в библиотеке archiver были функции сжатия deflate.
В библиотеке zlib 1.2.8 есть сжатие deflate. Я пробовал переписать функции из этой библиотеки, но пока что безуспешно.
Даю пример тестовой библиотеки и 2-х примеров. В 1-ом примере сжимается блок памяти с нулями, во 2-м сжимается память с куском текста. Проблема в том что обратное разархивирование не работает. Скорее всего что есть глюки. На доску отладки можно выводить структуры zstream и deflate_state. Должно работать сжатие с уровнем 0 и 1. (Уровни сжатия от 2 до 9 пока не поддерживаются)
Если кто может чем помочь в обнаружении ошибок буду рад.


Вложения:
zlib.zip [114.55 КБ]
15 скачиваний
Вернуться к началу
 Заголовок сообщения: Re: Использование archiver.obj
СообщениеДобавлено: Вт окт 25, 2016 12:22 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Пн окт 27, 2008 10:10 pm
Сообщения: 751
Нашел интересную статью здесь:
http://www.manhunter.ru/underground/165 ... s_php.html
Там один человек на fasm-е подключает библиотеку zlib для тестирования сжатия строки текста.
Можно будет это использовать для сравнения моей версии библиотеки с виндосовской для выявления ошибок.
Обнаружил что если в функцию deflate_unpack подавать не весь закодированный массив а отнять от него первые 2 байта и последние 4 (для crc32) то иногда даже происходит правильное разархивирование строки. Только размер пока не совпадает. Так что есть надежда что удастся довести эту библиотеку до ума.


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 27 сообщений ]  На страницу 1 2 След.

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB