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