forked from KolibriOS/kolibrios
added documentation for KFar_Arc deflate exports
git-svn-id: svn://kolibrios.org@1149 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
cadcbb20ef
commit
ab173f74cc
66
programs/fs/kfar/trunk/kfar_arc/archiver_deflate.txt
Normal file
66
programs/fs/kfar/trunk/kfar_arc/archiver_deflate.txt
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
archiver.obj экспортирует две функции для распаковки deflate-данных.
|
||||||
|
|
||||||
|
Первая: deflate_unpack
|
||||||
|
Объявление в стиле Си: void* __stdcall deflate_unpack(const void* data, unsigned* pLength);
|
||||||
|
Аргументы:
|
||||||
|
data - указатель на упакованные данные
|
||||||
|
pLength - указатель на переменную длины:
|
||||||
|
на входе *pLength должно содержать длину входных данных data,
|
||||||
|
на выходе *pLength заполнится длиной выходных данных
|
||||||
|
Возвращаемое значение:
|
||||||
|
указатель на распакованные данные, NULL при нехватке памяти
|
||||||
|
память выделяет сам распаковщик, освободить её можно стандартной
|
||||||
|
функцией 68.13
|
||||||
|
Пример вызова из ассемблерного кода:
|
||||||
|
; пусть esi = указатель на данные, ecx = длина упакованных данных
|
||||||
|
push ecx ; переменная *pLength будет в стеке
|
||||||
|
push esp ; а вот и указатель на неё pLength
|
||||||
|
push esi ; а это данные
|
||||||
|
call [deflate_unpack]
|
||||||
|
pop ecx ; вытолкнем из стека переменную *pLength
|
||||||
|
; два аргумента вытолкнет сама deflate_unpack
|
||||||
|
; теперь eax = указатель на распакованные данные, ecx = их длина
|
||||||
|
|
||||||
|
Вторая: deflate_unpack2
|
||||||
|
Объявление в стиле Си: void* __stdcall deflate_unpack2(const void* get_next_chunk, void* parameter, unsigned* pUnpackedLength);
|
||||||
|
void* __stdcall get_next_chunk(void* parameter, unsigned* pLength);
|
||||||
|
Аргументы:
|
||||||
|
get_next_chunk - указатель на функцию, возвращающую указатель и длину
|
||||||
|
очередного блока упакованных данных; когда данные
|
||||||
|
заканчиваются, должна возвращать NULL (при корректных
|
||||||
|
упакованных данных такой ситуации не может быть в принципе,
|
||||||
|
при некорректных данных если функция вернула NULL, то
|
||||||
|
дальнейших вызовов не будет)
|
||||||
|
parameter - сущность, которая не используется самим распаковщиком
|
||||||
|
и без изменений передаётся в get_next_chunk
|
||||||
|
(если callback-функции она тоже не нужна, можно передавать
|
||||||
|
в этом параметре всё, что угодно)
|
||||||
|
pUnpackedLength - указатель на переменную, куда будет записана
|
||||||
|
длина распакованных данных
|
||||||
|
Возвращаемое значение:
|
||||||
|
указатель на распакованные данные, NULL при нехватке памяти
|
||||||
|
память выделяет сам распаковщик, освободить её можно стандартной
|
||||||
|
функцией 68.13
|
||||||
|
Пример вызова из ассемблерного кода:
|
||||||
|
push eax ; выделяем в стеке переменную для *pUnpackedLength
|
||||||
|
; поскольку значение неважно, короче и быстрее всего
|
||||||
|
; сделать это однобайтовым push <регистр>
|
||||||
|
push esp ; а вот и сам указатель pUnpackedLength
|
||||||
|
push esi ; какой-нибудь параметр
|
||||||
|
push deflate_callback
|
||||||
|
call [deflate_unpack2]
|
||||||
|
pop ecx ; выталкиваем UnpackedLength
|
||||||
|
; как и в первом случае, eax = указатель на распакованные данные, ecx = размер
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
; а это функция получения следующего куска упакованных данных
|
||||||
|
deflate_callback:
|
||||||
|
; если нужен параметр, то достать его можно так:
|
||||||
|
; mov esi, [esp+4] ; esi = параметр
|
||||||
|
; тут какие-то действия
|
||||||
|
; и вот результат
|
||||||
|
mov ecx, [esp+8] ; в [ecx] нужно записать длину
|
||||||
|
mov [ecx], length
|
||||||
|
mov eax, buffer
|
||||||
|
ret 8
|
Loading…
Reference in New Issue
Block a user