Использование archiver.obj

Applications development, KoOS API questions
  • 1) Из примеров только KFAR и документации нет, так как другие программы используют только процедуру распаковки применяемую для PNG файлов - насколько мне это известно.
    2) Я бы не стал рассчитывать на наличие /tmp1/1. Перед применением лучше проверить наличие директории ее чтением и проверить код ошибки, если нет то можно показать, например, OpenDialog.
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • В принципе, можно нужный файл распаковать прямо в память)) Всё равно его потом (по алгоритму) надо будет загрузить в память, а с диска удалить)) Остаётся вопрос, как это сделать :) для разбора чужого кода у меня скиллов не хватает.
    колибри летает лучше пингвина, а пингвин летает, только если его пнуть
  • Dartess, интерфейс плагинов kfar описан в http://websvn.kolibrios.org/filedetails ... %2Fapi.txt . Тебе нужно его прочитать с точки зрения "что бы я сделал, если бы был kfar'ом". Вызвать функцию plugin_load, передав ей указатель на структуру с функциями, читающими zip-архив. Вызвать функцию OpenFilePlugin, которая откроет zip-архив. Вызвать функцию open, которая откроет файл внутри zip-архива. Прочитать данные функцией read, сделать с ними что-нибудь. Потом закрыть всё, что наоткрывал, в обратном порядке.
    Сделаем мир лучше!
  • CleverMouse wrote:Вызвать функцию plugin_load, передав ей указатель на структуру с функциями, читающими zip-архив.
    Загрузить .obj, получить указатель на структуру с функциями, читающими zip-архив, после чего найти в структуре адрес функции plugin_load, и вызвать её, передав тот самый указатель на структуру с функциями, читающими zip-архив, в которой надо было найти адрес функции plugin_load, которую мы вызываем с параметром виде указателя на структуру с функциями, полученную при загрузке .obj?
    колибри летает лучше пингвина, а пингвин летает, только если его пнуть
  • Я так думаю, что нужно вызвать plugin_load со структурой, которая указана в справке - то есть с указателями на open, close, read, malloc, free и так далее, а после этого просто вызывать остальные функции archiver.obj. Верно?
  • Значит, я не понял про структуру :) попробую вникнуть в справочку, спасибо за ответы.

    С другой стороны, я не знаю, как получить структуру
    SoUrcerer wrote:с указателями на open, close, read, malloc, free и так далее
    , ибо в archiver.obj функций явно намного меньше...)

    Кажется, я бред несу, просьба не воспринимать всерьёз :P
    колибри летает лучше пингвина, а пингвин летает, только если его пнуть
  • Dartress, самому написать её.
    Сделаем мир лучше!
  • Давно хотел сам этот вопрос поднять. Спасибо, есть надежда, что когда-то и в Эолайте появится распаковка архивов.
    Из хаоса в космос
  • CleverMouse wrote:Dartress, самому написать её.
    Написать то - понятно. А заполнять надо? Я не понимаю сути функции этой. Если ей нужна заполненная функция - смотреть память, искать, какие функции есть, и их адреса записывать в структуру? Немного бред) Или же эта функция сама должна записывать структуру?)
    колибри летает лучше пингвина, а пингвин летает, только если его пнуть
  • Dartess, и все функции, на которые она ссылается, тоже написать. plugin_load выражает "kfar - плагину: я kfar такой-то версии, у меня есть такие-то функции, вот, я их собрал в структуру, можешь их вызывать, приём".
    Сделаем мир лучше!
  • но ведь plugin_load находится в одной библиотеке с "плагином" ? О_о
    это жесть получается...
    но хотя бы я смогу вызывать их после этого не по адресам, а через эту структуру?)

    upd: а данная библиотека позиционируется как "личная" kfar'а, или же всё же как общесистемная? Если второе, то, может, имеет смысл вставить её структуру в 'STRUCT.INC'?
    колибри летает лучше пингвина, а пингвин летает, только если его пнуть
  • Как понял я: нужно создать структуру, аналогичную описанной тут: http://websvn.kolibrios.org/filedetails ... %2Fapi.txt
    После чего заполнить её адресами функций. но вот где такие взять?) Содержимое archiver.obj и полей структуры практически не пересекается. В общем, вот...
    Spoiler:

    Code: Select all

    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: но что-то мне не верится в это)
    колибри летает лучше пингвина, а пингвин летает, только если его пнуть
  • Очень хотелось чтобы в библиотеке archiver были функции сжатия deflate.
    В библиотеке zlib 1.2.8 есть сжатие deflate. Я пробовал переписать функции из этой библиотеки, но пока что безуспешно.
    Даю пример тестовой библиотеки и 2-х примеров. В 1-ом примере сжимается блок памяти с нулями, во 2-м сжимается память с куском текста. Проблема в том что обратное разархивирование не работает. Скорее всего что есть глюки. На доску отладки можно выводить структуры zstream и deflate_state. Должно работать сжатие с уровнем 0 и 1. (Уровни сжатия от 2 до 9 пока не поддерживаются)
    Если кто может чем помочь в обнаружении ошибок буду рад.
    Attachments
    zlib.zip (114.55 KiB)
    Downloaded 265 times
  • Нашел интересную статью здесь:
    http://www.manhunter.ru/underground/165 ... s_php.html
    Там один человек на fasm-е подключает библиотеку zlib для тестирования сжатия строки текста.
    Можно будет это использовать для сравнения моей версии библиотеки с виндосовской для выявления ошибок.
    Обнаружил что если в функцию deflate_unpack подавать не весь закодированный массив а отнять от него первые 2 байта и последние 4 (для crc32) то иногда даже происходит правильное разархивирование строки. Только размер пока не совпадает. Так что есть надежда что удастся довести эту библиотеку до ума.
  • Who is online

    Users browsing this forum: No registered users and 5 guests