mirror of
https://github.com/HeidiSQL/HeidiSQL.git
synced 2026-03-13 09:24:25 +08:00
4832 lines
157 KiB
ObjectPascal
4832 lines
157 KiB
ObjectPascal
/// low-level access to ZLib compression (1.2.5 engine version)
|
|
// - this unit is a part of the freeware Synopse framework,
|
|
// licensed under a MPL/GPL/LGPL tri-license; version 1.17
|
|
unit SynZip;
|
|
|
|
{
|
|
This file is part of Synopse framework.
|
|
|
|
Synopse framework. Copyright (C) 2012 Arnaud Bouchez
|
|
Synopse Informatique - http://synopse.info
|
|
|
|
*** BEGIN LICENSE BLOCK *****
|
|
Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
|
|
The contents of this file are subject to the Mozilla Public License Version
|
|
1.1 (the "License"); you may not use this file except in compliance with
|
|
the License. You may obtain a copy of the License at
|
|
http://www.mozilla.org/MPL
|
|
|
|
Software distributed under the License is distributed on an "AS IS" basis,
|
|
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
for the specific language governing rights and limitations under the License.
|
|
|
|
The Original Code is Synopse SQLite3/mORMot database framework.
|
|
|
|
The Initial Developer of the Original Code is Arnaud Bouchez.
|
|
|
|
Portions created by the Initial Developer are Copyright (C) 2012
|
|
the Initial Developer. All Rights Reserved.
|
|
|
|
Contributor(s):
|
|
Alternatively, the contents of this file may be used under the terms of
|
|
either the GNU General Public License Version 2 or later (the "GPL"), or
|
|
the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
in which case the provisions of the GPL or the LGPL are applicable instead
|
|
of those above. If you wish to allow use of your version of this file only
|
|
under the terms of either the GPL or the LGPL, and not to allow others to
|
|
use your version of this file under the terms of the MPL, indicate your
|
|
decision by deleting the provisions above and replace them with the notice
|
|
and other provisions required by the GPL or the LGPL. If you do not delete
|
|
the provisions above, a recipient may use your version of this file under
|
|
the terms of any one of the MPL, the GPL or the LGPL.
|
|
|
|
***** END LICENSE BLOCK *****
|
|
|
|
ORIGINAL LICENSE:
|
|
|
|
zlib.h -- interface of the 'zlib' general purpose compression library
|
|
version 1.2.5, April 19th, 2010
|
|
|
|
Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler
|
|
|
|
This software is provided 'as-is', without any express or implied
|
|
warranty. In no event will the authors be held liable for any damages
|
|
arising from the use of this software.
|
|
|
|
Permission is granted to anyone to use this software for any purpose,
|
|
including commercial applications, and to alter it and redistribute it
|
|
freely, subject to the following restrictions:
|
|
|
|
1. The origin of this software must not be misrepresented; you must not
|
|
claim that you wrote the original software. If you use this software
|
|
in a product, an acknowledgment in the product documentation would be
|
|
appreciated but is not required.
|
|
2. Altered source versions must be plainly marked as such, and must not be
|
|
misrepresented as being the original software.
|
|
3. This notice may not be removed or altered from any source distribution.
|
|
|
|
Jean-loup Gailly
|
|
Mark Adler
|
|
|
|
|
|
|
|
Cross-platform ZLib 1.2.5 implementation
|
|
==========================================
|
|
|
|
Link to original C-compiled ZLib library
|
|
- Win32: use fast obj and inline asm
|
|
- Linux: use available system library libz.so
|
|
Also defines .zip file structure (TFileInfo TFileHeader TLastHeader)
|
|
|
|
Version 1.3
|
|
- Delphi 2009/2010 compatibility (Unicode)
|
|
|
|
Version 1.3.1 - January 23, 2010
|
|
- issue corrected in CompressStream()
|
|
- compilation of TSynZipCompressor under Delphi 2009/2010, without any
|
|
Internal Error DT5830 (trigerred with my Delphi 2009 Update 3)
|
|
|
|
Version 1.3.2 - February 5, 2010
|
|
- added .zip direct reading class
|
|
|
|
Version 1.4 - February 8, 2010
|
|
- whole Synopse SQLite3 database framework released under the GNU Lesser
|
|
General Public License version 3, instead of generic "Public Domain"
|
|
|
|
Version 1.5 - February 11, 2010
|
|
- added .zip direct writing class
|
|
|
|
Version 1.9
|
|
- crc32 is now coded in inlined fast asm (crc32.obj is no longer necessary)
|
|
- crc32 hashing is performed using 8 tables, for better CPU pipelining and
|
|
faster execution
|
|
- crc32 tables are created on the fly during unit initialization, therefore
|
|
save 8 KB of code size from standard crc32.obj, with no speed penalty
|
|
|
|
Version 1.9.2
|
|
- both obj files (i.e. deflate.obj and trees.obj) updated to version 1.2.5
|
|
|
|
Version 1.13
|
|
- code modifications to compile with Delphi 5 compiler
|
|
- new CompressGZip and CompressDeflate functions, for THttpSocket.RegisterCompress
|
|
- now handle Unicode file names UTF-8 encoded inside .Zip archive
|
|
- new TZipWrite.CreateFrom constructor, to add some new content to an
|
|
existing .Zip archive
|
|
- EventArchiveZip function can be used as a TSynLogArchiveEvent handler to
|
|
compress old .log files into a .zip standard archive
|
|
|
|
Version 1.15
|
|
- unit now tested with Delphi XE2 (32 Bit)
|
|
|
|
Version 1.16
|
|
- unit now compiles with Delphi XE2 (64 Bit)
|
|
- TZipWrite.AddDeflated(const aFileName) method will use streaming instead
|
|
of in-memory compression (will handle huge files much efficiently, e.g.
|
|
log files as for EventArchiveZip)
|
|
|
|
}
|
|
|
|
{$I Synopse.inc} // define HASINLINE USETYPEINFO CPU32 CPU64
|
|
|
|
{$ifdef FPC}
|
|
{$define USEZLIB}
|
|
{$else}
|
|
{$ifdef Win32}
|
|
{$define USEINLINEASM}
|
|
// if defined, we use a special inlined asm version for uncompress:
|
|
// seems 50% faster than BC++ generated .obj, and is 3KB smaller in code size
|
|
{$else}
|
|
{$define USEZLIB}
|
|
{$endif}
|
|
{$endif}
|
|
|
|
interface
|
|
|
|
uses
|
|
SysUtils, Classes,
|
|
{$ifdef USEZLIB}
|
|
ZLib,
|
|
{$endif}
|
|
{$ifdef MSWINDOWS}
|
|
Windows;
|
|
{$else}
|
|
LibC;
|
|
{$endif}
|
|
|
|
type
|
|
/// the format used for storing data
|
|
TSynZipCompressorFormat = (szcfRaw, szcfZip, szcfGZ);
|
|
|
|
{$ifndef CONDITIONALEXPRESSIONS}
|
|
type // Delphi 5 doesn't have those base types defined :(
|
|
PInteger = ^Integer;
|
|
PCardinal = ^Cardinal;
|
|
IntegerArray = array[0..$effffff] of Integer;
|
|
PIntegerArray = ^IntegerArray;
|
|
{$endif}
|
|
|
|
{/ in-memory ZLib DEFLATE compression }
|
|
function CompressMem(src, dst: pointer; srcLen, dstLen: integer;
|
|
CompressionLevel: integer=6; ZipFormat: Boolean=false) : integer;
|
|
|
|
/// in-memory ZLib INFLATE decompression
|
|
function UnCompressMem(src, dst: pointer; srcLen, dstLen: integer) : integer;
|
|
|
|
/// ZLib DEFLATE compression from memory into a stream
|
|
function CompressStream(src: pointer; srcLen: integer;
|
|
aStream: TStream; CompressionLevel:integer=6; ZipFormat: Boolean=false): cardinal;
|
|
|
|
/// ZLib INFLATE decompression from memory into a stream
|
|
// - return the number of bytes written into the stream
|
|
// - if checkCRC if not nil, it will contain thecrc32 (if aStream is nil, it will
|
|
// fast calculate the crc of the the uncompressed memory block)
|
|
function UnCompressStream(src: pointer; srcLen: integer; aStream: TStream; checkCRC: PCardinal): cardinal;
|
|
|
|
|
|
{$ifndef UNICODE}
|
|
type
|
|
/// define RawByteString, as it does exist in Delphi 2009 and up
|
|
// - to be used for byte storage into an AnsiString
|
|
RawByteString = AnsiString;
|
|
/// as available in newer Delphi versions
|
|
NativeUInt = cardinal;
|
|
{$endif}
|
|
|
|
/// compress some data, with a proprietary format (including CRC)
|
|
function CompressString(const data: RawByteString; failIfGrow: boolean = false;
|
|
CompressionLevel: integer=6) : RawByteString;
|
|
|
|
/// uncompress some data, with a proprietary format (including CRC)
|
|
// - return '' in case of a decompression failure
|
|
function UncompressString(const data: RawByteString) : RawByteString;
|
|
|
|
|
|
/// (un)compress a data content using the gzip algorithm
|
|
// - as expected by THttpSocket.RegisterCompress
|
|
// - will use internaly a level compression of 1, i.e. fastest available (content
|
|
// of 4803 bytes is compressed into 700, and time is 440 us instead of 220 us)
|
|
function CompressGZip(var Data: RawByteString; Compress: boolean): RawByteString;
|
|
|
|
/// (un)compress a data content using the Deflate algorithm
|
|
// - as expected by THttpSocket.RegisterCompress
|
|
// - will use internaly a level compression of 1, i.e. fastest available (content
|
|
// of 4803 bytes is compressed into 700, and time is 440 us instead of 220 us)
|
|
function CompressDeflate(var Data: RawByteString; Compress: boolean): RawByteString;
|
|
|
|
|
|
|
|
/// low-level check of the code returned by the ZLib library
|
|
function Check(const Code: Integer; const ValidCodes: array of Integer): integer;
|
|
|
|
|
|
type
|
|
PCardinalArray = ^TCardinalArray;
|
|
TCardinalArray = array[0..(MaxLongint div SizeOf(cardinal))-1] of cardinal;
|
|
|
|
|
|
/// just hash aString with CRC32 algorithm
|
|
// - crc32 is better than adler32 for short strings
|
|
function CRC32string(const aString: RawByteString): cardinal;
|
|
|
|
// don't know why using objects below produce an Internal Error DT5830
|
|
// under Delphi 2009 Update 3 !!!!!
|
|
// -> see http://qc.embarcadero.com/wc/qcmain.aspx?d=79792
|
|
// it seems that this compiler doesn't like to compile packed objects,
|
|
// but all other versions (including Delphi 2009 Update 2) did
|
|
// -> do Codegear knows about regression tests?
|
|
|
|
type
|
|
{$A-} { force packed object (not allowed under Delphi 2009) }
|
|
/// the internal memory structure as expected by the ZLib library
|
|
{$ifndef UNICODE}
|
|
TZStream = object
|
|
{$else}
|
|
TZStream = record
|
|
{$endif}
|
|
next_in : PAnsiChar;
|
|
avail_in : cardinal;
|
|
total_in : cardinal;
|
|
next_out : PAnsiChar;
|
|
avail_out : cardinal;
|
|
total_out : cardinal;
|
|
msg : PAnsiChar;
|
|
state : pointer;
|
|
zalloc : pointer;
|
|
zfree : pointer;
|
|
opaque : pointer;
|
|
data_type: integer;
|
|
adler : cardinal;
|
|
reserved : cardinal;
|
|
procedure Init;
|
|
function DeflateInit(CompressionLevel: integer; ZipFormat: Boolean): Boolean;
|
|
end;
|
|
PZStream = ^TZStream;
|
|
|
|
PFileInfo = ^TFileInfo;
|
|
/// generic file information structure, as used in .zip file format
|
|
// - used in any header, contains info about following block
|
|
{$ifndef UNICODE}
|
|
TFileInfo = object
|
|
{$else}
|
|
TFileInfo = record
|
|
{$endif}
|
|
neededVersion : word; // $14
|
|
flags : word; // 0
|
|
zzipMethod : word; // 0=stored 8=deflate 12=BZ2 14=LZMA
|
|
zlastMod : integer; // time in dos format
|
|
zcrc32 : dword; // crc32 checksum of uncompressed data
|
|
zzipSize : dword; // size of compressed data
|
|
zfullSize : dword; // size of uncompressed data
|
|
nameLen : word; // length(name)
|
|
extraLen : word; // 0
|
|
function SameAs(aInfo: PFileInfo): boolean;
|
|
function AlgoID: integer; // 1..15 (1=SynLZ e.g.) from flags
|
|
procedure SetAlgoID(Algorithm: integer);
|
|
function GetUTF8FileName: boolean;
|
|
procedure SetUTF8FileName;
|
|
procedure UnSetUTF8FileName;
|
|
end;
|
|
|
|
/// directory file information structure, as used in .zip file format
|
|
// - used at the end of the zip file to recap all entries
|
|
TFileHeader = {$ifdef UNICODE}record{$else}object{$endif}
|
|
signature : dword; // $02014b50 PK#1#2
|
|
madeBy : word; // $14
|
|
fileInfo : TFileInfo;
|
|
commentLen : word; // 0
|
|
firstDiskNo : word; // 0
|
|
intFileAttr : word; // 0 = binary; 1 = text
|
|
extFileAttr : dword; // dos file attributes
|
|
localHeadOff : dword; // @TLocalFileHeader
|
|
function DataPosition: cardinal;
|
|
procedure Init;
|
|
end;
|
|
PFileHeader = ^TFileHeader;
|
|
|
|
/// internal file information structure, as used in .zip file format
|
|
// - used locally inside the file stream, followed by the name and then the data
|
|
TLocalFileHeader = record
|
|
signature : dword; // $04034b50 PK#3#4
|
|
fileInfo : TFileInfo;
|
|
end;
|
|
|
|
/// last header structure, as used in .zip file format
|
|
// - this header ends the file and is used to find the TFileHeader entries
|
|
TLastHeader = record
|
|
signature : dword; // $06054b50 PK#5#6
|
|
thisDisk : word; // 0
|
|
headerDisk : word; // 0
|
|
thisFiles : word; // 1
|
|
totalFiles : word; // 1
|
|
headerSize : dword; // sizeOf(TFileHeaders + names)
|
|
headerOffset : dword; // @TFileHeader
|
|
commentLen : word; // 0
|
|
end;
|
|
{$A+}
|
|
|
|
{$ifdef linux}
|
|
const
|
|
ZLIB_VERSION = '1.2.5';
|
|
libz='libz.so';
|
|
|
|
type
|
|
gzFile = pointer;
|
|
|
|
|
|
const
|
|
Z_NO_FLUSH = 0;
|
|
|
|
Z_PARTIAL_FLUSH = 1;
|
|
Z_SYNC_FLUSH = 2;
|
|
Z_FULL_FLUSH = 3;
|
|
Z_FINISH = 4;
|
|
|
|
Z_OK = 0;
|
|
Z_STREAM_END = 1;
|
|
Z_NEED_DICT = 2;
|
|
Z_ERRNO = -(1);
|
|
Z_STREAM_ERROR = -(2);
|
|
Z_DATA_ERROR = -(3);
|
|
Z_MEM_ERROR = -(4);
|
|
Z_BUF_ERROR = -(5);
|
|
Z_VERSION_ERROR = -(6);
|
|
|
|
Z_NO_COMPRESSION = 0;
|
|
Z_BEST_SPEED = 1;
|
|
Z_BEST_COMPRESSION = 9;
|
|
Z_DEFAULT_COMPRESSION = -(1);
|
|
|
|
Z_FILTERED = 1;
|
|
Z_HUFFMAN_ONLY = 2;
|
|
Z_DEFAULT_STRATEGY = 0;
|
|
|
|
Z_BINARY = 0;
|
|
Z_ASCII = 1;
|
|
Z_UNKNOWN = 2;
|
|
|
|
Z_DEFLATED = 8;
|
|
MAX_WBITS = 15; // 32K LZ77 window
|
|
DEF_MEM_LEVEL = 8;
|
|
|
|
Z_NULL = 0;
|
|
|
|
function zlibVersion: PAnsiChar; cdecl;
|
|
function deflate(var strm: TZStream; flush: integer): integer; cdecl;
|
|
function deflateEnd(var strm: TZStream): integer; cdecl;
|
|
function inflate(var strm: TZStream; flush: integer): integer; cdecl;
|
|
function inflateEnd(var strm: TZStream): integer; cdecl;
|
|
function deflateSetDictionary(var strm: TZStream;dictionary : PAnsiChar; dictLength: cardinal): integer; cdecl;
|
|
function deflateCopy(var dest,source: TZStream): integer; cdecl;
|
|
function deflateReset(var strm: TZStream): integer; cdecl;
|
|
function deflateParams(var strm: TZStream; level: integer; strategy: integer): integer; cdecl;
|
|
function inflateSetDictionary(var strm: TZStream;dictionary : PAnsiChar; dictLength: cardinal): integer; cdecl;
|
|
function inflateSync(var strm: TZStream): integer; cdecl;
|
|
function inflateReset(var strm: TZStream): integer; cdecl;
|
|
function compress(dest: PAnsiChar;var destLen:cardinal; source : PAnsiChar; sourceLen:cardinal):integer; cdecl;
|
|
function compress2(dest: PAnsiChar;destLen:pcardinal; source : PAnsiChar; sourceLen:cardinal; level:integer):integer; cdecl;
|
|
function uncompress(dest: PAnsiChar;destLen:pcardinal; source : PAnsiChar; sourceLen:cardinal):integer; cdecl;
|
|
{
|
|
function gzopen(path: PAnsiChar; mode: PAnsiChar): gzFile; cdecl;
|
|
function gzdopen(fd: integer; mode: PAnsiChar): gzFile; cdecl;
|
|
function gzsetparams(thefile: gzFile; level: integer; strategy: integer): integer; cdecl;
|
|
function gzread(thefile: gzFile; buf: pointer; len:cardinal): integer; cdecl;
|
|
function gzwrite(thefile: gzFile; buf: pointer; len:cardinal): integer; cdecl;
|
|
function gzprintf(thefile: gzFile; format: PAnsiChar; args:array of const): integer; cdecl;
|
|
function gzputs(thefile: gzFile; s: PAnsiChar): integer; cdecl;
|
|
function gzgets(thefile: gzFile; buf: PAnsiChar; len: integer): PAnsiChar; cdecl;
|
|
function gzputc(thefile: gzFile; c:AnsiChar):AnsiChar; cdecl;
|
|
function gzgetc(thefile: gzFile):AnsiChar; cdecl;
|
|
function gzflush(thefile: gzFile; flush: integer): integer; cdecl;
|
|
function gzseek(thefile: gzFile; offset:integer; whence: integer):integer; cdecl;
|
|
function gzrewind(thefile: gzFile): integer; cdecl;
|
|
function gztell(thefile: gzFile):integer; cdecl;
|
|
function gzeof(thefile: gzFile):longbool; cdecl;
|
|
function gzclose(thefile: gzFile): integer; cdecl;
|
|
function gzerror(thefile: gzFile; var errnum: integer): PAnsiChar; cdecl;
|
|
}
|
|
function adler32(adler:cardinal; buf: PAnsiChar; len: cardinal): cardinal; cdecl;
|
|
function crc32(crc:cardinal; buf: PAnsiChar; len: cardinal): cardinal; cdecl;
|
|
function deflateInit_(var strm: TZStream; level: integer; version: PAnsiChar; stream_size: integer): integer; cdecl;
|
|
function inflateInit_(var strm: TZStream; version: PAnsiChar; stream_size: integer): integer; cdecl;
|
|
function deflateInit2_(var strm: TZStream; level: integer; method: integer; windowBits: integer; memLevel: integer;strategy: integer; version: PAnsiChar; stream_size: integer): integer; cdecl;
|
|
function inflateInit2_(var strm: TZStream; windowBits: integer; version: PAnsiChar; stream_size: integer): integer; cdecl;
|
|
function get_crc_table: pointer; cdecl;
|
|
|
|
function zlibAllocMem(AppData: Pointer; Items, Size: cardinal): Pointer; cdecl;
|
|
procedure zlibFreeMem(AppData, Block: Pointer); cdecl;
|
|
|
|
{$else}
|
|
{ our very own short implementation of ZLibH }
|
|
|
|
const
|
|
ZLIB_VERSION = '1.2.5';
|
|
|
|
Z_NO_FLUSH = 0;
|
|
Z_PARTIAL_FLUSH = 1;
|
|
Z_SYNC_FLUSH = 2;
|
|
Z_FULL_FLUSH = 3;
|
|
Z_FINISH = 4;
|
|
|
|
Z_OK = 0;
|
|
Z_STREAM_END = 1;
|
|
Z_MEM_ERROR = -(4);
|
|
Z_BUF_ERROR = -(5);
|
|
|
|
Z_DEFLATED = 8;
|
|
MAX_WBITS = 15; // 32K LZ77 window
|
|
DEF_MEM_LEVEL = 8;
|
|
Z_DEFAULT_STRATEGY = 0;
|
|
Z_HUFFMAN_ONLY = 2;
|
|
|
|
function deflateInit2_(var strm: TZStream; level: integer; method: integer; windowBits: integer; memLevel: integer;strategy: integer; version: PAnsiChar; stream_size: integer): integer;
|
|
function deflate(var strm: TZStream; flush: integer): integer;
|
|
function deflateEnd(var strm: TZStream): integer;
|
|
|
|
function inflateInit2_(var strm: TZStream; windowBits: integer; version: PAnsiChar; stream_size: integer): integer;
|
|
{$ifdef USEINLINEASM}stdcall;{$endif}
|
|
function inflate(var strm: TZStream; flush: integer): integer;
|
|
{$ifdef USEINLINEASM}stdcall;{$endif}
|
|
function inflateEnd(var strm: TZStream): integer;
|
|
{$ifdef USEINLINEASM}stdcall;{$endif}
|
|
|
|
|
|
function adler32(adler: cardinal; buf: PAnsiChar; len: cardinal): cardinal;
|
|
function crc32(crc: cardinal; buf: PAnsiChar; len: cardinal): cardinal;
|
|
function get_crc_table: pointer;
|
|
|
|
{$endif Linux}
|
|
|
|
|
|
{/ uncompress a .gz file content
|
|
- return '' if the .gz content is invalid (e.g. bad crc) }
|
|
function GZRead(gz: PAnsiChar; gzLen: integer): RawByteString;
|
|
|
|
type
|
|
/// a simple TStream descendant for compressing data into a stream
|
|
// - this simple version don't use any internal buffer, but rely
|
|
// on Zip library buffering system
|
|
// - the version in SynZipFiles is much more powerfull, but this one
|
|
// is sufficient for most common cases (e.g. for on the fly .gz backup)
|
|
TSynZipCompressor = class(TStream)
|
|
private
|
|
fInitialized: Boolean;
|
|
fDestStream: TStream;
|
|
fStrm: TZStream;
|
|
fCRC: Cardinal;
|
|
fGZFormat: boolean;
|
|
fBufferOut: array[word] of byte; // a 64 KB buffer
|
|
function FlushBufferOut: integer;
|
|
public
|
|
{/ create a compression stream, writting the compressed data into
|
|
the specified stream (e.g. a file stream) }
|
|
constructor Create(outStream: TStream; CompressionLevel: Integer;
|
|
Format: TSynZipCompressorFormat = szcfRaw);
|
|
/// release memory
|
|
destructor Destroy; override;
|
|
/// this method will raise an error: it's a compression-only stream
|
|
function Read(var Buffer; Count: Longint): Longint; override;
|
|
/// add some data to be compressed
|
|
function Write(const Buffer; Count: Longint): Longint; override;
|
|
/// used to return the current position, i.e. the real byte written count
|
|
// - for real seek, this method will raise an error: it's a compression-only stream
|
|
function Seek(Offset: Longint; Origin: Word): Longint; override;
|
|
/// the number of byte written, i.e. the current uncompressed size
|
|
property SizeIn: cardinal read FStrm.total_in;
|
|
/// write all pending compressed data into outStream
|
|
procedure Flush;
|
|
/// the number of byte sent to the destination stream, i.e. the current
|
|
// compressed size
|
|
property SizeOut: cardinal read FStrm.total_out;
|
|
/// the current CRC of the written data, i.e. the uncompressed data CRC
|
|
property CRC: cardinal read fCRC;
|
|
end;
|
|
|
|
/// stores an entry of a file inside a .zip archive
|
|
TZipEntry = record
|
|
/// the information of this file, as stored in the .zip archive
|
|
info: PFileInfo;
|
|
/// points to the compressed data in the .zip archive, mapped in memory
|
|
data: PAnsiChar;
|
|
/// name of the file inside the .zip archive
|
|
// - not ASCIIZ: length = info.nameLen
|
|
storedName: PAnsiChar;
|
|
/// name of the file inside the .zip archive
|
|
// - converted from DOS/OEM or UTF-8 into generic (Unicode) string
|
|
zipName: TFileName;
|
|
end;
|
|
|
|
{$ifndef LINUX}
|
|
/// read-only access to a .zip archive file
|
|
// - can open directly a specified .zip file (will be memory mapped for fast access)
|
|
// - can open a .zip archive file content from a resource (embedded in the executable)
|
|
// - can open a .zip archive file content from memory
|
|
TZipRead = class
|
|
private
|
|
file_, map: NativeUInt; // we use a memory mapped file to access the zip content
|
|
buf: PByteArray;
|
|
ReadOffset: cardinal;
|
|
procedure UnMap;
|
|
public
|
|
/// the number of files inside a .zip archive
|
|
Count: integer;
|
|
/// the files inside the .zip archive
|
|
Entry: array of TZipEntry;
|
|
|
|
/// open a .zip archive file as Read Only
|
|
constructor Create(const aFileName: TFileName; ZipStartOffset: cardinal=0;
|
|
Size: cardinal=0); overload;
|
|
/// open a .zip archive file directly from a resource
|
|
constructor Create(Instance: THandle; const ResName: string; ResType: PChar); overload;
|
|
/// open a .zip archive file from its File Handle
|
|
constructor Create(aFile: THandle; ZipStartOffset: cardinal=0;
|
|
Size: cardinal=0); overload;
|
|
/// open a .zip archive file directly from memory
|
|
constructor Create(BufZip: pByteArray; Size: cardinal); overload;
|
|
/// release associated memory
|
|
destructor Destroy; override;
|
|
|
|
/// get the index of a file inside the .zip archive
|
|
function NameToIndex(const aName: TFileName): integer;
|
|
/// uncompress a file stored inside the .zip archive into memory
|
|
function UnZip(aIndex: integer): RawByteString; overload;
|
|
/// uncompress a file stored inside the .zip archive into a destination directory
|
|
function UnZip(aIndex: integer; const DestDir: TFileName): boolean; overload;
|
|
end;
|
|
{$endif Linux}
|
|
|
|
/// write-only access for creating a .zip archive file
|
|
// - not to be used to update a .zip file, but to create a new one
|
|
// - update can be done manualy by using a TZipRead instance and the
|
|
// AddFromZip() method
|
|
TZipWrite = class
|
|
protected
|
|
fAppendOffset: cardinal;
|
|
fFileName: TFileName;
|
|
fMagic: cardinal;
|
|
function InternalAdd(const zipName: TFileName; Buf: pointer; Size: integer): cardinal;
|
|
public
|
|
/// the associated file handle
|
|
Handle: integer;
|
|
/// the total number of entries
|
|
Count: integer;
|
|
/// the resulting file entries, ready to be written as a .zip catalog
|
|
// - those will be appended after the data blocks at the end of the .zip file
|
|
Entry: array of record
|
|
/// the file name, as stored in the .zip internal directory
|
|
intName: RawByteString;
|
|
/// the corresponding file header
|
|
fhr: TFileHeader;
|
|
end;
|
|
/// initialize the .zip file
|
|
// - a new .zip file content is created
|
|
constructor Create(const aFileName: TFileName); overload;
|
|
/// initialize an existing .zip file in order to add some content to it
|
|
// - warning: AddStored/AddDeflated() won't check for duplicate zip entries
|
|
// - this method is very fast, and will increase the .zip file in-place
|
|
// (the old content is not copied, new data is appended at the file end)
|
|
constructor CreateFrom(const aFileName: TFileName);
|
|
/// compress (using the deflate method) a memory buffer, and add it to the zip file
|
|
// - by default, the 1st of January, 2010 is used if not date is supplied
|
|
procedure AddDeflated(const aZipName: TFileName; Buf: pointer; Size: integer;
|
|
CompressLevel: integer=6; FileAge: integer=1+1 shl 5+30 shl 9); overload;
|
|
/// compress (using the deflate method) a file, and add it to the zip file
|
|
procedure AddDeflated(const aFileName: TFileName; RemovePath: boolean=true;
|
|
CompressLevel: integer=6); overload;
|
|
/// add a memory buffer to the zip file, without compression
|
|
// - content is stored, not deflated
|
|
// (in that case, no deflate code is added to the executable)
|
|
// - by default, the 1st of January, 2010 is used if not date is supplied
|
|
procedure AddStored(const aZipName: TFileName; Buf: pointer; Size: integer;
|
|
FileAge: integer=1+1 shl 5+30 shl 9);
|
|
/// add a file from an already compressed zip entry
|
|
procedure AddFromZip(const ZipEntry: TZipEntry);
|
|
/// append a file content into the destination file
|
|
// - usefull to add the initial Setup.exe file, e.g.
|
|
procedure Append(const Content: RawByteString);
|
|
/// release associated memory, and close destination file
|
|
destructor Destroy; override;
|
|
end;
|
|
|
|
/// a TSynLogArchiveEvent handler which will compress older .log files
|
|
// into .zip archive files
|
|
// - resulting file will be named YYYYMM.zip and will be located in the
|
|
// aDestinationPath directory, i.e. TSynLogFamily.ArchivePath+'\log\YYYYMM.zip'
|
|
function EventArchiveZip(const aOldLogFileName, aDestinationPath: TFileName): boolean;
|
|
|
|
|
|
implementation
|
|
|
|
{ TZipWrite }
|
|
|
|
var
|
|
EventArchiveZipWrite: TZipWrite = nil;
|
|
|
|
function EventArchiveZip(const aOldLogFileName, aDestinationPath: TFileName): boolean;
|
|
var n: integer;
|
|
begin
|
|
result := false;
|
|
if aOldLogFileName='' then
|
|
FreeAndNil(EventArchiveZipWrite) else begin
|
|
if not FileExists(aOldLogFileName) then
|
|
exit;
|
|
if EventArchiveZipWrite=nil then
|
|
EventArchiveZipWrite := TZipWrite.CreateFrom(
|
|
copy(aDestinationPath,1,length(aDestinationPath)-1)+'.zip');
|
|
n := EventArchiveZipWrite.Count;
|
|
EventArchiveZipWrite.AddDeflated(aOldLogFileName,True);
|
|
if (EventArchiveZipWrite.Count=n+1) and DeleteFile(pointer(aOldLogFileName)) then
|
|
result := True;
|
|
end;
|
|
end;
|
|
|
|
procedure TZipWrite.AddDeflated(const aFileName: TFileName; RemovePath: boolean=true;
|
|
CompressLevel: integer=6);
|
|
var Time: TFileTime;
|
|
ZipName: TFileName;
|
|
FileTime: LongRec;
|
|
Size: Int64;
|
|
Size64: Int64Rec absolute Size;
|
|
OffsHead, OffsEnd: cardinal;
|
|
S: TFileStream;
|
|
D: THandleStream;
|
|
Z: TSynZipCompressor;
|
|
begin
|
|
S := TFileStream.Create(aFileName,fmOpenRead or fmShareDenyNone);
|
|
try
|
|
if RemovePath then
|
|
ZipName := ExtractFileName(aFileName) else
|
|
ZipName := aFileName;
|
|
GetFileTime(S.Handle,nil,nil,@Time);
|
|
FileTimeToLocalFileTime(Time,Time);
|
|
FileTimeToDosDateTime(Time,FileTime.Hi,FileTime.Lo);
|
|
Size := S.Size;
|
|
if Size64.Hi<>0 then
|
|
raise Exception.CreateFmt('%s file too big for .zip',[aFileName]);
|
|
if Count>=length(Entry) then
|
|
SetLength(Entry,length(Entry)+20);
|
|
OffsHead := InternalAdd(ZipName,nil,0);
|
|
D := THandleStream.Create(Handle);
|
|
Z := TSynZipCompressor.Create(D,CompressLevel);
|
|
try
|
|
Z.CopyFrom(S,Size64.Lo);
|
|
Z.Flush;
|
|
assert(Z.SizeIn=Size64.Lo);
|
|
with Entry[Count] do begin
|
|
with fhr.fileInfo do begin
|
|
zcrc32 := Z.CRC;
|
|
zfullSize := Z.SizeIn;
|
|
zzipSize := Z.SizeOut;
|
|
zzipMethod := Z_DEFLATED;
|
|
zlastMod := integer(FileTime);
|
|
end;
|
|
OffsEnd := D.Position;
|
|
D.Position := OffsHead+sizeof(fMagic);
|
|
D.Write(fhr.fileInfo,sizeof(fhr.fileInfo));
|
|
D.Position := OffsEnd;
|
|
end;
|
|
inc(Count);
|
|
finally
|
|
Z.Free;
|
|
D.Free;
|
|
end;
|
|
finally
|
|
S.Free;
|
|
end;
|
|
end;
|
|
|
|
function Is7BitAnsi(P: PChar): boolean;
|
|
begin
|
|
if P<>nil then
|
|
while true do
|
|
if ord(P^)=0 then
|
|
break else
|
|
if ord(P^)<=126 then
|
|
inc(P) else begin
|
|
result := false;
|
|
exit;
|
|
end;
|
|
result := true;
|
|
end;
|
|
|
|
function TZipWrite.InternalAdd(const zipName: TFileName; Buf: pointer; Size: integer): cardinal;
|
|
begin
|
|
with Entry[Count] do begin
|
|
fHr.signature := $02014b51;
|
|
dec(fHr.signature); // +1 to avoid finding it in the exe
|
|
fHr.madeBy := $14;
|
|
fHr.fileInfo.neededVersion := $14;
|
|
result := SetFilePointer(Handle,0,nil,FILE_CURRENT);
|
|
fHr.localHeadOff := result-fAppendOffset;
|
|
{$ifdef CONDITIONALEXPRESSIONS}
|
|
// Delphi 5 doesn't have UTF8Decode/UTF8Encode functions -> make 7 bit version
|
|
if Is7BitAnsi(pointer(zipName)) then begin
|
|
{$endif}
|
|
{$ifdef UNICODE}
|
|
intName := AnsiString(zipName);
|
|
{$else} // intName := zipName -> error reference count under Delphi 6
|
|
SetString(intName,PAnsiChar(pointer(zipName)),length(zipName));
|
|
{$endif}
|
|
fHr.fileInfo.UnSetUTF8FileName;
|
|
{$ifdef CONDITIONALEXPRESSIONS}
|
|
end else begin
|
|
intName := UTF8Encode(WideString(zipName));
|
|
fHr.fileInfo.SetUTF8FileName;
|
|
end;
|
|
{$endif}
|
|
fHr.fileInfo.nameLen := length(intName);
|
|
FileWrite(Handle,fMagic,sizeof(fMagic));
|
|
FileWrite(Handle,fhr.fileInfo,sizeof(fhr.fileInfo));
|
|
FileWrite(Handle,pointer(intName)^,fhr.fileInfo.nameLen);
|
|
end;
|
|
if Buf<>nil then begin
|
|
FileWrite(Handle,Buf^,Size); // write stored data
|
|
inc(Count);
|
|
end;
|
|
end;
|
|
|
|
procedure TZipWrite.AddDeflated(const aZipName: TFileName; Buf: pointer;
|
|
Size, CompressLevel, FileAge: integer);
|
|
var tmp: pointer;
|
|
tmpsize: integer;
|
|
begin
|
|
if (self=nil) or (Handle<=0) then
|
|
exit;
|
|
if Count>=length(Entry) then
|
|
SetLength(Entry,length(Entry)+20);
|
|
with Entry[Count] do begin
|
|
with fhr.fileInfo do begin
|
|
zcrc32 := SynZip.crc32(0,Buf,Size);
|
|
zfullSize := Size;
|
|
zzipMethod := Z_DEFLATED;
|
|
zlastMod := FileAge;
|
|
tmpsize := (Size*11) div 10+12;
|
|
Getmem(tmp,tmpSize);
|
|
zzipSize := CompressMem(Buf,tmp,Size,tmpSize,CompressLevel);
|
|
InternalAdd(aZipName,tmp,zzipSize); // write stored data
|
|
Freemem(tmp);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TZipWrite.AddFromZip(const ZipEntry: TZipEntry);
|
|
begin
|
|
if (self=nil) or (Handle<=0) then
|
|
exit;
|
|
if Count>=length(Entry) then
|
|
SetLength(Entry,length(Entry)+20);
|
|
with Entry[Count] do begin
|
|
fhr.fileInfo := ZipEntry.info^;
|
|
InternalAdd(ZipEntry.zipName,ZipEntry.data,fhr.fileInfo.zzipSize);
|
|
end;
|
|
end;
|
|
|
|
procedure TZipWrite.AddStored(const aZipName: TFileName; Buf: pointer;
|
|
Size, FileAge: integer);
|
|
begin
|
|
if (self=nil) or (Handle<=0) then
|
|
exit;
|
|
if Count>=length(Entry) then
|
|
SetLength(Entry,length(Entry)+20);
|
|
with Entry[Count], fhr.fileInfo do begin
|
|
zcrc32 := SynZip.crc32(0,Buf,Size);
|
|
zfullSize := Size;
|
|
zzipSize := Size;
|
|
zlastMod := FileAge;
|
|
InternalAdd(aZipName,Buf,Size);
|
|
end;
|
|
end;
|
|
|
|
procedure TZipWrite.Append(const Content: RawByteString);
|
|
begin
|
|
if (self=nil) or (Handle<=0) or (fAppendOffset<>0) then
|
|
exit;
|
|
fAppendOffset := length(Content);
|
|
FileWrite(Handle,pointer(Content)^,fAppendOffset);
|
|
end;
|
|
|
|
constructor TZipWrite.Create(const aFileName: TFileName);
|
|
begin
|
|
fFileName := aFileName;
|
|
fMagic := $04034b50+1; // +1 to avoid finding it in the exe generated code
|
|
dec(fMagic);
|
|
if Handle=0 then
|
|
Handle := FileCreate(aFileName);
|
|
end;
|
|
|
|
constructor TZipWrite.CreateFrom(const aFileName: TFileName);
|
|
var R: TZipRead;
|
|
i: Integer;
|
|
begin
|
|
Handle := FileOpen(aFileName,fmOpenReadWrite or fmShareDenyNone);
|
|
if Handle<0 then begin
|
|
R := nil;
|
|
Handle := 0;
|
|
end else
|
|
R := TZipRead.Create(Handle);
|
|
Create(aFileName);
|
|
if R<>nil then
|
|
try
|
|
Count := R.Count;
|
|
SetLength(Entry,Count+10);
|
|
for i := 0 to Count-1 do
|
|
with Entry[i], R.Entry[i] do begin
|
|
fhr.Init;
|
|
fhr.localHeadOff := NativeUInt(info)-NativeUInt(R.Entry[0].info);
|
|
fhr.fileInfo := info^;
|
|
SetString(intName,storedName,info^.nameLen);
|
|
end;
|
|
SetFilePointer(Handle,R.ReadOffset,nil,FILE_BEGIN);
|
|
finally
|
|
R.Free;
|
|
end;
|
|
end;
|
|
|
|
destructor TZipWrite.Destroy;
|
|
var lhr: TLastHeader;
|
|
i: integer;
|
|
begin
|
|
fillchar(lhr,sizeof(lhr),0);
|
|
lhr.signature := $06054b50+1; dec(lhr.signature); // +1 to avoid finding it in the exe
|
|
lhr.thisFiles := Count;
|
|
lhr.totalFiles := Count;
|
|
lhr.headerOffset := SetFilePointer(Handle,0,nil,FILE_CURRENT)-fAppendOffset;
|
|
for i := 0 to Count-1 do
|
|
with Entry[i] do begin
|
|
assert(fhr.fileInfo.nameLen=length(intName));
|
|
inc(lhr.headerSize,sizeof(TFileHeader)+fhr.fileInfo.nameLen);
|
|
FileWrite(Handle,fhr,sizeof(fhr));
|
|
FileWrite(Handle,pointer(IntName)^,fhr.fileInfo.nameLen);
|
|
end;
|
|
FileWrite(Handle,lhr,sizeof(lhr));
|
|
SetEndOfFile(Handle);
|
|
FileClose(Handle);
|
|
inherited;
|
|
end;
|
|
|
|
{$ifndef Linux}
|
|
|
|
procedure TZipRead.UnMap;
|
|
begin
|
|
Count := 0;
|
|
if map<>0 then begin
|
|
UnmapViewOfFile(Buf);
|
|
CloseHandle(map);
|
|
end;
|
|
if file_>0 then begin
|
|
CloseHandle(file_);
|
|
file_ := 0;
|
|
end;
|
|
end;
|
|
|
|
{$ifdef UNICODE}
|
|
function UTF8Decode(const tmp: UTF8String): TFileName;
|
|
begin
|
|
result := TFileName(tmp);
|
|
end;
|
|
{$endif}
|
|
|
|
constructor TZipRead.Create(BufZip: pByteArray; Size: cardinal);
|
|
var lhr: ^TLastHeader;
|
|
h: ^TFileHeader;
|
|
lfhr: ^TLocalFileHeader;
|
|
i,j: integer;
|
|
{$ifdef CONDITIONALEXPRESSIONS}
|
|
tmp: UTF8String;
|
|
{$else}
|
|
tmp: RawByteString;
|
|
{$endif}
|
|
begin
|
|
for i := 0 to 31 do begin // resources size may be rounded up to alignment
|
|
lhr := @BufZip[Size-sizeof(TLastHeader)];
|
|
if lhr^.signature+1=$06054b51 then
|
|
break;
|
|
dec(Size);
|
|
if Size<=sizeof(lhr^) then
|
|
break;
|
|
end;
|
|
if lhr^.signature+1<>$06054b51 then begin
|
|
UnMap;
|
|
raise Exception.Create('ZIP format');
|
|
exit;
|
|
end;
|
|
SetLength(Entry,lhr^.totalFiles); // fill Entry[] with the Zip headers
|
|
H := @BufZip[lhr^.headerOffset];
|
|
ReadOffset := lhr^.headerOffset;
|
|
for i := 1 to lhr^.totalFiles do begin
|
|
if H^.signature+1<>$02014b51 then begin
|
|
UnMap;
|
|
raise Exception.Create('ZIP format');
|
|
exit;
|
|
end;
|
|
lfhr := @BufZip[H^.localHeadOff];
|
|
with Entry[Count] do begin
|
|
info := @lfhr^.fileInfo;
|
|
storedName := PAnsiChar(lfhr)+sizeof(lfhr^);
|
|
data := storedName+info^.NameLen+info^.extraLen; // data mapped in memory
|
|
SetString(tmp,storedName,info^.nameLen);
|
|
for j := 0 to info^.nameLen-1 do
|
|
if storedName[j]='/' then // normalize path delimiter
|
|
PAnsiChar(Pointer(tmp))[j] := '\';
|
|
{$ifdef CONDITIONALEXPRESSIONS}
|
|
// Delphi 5 doesn't have UTF8Decode/UTF8Encode functions -> make 7 bit version
|
|
if info^.GetUTF8FileName then
|
|
// decode UTF-8 file name into native string/TFileName type
|
|
zipName := UTF8Decode(tmp) else
|
|
{$endif}
|
|
begin
|
|
// decode OEM/DOS file name into native string/TFileName type
|
|
SetLength(zipName,info^.nameLen);
|
|
OemToChar(Pointer(tmp),Pointer(zipName)); // OemToCharW/OemToCharA
|
|
end;
|
|
inc(NativeUInt(H),sizeof(H^)+info^.NameLen+H^.fileInfo.extraLen+H^.commentLen);
|
|
if (info^.zZipMethod in [0,Z_DEFLATED]) and
|
|
(zipName<>'') and (zipName[length(zipName)]<>'\') then // ignore folder
|
|
inc(Count); // known methods: stored + deflate
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
constructor TZipRead.Create(Instance: THandle; const ResName: string; ResType: PChar);
|
|
// locked resources are memory map of the executable -> direct access is easy
|
|
var HResInfo: THandle;
|
|
HGlobal: THandle;
|
|
begin
|
|
HResInfo := FindResource(Instance,PChar(ResName),ResType);
|
|
if HResInfo=0 then
|
|
exit;
|
|
HGlobal := LoadResource(HInstance, HResInfo);
|
|
if HGlobal<>0 then
|
|
// warning: resources size may be rounded up to alignment -> handled in Create()
|
|
Create(LockResource(HGlobal),SizeofResource(HInstance, HResInfo));
|
|
end;
|
|
|
|
constructor TZipRead.Create(aFile: THandle; ZipStartOffset: cardinal=0;
|
|
Size: cardinal=0);
|
|
var i, ExeOffset: integer;
|
|
begin
|
|
if aFile<=0 then
|
|
exit;
|
|
if Size=0 then
|
|
Size := GetFileSize(aFile, nil);
|
|
map := CreateFileMapping(aFile, nil, PAGE_READONLY, 0, 0, nil);
|
|
if map=0 then begin
|
|
Unmap;
|
|
raise Exception.Create('Missing File');
|
|
exit;
|
|
end;
|
|
Buf := MapViewOfFile(map, FILE_MAP_READ, 0, 0, 0);
|
|
ExeOffset := -1;
|
|
for i := ZipStartOffset to Size-5 do
|
|
if PCardinal(@buf[i])^+1=$04034b51 then begin // +1 to avoid finding it in the exe part
|
|
ExeOffset := i;
|
|
break;
|
|
end;
|
|
if ExeOffset<0 then begin
|
|
Unmap;
|
|
raise Exception.Create('No ZIP found');
|
|
exit;
|
|
end;
|
|
Create(@Buf[ExeOffset],integer(Size)-ExeOffset);
|
|
end;
|
|
|
|
constructor TZipRead.Create(const aFileName: TFileName; ZipStartOffset, Size: cardinal);
|
|
begin
|
|
file_ := CreateFile(pointer(aFileName), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
|
|
Create(file_,ZipStartOffset, Size);
|
|
end;
|
|
|
|
destructor TZipRead.Destroy;
|
|
begin
|
|
UnMap;
|
|
inherited;
|
|
end;
|
|
|
|
function TZipRead.NameToIndex(const aName: TFileName): integer;
|
|
begin
|
|
if (self<>nil) and (aName<>'') then
|
|
for result := 0 to Count-1 do
|
|
if SameText(Entry[result].zipName,aName) then
|
|
exit;
|
|
result := -1;
|
|
end;
|
|
|
|
function TZipRead.UnZip(aIndex: integer): RawByteString;
|
|
var len: cardinal;
|
|
begin
|
|
result := ''; // somewhat faster if memory is reallocated each time
|
|
if (self=nil) or (cardinal(aIndex)>=cardinal(Count)) then
|
|
exit;
|
|
with Entry[aIndex] do begin
|
|
SetLength(result,info^.zfullSize);
|
|
if info^.zZipMethod=0 then begin // stored method
|
|
len := info^.zfullsize;
|
|
move(data^,pointer(result)^,len);
|
|
end else // deflate method
|
|
len := UnCompressMem(data,pointer(result),info^.zzipsize,info^.zfullsize);
|
|
if (len<>info^.zfullsize) or
|
|
(info^.zcrc32<>SynZip.crc32(0,pointer(result),info^.zfullSize)) then begin
|
|
MessageBox(0,'CRC',pointer(zipName),0); // Name is PAnsiChar -> force MessageBoxA()
|
|
result := '';
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
{$ifndef CONDITIONALEXPRESSIONS}
|
|
/// DirectoryExists returns a boolean value that indicates whether the
|
|
// specified directory exists (and is actually a directory)
|
|
function DirectoryExists(const Directory: string): boolean;
|
|
var Code: Integer;
|
|
begin
|
|
Code := GetFileAttributes(PChar(Directory));
|
|
Result := (Code <> -1) and (FILE_ATTRIBUTE_DIRECTORY and Code <> 0);
|
|
end;
|
|
{$endif}
|
|
|
|
function EnsurePath(var Path: TFileName): boolean;
|
|
var Parent: TFileName;
|
|
begin
|
|
result := false;
|
|
if Path='' then exit;
|
|
if Path[length(Path)]<>'\' then
|
|
Path := Path+'\';
|
|
if DirectoryExists(Path) then
|
|
result := true else begin
|
|
Parent := ExtractFilePath(copy(Path,1,length(Path)-1));
|
|
if (Parent<>'') and not DirectoryExists(Parent) then
|
|
if not EnsurePath(Parent) then exit;
|
|
if CreateDirectory(pointer(path),nil) then
|
|
result := true;
|
|
end;
|
|
end;
|
|
|
|
function TZipRead.UnZip(aIndex: integer; const DestDir: TFileName): boolean;
|
|
var FS: TFileStream;
|
|
Path: TFileName;
|
|
CRC: Cardinal;
|
|
begin
|
|
result := false;
|
|
if (self=nil) or (cardinal(aIndex)>=cardinal(Count)) then
|
|
exit;
|
|
with Entry[aIndex] do begin
|
|
Path := DestDir+ExtractFilePath(zipName); // include sub directories
|
|
if not EnsurePath(Path) then
|
|
exit;
|
|
FS := TFileStream.Create(Path+ExtractFileName(zipName),fmCreate);
|
|
try
|
|
if info^.zZipMethod=0 then begin
|
|
FS.Write(data^,info^.zfullsize);
|
|
CRC := SynZip.crc32(0,data,info^.zfullSize);
|
|
end else
|
|
if UnCompressStream(data,info^.zzipsize,FS,@CRC)<>info^.zfullsize then
|
|
exit;
|
|
result := CRC=info^.zcrc32;
|
|
if info^.zlastMod<>0 then
|
|
{$ifdef CONDITIONALEXPRESSIONS}
|
|
{$WARN SYMBOL_PLATFORM OFF}
|
|
{$endif}
|
|
FileSetDate(FS.Handle,info^.zlastMod);
|
|
{$ifdef CONDITIONALEXPRESSIONS}
|
|
{$WARN SYMBOL_PLATFORM ON}
|
|
{$endif}
|
|
finally
|
|
FS.Free;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
{$endif Linux}
|
|
|
|
function GZRead(gz: PAnsiChar; gzLen: integer): RawByteString;
|
|
var Len: integer;
|
|
begin
|
|
result := '';
|
|
if (gz=nil) or (gzLen<=18) or (PCardinal(gz)^<>$88B1F) then
|
|
exit; // it MUST be a true .gz file
|
|
Len := pInteger(@gz[gzLen-4])^;
|
|
assert(cardinal(Len)<cardinal(gzLen)*64); // basic content check
|
|
if Len=0 then
|
|
exit;
|
|
SetLength(result,Len);
|
|
if UnCompressMem(@gz[10],pointer(result),gzLen-18,Len)<>Len then
|
|
result := '' else
|
|
if SynZip.crc32(0,pointer(result),Len)<>pCardinal(@gz[gzLen-8])^ then
|
|
result := ''; // invalid CRC
|
|
end;
|
|
|
|
|
|
{$ifdef Linux}
|
|
function zlibVersion: PAnsiChar; cdecl; external libz name 'zlibVersion';
|
|
function deflate; cdecl; external libz name 'deflate';
|
|
function deflateEnd(var strm: TZStream): integer; cdecl; external libz name 'deflateEnd';
|
|
function inflate(var strm: TZStream; flush: integer): integer; cdecl; external libz name 'inflate';
|
|
function inflateEnd(var strm: TZStream): integer; cdecl; external libz name 'inflateEnd';
|
|
function deflateSetDictionary(var strm: TZStream;dictionary : PAnsiChar; dictLength: cardinal): integer; cdecl; external libz name 'deflateSetDictionary';
|
|
function deflateCopy(var dest,source: TZStream): integer; cdecl; external libz name 'deflateCopy';
|
|
function deflateReset(var strm: TZStream): integer; cdecl; external libz name 'deflateReset';
|
|
function deflateParams(var strm: TZStream; level: integer; strategy: integer): integer; cdecl; external libz name 'deflateParams';
|
|
function inflateSetDictionary(var strm: TZStream;dictionary : PAnsiChar; dictLength: cardinal): integer; cdecl; external libz name 'inflateSetDictionary';
|
|
function inflateSync(var strm: TZStream): integer; cdecl; external libz name 'inflateSync';
|
|
function inflateReset(var strm: TZStream): integer; cdecl; external libz name 'inflateReset';
|
|
function compress(dest: PAnsiChar;var destLen:cardinal; source : PAnsiChar; sourceLen:cardinal):integer; cdecl; external libz name 'compress';
|
|
function compress2(dest: PAnsiChar;destLen:pcardinal; source : PAnsiChar; sourceLen:cardinal; level:integer):integer; cdecl; external libz name 'compress2';
|
|
function uncompress(dest: PAnsiChar;destLen:pcardinal; source : PAnsiChar; sourceLen:cardinal):integer; cdecl; external libz name 'uncompress';
|
|
{
|
|
function gzopen(path: PAnsiChar; mode: PAnsiChar): gzFile; cdecl; external libz name 'gzopen';
|
|
function gzdopen(fd: integer; mode: PAnsiChar): gzFile; cdecl; external libz name 'gzdopen';
|
|
function gzsetparams(thefile: gzFile; level: integer; strategy: integer): integer; cdecl; external libz name 'gzsetparams';
|
|
function gzread(thefile: gzFile; buf: pointer; len:cardinal): integer; cdecl; external libz name 'gzread';
|
|
function gzwrite(thefile: gzFile; buf: pointer; len:cardinal): integer; cdecl; external libz name 'gzwrite';
|
|
function gzprintf(thefile: gzFile; format: PAnsiChar; args:array of const): integer; cdecl; external libz name 'gzprintf';
|
|
function gzputs(thefile: gzFile; s: PAnsiChar): integer; cdecl; external libz name 'gzputs';
|
|
function gzgets(thefile: gzFile; buf: PAnsiChar; len: integer): PAnsiChar; cdecl; external libz name 'gzgets';
|
|
function gzputc(thefile: gzFile; c:AnsiChar):AnsiChar; cdecl; external libz name 'gzputc';
|
|
function gzgetc(thefile: gzFile):AnsiChar; cdecl; external libz name 'gzgetc';
|
|
function gzflush(thefile: gzFile; flush: integer): integer; cdecl; external libz name 'gzflush';
|
|
function gzseek(thefile: gzFile; offset:integer; whence: integer):integer; cdecl; external libz name 'gzseek';
|
|
function gzrewind(thefile: gzFile): integer; cdecl; external libz name 'gzrewind';
|
|
function gztell(thefile: gzFile):integer; cdecl; external libz name 'gztell';
|
|
function gzeof(thefile: gzFile):longbool; cdecl; external libz name 'gzeof';
|
|
function gzclose(thefile: gzFile): integer; cdecl; external libz name 'gzclose';
|
|
function gzerror(thefile: gzFile; var errnum: integer): PAnsiChar; cdecl; external libz name 'gzerror';
|
|
}
|
|
function adler32(adler:cardinal; buf: PAnsiChar; len: cardinal):cardinal; cdecl; external libz name 'adler32';
|
|
function crc32(crc:cardinal;buf : PAnsiChar; len: cardinal):cardinal; cdecl; external libz name 'crc32';
|
|
function deflateInit_(var strm: TZStream; level: integer; version: PAnsiChar; stream_size: integer): integer; cdecl; external libz name 'deflateInit_';
|
|
function inflateInit_(var strm: TZStream; version: PAnsiChar; stream_size: integer): integer; cdecl; external libz name 'inflateInit_';
|
|
function deflateInit2_(var strm: TZStream; level: integer; method: integer; windowBits: integer; memLevel: integer;strategy: integer; version: PAnsiChar; stream_size: integer): integer; cdecl; external libz name 'deflateInit2_';
|
|
function inflateInit2_(var strm: TZStream; windowBits: integer; version: PAnsiChar; stream_size: integer): integer; cdecl; external libz name 'inflateInit2_';
|
|
function get_crc_table: pointer; cdecl; external libz name 'get_crc_table';
|
|
|
|
function zlibAllocMem(AppData: Pointer; Items, Size: cardinal): Pointer; cdecl;
|
|
begin
|
|
Getmem(Result,Items * Size);
|
|
end;
|
|
|
|
procedure zlibFreeMem(AppData, Block: Pointer); cdecl;
|
|
begin
|
|
FreeMem(Block);
|
|
end;
|
|
|
|
procedure TZStream.Init;
|
|
begin
|
|
fillchar(Self,sizeof(Self),0);
|
|
zalloc := @zlibAllocMem; // even under Linux, use program heap
|
|
zfree := @zlibFreeMem;
|
|
end;
|
|
|
|
{$else} // Windows:
|
|
|
|
{$ifndef USEZLIB}
|
|
// our very own short implementation of ZLibH
|
|
|
|
// some small functions (adler32.obj, zutil.obj, compress.obj, uncompress.obj,
|
|
// crc32.obj) are coded directly in this unit, not as external .obj files
|
|
|
|
// this external obj code was compiled with pascal register call conventions
|
|
{$ifdef FPC} // FPC expects coff format
|
|
{$LINK deflate.o}
|
|
{$LINK trees.o}
|
|
{$else} // Delphi works with omf32 format
|
|
{$LINK deflate.obj}
|
|
{$LINK trees.obj}
|
|
{$endif}
|
|
|
|
function deflateInit2_(var strm: TZStream; level: integer; method: integer; windowBits: integer; memLevel: integer;strategy: integer; version: PAnsiChar; stream_size: integer): integer; external;
|
|
function deflate(var strm: TZStream; flush: integer): integer; external;
|
|
function deflateEnd(var strm: TZStream): integer; external;
|
|
|
|
const
|
|
_z_errmsg: array[0..9] of PAnsiChar = (
|
|
'need dictionary', // Z_NEED_DICT 2
|
|
'stream end', // Z_STREAM_END 1
|
|
'', // Z_OK 0
|
|
'file error', // Z_ERRNO (-1)
|
|
'stream error', // Z_STREAM_ERROR (-2)
|
|
'data error', // Z_DATA_ERROR (-3)
|
|
'insufficient memory', // Z_MEM_ERROR (-4)
|
|
'buffer error', // Z_BUF_ERROR (-5)
|
|
'incompatible version',// Z_VERSION_ERROR (-6)
|
|
'');
|
|
|
|
{$ifdef USEINLINEASM}
|
|
|
|
const
|
|
Err246: array[0..3] of AnsiChar = 'lit';
|
|
Err247: array[0..3] of AnsiChar = 'dst';
|
|
Err248: array[0..3] of AnsiChar = 'inv';
|
|
|
|
procedure Inline018;
|
|
asm
|
|
sub esp, 60
|
|
push ebx
|
|
push ebp
|
|
push esi
|
|
push edi
|
|
mov eax, dword ptr [esp + 50H]
|
|
mov edx, dword ptr [eax]
|
|
mov ecx, dword ptr [eax + 04H]
|
|
mov ebx, dword ptr [esp + 54H]
|
|
dec edx
|
|
lea ecx, [ecx + edx - 05H]
|
|
mov ebp, dword ptr [eax + 1CH]
|
|
mov dword ptr [esp + 30H], ecx
|
|
mov esi, dword ptr [eax + 0CH]
|
|
mov eax, dword ptr [eax + 10H]
|
|
mov ecx, eax
|
|
sub ecx, ebx
|
|
dec esi
|
|
lea eax, [eax + esi - 00000101H]
|
|
add ecx, esi
|
|
mov dword ptr [esp + 34H], eax
|
|
mov eax, dword ptr [ebp + 2CH]
|
|
mov dword ptr [esp + 44H], ecx
|
|
mov ecx, dword ptr [ebp + 28H]
|
|
mov dword ptr [esp + 48H], eax
|
|
mov eax, dword ptr [ebp + 34H]
|
|
mov ebx, dword ptr [ebp + 3CH]
|
|
mov dword ptr [esp + 28H], ecx
|
|
mov ecx, dword ptr [ebp + 30H]
|
|
mov dword ptr [esp + 2CH], eax
|
|
mov eax, dword ptr [ebp + 50H]
|
|
mov dword ptr [esp + 1CH], ecx
|
|
mov ecx, dword ptr [ebp + 4CH]
|
|
mov dword ptr [esp + 24H], eax
|
|
mov dword ptr [esp + 20H], ecx
|
|
mov ecx, dword ptr [ebp + 54H]
|
|
mov eax, 1
|
|
shl eax, cl
|
|
mov ecx, dword ptr [ebp + 58H]
|
|
mov edi, dword ptr [ebp + 38H]
|
|
dec eax
|
|
mov dword ptr [esp + 38H], eax
|
|
mov eax, 1
|
|
shl eax, cl
|
|
mov dword ptr [esp + 18H], ebp
|
|
mov dword ptr [esp + 14H], edx
|
|
dec eax
|
|
mov dword ptr [esp + 3CH], eax
|
|
@@019: cmp ebx, 15
|
|
jnc @@020
|
|
movzx eax, byte ptr [edx + 01H]
|
|
inc edx
|
|
mov ecx, ebx
|
|
shl eax, cl
|
|
add ebx, 8
|
|
mov ecx, ebx
|
|
add edi, eax
|
|
movzx eax, byte ptr [edx + 01H]
|
|
inc edx
|
|
shl eax, cl
|
|
mov dword ptr [esp + 14H], edx
|
|
add edi, eax
|
|
add ebx, 8
|
|
@@020: mov ecx, dword ptr [esp + 38H]
|
|
mov eax, dword ptr [esp + 20H]
|
|
and ecx, edi
|
|
mov eax, dword ptr [eax + ecx*4]
|
|
movzx ecx, ah
|
|
mov dword ptr [esp + 10H], eax
|
|
movzx eax, al
|
|
shr edi, cl
|
|
sub ebx, ecx
|
|
test eax, eax
|
|
jz @@022
|
|
@@021: test al, 10H
|
|
jnz @@023
|
|
test al, 40H
|
|
jne @@046
|
|
mov ecx, 1
|
|
mov dword ptr [esp + 54H], ecx
|
|
mov ecx, eax
|
|
mov eax, dword ptr [esp + 54H]
|
|
shl eax, cl
|
|
mov ecx, dword ptr [esp + 10H]
|
|
shr ecx, 16
|
|
dec eax
|
|
and eax, edi
|
|
add eax, ecx
|
|
mov ecx, dword ptr [esp + 20H]
|
|
mov eax, dword ptr [ecx + eax*4]
|
|
movzx ecx, ah
|
|
mov dword ptr [esp + 10H], eax
|
|
movzx eax, al
|
|
shr edi, cl
|
|
sub ebx, ecx
|
|
test eax, eax
|
|
jnz @@021
|
|
@@022: mov eax, dword ptr [esp + 10H]
|
|
inc esi
|
|
shr eax, 16
|
|
mov byte ptr [esi], al
|
|
jmp @@043
|
|
|
|
@@023: mov ecx, dword ptr [esp + 10H]
|
|
shr ecx, 16
|
|
and eax, 0000000FH
|
|
mov dword ptr [esp + 54H], ecx
|
|
jz @@025
|
|
cmp ebx, eax
|
|
jnc @@024
|
|
movzx ebp, byte ptr [edx + 01H]
|
|
inc edx
|
|
mov ecx, ebx
|
|
shl ebp, cl
|
|
mov dword ptr [esp + 14H], edx
|
|
add edi, ebp
|
|
add ebx, 8
|
|
@@024: mov ecx, eax
|
|
mov ebp, 1
|
|
shl ebp, cl
|
|
mov ecx, dword ptr [esp + 54H]
|
|
dec ebp
|
|
and ebp, edi
|
|
add ecx, ebp
|
|
mov ebp, dword ptr [esp + 18H]
|
|
mov dword ptr [esp + 54H], ecx
|
|
mov ecx, eax
|
|
shr edi, cl
|
|
sub ebx, eax
|
|
@@025: cmp ebx, 15
|
|
jnc @@026
|
|
movzx eax, byte ptr [edx + 01H]
|
|
inc edx
|
|
mov ecx, ebx
|
|
shl eax, cl
|
|
add ebx, 8
|
|
mov ecx, ebx
|
|
add edi, eax
|
|
movzx eax, byte ptr [edx + 01H]
|
|
inc edx
|
|
shl eax, cl
|
|
mov dword ptr [esp + 14H], edx
|
|
add edi, eax
|
|
add ebx, 8
|
|
@@026: mov ecx, dword ptr [esp + 3CH]
|
|
mov eax, dword ptr [esp + 24H]
|
|
and ecx, edi
|
|
mov eax, dword ptr [eax + ecx*4]
|
|
movzx ecx, ah
|
|
mov dword ptr [esp + 10H], eax
|
|
movzx eax, al
|
|
shr edi, cl
|
|
sub ebx, ecx
|
|
test al, 10H
|
|
jnz @@028
|
|
@@027: test al, 40H
|
|
jne @@045
|
|
mov ecx, 1
|
|
mov dword ptr [esp + 40H], ecx
|
|
mov ecx, eax
|
|
mov eax, dword ptr [esp + 40H]
|
|
shl eax, cl
|
|
mov ecx, dword ptr [esp + 10H]
|
|
shr ecx, 16
|
|
dec eax
|
|
and eax, edi
|
|
add eax, ecx
|
|
mov ecx, dword ptr [esp + 24H]
|
|
mov eax, dword ptr [ecx + eax*4]
|
|
movzx ecx, ah
|
|
mov dword ptr [esp + 10H], eax
|
|
movzx eax, al
|
|
shr edi, cl
|
|
sub ebx, ecx
|
|
test al, 10H
|
|
jz @@027
|
|
@@028: mov ecx, dword ptr [esp + 10H]
|
|
shr ecx, 16
|
|
and eax, 0000000FH
|
|
cmp ebx, eax
|
|
mov dword ptr [esp + 10H], ecx
|
|
jnc @@029
|
|
movzx ebp, byte ptr [edx + 01H]
|
|
inc edx
|
|
mov ecx, ebx
|
|
shl ebp, cl
|
|
add ebx, 8
|
|
mov dword ptr [esp + 14H], edx
|
|
add edi, ebp
|
|
cmp ebx, eax
|
|
jnc @@029
|
|
movzx ebp, byte ptr [edx + 01H]
|
|
inc edx
|
|
mov ecx, ebx
|
|
shl ebp, cl
|
|
mov dword ptr [esp + 14H], edx
|
|
add edi, ebp
|
|
add ebx, 8
|
|
@@029: mov ecx, 1
|
|
mov ebp, ecx
|
|
mov ecx, eax
|
|
shl ebp, cl
|
|
sub ebx, eax
|
|
dec ebp
|
|
and ebp, edi
|
|
mov ecx, ebp
|
|
mov ebp, dword ptr [esp + 10H]
|
|
add ebp, ecx
|
|
mov ecx, eax
|
|
shr edi, cl
|
|
mov ecx, dword ptr [esp + 44H]
|
|
mov eax, esi
|
|
sub eax, ecx
|
|
cmp ebp, eax
|
|
mov dword ptr [esp + 10H], ebp
|
|
jbe @@040
|
|
sub ebp, eax
|
|
cmp ebp, dword ptr [esp + 48H]
|
|
ja @@044
|
|
mov ecx, dword ptr [esp + 2CH]
|
|
mov eax, dword ptr [esp + 1CH]
|
|
dec ecx
|
|
test eax, eax
|
|
jnz @@031
|
|
mov eax, dword ptr [esp + 28H]
|
|
sub eax, ebp
|
|
add ecx, eax
|
|
mov eax, dword ptr [esp + 54H]
|
|
cmp ebp, eax
|
|
jae @@037
|
|
sub eax, ebp
|
|
mov dword ptr [esp + 54H], eax
|
|
|
|
@@030: mov al, byte ptr [ecx + 01H]
|
|
inc ecx
|
|
inc esi
|
|
dec ebp
|
|
mov byte ptr [esi], al
|
|
jnz @@030
|
|
jmp @@036
|
|
|
|
@@031: cmp eax, ebp
|
|
jnc @@034
|
|
sub eax, ebp
|
|
add eax, dword ptr [esp + 28H]
|
|
add ecx, eax
|
|
sub ebp, dword ptr [esp + 1CH]
|
|
mov eax, dword ptr [esp + 54H]
|
|
cmp ebp, eax
|
|
jnc @@037
|
|
sub eax, ebp
|
|
mov dword ptr [esp + 54H], eax
|
|
|
|
@@032: mov al, byte ptr [ecx + 01H]
|
|
inc ecx
|
|
inc esi
|
|
dec ebp
|
|
mov byte ptr [esi], al
|
|
jnz @@032
|
|
mov ecx, dword ptr [esp + 2CH]
|
|
mov eax, dword ptr [esp + 1CH]
|
|
mov ebp, dword ptr [esp + 54H]
|
|
dec ecx
|
|
cmp eax, ebp
|
|
jnc @@037
|
|
sub ebp, eax
|
|
mov dword ptr [esp + 54H], ebp
|
|
mov dword ptr [esp + 40H], eax
|
|
mov ebp, eax
|
|
@@033: mov al, byte ptr [ecx + 01H]
|
|
inc ecx
|
|
inc esi
|
|
dec ebp
|
|
mov byte ptr [esi], al
|
|
jnz @@033
|
|
jmp @@036
|
|
|
|
@@034: sub eax, ebp
|
|
add ecx, eax
|
|
mov eax, dword ptr [esp + 54H]
|
|
cmp ebp, eax
|
|
jnc @@037
|
|
sub eax, ebp
|
|
mov dword ptr [esp + 54H], eax
|
|
@@035: mov al, byte ptr [ecx + 01H]
|
|
inc ecx
|
|
inc esi
|
|
dec ebp
|
|
mov byte ptr [esi], al
|
|
jnz @@035
|
|
@@036: mov eax, dword ptr [esp + 10H]
|
|
mov ecx, esi
|
|
sub ecx, eax
|
|
@@037: mov eax, dword ptr [esp + 54H]
|
|
cmp eax, 2
|
|
jbe @@039
|
|
lea edx, [eax - 03H]
|
|
mov eax, -1431655765
|
|
mul edx
|
|
mov ebp, edx
|
|
shr ebp, 1
|
|
inc ebp
|
|
nop
|
|
@@038: mov al, byte ptr [ecx + 01H]
|
|
inc ecx
|
|
inc esi
|
|
mov byte ptr [esi], al
|
|
mov dl, byte ptr [ecx + 01H]
|
|
inc ecx
|
|
inc esi
|
|
mov byte ptr [esi], dl
|
|
mov edx, dword ptr [esp + 54H]
|
|
mov al, byte ptr [ecx + 01H]
|
|
inc ecx
|
|
inc esi
|
|
sub edx, 3
|
|
dec ebp
|
|
mov byte ptr [esi], al
|
|
mov dword ptr [esp + 54H], edx
|
|
jnz @@038
|
|
mov edx, dword ptr [esp + 14H]
|
|
@@039: mov eax, dword ptr [esp + 54H]
|
|
test eax, eax
|
|
jz @@042
|
|
mov al, byte ptr [ecx + 01H]
|
|
inc ecx
|
|
inc esi
|
|
mov byte ptr [esi], al
|
|
cmp dword ptr [esp + 54H], 1
|
|
jbe @@042
|
|
mov cl, byte ptr [ecx + 01H]
|
|
inc esi
|
|
mov byte ptr [esi], cl
|
|
jmp @@042
|
|
|
|
@@040: mov eax, esi
|
|
sub eax, ebp
|
|
|
|
@@041: mov cl, byte ptr [eax + 01H]
|
|
inc eax
|
|
inc esi
|
|
mov byte ptr [esi], cl
|
|
mov cl, byte ptr [eax + 01H]
|
|
inc eax
|
|
inc esi
|
|
mov byte ptr [esi], cl
|
|
mov cl, byte ptr [eax + 01H]
|
|
inc eax
|
|
inc esi
|
|
mov byte ptr [esi], cl
|
|
mov ecx, dword ptr [esp + 54H]
|
|
sub ecx, 3
|
|
cmp ecx, 2
|
|
mov dword ptr [esp + 54H], ecx
|
|
ja @@041
|
|
test ecx, ecx
|
|
jz @@042
|
|
mov cl, byte ptr [eax + 01H]
|
|
inc eax
|
|
inc esi
|
|
mov byte ptr [esi], cl
|
|
cmp dword ptr [esp + 54H], 1
|
|
jbe @@042
|
|
mov al, byte ptr [eax + 01H]
|
|
inc esi
|
|
mov byte ptr [esi], al
|
|
@@042: mov ebp, dword ptr [esp + 18H]
|
|
@@043: cmp edx, dword ptr [esp + 30H]
|
|
jnc @@049
|
|
cmp esi, dword ptr [esp + 34H]
|
|
jb @@019
|
|
jmp @@049
|
|
|
|
@@044: mov ecx, dword ptr [esp + 50H]
|
|
mov eax, dword ptr [esp + 18H]
|
|
mov dword ptr [ecx + 18H],offset Err248
|
|
mov dword ptr [eax], 27
|
|
mov ebp, eax
|
|
jmp @@049
|
|
|
|
@@045: mov ecx, dword ptr [esp + 50H]
|
|
mov dword ptr [ecx + 18H], offset Err247
|
|
jmp @@048
|
|
|
|
@@046: test al, 20H
|
|
jz @@047
|
|
mov dword ptr [ebp], 11
|
|
jmp @@049
|
|
|
|
@@047: mov eax, dword ptr [esp + 50H]
|
|
mov dword ptr [eax + 18H], offset Err246
|
|
@@048: mov dword ptr [ebp], 27
|
|
@@049: mov eax, ebx
|
|
shr eax, 3
|
|
lea ecx, [eax*8]
|
|
sub edx, eax
|
|
sub ebx, ecx
|
|
mov ecx, ebx
|
|
mov eax, 1
|
|
shl eax, cl
|
|
mov ecx, dword ptr [esp + 50H]
|
|
dec eax
|
|
and edi, eax
|
|
lea eax, [edx + 01H]
|
|
mov dword ptr [ecx], eax
|
|
lea eax, [esi + 01H]
|
|
mov dword ptr [ecx + 0CH], eax
|
|
mov eax, dword ptr [esp + 30H]
|
|
sub eax, edx
|
|
add eax, 5
|
|
mov dword ptr [ecx + 04H], eax
|
|
mov eax, dword ptr [esp + 34H]
|
|
sub eax, esi
|
|
add eax, 257
|
|
mov dword ptr [ecx + 10H], eax
|
|
mov dword ptr [ebp + 38H], edi
|
|
pop edi
|
|
pop esi
|
|
mov dword ptr [ebp + 3CH], ebx
|
|
pop ebp
|
|
pop ebx
|
|
add esp, 60
|
|
ret 8
|
|
end;
|
|
|
|
procedure inflateReset;
|
|
asm
|
|
mov edx, dword ptr [esp + 04H]
|
|
xor ecx, ecx
|
|
cmp edx, ecx
|
|
jz @@050
|
|
mov eax, dword ptr [edx + 1CH]
|
|
cmp eax, ecx
|
|
jz @@050
|
|
mov dword ptr [eax + 1CH], ecx
|
|
mov dword ptr [edx + 14H], ecx
|
|
mov dword ptr [edx + 08H], ecx
|
|
mov dword ptr [edx + 18H], ecx
|
|
mov dword ptr [edx + 30H], 1
|
|
mov dword ptr [eax], ecx
|
|
mov dword ptr [eax + 04H], ecx
|
|
mov dword ptr [eax + 0CH], ecx
|
|
mov dword ptr [eax + 20H], ecx
|
|
mov dword ptr [eax + 28H], ecx
|
|
mov dword ptr [eax + 2CH], ecx
|
|
mov dword ptr [eax + 30H], ecx
|
|
mov dword ptr [eax + 38H], ecx
|
|
mov dword ptr [eax + 3CH], ecx
|
|
lea ecx, [eax + 00000530H]
|
|
mov dword ptr [eax + 14H], 32768
|
|
mov dword ptr [eax + 6CH], ecx
|
|
mov dword ptr [eax + 50H], ecx
|
|
mov dword ptr [eax + 4CH], ecx
|
|
xor eax, eax
|
|
ret 4
|
|
|
|
@@050: mov eax, -2
|
|
ret 4
|
|
end;
|
|
|
|
function zsalloc(AppData: Pointer; Items, Size: cardinal): Pointer; stdcall;
|
|
begin // direct use of the (FastMM4) delphi heap for all inflate memory allocation
|
|
Getmem(Result,Items * Size);
|
|
end;
|
|
|
|
procedure zsfree(AppData, Block: Pointer); stdcall;
|
|
begin // direct use of the (FastMM4) delphi heap for all inflate memory allocation
|
|
FreeMem(Block);
|
|
end;
|
|
|
|
function inflateInit2_;
|
|
asm pop ebp // auto-generated push ebp; mov ebp,esp
|
|
mov eax, dword ptr [esp + 0CH]
|
|
push edi
|
|
xor edi, edi
|
|
cmp eax, edi
|
|
je @@058
|
|
cmp byte ptr [eax], 49
|
|
jne @@058
|
|
cmp dword ptr [esp + 14H], 56
|
|
jnz @@058
|
|
push esi
|
|
mov esi, dword ptr [esp + 0CH]
|
|
cmp esi, edi
|
|
jz @@057
|
|
mov [esi].TZStream.zFree,offset zsfree
|
|
mov [esi].TZStream.zAlloc,offset zsalloc
|
|
mov dword ptr [esi + 18H], edi
|
|
mov eax,9520
|
|
call System.@GetMem
|
|
mov [esi].TZStream.State,eax
|
|
mov ecx, dword ptr [esp + 10H]
|
|
cmp ecx, edi
|
|
jge @@054
|
|
mov dword ptr [eax + 08H], edi
|
|
neg ecx
|
|
jmp @@055
|
|
|
|
@@054: mov edx, ecx
|
|
sar edx, 4
|
|
inc edx
|
|
mov dword ptr [eax + 08H], edx
|
|
@@055: cmp ecx, 8
|
|
jl @@056
|
|
cmp ecx, 15
|
|
jg @@056
|
|
push esi
|
|
mov dword ptr [eax + 24H], ecx
|
|
mov dword ptr [eax + 34H], edi
|
|
call inflateReset
|
|
pop esi
|
|
pop edi
|
|
ret 16
|
|
|
|
@@056: push eax
|
|
mov eax, dword ptr [esi + 28H]
|
|
push eax
|
|
call dword ptr [esi + 24H]
|
|
mov dword ptr [esi + 1CH], edi
|
|
@@057: pop esi
|
|
mov eax, -2
|
|
pop edi
|
|
ret 16
|
|
|
|
@@058: mov eax, -6
|
|
pop edi
|
|
ret 16
|
|
end;
|
|
|
|
|
|
procedure Inline059;
|
|
asm
|
|
push ebx
|
|
push ebp
|
|
mov ebp, dword ptr [esp + 0CH]
|
|
mov ebx, dword ptr [ebp + 1CH]
|
|
push esi
|
|
push edi
|
|
mov esi, eax
|
|
mov eax, dword ptr [ebx + 34H]
|
|
xor edi, edi
|
|
cmp eax, edi
|
|
jnz @@060
|
|
mov ecx, dword ptr [ebx + 24H]
|
|
mov eax, 1
|
|
shl eax, cl
|
|
mov ecx, dword ptr [ebp + 28H]
|
|
push 1
|
|
push eax
|
|
push ecx
|
|
call dword ptr [ebp + 20H]
|
|
cmp eax, edi
|
|
mov dword ptr [ebx + 34H], eax
|
|
jnz @@060
|
|
pop edi
|
|
pop esi
|
|
pop ebp
|
|
mov eax, 1
|
|
pop ebx
|
|
ret 4
|
|
|
|
@@060: cmp dword ptr [ebx + 28H], edi
|
|
jnz @@061
|
|
mov ecx, dword ptr [ebx + 24H]
|
|
mov edx, 1
|
|
shl edx, cl
|
|
mov dword ptr [ebx + 30H], edi
|
|
mov dword ptr [ebx + 2CH], edi
|
|
mov dword ptr [ebx + 28H], edx
|
|
@@061: mov edi, dword ptr [ebp + 10H]
|
|
mov ecx, dword ptr [ebx + 28H]
|
|
sub esi, edi
|
|
mov eax, esi
|
|
cmp eax, ecx
|
|
jc @@062
|
|
mov esi, dword ptr [ebp + 0CH]
|
|
mov edi, dword ptr [ebx + 34H]
|
|
sub esi, ecx
|
|
mov eax, ecx
|
|
shr ecx, 2
|
|
rep movsd
|
|
mov ecx, eax
|
|
and ecx, 00000003H
|
|
rep movsb
|
|
mov ecx, dword ptr [ebx + 28H]
|
|
pop edi
|
|
pop esi
|
|
pop ebp
|
|
mov dword ptr [ebx + 30H], 0
|
|
mov dword ptr [ebx + 2CH], ecx
|
|
xor eax, eax
|
|
pop ebx
|
|
ret 4
|
|
|
|
@@062: sub ecx, dword ptr [ebx + 30H]
|
|
cmp ecx, eax
|
|
mov dword ptr [esp + 14H], ecx
|
|
jbe @@063
|
|
mov ecx, eax
|
|
mov dword ptr [esp + 14H], ecx
|
|
@@063: mov edx, dword ptr [ebx + 30H]
|
|
mov edi, dword ptr [ebx + 34H]
|
|
mov esi, dword ptr [ebp + 0CH]
|
|
add edi, edx
|
|
mov edx, ecx
|
|
shr ecx, 2
|
|
sub esi, eax
|
|
rep movsd
|
|
mov ecx, edx
|
|
and ecx, 00000003H
|
|
rep movsb
|
|
mov ecx, dword ptr [esp + 14H]
|
|
sub eax, ecx
|
|
jz @@064
|
|
mov esi, dword ptr [ebp + 0CH]
|
|
mov edi, dword ptr [ebx + 34H]
|
|
mov ecx, eax
|
|
mov edx, ecx
|
|
sub esi, eax
|
|
shr ecx, 2
|
|
rep movsd
|
|
mov ecx, edx
|
|
and ecx, 00000003H
|
|
rep movsb
|
|
pop edi
|
|
mov dword ptr [ebx + 30H], eax
|
|
mov eax, dword ptr [ebx + 28H]
|
|
pop esi
|
|
mov dword ptr [ebx + 2CH], eax
|
|
pop ebp
|
|
xor eax, eax
|
|
pop ebx
|
|
ret 4
|
|
|
|
@@064: mov edi, dword ptr [ebx + 30H]
|
|
mov eax, dword ptr [ebx + 28H]
|
|
add edi, ecx
|
|
mov edx, edi
|
|
cmp edx, eax
|
|
mov dword ptr [ebx + 30H], edi
|
|
jnz @@065
|
|
mov dword ptr [ebx + 30H], 0
|
|
@@065: mov edx, dword ptr [ebx + 2CH]
|
|
cmp edx, eax
|
|
jnc @@066
|
|
add edx, ecx
|
|
mov dword ptr [ebx + 2CH], edx
|
|
@@066: pop edi
|
|
pop esi
|
|
pop ebp
|
|
xor eax, eax
|
|
pop ebx
|
|
ret 4
|
|
end;
|
|
|
|
function inflate;
|
|
asm pop ebp // auto-generated push ebp; mov ebp,esp
|
|
mov eax, dword ptr [esp + 04H]
|
|
sub esp, 52
|
|
test eax, eax
|
|
push ebx
|
|
je @@191
|
|
mov ebx, dword ptr [eax + 1CH]
|
|
test ebx, ebx
|
|
je @@191
|
|
mov ecx, dword ptr [eax + 0CH]
|
|
test ecx, ecx
|
|
je @@191
|
|
cmp dword ptr [eax], 0
|
|
jnz @@067
|
|
mov ecx, dword ptr [eax + 04H]
|
|
test ecx, ecx
|
|
jne @@191
|
|
@@067: cmp dword ptr [ebx], 11
|
|
jnz @@068
|
|
mov dword ptr [ebx], 12
|
|
@@068: mov ecx, dword ptr [eax + 0CH]
|
|
mov edx, dword ptr [ebx + 38H]
|
|
push ebp
|
|
mov ebp, dword ptr [ebx + 3CH]
|
|
push esi
|
|
mov esi, dword ptr [eax]
|
|
push edi
|
|
mov edi, dword ptr [eax + 04H]
|
|
mov dword ptr [esp + 24H], ecx
|
|
mov ecx, dword ptr [eax + 10H]
|
|
mov eax, dword ptr [ebx]
|
|
cmp eax, 28
|
|
mov dword ptr [esp + 1CH], ecx
|
|
mov dword ptr [esp + 14H], esi
|
|
mov dword ptr [esp + 18H], edi
|
|
mov dword ptr [esp + 10H], edx
|
|
mov dword ptr [esp + 38H], edi
|
|
mov dword ptr [esp + 28H], ecx
|
|
mov dword ptr [esp + 2CH], 0
|
|
ja @@176
|
|
@@069: jmp dword ptr [@@192 + eax*4]
|
|
|
|
@@070: mov eax, dword ptr [ebx + 08H]
|
|
test eax, eax
|
|
jnz @@071
|
|
mov dword ptr [ebx], 12
|
|
jmp @@175
|
|
|
|
@@071: cmp ebp, 16
|
|
jnc @@073
|
|
@@072: test edi, edi
|
|
je @@183
|
|
movzx eax, byte ptr [esi]
|
|
mov ecx, ebp
|
|
shl eax, cl
|
|
dec edi
|
|
add ebp, 8
|
|
mov dword ptr [esp + 18H], edi
|
|
add edx, eax
|
|
inc esi
|
|
cmp ebp, 16
|
|
mov dword ptr [esp + 10H], edx
|
|
mov dword ptr [esp + 14H], esi
|
|
jc @@072
|
|
@@073: mov eax, edx
|
|
and eax, 000000FFH
|
|
shr edx, 8
|
|
shl eax, 8
|
|
add eax, edx
|
|
xor edx, edx
|
|
mov ecx, 31
|
|
div ecx
|
|
test edx, edx
|
|
jz @@074
|
|
mov edx, dword ptr [esp + 48H]
|
|
mov dword ptr [edx + 18H], offset Err248
|
|
mov edx, dword ptr [esp + 10H]
|
|
jmp @@174
|
|
|
|
@@074: mov ecx, dword ptr [esp + 10H]
|
|
mov eax, ecx
|
|
and al, 0FH
|
|
cmp al, 8
|
|
jz @@075
|
|
mov ecx, dword ptr [esp + 48H]
|
|
mov edx, dword ptr [esp + 10H]
|
|
mov dword ptr [ecx + 18H], offset Err248
|
|
jmp @@174
|
|
|
|
@@075: mov eax, dword ptr [ebx + 24H]
|
|
shr ecx, 4
|
|
mov dword ptr [esp + 10H], ecx
|
|
and ecx, 0000000FH
|
|
add ecx, 8
|
|
sub ebp, 4
|
|
cmp ecx, eax
|
|
jbe @@076
|
|
mov edx, dword ptr [esp + 48H]
|
|
mov dword ptr [edx + 18H], offset Err248
|
|
mov edx, dword ptr [esp + 10H]
|
|
jmp @@174
|
|
|
|
@@076: mov eax, 1
|
|
shl eax, cl
|
|
mov dword ptr [ebx + 14H], eax
|
|
xor eax,eax
|
|
xor ecx,ecx
|
|
xor edx,edx
|
|
xor ebp,ebp
|
|
call Adler32
|
|
mov edx, dword ptr [esp + 10H]
|
|
mov ecx, dword ptr [esp + 48H]
|
|
shr edx, 8
|
|
not edx
|
|
and edx, 00000002H
|
|
or edx, 00000009H
|
|
mov dword ptr [ebx + 18H], eax
|
|
mov dword ptr [ecx + 30H], eax
|
|
mov dword ptr [ebx], edx
|
|
mov dword ptr [esp + 10H], ebp
|
|
mov edx, ebp
|
|
jmp @@175
|
|
|
|
@@077: cmp ebp, 32
|
|
jnc @@079
|
|
@@078: test edi, edi
|
|
je @@183
|
|
movzx eax, byte ptr [esi]
|
|
mov ecx, ebp
|
|
shl eax, cl
|
|
dec edi
|
|
add ebp, 8
|
|
mov dword ptr [esp + 18H], edi
|
|
add edx, eax
|
|
inc esi
|
|
cmp ebp, 32
|
|
mov dword ptr [esp + 10H], edx
|
|
mov dword ptr [esp + 14H], esi
|
|
jc @@078
|
|
@@079: mov ecx, edx
|
|
and ecx, 0000FF00H
|
|
mov eax, edx
|
|
shl eax, 16
|
|
add ecx, eax
|
|
xor eax, eax
|
|
mov ah, byte ptr [esp + 12H]
|
|
shl ecx, 8
|
|
shr edx, 24
|
|
add ecx, eax
|
|
lea eax, [ecx + edx]
|
|
mov ecx, dword ptr [esp + 48H]
|
|
xor ebp, ebp
|
|
mov dword ptr [ebx + 18H], eax
|
|
mov dword ptr [ecx + 30H], eax
|
|
mov dword ptr [esp + 10H], ebp
|
|
mov dword ptr [ebx], 10
|
|
mov edx, ebp
|
|
|
|
@@080: mov eax, dword ptr [ebx + 0CH]
|
|
test eax, eax
|
|
je @@178
|
|
xor eax,eax
|
|
xor ecx,ecx
|
|
xor edx,edx
|
|
call Adler32
|
|
mov edx, dword ptr [esp + 48H]
|
|
mov dword ptr [ebx + 18H], eax
|
|
mov dword ptr [edx + 30H], eax
|
|
mov edx, dword ptr [esp + 10H]
|
|
mov dword ptr [ebx], 11
|
|
|
|
@@081: cmp dword ptr [esp + 4CH], 5
|
|
je @@183
|
|
|
|
@@082: mov eax, dword ptr [ebx + 04H]
|
|
test eax, eax
|
|
jz @@083
|
|
mov ecx, ebp
|
|
and ecx, 00000007H
|
|
shr edx, cl
|
|
sub ebp, ecx
|
|
mov dword ptr [ebx], 24
|
|
mov dword ptr [esp + 10H], edx
|
|
jmp @@175
|
|
|
|
@@083: cmp ebp, 3
|
|
jnc @@085
|
|
|
|
@@084: test edi, edi
|
|
je @@183
|
|
movzx eax, byte ptr [esi]
|
|
mov ecx, ebp
|
|
shl eax, cl
|
|
dec edi
|
|
add ebp, 8
|
|
mov dword ptr [esp + 18H], edi
|
|
add edx, eax
|
|
inc esi
|
|
cmp ebp, 3
|
|
mov dword ptr [esp + 14H], esi
|
|
jc @@084
|
|
@@085: mov ecx, edx
|
|
shr edx, 1
|
|
and ecx, 00000001H
|
|
mov eax, edx
|
|
and eax, 00000003H
|
|
dec ebp
|
|
cmp eax, 3
|
|
mov dword ptr [ebx + 04H], ecx
|
|
ja @@090
|
|
jmp dword ptr [@@193 + eax*4]
|
|
|
|
@@086: shr edx, 2
|
|
mov dword ptr [ebx], 13
|
|
mov dword ptr [esp + 10H], edx
|
|
sub ebp, 2
|
|
jmp @@175
|
|
|
|
@@087: shr edx, 2
|
|
mov dword ptr [ebx + 4CH], offset @@249
|
|
mov dword ptr [ebx + 54H], 9
|
|
mov dword ptr [ebx + 50H], offset @@250
|
|
mov dword ptr [ebx + 58H], 5
|
|
mov dword ptr [ebx], 18
|
|
mov dword ptr [esp + 10H], edx
|
|
sub ebp, 2
|
|
jmp @@175
|
|
|
|
@@088: shr edx, 2
|
|
mov dword ptr [ebx], 15
|
|
mov dword ptr [esp + 10H], edx
|
|
sub ebp, 2
|
|
jmp @@175
|
|
|
|
@@089: mov eax, dword ptr [esp + 48H]
|
|
mov dword ptr [eax + 18H], offset Err248
|
|
mov dword ptr [ebx], 27
|
|
@@090: shr edx, 2
|
|
mov dword ptr [esp + 10H], edx
|
|
sub ebp, 2
|
|
jmp @@175
|
|
|
|
@@091: mov ecx, ebp
|
|
and ecx, 00000007H
|
|
shr edx, cl
|
|
sub ebp, ecx
|
|
cmp ebp, 32
|
|
mov dword ptr [esp + 10H], edx
|
|
jnc @@093
|
|
|
|
@@092: test edi, edi
|
|
je @@183
|
|
movzx eax, byte ptr [esi]
|
|
mov ecx, ebp
|
|
shl eax, cl
|
|
dec edi
|
|
add ebp, 8
|
|
mov dword ptr [esp + 18H], edi
|
|
add edx, eax
|
|
inc esi
|
|
cmp ebp, 32
|
|
mov dword ptr [esp + 10H], edx
|
|
mov dword ptr [esp + 14H], esi
|
|
jc @@092
|
|
@@093: mov ecx, edx
|
|
mov eax, edx
|
|
not ecx
|
|
and eax, 0000FFFFH
|
|
shr ecx, 16
|
|
cmp eax, ecx
|
|
jz @@094
|
|
mov eax, dword ptr [esp + 48H]
|
|
mov dword ptr [eax + 18H], offset Err248
|
|
jmp @@174
|
|
|
|
@@094: xor ebp, ebp
|
|
mov dword ptr [ebx + 40H], eax
|
|
mov dword ptr [esp + 10H], ebp
|
|
mov dword ptr [ebx], 14
|
|
mov edx, ebp
|
|
|
|
@@095: mov ecx, dword ptr [ebx + 40H]
|
|
test ecx, ecx
|
|
mov dword ptr [esp + 20H], ecx
|
|
je @@142
|
|
cmp ecx, edi
|
|
jbe @@096
|
|
mov ecx, edi
|
|
mov dword ptr [esp + 20H], ecx
|
|
@@096: mov eax, dword ptr [esp + 1CH]
|
|
cmp ecx, eax
|
|
jbe @@097
|
|
mov ecx, eax
|
|
mov dword ptr [esp + 20H], ecx
|
|
@@097: test ecx, ecx
|
|
je @@183
|
|
mov esi, dword ptr [esp + 14H]
|
|
mov edi, dword ptr [esp + 24H]
|
|
mov eax, ecx
|
|
shr ecx, 2
|
|
rep movsd
|
|
mov ecx, eax
|
|
mov eax, dword ptr [esp + 20H]
|
|
and ecx, 00000003H
|
|
rep movsb
|
|
mov esi, dword ptr [esp + 18H]
|
|
mov ecx, dword ptr [esp + 14H]
|
|
mov edi, dword ptr [esp + 1CH]
|
|
sub esi, eax
|
|
mov dword ptr [esp + 18H], esi
|
|
mov esi, dword ptr [esp + 24H]
|
|
add ecx, eax
|
|
mov dword ptr [esp + 14H], ecx
|
|
mov ecx, dword ptr [ebx + 40H]
|
|
sub edi, eax
|
|
add esi, eax
|
|
sub ecx, eax
|
|
mov dword ptr [esp + 1CH], edi
|
|
mov edi, dword ptr [esp + 18H]
|
|
mov dword ptr [esp + 24H], esi
|
|
mov esi, dword ptr [esp + 14H]
|
|
mov dword ptr [ebx + 40H], ecx
|
|
jmp @@175
|
|
|
|
@@098: cmp ebp, 14
|
|
jnc @@100
|
|
@@099: test edi, edi
|
|
je @@183
|
|
movzx eax, byte ptr [esi]
|
|
mov ecx, ebp
|
|
shl eax, cl
|
|
dec edi
|
|
add ebp, 8
|
|
mov dword ptr [esp + 18H], edi
|
|
add edx, eax
|
|
inc esi
|
|
cmp ebp, 14
|
|
mov dword ptr [esp + 14H], esi
|
|
jc @@099
|
|
@@100: mov ecx, edx
|
|
and ecx, 0000001FH
|
|
shr edx, 5
|
|
add ecx, 257
|
|
mov eax, edx
|
|
mov dword ptr [ebx + 60H], ecx
|
|
and eax, 0000001FH
|
|
shr edx, 5
|
|
inc eax
|
|
mov ecx, edx
|
|
and ecx, 0000000FH
|
|
mov dword ptr [ebx + 64H], eax
|
|
mov eax, dword ptr [ebx + 60H]
|
|
add ecx, 4
|
|
shr edx, 4
|
|
sub ebp, 14
|
|
cmp eax, 286
|
|
mov dword ptr [ebx + 5CH], ecx
|
|
mov dword ptr [esp + 10H], edx
|
|
ja @@108
|
|
cmp dword ptr [ebx + 64H], 30
|
|
ja @@108
|
|
mov dword ptr [ebx + 68H], 0
|
|
mov dword ptr [ebx], 16
|
|
|
|
@@101: mov ecx, dword ptr [ebx + 68H]
|
|
cmp ecx, dword ptr [ebx + 5CH]
|
|
jnc @@105
|
|
@@102: cmp ebp, 3
|
|
jnc @@104
|
|
|
|
@@103: test edi, edi
|
|
je @@183
|
|
movzx eax, byte ptr [esi]
|
|
mov ecx, ebp
|
|
shl eax, cl
|
|
dec edi
|
|
add ebp, 8
|
|
mov dword ptr [esp + 18H], edi
|
|
add edx, eax
|
|
inc esi
|
|
cmp ebp, 3
|
|
mov dword ptr [esp + 14H], esi
|
|
jc @@103
|
|
@@104: mov eax, dword ptr [ebx + 68H]
|
|
movzx eax, word ptr [@@251 + eax*2]
|
|
xor ecx, ecx
|
|
mov cl, dl
|
|
shr edx, 3
|
|
sub ebp, 3
|
|
mov dword ptr [esp + 10H], edx
|
|
and ecx, 00000007H
|
|
mov word ptr [ebx + eax*2 + 70H], cx
|
|
mov ecx, dword ptr [ebx + 68H]
|
|
inc ecx
|
|
mov dword ptr [ebx + 68H], ecx
|
|
cmp ecx, dword ptr [ebx + 5CH]
|
|
jc @@102
|
|
@@105: mov ecx, dword ptr [ebx + 68H]
|
|
mov eax, 19
|
|
cmp ecx, eax
|
|
jnc @@107
|
|
xor ecx, ecx
|
|
|
|
@@106: mov edx, dword ptr [ebx + 68H]
|
|
movzx edx, word ptr [@@251 + edx*2]
|
|
mov word ptr [ebx + edx*2 + 70H], cx
|
|
mov edx, dword ptr [ebx + 68H]
|
|
inc edx
|
|
cmp edx, eax
|
|
mov dword ptr [ebx + 68H], edx
|
|
jc @@106
|
|
@@107: lea eax, [ebx + 00000530H]
|
|
lea ecx, [ebx + 6CH]
|
|
mov dword ptr [ecx], eax
|
|
mov dword ptr [ebx + 4CH], eax
|
|
lea edx, [ebx + 000002F0H]
|
|
push edx
|
|
lea eax, [ebx + 54H]
|
|
push eax
|
|
push ecx
|
|
mov dword ptr [eax], 7
|
|
push 19
|
|
lea eax, [ebx + 70H]
|
|
push eax
|
|
push 0
|
|
call @@196
|
|
test eax, eax
|
|
mov edx, dword ptr [esp + 10H]
|
|
mov dword ptr [esp + 2CH], eax
|
|
jz @@109
|
|
mov ecx, dword ptr [esp + 48H]
|
|
mov dword ptr [ecx + 18H], offset Err248
|
|
jmp @@174
|
|
|
|
@@108: mov eax, dword ptr [esp + 48H]
|
|
mov dword ptr [eax + 18H], offset Err248
|
|
jmp @@174
|
|
|
|
@@109: mov dword ptr [ebx + 68H], 0
|
|
mov dword ptr [ebx], 17
|
|
|
|
@@110: mov ecx, dword ptr [ebx + 60H]
|
|
mov eax, dword ptr [ebx + 64H]
|
|
add eax, ecx
|
|
cmp dword ptr [ebx + 68H], eax
|
|
jae @@129
|
|
@@111: mov ecx, dword ptr [ebx + 54H]
|
|
mov eax, 1
|
|
shl eax, cl
|
|
mov ecx, dword ptr [ebx + 4CH]
|
|
dec eax
|
|
and eax, edx
|
|
mov eax, dword ptr [ecx + eax*4]
|
|
movzx ecx, ah
|
|
cmp ecx, ebp
|
|
mov dword ptr [esp + 3CH], eax
|
|
jbe @@113
|
|
@@112: test edi, edi
|
|
je @@183
|
|
movzx eax, byte ptr [esi]
|
|
mov ecx, ebp
|
|
shl eax, cl
|
|
mov ecx, dword ptr [ebx + 54H]
|
|
dec edi
|
|
add ebp, 8
|
|
add edx, eax
|
|
mov eax, 1
|
|
shl eax, cl
|
|
mov ecx, dword ptr [ebx + 4CH]
|
|
inc esi
|
|
mov dword ptr [esp + 18H], edi
|
|
dec eax
|
|
and eax, edx
|
|
mov eax, dword ptr [ecx + eax*4]
|
|
movzx ecx, ah
|
|
cmp ecx, ebp
|
|
mov dword ptr [esp + 14H], esi
|
|
mov dword ptr [esp + 3CH], eax
|
|
ja @@112
|
|
@@113: mov ecx, dword ptr [esp + 3CH]
|
|
shr ecx, 16
|
|
cmp cx, 16
|
|
jnc @@116
|
|
movzx ecx, ah
|
|
cmp ebp, ecx
|
|
mov dword ptr [esp + 20H], ecx
|
|
jnc @@115
|
|
@@114: test edi, edi
|
|
je @@183
|
|
movzx eax, byte ptr [esi]
|
|
mov ecx, ebp
|
|
shl eax, cl
|
|
mov ecx, dword ptr [esp + 20H]
|
|
dec edi
|
|
add ebp, 8
|
|
add edx, eax
|
|
inc esi
|
|
cmp ebp, ecx
|
|
mov dword ptr [esp + 18H], edi
|
|
mov dword ptr [esp + 14H], esi
|
|
jc @@114
|
|
@@115: mov ax, word ptr [esp + 3EH]
|
|
shr edx, cl
|
|
sub ebp, ecx
|
|
mov ecx, dword ptr [ebx + 68H]
|
|
mov word ptr [ebx + ecx*2 + 70H], ax
|
|
mov eax, dword ptr [ebx + 68H]
|
|
inc eax
|
|
mov dword ptr [esp + 10H], edx
|
|
mov dword ptr [ebx + 68H], eax
|
|
jmp @@128
|
|
|
|
@@116: jnz @@119
|
|
movzx ecx, ah
|
|
lea eax, [ecx + 02H]
|
|
cmp ebp, eax
|
|
mov dword ptr [esp + 20H], ecx
|
|
jnc @@118
|
|
|
|
@@117: test edi, edi
|
|
je @@183
|
|
movzx eax, byte ptr [esi]
|
|
mov ecx, ebp
|
|
shl eax, cl
|
|
mov ecx, dword ptr [esp + 20H]
|
|
dec edi
|
|
add ebp, 8
|
|
add edx, eax
|
|
inc esi
|
|
lea eax, [ecx + 02H]
|
|
cmp ebp, eax
|
|
mov dword ptr [esp + 18H], edi
|
|
mov dword ptr [esp + 14H], esi
|
|
jc @@117
|
|
@@118: mov eax, dword ptr [ebx + 68H]
|
|
shr edx, cl
|
|
sub ebp, ecx
|
|
test eax, eax
|
|
mov dword ptr [esp + 10H], edx
|
|
je @@130
|
|
movzx ecx, word ptr [ebx + eax*2 + 6EH]
|
|
mov eax, edx
|
|
and eax, 00000003H
|
|
add eax, 3
|
|
shr edx, 2
|
|
mov dword ptr [esp + 30H], ecx
|
|
mov dword ptr [esp + 20H], eax
|
|
sub ebp, 2
|
|
jmp @@126
|
|
|
|
@@119: cmp cx, 17
|
|
movzx ecx, ah
|
|
mov dword ptr [esp + 20H], ecx
|
|
jnz @@122
|
|
lea eax, [ecx + 03H]
|
|
cmp ebp, eax
|
|
jnc @@121
|
|
@@120: test edi, edi
|
|
je @@183
|
|
movzx eax, byte ptr [esi]
|
|
mov ecx, ebp
|
|
shl eax, cl
|
|
mov ecx, dword ptr [esp + 20H]
|
|
dec edi
|
|
add ebp, 8
|
|
add edx, eax
|
|
inc esi
|
|
lea eax, [ecx + 03H]
|
|
cmp ebp, eax
|
|
mov dword ptr [esp + 18H], edi
|
|
mov dword ptr [esp + 14H], esi
|
|
jc @@120
|
|
@@121: shr edx, cl
|
|
mov eax, edx
|
|
and eax, 00000007H
|
|
add eax, 3
|
|
mov dword ptr [esp + 20H], eax
|
|
shr edx, 3
|
|
mov eax, -3
|
|
jmp @@125
|
|
|
|
@@122: lea eax, [ecx + 07H]
|
|
cmp ebp, eax
|
|
jnc @@124
|
|
@@123: test edi, edi
|
|
je @@183
|
|
movzx eax, byte ptr [esi]
|
|
mov ecx, ebp
|
|
shl eax, cl
|
|
mov ecx, dword ptr [esp + 20H]
|
|
dec edi
|
|
add ebp, 8
|
|
add edx, eax
|
|
inc esi
|
|
lea eax, [ecx + 07H]
|
|
cmp ebp, eax
|
|
mov dword ptr [esp + 18H], edi
|
|
mov dword ptr [esp + 14H], esi
|
|
jc @@123
|
|
@@124: shr edx, cl
|
|
mov eax, edx
|
|
and eax, 0000007FH
|
|
add eax, 11
|
|
mov dword ptr [esp + 20H], eax
|
|
shr edx, 7
|
|
mov eax, -7
|
|
@@125: sub eax, ecx
|
|
mov dword ptr [esp + 30H], 0
|
|
add ebp, eax
|
|
@@126: mov eax, dword ptr [ebx + 60H]
|
|
mov ecx, dword ptr [ebx + 64H]
|
|
add ecx, eax
|
|
mov eax, dword ptr [ebx + 68H]
|
|
add eax, dword ptr [esp + 20H]
|
|
mov dword ptr [esp + 10H], edx
|
|
cmp eax, ecx
|
|
ja @@131
|
|
mov eax, dword ptr [esp + 20H]
|
|
test eax, eax
|
|
jz @@128
|
|
mov dword ptr [esp + 20H], eax
|
|
mov eax, dword ptr [esp + 30H]
|
|
|
|
@@127: mov ecx, dword ptr [ebx + 68H]
|
|
mov word ptr [ebx + ecx*2 + 70H], ax
|
|
inc dword ptr [ebx + 68H]
|
|
dec dword ptr [esp + 20H]
|
|
jnz @@127
|
|
@@128: mov ecx, dword ptr [ebx + 60H]
|
|
mov eax, dword ptr [ebx + 64H]
|
|
add eax, ecx
|
|
cmp dword ptr [ebx + 68H], eax
|
|
jb @@111
|
|
@@129: cmp dword ptr [ebx], 27
|
|
je @@175
|
|
lea eax, [ebx + 00000530H]
|
|
lea ecx, [ebx + 6CH]
|
|
mov dword ptr [ecx], eax
|
|
lea edx, [ebx + 000002F0H]
|
|
push edx
|
|
mov dword ptr [ebx + 4CH], eax
|
|
lea eax, [ebx + 54H]
|
|
push eax
|
|
push ecx
|
|
mov ecx, dword ptr [ebx + 60H]
|
|
push ecx
|
|
lea edx, [ebx + 70H]
|
|
push edx
|
|
push 1
|
|
mov dword ptr [eax], 9
|
|
call @@196
|
|
test eax, eax
|
|
mov dword ptr [esp + 2CH], eax
|
|
jz @@132
|
|
mov eax, dword ptr [esp + 48H]
|
|
mov edx, dword ptr [esp + 10H]
|
|
mov dword ptr [eax + 18H], offset Err248
|
|
jmp @@174
|
|
|
|
@@130: mov ecx, dword ptr [esp + 48H]
|
|
mov dword ptr [ecx + 18H], offset Err248
|
|
jmp @@174
|
|
|
|
@@131: mov eax, dword ptr [esp + 48H]
|
|
mov dword ptr [eax + 18H], offset Err248
|
|
jmp @@174
|
|
|
|
@@132: mov edx, dword ptr [ebx + 6CH]
|
|
lea ecx, [ebx + 6CH]
|
|
mov dword ptr [ebx + 50H], edx
|
|
lea edx, [ebx + 000002F0H]
|
|
push edx
|
|
lea eax, [ebx + 58H]
|
|
push eax
|
|
push ecx
|
|
mov ecx, dword ptr [ebx + 60H]
|
|
mov dword ptr [eax], 6
|
|
mov eax, dword ptr [ebx + 64H]
|
|
push eax
|
|
lea edx, [ebx + ecx*2 + 70H]
|
|
push edx
|
|
push 2
|
|
call @@196
|
|
test eax, eax
|
|
mov edx, dword ptr [esp + 10H]
|
|
mov dword ptr [esp + 2CH], eax
|
|
jz @@133
|
|
mov eax, dword ptr [esp + 48H]
|
|
mov dword ptr [eax + 18H], offset Err248
|
|
jmp @@174
|
|
|
|
@@133: mov dword ptr [ebx], 18
|
|
|
|
@@134: cmp edi, 6
|
|
jc @@135
|
|
cmp dword ptr [esp + 1CH], 258
|
|
jc @@135
|
|
mov eax, dword ptr [esp + 48H]
|
|
mov ecx, dword ptr [esp + 24H]
|
|
mov dword ptr [eax + 0CH], ecx
|
|
mov ecx, dword ptr [esp + 1CH]
|
|
mov dword ptr [eax + 10H], ecx
|
|
mov dword ptr [eax], esi
|
|
mov dword ptr [eax + 04H], edi
|
|
mov dword ptr [ebx + 38H], edx
|
|
mov edx, dword ptr [esp + 28H]
|
|
push edx
|
|
push eax
|
|
mov dword ptr [ebx + 3CH], ebp
|
|
call Inline018
|
|
mov eax, dword ptr [esp + 48H]
|
|
mov edx, dword ptr [eax + 10H]
|
|
mov ecx, dword ptr [eax + 0CH]
|
|
mov esi, dword ptr [eax]
|
|
mov edi, dword ptr [eax + 04H]
|
|
mov eax, dword ptr [ebx + 38H]
|
|
mov ebp, dword ptr [ebx + 3CH]
|
|
mov dword ptr [esp + 1CH], edx
|
|
mov dword ptr [esp + 24H], ecx
|
|
mov dword ptr [esp + 14H], esi
|
|
mov dword ptr [esp + 18H], edi
|
|
mov dword ptr [esp + 10H], eax
|
|
mov edx, eax
|
|
jmp @@175
|
|
|
|
@@135: mov ecx, dword ptr [ebx + 54H]
|
|
mov eax, 1
|
|
shl eax, cl
|
|
dec eax
|
|
and eax, edx
|
|
mov ecx, eax
|
|
mov eax, dword ptr [ebx + 4CH]
|
|
mov eax, dword ptr [eax + ecx*4]
|
|
movzx ecx, ah
|
|
cmp ecx, ebp
|
|
mov dword ptr [esp + 3CH], eax
|
|
jbe @@137
|
|
|
|
@@136: test edi, edi
|
|
je @@183
|
|
movzx eax, byte ptr [esi]
|
|
mov ecx, ebp
|
|
shl eax, cl
|
|
mov ecx, dword ptr [ebx + 54H]
|
|
dec edi
|
|
add ebp, 8
|
|
add edx, eax
|
|
mov eax, 1
|
|
shl eax, cl
|
|
mov ecx, dword ptr [ebx + 4CH]
|
|
inc esi
|
|
mov dword ptr [esp + 18H], edi
|
|
dec eax
|
|
and eax, edx
|
|
mov eax, dword ptr [ecx + eax*4]
|
|
movzx ecx, ah
|
|
cmp ecx, ebp
|
|
mov dword ptr [esp + 14H], esi
|
|
mov dword ptr [esp + 3CH], eax
|
|
ja @@136
|
|
@@137: test al, al
|
|
je @@140
|
|
test al, 0F0H
|
|
jne @@140
|
|
movzx ecx, ah
|
|
mov dword ptr [esp + 20H], ecx
|
|
xor ecx, ecx
|
|
mov cl, al
|
|
mov dword ptr [esp + 10H], eax
|
|
add ecx, dword ptr [esp + 20H]
|
|
mov eax, 1
|
|
shl eax, cl
|
|
mov ecx, dword ptr [esp + 20H]
|
|
dec eax
|
|
and eax, edx
|
|
shr eax, cl
|
|
mov ecx, dword ptr [esp + 3CH]
|
|
shr ecx, 16
|
|
add eax, ecx
|
|
mov ecx, eax
|
|
mov eax, dword ptr [ebx + 4CH]
|
|
mov eax, dword ptr [eax + ecx*4]
|
|
mov ecx, dword ptr [esp + 10H]
|
|
shr ecx, 8
|
|
mov dword ptr [esp + 3CH], eax
|
|
movzx ecx, cl
|
|
movzx eax, ah
|
|
add eax, ecx
|
|
cmp eax, ebp
|
|
mov dword ptr [esp + 20H], ecx
|
|
jbe @@139
|
|
|
|
@@138: test edi, edi
|
|
je @@183
|
|
movzx eax, byte ptr [esi]
|
|
mov ecx, ebp
|
|
shl eax, cl
|
|
xor ecx, ecx
|
|
mov cl, byte ptr [esp + 10H]
|
|
dec edi
|
|
add edx, eax
|
|
mov eax, dword ptr [esp + 20H]
|
|
inc esi
|
|
add ebp, 8
|
|
mov dword ptr [esp + 18H], edi
|
|
add ecx, eax
|
|
mov eax, 1
|
|
shl eax, cl
|
|
mov ecx, dword ptr [esp + 20H]
|
|
mov dword ptr [esp + 14H], esi
|
|
dec eax
|
|
and eax, edx
|
|
shr eax, cl
|
|
movzx ecx, word ptr [esp + 12H]
|
|
add eax, ecx
|
|
mov ecx, dword ptr [ebx + 4CH]
|
|
mov eax, dword ptr [ecx + eax*4]
|
|
mov ecx, dword ptr [esp + 20H]
|
|
mov dword ptr [esp + 3CH], eax
|
|
movzx eax, ah
|
|
add eax, ecx
|
|
cmp eax, ebp
|
|
ja @@138
|
|
@@139: mov eax, dword ptr [esp + 3CH]
|
|
shr edx, cl
|
|
sub ebp, ecx
|
|
@@140: movzx ecx, ah
|
|
shr edx, cl
|
|
movzx ecx, ah
|
|
sub ebp, ecx
|
|
mov ecx, dword ptr [esp + 3CH]
|
|
shr ecx, 16
|
|
test al, al
|
|
mov dword ptr [esp + 10H], edx
|
|
mov dword ptr [ebx + 40H], ecx
|
|
jnz @@141
|
|
mov dword ptr [ebx], 23
|
|
jmp @@175
|
|
|
|
@@141: test al, 20H
|
|
jz @@143
|
|
@@142: mov dword ptr [ebx], 11
|
|
jmp @@175
|
|
|
|
@@143: test al, 40H
|
|
jz @@144
|
|
mov eax, dword ptr [esp + 48H]
|
|
mov dword ptr [eax + 18H], offset Err248
|
|
jmp @@174
|
|
|
|
@@144: and eax, 0000000FH
|
|
mov dword ptr [ebx + 48H], eax
|
|
mov dword ptr [ebx], 19
|
|
|
|
@@145: mov eax, dword ptr [ebx + 48H]
|
|
test eax, eax
|
|
jz @@148
|
|
cmp ebp, eax
|
|
jnc @@147
|
|
@@146: test edi, edi
|
|
je @@183
|
|
movzx eax, byte ptr [esi]
|
|
mov ecx, ebp
|
|
shl eax, cl
|
|
dec edi
|
|
add ebp, 8
|
|
mov dword ptr [esp + 18H], edi
|
|
add edx, eax
|
|
mov eax, dword ptr [ebx + 48H]
|
|
inc esi
|
|
cmp ebp, eax
|
|
mov dword ptr [esp + 14H], esi
|
|
jc @@146
|
|
@@147: mov ecx, dword ptr [ebx + 48H]
|
|
mov eax, 1
|
|
shl eax, cl
|
|
mov ecx, dword ptr [ebx + 40H]
|
|
dec eax
|
|
and eax, edx
|
|
add ecx, eax
|
|
mov dword ptr [ebx + 40H], ecx
|
|
mov ecx, dword ptr [ebx + 48H]
|
|
shr edx, cl
|
|
sub ebp, ecx
|
|
@@148: mov dword ptr [ebx], 20
|
|
|
|
@@149: mov ecx, dword ptr [ebx + 58H]
|
|
mov eax, 1
|
|
shl eax, cl
|
|
dec eax
|
|
and eax, edx
|
|
mov ecx, eax
|
|
mov eax, dword ptr [ebx + 50H]
|
|
mov eax, dword ptr [eax + ecx*4]
|
|
movzx ecx, ah
|
|
cmp ecx, ebp
|
|
mov dword ptr [esp + 3CH], eax
|
|
jbe @@151
|
|
@@150: test edi, edi
|
|
je @@183
|
|
movzx eax, byte ptr [esi]
|
|
mov ecx, ebp
|
|
shl eax, cl
|
|
mov ecx, dword ptr [ebx + 58H]
|
|
dec edi
|
|
add ebp, 8
|
|
add edx, eax
|
|
mov eax, 1
|
|
shl eax, cl
|
|
mov ecx, dword ptr [ebx + 50H]
|
|
inc esi
|
|
mov dword ptr [esp + 18H], edi
|
|
dec eax
|
|
and eax, edx
|
|
mov eax, dword ptr [ecx + eax*4]
|
|
movzx ecx, ah
|
|
cmp ecx, ebp
|
|
mov dword ptr [esp + 14H], esi
|
|
mov dword ptr [esp + 3CH], eax
|
|
ja @@150
|
|
@@151: test al, 0F0H
|
|
jne @@154
|
|
movzx ecx, ah
|
|
mov dword ptr [esp + 20H], ecx
|
|
xor ecx, ecx
|
|
mov cl, al
|
|
mov dword ptr [esp + 10H], eax
|
|
add ecx, dword ptr [esp + 20H]
|
|
mov eax, 1
|
|
shl eax, cl
|
|
mov ecx, dword ptr [esp + 20H]
|
|
dec eax
|
|
and eax, edx
|
|
shr eax, cl
|
|
mov ecx, dword ptr [esp + 3CH]
|
|
shr ecx, 16
|
|
add eax, ecx
|
|
mov ecx, eax
|
|
mov eax, dword ptr [ebx + 50H]
|
|
mov eax, dword ptr [eax + ecx*4]
|
|
mov ecx, dword ptr [esp + 10H]
|
|
shr ecx, 8
|
|
mov dword ptr [esp + 3CH], eax
|
|
movzx ecx, cl
|
|
movzx eax, ah
|
|
add eax, ecx
|
|
cmp eax, ebp
|
|
mov dword ptr [esp + 20H], ecx
|
|
jbe @@153
|
|
|
|
@@152: test edi, edi
|
|
je @@183
|
|
movzx eax, byte ptr [esi]
|
|
mov ecx, ebp
|
|
shl eax, cl
|
|
xor ecx, ecx
|
|
mov cl, byte ptr [esp + 10H]
|
|
dec edi
|
|
add edx, eax
|
|
mov eax, dword ptr [esp + 20H]
|
|
inc esi
|
|
add ebp, 8
|
|
mov dword ptr [esp + 18H], edi
|
|
add ecx, eax
|
|
mov eax, 1
|
|
shl eax, cl
|
|
mov ecx, dword ptr [esp + 20H]
|
|
mov dword ptr [esp + 14H], esi
|
|
dec eax
|
|
and eax, edx
|
|
shr eax, cl
|
|
movzx ecx, word ptr [esp + 12H]
|
|
add eax, ecx
|
|
mov ecx, dword ptr [ebx + 50H]
|
|
mov eax, dword ptr [ecx + eax*4]
|
|
mov ecx, dword ptr [esp + 20H]
|
|
mov dword ptr [esp + 3CH], eax
|
|
movzx eax, ah
|
|
add eax, ecx
|
|
cmp eax, ebp
|
|
ja @@152
|
|
@@153: mov eax, dword ptr [esp + 3CH]
|
|
shr edx, cl
|
|
sub ebp, ecx
|
|
@@154: movzx ecx, ah
|
|
shr edx, cl
|
|
movzx ecx, ah
|
|
sub ebp, ecx
|
|
test al, 40H
|
|
mov dword ptr [esp + 10H], edx
|
|
jz @@155
|
|
mov ecx, dword ptr [esp + 48H]
|
|
mov dword ptr [ecx + 18H], offset Err248
|
|
jmp @@174
|
|
|
|
@@155: mov ecx, dword ptr [esp + 3CH]
|
|
shr ecx, 16
|
|
and eax, 0000000FH
|
|
mov dword ptr [ebx + 44H], ecx
|
|
mov dword ptr [ebx + 48H], eax
|
|
mov dword ptr [ebx], 21
|
|
|
|
@@156: mov eax, dword ptr [ebx + 48H]
|
|
test eax, eax
|
|
jz @@159
|
|
cmp ebp, eax
|
|
jnc @@158
|
|
@@157: test edi, edi
|
|
je @@183
|
|
movzx eax, byte ptr [esi]
|
|
mov ecx, ebp
|
|
shl eax, cl
|
|
dec edi
|
|
add ebp, 8
|
|
mov dword ptr [esp + 18H], edi
|
|
add edx, eax
|
|
mov eax, dword ptr [ebx + 48H]
|
|
inc esi
|
|
cmp ebp, eax
|
|
mov dword ptr [esp + 14H], esi
|
|
jc @@157
|
|
@@158: mov ecx, dword ptr [ebx + 48H]
|
|
mov eax, 1
|
|
shl eax, cl
|
|
mov ecx, dword ptr [ebx + 44H]
|
|
dec eax
|
|
and eax, edx
|
|
add ecx, eax
|
|
mov dword ptr [ebx + 44H], ecx
|
|
mov ecx, dword ptr [ebx + 48H]
|
|
shr edx, cl
|
|
sub ebp, ecx
|
|
mov dword ptr [esp + 10H], edx
|
|
@@159: mov eax, dword ptr [esp + 1CH]
|
|
mov ecx, dword ptr [ebx + 2CH]
|
|
sub ecx, eax
|
|
add ecx, dword ptr [esp + 28H]
|
|
cmp dword ptr [ebx + 44H], ecx
|
|
jbe @@160
|
|
mov eax, dword ptr [esp + 48H]
|
|
mov dword ptr [eax + 18H], offset Err248
|
|
jmp @@174
|
|
|
|
@@160: mov dword ptr [ebx], 22
|
|
|
|
@@161: mov eax, dword ptr [esp + 1CH]
|
|
test eax, eax
|
|
je @@183
|
|
mov ecx, dword ptr [esp + 28H]
|
|
sub ecx, eax
|
|
mov eax, dword ptr [ebx + 44H]
|
|
cmp eax, ecx
|
|
jbe @@164
|
|
sub eax, ecx
|
|
mov ecx, dword ptr [ebx + 30H]
|
|
cmp eax, ecx
|
|
mov dword ptr [esp + 20H], eax
|
|
jbe @@162
|
|
sub eax, ecx
|
|
mov ecx, dword ptr [ebx + 34H]
|
|
add ecx, dword ptr [ebx + 28H]
|
|
mov dword ptr [esp + 20H], eax
|
|
sub ecx, eax
|
|
jmp @@163
|
|
|
|
@@162: mov ecx, dword ptr [ebx + 34H]
|
|
sub ecx, eax
|
|
add ecx, dword ptr [ebx + 30H]
|
|
mov eax, dword ptr [esp + 20H]
|
|
@@163: mov dword ptr [esp + 30H], ecx
|
|
mov ecx, dword ptr [ebx + 40H]
|
|
cmp eax, ecx
|
|
mov dword ptr [esp + 34H], ecx
|
|
jbe @@166
|
|
mov eax, ecx
|
|
jmp @@165
|
|
|
|
@@164: mov ecx, dword ptr [esp + 24H]
|
|
sub ecx, eax
|
|
mov eax, dword ptr [ebx + 40H]
|
|
mov dword ptr [esp + 30H], ecx
|
|
mov dword ptr [esp + 34H], eax
|
|
@@165: mov dword ptr [esp + 20H], eax
|
|
@@166: mov ecx, dword ptr [esp + 1CH]
|
|
cmp eax, ecx
|
|
jbe @@167
|
|
mov eax, ecx
|
|
mov dword ptr [esp + 20H], eax
|
|
@@167: sub ecx, eax
|
|
mov dword ptr [esp + 1CH], ecx
|
|
mov ecx, dword ptr [esp + 34H]
|
|
sub ecx, eax
|
|
mov eax, dword ptr [esp + 24H]
|
|
mov dword ptr [ebx + 40H], ecx
|
|
|
|
@@168: mov ecx, dword ptr [esp + 30H]
|
|
mov cl, byte ptr [ecx]
|
|
mov byte ptr [eax], cl
|
|
mov ecx, dword ptr [esp + 30H]
|
|
inc eax
|
|
inc ecx
|
|
mov dword ptr [esp + 30H], ecx
|
|
dec dword ptr [esp + 20H]
|
|
jnz @@168
|
|
mov dword ptr [esp + 24H], eax
|
|
mov eax, dword ptr [ebx + 40H]
|
|
test eax, eax
|
|
jne @@175
|
|
mov dword ptr [ebx], 18
|
|
jmp @@175
|
|
|
|
@@169: mov eax, dword ptr [esp + 1CH]
|
|
test eax, eax
|
|
je @@183
|
|
mov eax, dword ptr [esp + 24H]
|
|
mov cl, byte ptr [ebx + 40H]
|
|
mov byte ptr [eax], cl
|
|
inc eax
|
|
mov dword ptr [esp + 24H], eax
|
|
dec dword ptr [esp + 1CH]
|
|
mov dword ptr [ebx], 18
|
|
jmp @@175
|
|
|
|
@@170: mov eax, dword ptr [ebx + 08H]
|
|
test eax, eax
|
|
je @@180
|
|
cmp ebp, 32
|
|
jnc @@172
|
|
|
|
@@171: test edi, edi
|
|
je @@183
|
|
movzx eax, byte ptr [esi]
|
|
mov ecx, ebp
|
|
shl eax, cl
|
|
dec edi
|
|
add ebp, 8
|
|
mov dword ptr [esp + 18H], edi
|
|
add edx, eax
|
|
inc esi
|
|
cmp ebp, 32
|
|
mov dword ptr [esp + 10H], edx
|
|
mov dword ptr [esp + 14H], esi
|
|
jc @@171
|
|
@@172: mov eax, dword ptr [esp + 28H]
|
|
sub eax, dword ptr [esp + 1CH]
|
|
mov ecx, dword ptr [esp + 48H]
|
|
add dword ptr [ecx + 14H], eax
|
|
mov ecx, dword ptr [ebx + 1CH]
|
|
add ecx, eax
|
|
test eax, eax
|
|
mov dword ptr [esp + 28H], eax
|
|
mov dword ptr [ebx + 1CH], ecx
|
|
jz @@173
|
|
mov ecx, dword ptr [esp + 24H]
|
|
mov edx, dword ptr [ebx + 18H]
|
|
push eax
|
|
sub ecx, eax
|
|
push ecx
|
|
push edx // parameters on stack
|
|
pop eax
|
|
pop edx
|
|
pop ecx // register calling convention
|
|
call Adler32
|
|
mov ecx, dword ptr [esp + 48H]
|
|
mov edx, dword ptr [esp + 10H]
|
|
mov dword ptr [ebx + 18H], eax
|
|
mov dword ptr [ecx + 30H], eax
|
|
@@173: mov eax, dword ptr [esp + 1CH]
|
|
mov dword ptr [esp + 28H], eax
|
|
mov ecx, edx
|
|
and ecx, 0000FF00H
|
|
mov eax, edx
|
|
shl eax, 16
|
|
add ecx, eax
|
|
xor eax, eax
|
|
mov ah, byte ptr [esp + 12H]
|
|
shl ecx, 8
|
|
add ecx, eax
|
|
mov eax, edx
|
|
shr eax, 24
|
|
add ecx, eax
|
|
cmp ecx, dword ptr [ebx + 18H]
|
|
jz @@179
|
|
mov ecx, dword ptr [esp + 48H]
|
|
mov dword ptr [ecx + 18H], offset Err248
|
|
@@174: mov dword ptr [ebx], 27
|
|
@@175: mov eax, dword ptr [ebx]
|
|
cmp eax, 28
|
|
jbe @@069
|
|
|
|
@@176: mov eax, -2
|
|
@@177: pop edi
|
|
pop esi
|
|
pop ebp
|
|
pop ebx
|
|
add esp, 52
|
|
ret 8
|
|
|
|
@@178: mov eax, dword ptr [esp + 48H]
|
|
mov ecx, dword ptr [esp + 24H]
|
|
mov dword ptr [eax + 0CH], ecx
|
|
mov ecx, dword ptr [esp + 1CH]
|
|
mov dword ptr [eax + 04H], edi
|
|
mov dword ptr [eax], esi
|
|
pop edi
|
|
mov dword ptr [eax + 10H], ecx
|
|
pop esi
|
|
mov dword ptr [ebx + 3CH], ebp
|
|
pop ebp
|
|
mov dword ptr [ebx + 38H], edx
|
|
mov eax, 2
|
|
pop ebx
|
|
add esp, 52
|
|
ret 8
|
|
|
|
@@179: xor ebp, ebp
|
|
mov dword ptr [esp + 10H], ebp
|
|
mov edx, ebp
|
|
@@180: mov dword ptr [ebx], 26
|
|
|
|
@@181: mov dword ptr [esp + 2CH], 1
|
|
jmp @@183
|
|
|
|
@@182: mov dword ptr [esp + 2CH], -3
|
|
@@183: mov eax, dword ptr [esp + 48H]
|
|
mov ecx, dword ptr [esp + 24H]
|
|
mov dword ptr [eax + 0CH], ecx
|
|
mov ecx, dword ptr [esp + 1CH]
|
|
mov dword ptr [eax + 10H], ecx
|
|
mov dword ptr [eax], esi
|
|
mov dword ptr [eax + 04H], edi
|
|
mov eax, dword ptr [ebx + 28H]
|
|
test eax, eax
|
|
mov dword ptr [ebx + 38H], edx
|
|
mov dword ptr [ebx + 3CH], ebp
|
|
jnz @@184
|
|
cmp dword ptr [ebx], 24
|
|
jge @@186
|
|
mov eax, dword ptr [esp + 48H]
|
|
mov edx, dword ptr [esp + 28H]
|
|
cmp edx, dword ptr [eax + 10H]
|
|
jz @@186
|
|
@@184: mov ecx, dword ptr [esp + 48H]
|
|
mov eax, dword ptr [esp + 28H]
|
|
push ecx
|
|
call Inline059;
|
|
test eax, eax
|
|
jz @@186
|
|
mov dword ptr [ebx], 28
|
|
|
|
@@185: pop edi
|
|
pop esi
|
|
pop ebp
|
|
mov eax, -4
|
|
pop ebx
|
|
add esp, 52
|
|
ret 8
|
|
|
|
@@186: mov esi, dword ptr [esp + 48H]
|
|
mov edx, dword ptr [esi + 04H]
|
|
mov ecx, dword ptr [esi + 10H]
|
|
mov ebp, dword ptr [esp + 38H]
|
|
mov edi, dword ptr [esp + 28H]
|
|
mov eax, dword ptr [esi + 08H]
|
|
sub ebp, edx
|
|
mov edx, dword ptr [esi + 14H]
|
|
sub edi, ecx
|
|
add eax, ebp
|
|
add edx, edi
|
|
mov dword ptr [esi + 08H], eax
|
|
mov dword ptr [esi + 14H], edx
|
|
mov ecx, dword ptr [ebx + 1CH]
|
|
mov eax, dword ptr [ebx + 08H]
|
|
add ecx, edi
|
|
test eax, eax
|
|
mov dword ptr [ebx + 1CH], ecx
|
|
jz @@187
|
|
test edi, edi
|
|
jz @@187
|
|
mov edx, dword ptr [esi + 0CH]
|
|
mov eax, dword ptr [ebx + 18H]
|
|
mov ecx,edi
|
|
sub edx, edi
|
|
call Adler32 // register calling convention
|
|
mov dword ptr [ebx + 18H], eax
|
|
mov dword ptr [esi + 30H], eax
|
|
@@187: mov ecx, dword ptr [ebx + 04H]
|
|
mov eax, dword ptr [ebx]
|
|
neg ecx
|
|
sbb ecx, ecx
|
|
xor edx, edx
|
|
and ecx, 00000040H
|
|
cmp eax, 11
|
|
setne dl
|
|
dec edx
|
|
and edx, 00000080H
|
|
add ecx, edx
|
|
add ecx, dword ptr [ebx + 3CH]
|
|
test ebp, ebp
|
|
mov dword ptr [esi + 2CH], ecx
|
|
jnz @@188
|
|
test edi, edi
|
|
jz @@189
|
|
@@188: cmp dword ptr [esp + 4CH], 4
|
|
jnz @@190
|
|
@@189: mov eax, dword ptr [esp + 2CH]
|
|
test eax, eax
|
|
jne @@177
|
|
pop edi
|
|
pop esi
|
|
pop ebp
|
|
mov eax, -5
|
|
pop ebx
|
|
add esp, 52
|
|
ret 8
|
|
|
|
@@190: mov eax, dword ptr [esp + 2CH]
|
|
pop edi
|
|
pop esi
|
|
pop ebp
|
|
pop ebx
|
|
add esp, 52
|
|
ret 8
|
|
|
|
@@191: mov eax, -2
|
|
pop ebx
|
|
add esp, 52
|
|
ret 8
|
|
|
|
@@196: sub esp, 124
|
|
mov edx, dword ptr [esp + 00000088H]
|
|
xor eax, eax
|
|
test edx, edx
|
|
mov dword ptr [esp + 3CH], eax
|
|
mov dword ptr [esp + 40H], eax
|
|
mov dword ptr [esp + 44H], eax
|
|
mov dword ptr [esp + 48H], eax
|
|
mov dword ptr [esp + 4CH], eax
|
|
push ebx
|
|
mov dword ptr [esp + 54H], eax
|
|
push ebp
|
|
mov ebp, dword ptr [esp + 0000008CH]
|
|
mov dword ptr [esp + 5CH], eax
|
|
push esi
|
|
mov dword ptr [esp + 64H], eax
|
|
jbe @@198
|
|
|
|
@@197: movzx ecx, word ptr [ebp + eax*2]
|
|
inc word ptr [esp + ecx*2 + 48H]
|
|
lea ecx, [esp + ecx*2 + 48H]
|
|
inc eax
|
|
cmp eax, edx
|
|
jc @@197
|
|
@@198: mov esi, dword ptr [esp + 0000009CH]
|
|
mov eax, dword ptr [esi]
|
|
mov ebx, 15
|
|
mov dword ptr [esp + 10H], eax
|
|
mov dword ptr [esp + 18H], ebx
|
|
|
|
@@199: cmp word ptr [esp + ebx*2 + 48H], 0
|
|
jnz @@200
|
|
dec ebx
|
|
cmp ebx, 1
|
|
jnc @@199
|
|
@@200: cmp eax, ebx
|
|
mov dword ptr [esp + 18H], ebx
|
|
jbe @@201
|
|
mov dword ptr [esp + 10H], ebx
|
|
@@201: test ebx, ebx
|
|
jnz @@202
|
|
mov eax, dword ptr [esp + 00000098H]
|
|
mov edx, dword ptr [eax]
|
|
mov word ptr [esp + 0EH], bx
|
|
mov byte ptr [esp + 0CH], 64
|
|
mov byte ptr [esp + 0DH], 1
|
|
mov ecx, dword ptr [esp + 0CH]
|
|
mov dword ptr [edx], ecx
|
|
mov edx, dword ptr [eax]
|
|
add edx, 4
|
|
mov dword ptr [eax], edx
|
|
mov dword ptr [edx], ecx
|
|
add dword ptr [eax], 4
|
|
mov dword ptr [esi], 1
|
|
pop esi
|
|
pop ebp
|
|
xor eax, eax
|
|
pop ebx
|
|
add esp, 124
|
|
ret 24
|
|
|
|
@@202: mov esi, 1
|
|
|
|
@@203: cmp word ptr [esp + esi*2 + 48H], 0
|
|
jnz @@208
|
|
cmp word ptr [esp + esi*2 + 4AH], 0
|
|
jnz @@204
|
|
cmp word ptr [esp + esi*2 + 4CH], 0
|
|
jnz @@205
|
|
cmp word ptr [esp + esi*2 + 4EH], 0
|
|
jnz @@206
|
|
cmp word ptr [esp + esi*2 + 50H], 0
|
|
jnz @@207
|
|
add esi, 5
|
|
cmp esi, 15
|
|
jbe @@203
|
|
jmp @@208
|
|
|
|
@@204: inc esi
|
|
jmp @@208
|
|
|
|
@@205: add esi, 2
|
|
jmp @@208
|
|
|
|
@@206: add esi, 3
|
|
jmp @@208
|
|
|
|
@@207: add esi, 4
|
|
@@208: cmp dword ptr [esp + 10H], esi
|
|
jnc @@209
|
|
mov dword ptr [esp + 10H], esi
|
|
@@209: mov edx, 1
|
|
mov eax, edx
|
|
@@210: movzx ecx, word ptr [esp + eax*2 + 48H]
|
|
add edx, edx
|
|
sub edx, ecx
|
|
js @@212
|
|
inc eax
|
|
cmp eax, 15
|
|
jbe @@210
|
|
test edx, edx
|
|
push edi
|
|
mov edi, dword ptr [esp + 00000090H]
|
|
jle @@213
|
|
test edi, edi
|
|
jz @@211
|
|
cmp ebx, 1
|
|
jz @@213
|
|
@@211: pop edi
|
|
pop esi
|
|
pop ebp
|
|
or eax, 0FFFFFFFFH
|
|
pop ebx
|
|
add esp, 124
|
|
ret 24
|
|
|
|
@@212: pop esi
|
|
pop ebp
|
|
or eax, 0FFFFFFFFH
|
|
pop ebx
|
|
add esp, 124
|
|
ret 24
|
|
|
|
@@213:
|
|
mov word ptr [esp + 6EH], 0
|
|
mov eax, 2
|
|
|
|
@@214: mov dx, word ptr [esp + eax + 6CH]
|
|
add dx, word ptr [esp + eax + 4CH]
|
|
mov cx, word ptr [esp + eax + 4EH]
|
|
add cx, dx
|
|
mov word ptr [esp + eax + 6EH], dx
|
|
mov word ptr [esp + eax + 70H], cx
|
|
add eax, 4
|
|
cmp eax, 30
|
|
jc @@214
|
|
mov ebx, dword ptr [esp + 00000098H]
|
|
xor eax, eax
|
|
test ebx, ebx
|
|
jbe @@217
|
|
@@215: cmp word ptr [ebp + eax*2], 0
|
|
jz @@216
|
|
movzx edx, word ptr [ebp + eax*2]
|
|
movzx ecx, word ptr [esp + edx*2 + 6CH]
|
|
mov edx, dword ptr [esp + 000000A4H]
|
|
mov word ptr [edx + ecx*2], ax
|
|
movzx edx, word ptr [ebp + eax*2]
|
|
inc word ptr [esp + edx*2 + 6CH]
|
|
lea edx, [esp + edx*2 + 6CH]
|
|
@@216: inc eax
|
|
cmp eax, ebx
|
|
jc @@215
|
|
@@217: mov eax, edi
|
|
sub eax, 0
|
|
mov edx, -1
|
|
jz @@219
|
|
dec eax
|
|
jz @@218
|
|
mov dword ptr [esp + 34H], offset @@265
|
|
mov dword ptr [esp + 30H], offset @@266
|
|
mov dword ptr [esp + 2CH], edx
|
|
jmp @@221
|
|
|
|
@@218: mov eax, offset @@263
|
|
sub eax, 514
|
|
mov dword ptr [esp + 34H], eax
|
|
mov eax, offset @@264
|
|
sub eax, 514
|
|
mov dword ptr [esp + 2CH], 256
|
|
jmp @@220
|
|
|
|
@@219: mov eax, dword ptr [esp + 000000A4H]
|
|
mov dword ptr [esp + 34H], eax
|
|
mov dword ptr [esp + 2CH], 19
|
|
@@220: mov dword ptr [esp + 30H], eax
|
|
@@221: mov eax, dword ptr [esp + 0000009CH]
|
|
mov ecx, dword ptr [eax]
|
|
mov dword ptr [esp + 20H], ecx
|
|
mov ecx, dword ptr [esp + 14H]
|
|
mov eax, 1
|
|
shl eax, cl
|
|
mov dword ptr [esp + 38H], edx
|
|
xor ebp, ebp
|
|
xor ebx, ebx
|
|
cmp edi, 1
|
|
lea edx, [eax - 01H]
|
|
mov dword ptr [esp + 18H], esi
|
|
mov dword ptr [esp + 3CH], eax
|
|
mov dword ptr [esp + 28H], eax
|
|
mov dword ptr [esp + 40H], edx
|
|
jnz @@222
|
|
cmp eax, 1456
|
|
jae @@244
|
|
@@222: mov eax, dword ptr [esp + 000000A4H]
|
|
mov dword ptr [esp + 24H], eax
|
|
|
|
@@223: mov cl, byte ptr [esp + 18H]
|
|
mov esi, dword ptr [esp + 24H]
|
|
mov ax, word ptr [esi]
|
|
mov edx, dword ptr [esp + 2CH]
|
|
sub cl, bl
|
|
mov byte ptr [esp + 11H], cl
|
|
movzx ecx, ax
|
|
cmp ecx, edx
|
|
jge @@224
|
|
mov byte ptr [esp + 10H], 0
|
|
mov word ptr [esp + 12H], ax
|
|
jmp @@226
|
|
|
|
@@224: jle @@225
|
|
movzx eax, word ptr [esi]
|
|
mov edx, dword ptr [esp + 30H]
|
|
shl eax, 1
|
|
mov cl, byte ptr [eax + edx]
|
|
mov edx, dword ptr [esp + 34H]
|
|
mov ax, word ptr [eax + edx]
|
|
mov byte ptr [esp + 10H], cl
|
|
mov word ptr [esp + 12H], ax
|
|
jmp @@226
|
|
|
|
@@225: mov byte ptr [esp + 10H], 96
|
|
mov word ptr [esp + 12H], 0
|
|
@@226: mov ecx, dword ptr [esp + 18H]
|
|
mov eax, dword ptr [esp + 3CH]
|
|
sub ecx, ebx
|
|
mov edx, 1
|
|
shl edx, cl
|
|
mov ecx, ebx
|
|
mov edi, ebp
|
|
shr edi, cl
|
|
mov ecx, dword ptr [esp + 20H]
|
|
mov dword ptr [esp + 44H], eax
|
|
lea esi, [edx*4]
|
|
add edi, eax
|
|
lea ecx, [ecx + edi*4]
|
|
mov edi, dword ptr [esp + 10H]
|
|
@@227: sub eax, edx
|
|
sub ecx, esi
|
|
test eax, eax
|
|
mov dword ptr [ecx], edi
|
|
jnz @@227
|
|
mov edx, dword ptr [esp + 18H]
|
|
lea ecx, [edx - 01H]
|
|
mov eax, 1
|
|
shl eax, cl
|
|
test ebp, eax
|
|
jz @@229
|
|
@@228: shr eax, 1
|
|
test ebp, eax
|
|
jnz @@228
|
|
@@229: test eax, eax
|
|
jz @@230
|
|
lea ecx, [eax - 01H]
|
|
and ecx, ebp
|
|
add ecx, eax
|
|
mov ebp, ecx
|
|
jmp @@231
|
|
|
|
@@230: xor ebp, ebp
|
|
@@231: mov esi, dword ptr [esp + 24H]
|
|
add esi, 2
|
|
dec word ptr [esp + edx*2 + 4CH]
|
|
cmp word ptr [esp + edx*2 + 4CH], 0
|
|
mov dword ptr [esp + 24H], esi
|
|
jnz @@232
|
|
cmp edx, dword ptr [esp + 1CH]
|
|
je @@238
|
|
mov ecx, dword ptr [esp + 00000094H]
|
|
mov edx, esi
|
|
movzx eax, word ptr [edx]
|
|
movzx edx, word ptr [ecx + eax*2]
|
|
mov dword ptr [esp + 18H], edx
|
|
@@232: cmp edx, dword ptr [esp + 14H]
|
|
jbe @@223
|
|
mov esi, dword ptr [esp + 40H]
|
|
mov eax, dword ptr [esp + 38H]
|
|
and esi, ebp
|
|
cmp esi, eax
|
|
mov dword ptr [esp + 48H], esi
|
|
je @@223
|
|
test ebx, ebx
|
|
jnz @@233
|
|
mov ebx, dword ptr [esp + 14H]
|
|
@@233: mov eax, dword ptr [esp + 20H]
|
|
mov ecx, dword ptr [esp + 44H]
|
|
mov edi, dword ptr [esp + 1CH]
|
|
lea edx, [eax + ecx*4]
|
|
mov ecx, dword ptr [esp + 18H]
|
|
sub ecx, ebx
|
|
mov dword ptr [esp + 20H], edx
|
|
mov eax, 1
|
|
lea edx, [ebx + ecx]
|
|
shl eax, cl
|
|
cmp edx, edi
|
|
jnc @@236
|
|
lea esi, [esp + edx*2 + 4CH]
|
|
@@234: movzx edi, word ptr [esi]
|
|
sub eax, edi
|
|
test eax, eax
|
|
jle @@235
|
|
mov edi, dword ptr [esp + 1CH]
|
|
inc ecx
|
|
inc edx
|
|
add esi, 2
|
|
shl eax, 1
|
|
cmp edx, edi
|
|
jc @@234
|
|
@@235: mov esi, dword ptr [esp + 48H]
|
|
@@236: mov edx, dword ptr [esp + 28H]
|
|
mov eax, 1
|
|
shl eax, cl
|
|
add edx, eax
|
|
mov dword ptr [esp + 3CH], eax
|
|
cmp dword ptr [esp + 00000090H], 1
|
|
mov dword ptr [esp + 28H], edx
|
|
jnz @@237
|
|
mov eax, edx
|
|
cmp eax, 1456
|
|
jae @@244
|
|
@@237: mov edx, esi
|
|
mov esi, dword ptr [esp + 0000009CH]
|
|
mov eax, dword ptr [esi]
|
|
mov byte ptr [eax + edx*4], cl
|
|
mov ecx, dword ptr [esi]
|
|
mov al, byte ptr [esp + 14H]
|
|
mov byte ptr [ecx + edx*4 + 01H], al
|
|
mov eax, dword ptr [esi]
|
|
mov ecx, dword ptr [esp + 20H]
|
|
sub ecx, eax
|
|
sar ecx, 2
|
|
mov dword ptr [esp + 38H], edx
|
|
mov word ptr [eax + edx*4 + 02H], cx
|
|
jmp @@223
|
|
|
|
@@238: mov edi, dword ptr [esp + 0000009CH]
|
|
mov al, dl
|
|
sub al, bl
|
|
test ebp, ebp
|
|
mov byte ptr [esp + 10H], 64
|
|
mov byte ptr [esp + 11H], al
|
|
mov word ptr [esp + 12H], 0
|
|
jz @@243
|
|
mov esi, dword ptr [esp + 20H]
|
|
|
|
@@239: test ebx, ebx
|
|
jz @@240
|
|
mov ecx, dword ptr [esp + 40H]
|
|
mov eax, dword ptr [esp + 38H]
|
|
and ecx, ebp
|
|
cmp ecx, eax
|
|
jz @@240
|
|
mov eax, dword ptr [esp + 14H]
|
|
mov esi, dword ptr [edi]
|
|
xor ebx, ebx
|
|
mov dword ptr [esp + 18H], eax
|
|
mov byte ptr [esp + 11H], al
|
|
mov edx, eax
|
|
@@240: mov ecx, ebx
|
|
mov eax, ebp
|
|
shr eax, cl
|
|
mov ecx, dword ptr [esp + 10H]
|
|
mov dword ptr [esi + eax*4], ecx
|
|
lea ecx, [edx - 01H]
|
|
mov eax, 1
|
|
shl eax, cl
|
|
test ebp, eax
|
|
jz @@242
|
|
|
|
@@241: shr eax, 1
|
|
test ebp, eax
|
|
jnz @@241
|
|
@@242: test eax, eax
|
|
jz @@243
|
|
lea ecx, [eax - 01H]
|
|
and ecx, ebp
|
|
add ecx, eax
|
|
mov ebp, ecx
|
|
jnz @@239
|
|
@@243: mov edx, dword ptr [esp + 28H]
|
|
mov ecx, dword ptr [edi]
|
|
lea eax, [edx*4]
|
|
mov edx, dword ptr [esp + 14H]
|
|
add ecx, eax
|
|
mov dword ptr [edi], ecx
|
|
mov ecx, dword ptr [esp + 000000A0H]
|
|
pop edi
|
|
pop esi
|
|
pop ebp
|
|
mov dword ptr [ecx], edx
|
|
xor eax, eax
|
|
pop ebx
|
|
add esp, 124
|
|
ret 24
|
|
|
|
@@244: pop edi
|
|
pop esi
|
|
pop ebp
|
|
mov eax, 1
|
|
pop ebx
|
|
add esp, 124
|
|
ret 24
|
|
|
|
nop; nop
|
|
|
|
@@192: dd offset @@070 // buffer is 8 bytes aligned
|
|
dd offset @@176
|
|
dd offset @@176
|
|
dd offset @@176
|
|
dd offset @@176
|
|
dd offset @@176
|
|
dd offset @@176
|
|
dd offset @@176
|
|
dd offset @@176
|
|
dd offset @@077
|
|
dd offset @@080
|
|
dd offset @@081
|
|
dd offset @@082
|
|
dd offset @@091
|
|
dd offset @@095
|
|
dd offset @@098
|
|
dd offset @@101
|
|
dd offset @@110
|
|
dd offset @@134
|
|
dd offset @@145
|
|
dd offset @@149
|
|
dd offset @@156
|
|
dd offset @@161
|
|
dd offset @@169
|
|
dd offset @@170
|
|
dd offset @@176
|
|
dd offset @@181
|
|
dd offset @@182
|
|
dd offset @@185
|
|
|
|
@@193: dd offset @@086
|
|
dd offset @@087
|
|
dd offset @@088
|
|
dd offset @@089
|
|
|
|
@@251: dw 0010H, 0011H, 0012H, 0000H
|
|
dw 0008H, 0007H, 0009H, 0006H
|
|
dw 000AH, 0005H, 000BH, 0004H
|
|
dw 000CH, 0003H, 000DH, 0002H
|
|
dw 000EH, 0001H, 000FH, 0000H
|
|
|
|
@@249: db 60H, 07H, 00H, 00H, 00H, 08H, 50H, 00H
|
|
db 00H, 08H, 10H, 00H, 14H, 08H, 73H, 00H
|
|
db 12H, 07H, 1FH, 00H, 00H, 08H, 70H, 00H
|
|
db 00H, 08H, 30H, 00H, 00H, 09H, 0C0H, 00H
|
|
db 10H, 07H, 0AH, 00H, 00H, 08H, 60H, 00H
|
|
db 00H, 08H, 20H, 00H, 00H, 09H, 0A0H, 00H
|
|
db 00H, 08H, 00H, 00H, 00H, 08H, 80H, 00H
|
|
db 00H, 08H, 40H, 00H, 00H, 09H, 0E0H, 00H
|
|
db 10H, 07H, 06H, 00H, 00H, 08H, 58H, 00H
|
|
db 00H, 08H, 18H, 00H, 00H, 09H, 90H, 00H
|
|
db 13H, 07H, 3BH, 00H, 00H, 08H, 78H, 00H
|
|
db 00H, 08H, 38H, 00H, 00H, 09H, 0D0H, 00H
|
|
db 11H, 07H, 11H, 00H, 00H, 08H, 68H, 00H
|
|
db 00H, 08H, 28H, 00H, 00H, 09H, 0B0H, 00H
|
|
db 00H, 08H, 08H, 00H, 00H, 08H, 88H, 00H
|
|
db 00H, 08H, 48H, 00H, 00H, 09H, 0F0H, 00H
|
|
db 10H, 07H, 04H, 00H, 00H, 08H, 54H, 00H
|
|
db 00H, 08H, 14H, 00H, 15H, 08H, 0E3H, 00H
|
|
db 13H, 07H, 2BH, 00H, 00H, 08H, 74H, 00H
|
|
db 00H, 08H, 34H, 00H, 00H, 09H, 0C8H, 00H
|
|
db 11H, 07H, 0DH, 00H, 00H, 08H, 64H, 00H
|
|
db 00H, 08H, 24H, 00H, 00H, 09H, 0A8H, 00H
|
|
db 00H, 08H, 04H, 00H, 00H, 08H, 84H, 00H
|
|
db 00H, 08H, 44H, 00H, 00H, 09H, 0E8H, 00H
|
|
db 10H, 07H, 08H, 00H, 00H, 08H, 5CH, 00H
|
|
db 00H, 08H, 1CH, 00H, 00H, 09H, 98H, 00H
|
|
db 14H, 07H, 53H, 00H, 00H, 08H, 7CH, 00H
|
|
db 00H, 08H, 3CH, 00H, 00H, 09H, 0D8H, 00H
|
|
db 12H, 07H, 17H, 00H, 00H, 08H, 6CH, 00H
|
|
db 00H, 08H, 2CH, 00H, 00H, 09H, 0B8H, 00H
|
|
db 00H, 08H, 0CH, 00H, 00H, 08H, 8CH, 00H
|
|
db 00H, 08H, 4CH, 00H, 00H, 09H, 0F8H, 00H
|
|
db 10H, 07H, 03H, 00H, 00H, 08H, 52H, 00H
|
|
db 00H, 08H, 12H, 00H, 15H, 08H, 0A3H, 00H
|
|
db 13H, 07H, 23H, 00H, 00H, 08H, 72H, 00H
|
|
db 00H, 08H, 32H, 00H, 00H, 09H, 0C4H, 00H
|
|
db 11H, 07H, 0BH, 00H, 00H, 08H, 62H, 00H
|
|
db 00H, 08H, 22H, 00H, 00H, 09H, 0A4H, 00H
|
|
db 00H, 08H, 02H, 00H, 00H, 08H, 82H, 00H
|
|
db 00H, 08H, 42H, 00H, 00H, 09H, 0E4H, 00H
|
|
db 10H, 07H, 07H, 00H, 00H, 08H, 5AH, 00H
|
|
db 00H, 08H, 1AH, 00H, 00H, 09H, 94H, 00H
|
|
db 14H, 07H, 43H, 00H, 00H, 08H, 7AH, 00H
|
|
db 00H, 08H, 3AH, 00H, 00H, 09H, 0D4H, 00H
|
|
db 12H, 07H, 13H, 00H, 00H, 08H, 6AH, 00H
|
|
db 00H, 08H, 2AH, 00H, 00H, 09H, 0B4H, 00H
|
|
db 00H, 08H, 0AH, 00H, 00H, 08H, 8AH, 00H
|
|
db 00H, 08H, 4AH, 00H, 00H, 09H, 0F4H, 00H
|
|
db 10H, 07H, 05H, 00H, 00H, 08H, 56H, 00H
|
|
db 00H, 08H, 16H, 00H, 40H, 08H, 00H, 00H
|
|
db 13H, 07H, 33H, 00H, 00H, 08H, 76H, 00H
|
|
db 00H, 08H, 36H, 00H, 00H, 09H, 0CCH, 00H
|
|
db 11H, 07H, 0FH, 00H, 00H, 08H, 66H, 00H
|
|
db 00H, 08H, 26H, 00H, 00H, 09H, 0ACH, 00H
|
|
db 00H, 08H, 06H, 00H, 00H, 08H, 86H, 00H
|
|
db 00H, 08H, 46H, 00H, 00H, 09H, 0ECH, 00H
|
|
db 10H, 07H, 09H, 00H, 00H, 08H, 5EH, 00H
|
|
db 00H, 08H, 1EH, 00H, 00H, 09H, 9CH, 00H
|
|
db 14H, 07H, 63H, 00H, 00H, 08H, 7EH, 00H
|
|
db 00H, 08H, 3EH, 00H, 00H, 09H, 0DCH, 00H
|
|
db 12H, 07H, 1BH, 00H, 00H, 08H, 6EH, 00H
|
|
db 00H, 08H, 2EH, 00H, 00H, 09H, 0BCH, 00H
|
|
db 00H, 08H, 0EH, 00H, 00H, 08H, 8EH, 00H
|
|
db 00H, 08H, 4EH, 00H, 00H, 09H, 0FCH, 00H
|
|
db 60H, 07H, 00H, 00H, 00H, 08H, 51H, 00H
|
|
db 00H, 08H, 11H, 00H, 15H, 08H, 83H, 00H
|
|
db 12H, 07H, 1FH, 00H, 00H, 08H, 71H, 00H
|
|
db 00H, 08H, 31H, 00H, 00H, 09H, 0C2H, 00H
|
|
db 10H, 07H, 0AH, 00H, 00H, 08H, 61H, 00H
|
|
db 00H, 08H, 21H, 00H, 00H, 09H, 0A2H, 00H
|
|
db 00H, 08H, 01H, 00H, 00H, 08H, 81H, 00H
|
|
db 00H, 08H, 41H, 00H, 00H, 09H, 0E2H, 00H
|
|
db 10H, 07H, 06H, 00H, 00H, 08H, 59H, 00H
|
|
db 00H, 08H, 19H, 00H, 00H, 09H, 92H, 00H
|
|
db 13H, 07H, 3BH, 00H, 00H, 08H, 79H, 00H
|
|
db 00H, 08H, 39H, 00H, 00H, 09H, 0D2H, 00H
|
|
db 11H, 07H, 11H, 00H, 00H, 08H, 69H, 00H
|
|
db 00H, 08H, 29H, 00H, 00H, 09H, 0B2H, 00H
|
|
db 00H, 08H, 09H, 00H, 00H, 08H, 89H, 00H
|
|
db 00H, 08H, 49H, 00H, 00H, 09H, 0F2H, 00H
|
|
db 10H, 07H, 04H, 00H, 00H, 08H, 55H, 00H
|
|
db 00H, 08H, 15H, 00H, 10H, 08H, 02H, 01H
|
|
db 13H, 07H, 2BH, 00H, 00H, 08H, 75H, 00H
|
|
db 00H, 08H, 35H, 00H, 00H, 09H, 0CAH, 00H
|
|
db 11H, 07H, 0DH, 00H, 00H, 08H, 65H, 00H
|
|
db 00H, 08H, 25H, 00H, 00H, 09H, 0AAH, 00H
|
|
db 00H, 08H, 05H, 00H, 00H, 08H, 85H, 00H
|
|
db 00H, 08H, 45H, 00H, 00H, 09H, 0EAH, 00H
|
|
db 10H, 07H, 08H, 00H, 00H, 08H, 5DH, 00H
|
|
db 00H, 08H, 1DH, 00H, 00H, 09H, 9AH, 00H
|
|
db 14H, 07H, 53H, 00H, 00H, 08H, 7DH, 00H
|
|
db 00H, 08H, 3DH, 00H, 00H, 09H, 0DAH, 00H
|
|
db 12H, 07H, 17H, 00H, 00H, 08H, 6DH, 00H
|
|
db 00H, 08H, 2DH, 00H, 00H, 09H, 0BAH, 00H
|
|
db 00H, 08H, 0DH, 00H, 00H, 08H, 8DH, 00H
|
|
db 00H, 08H, 4DH, 00H, 00H, 09H, 0FAH, 00H
|
|
db 10H, 07H, 03H, 00H, 00H, 08H, 53H, 00H
|
|
db 00H, 08H, 13H, 00H, 15H, 08H, 0C3H, 00H
|
|
db 13H, 07H, 23H, 00H, 00H, 08H, 73H, 00H
|
|
db 00H, 08H, 33H, 00H, 00H, 09H, 0C6H, 00H
|
|
db 11H, 07H, 0BH, 00H, 00H, 08H, 63H, 00H
|
|
db 00H, 08H, 23H, 00H, 00H, 09H, 0A6H, 00H
|
|
db 00H, 08H, 03H, 00H, 00H, 08H, 83H, 00H
|
|
db 00H, 08H, 43H, 00H, 00H, 09H, 0E6H, 00H
|
|
db 10H, 07H, 07H, 00H, 00H, 08H, 5BH, 00H
|
|
db 00H, 08H, 1BH, 00H, 00H, 09H, 96H, 00H
|
|
db 14H, 07H, 43H, 00H, 00H, 08H, 7BH, 00H
|
|
db 00H, 08H, 3BH, 00H, 00H, 09H, 0D6H, 00H
|
|
db 12H, 07H, 13H, 00H, 00H, 08H, 6BH, 00H
|
|
db 00H, 08H, 2BH, 00H, 00H, 09H, 0B6H, 00H
|
|
db 00H, 08H, 0BH, 00H, 00H, 08H, 8BH, 00H
|
|
db 00H, 08H, 4BH, 00H, 00H, 09H, 0F6H, 00H
|
|
db 10H, 07H, 05H, 00H, 00H, 08H, 57H, 00H
|
|
db 00H, 08H, 17H, 00H, 40H, 08H, 00H, 00H
|
|
db 13H, 07H, 33H, 00H, 00H, 08H, 77H, 00H
|
|
db 00H, 08H, 37H, 00H, 00H, 09H, 0CEH, 00H
|
|
db 11H, 07H, 0FH, 00H, 00H, 08H, 67H, 00H
|
|
db 00H, 08H, 27H, 00H, 00H, 09H, 0AEH, 00H
|
|
db 00H, 08H, 07H, 00H, 00H, 08H, 87H, 00H
|
|
db 00H, 08H, 47H, 00H, 00H, 09H, 0EEH, 00H
|
|
db 10H, 07H, 09H, 00H, 00H, 08H, 5FH, 00H
|
|
db 00H, 08H, 1FH, 00H, 00H, 09H, 9EH, 00H
|
|
db 14H, 07H, 63H, 00H, 00H, 08H, 7FH, 00H
|
|
db 00H, 08H, 3FH, 00H, 00H, 09H, 0DEH, 00H
|
|
db 12H, 07H, 1BH, 00H, 00H, 08H, 6FH, 00H
|
|
db 00H, 08H, 2FH, 00H, 00H, 09H, 0BEH, 00H
|
|
db 00H, 08H, 0FH, 00H, 00H, 08H, 8FH, 00H
|
|
db 00H, 08H, 4FH, 00H, 00H, 09H, 0FEH, 00H
|
|
db 60H, 07H, 00H, 00H, 00H, 08H, 50H, 00H
|
|
db 00H, 08H, 10H, 00H, 14H, 08H, 73H, 00H
|
|
db 12H, 07H, 1FH, 00H, 00H, 08H, 70H, 00H
|
|
db 00H, 08H, 30H, 00H, 00H, 09H, 0C1H, 00H
|
|
db 10H, 07H, 0AH, 00H, 00H, 08H, 60H, 00H
|
|
db 00H, 08H, 20H, 00H, 00H, 09H, 0A1H, 00H
|
|
db 00H, 08H, 00H, 00H, 00H, 08H, 80H, 00H
|
|
db 00H, 08H, 40H, 00H, 00H, 09H, 0E1H, 00H
|
|
db 10H, 07H, 06H, 00H, 00H, 08H, 58H, 00H
|
|
db 00H, 08H, 18H, 00H, 00H, 09H, 91H, 00H
|
|
db 13H, 07H, 3BH, 00H, 00H, 08H, 78H, 00H
|
|
db 00H, 08H, 38H, 00H, 00H, 09H, 0D1H, 00H
|
|
db 11H, 07H, 11H, 00H, 00H, 08H, 68H, 00H
|
|
db 00H, 08H, 28H, 00H, 00H, 09H, 0B1H, 00H
|
|
db 00H, 08H, 08H, 00H, 00H, 08H, 88H, 00H
|
|
db 00H, 08H, 48H, 00H, 00H, 09H, 0F1H, 00H
|
|
db 10H, 07H, 04H, 00H, 00H, 08H, 54H, 00H
|
|
db 00H, 08H, 14H, 00H, 15H, 08H, 0E3H, 00H
|
|
db 13H, 07H, 2BH, 00H, 00H, 08H, 74H, 00H
|
|
db 00H, 08H, 34H, 00H, 00H, 09H, 0C9H, 00H
|
|
db 11H, 07H, 0DH, 00H, 00H, 08H, 64H, 00H
|
|
db 00H, 08H, 24H, 00H, 00H, 09H, 0A9H, 00H
|
|
db 00H, 08H, 04H, 00H, 00H, 08H, 84H, 00H
|
|
db 00H, 08H, 44H, 00H, 00H, 09H, 0E9H, 00H
|
|
db 10H, 07H, 08H, 00H, 00H, 08H, 5CH, 00H
|
|
db 00H, 08H, 1CH, 00H, 00H, 09H, 99H, 00H
|
|
db 14H, 07H, 53H, 00H, 00H, 08H, 7CH, 00H
|
|
db 00H, 08H, 3CH, 00H, 00H, 09H, 0D9H, 00H
|
|
db 12H, 07H, 17H, 00H, 00H, 08H, 6CH, 00H
|
|
db 00H, 08H, 2CH, 00H, 00H, 09H, 0B9H, 00H
|
|
db 00H, 08H, 0CH, 00H, 00H, 08H, 8CH, 00H
|
|
db 00H, 08H, 4CH, 00H, 00H, 09H, 0F9H, 00H
|
|
db 10H, 07H, 03H, 00H, 00H, 08H, 52H, 00H
|
|
db 00H, 08H, 12H, 00H, 15H, 08H, 0A3H, 00H
|
|
db 13H, 07H, 23H, 00H, 00H, 08H, 72H, 00H
|
|
db 00H, 08H, 32H, 00H, 00H, 09H, 0C5H, 00H
|
|
db 11H, 07H, 0BH, 00H, 00H, 08H, 62H, 00H
|
|
db 00H, 08H, 22H, 00H, 00H, 09H, 0A5H, 00H
|
|
db 00H, 08H, 02H, 00H, 00H, 08H, 82H, 00H
|
|
db 00H, 08H, 42H, 00H, 00H, 09H, 0E5H, 00H
|
|
db 10H, 07H, 07H, 00H, 00H, 08H, 5AH, 00H
|
|
db 00H, 08H, 1AH, 00H, 00H, 09H, 95H, 00H
|
|
db 14H, 07H, 43H, 00H, 00H, 08H, 7AH, 00H
|
|
db 00H, 08H, 3AH, 00H, 00H, 09H, 0D5H, 00H
|
|
db 12H, 07H, 13H, 00H, 00H, 08H, 6AH, 00H
|
|
db 00H, 08H, 2AH, 00H, 00H, 09H, 0B5H, 00H
|
|
db 00H, 08H, 0AH, 00H, 00H, 08H, 8AH, 00H
|
|
db 00H, 08H, 4AH, 00H, 00H, 09H, 0F5H, 00H
|
|
db 10H, 07H, 05H, 00H, 00H, 08H, 56H, 00H
|
|
db 00H, 08H, 16H, 00H, 40H, 08H, 00H, 00H
|
|
db 13H, 07H, 33H, 00H, 00H, 08H, 76H, 00H
|
|
db 00H, 08H, 36H, 00H, 00H, 09H, 0CDH, 00H
|
|
db 11H, 07H, 0FH, 00H, 00H, 08H, 66H, 00H
|
|
db 00H, 08H, 26H, 00H, 00H, 09H, 0ADH, 00H
|
|
db 00H, 08H, 06H, 00H, 00H, 08H, 86H, 00H
|
|
db 00H, 08H, 46H, 00H, 00H, 09H, 0EDH, 00H
|
|
db 10H, 07H, 09H, 00H, 00H, 08H, 5EH, 00H
|
|
db 00H, 08H, 1EH, 00H, 00H, 09H, 9DH, 00H
|
|
db 14H, 07H, 63H, 00H, 00H, 08H, 7EH, 00H
|
|
db 00H, 08H, 3EH, 00H, 00H, 09H, 0DDH, 00H
|
|
db 12H, 07H, 1BH, 00H, 00H, 08H, 6EH, 00H
|
|
db 00H, 08H, 2EH, 00H, 00H, 09H, 0BDH, 00H
|
|
db 00H, 08H, 0EH, 00H, 00H, 08H, 8EH, 00H
|
|
db 00H, 08H, 4EH, 00H, 00H, 09H, 0FDH, 00H
|
|
db 60H, 07H, 00H, 00H, 00H, 08H, 51H, 00H
|
|
db 00H, 08H, 11H, 00H, 15H, 08H, 83H, 00H
|
|
db 12H, 07H, 1FH, 00H, 00H, 08H, 71H, 00H
|
|
db 00H, 08H, 31H, 00H, 00H, 09H, 0C3H, 00H
|
|
db 10H, 07H, 0AH, 00H, 00H, 08H, 61H, 00H
|
|
db 00H, 08H, 21H, 00H, 00H, 09H, 0A3H, 00H
|
|
db 00H, 08H, 01H, 00H, 00H, 08H, 81H, 00H
|
|
db 00H, 08H, 41H, 00H, 00H, 09H, 0E3H, 00H
|
|
db 10H, 07H, 06H, 00H, 00H, 08H, 59H, 00H
|
|
db 00H, 08H, 19H, 00H, 00H, 09H, 93H, 00H
|
|
db 13H, 07H, 3BH, 00H, 00H, 08H, 79H, 00H
|
|
db 00H, 08H, 39H, 00H, 00H, 09H, 0D3H, 00H
|
|
db 11H, 07H, 11H, 00H, 00H, 08H, 69H, 00H
|
|
db 00H, 08H, 29H, 00H, 00H, 09H, 0B3H, 00H
|
|
db 00H, 08H, 09H, 00H, 00H, 08H, 89H, 00H
|
|
db 00H, 08H, 49H, 00H, 00H, 09H, 0F3H, 00H
|
|
db 10H, 07H, 04H, 00H, 00H, 08H, 55H, 00H
|
|
db 00H, 08H, 15H, 00H, 10H, 08H, 02H, 01H
|
|
db 13H, 07H, 2BH, 00H, 00H, 08H, 75H, 00H
|
|
db 00H, 08H, 35H, 00H, 00H, 09H, 0CBH, 00H
|
|
db 11H, 07H, 0DH, 00H, 00H, 08H, 65H, 00H
|
|
db 00H, 08H, 25H, 00H, 00H, 09H, 0ABH, 00H
|
|
db 00H, 08H, 05H, 00H, 00H, 08H, 85H, 00H
|
|
db 00H, 08H, 45H, 00H, 00H, 09H, 0EBH, 00H
|
|
db 10H, 07H, 08H, 00H, 00H, 08H, 5DH, 00H
|
|
db 00H, 08H, 1DH, 00H, 00H, 09H, 9BH, 00H
|
|
db 14H, 07H, 53H, 00H, 00H, 08H, 7DH, 00H
|
|
db 00H, 08H, 3DH, 00H, 00H, 09H, 0DBH, 00H
|
|
db 12H, 07H, 17H, 00H, 00H, 08H, 6DH, 00H
|
|
db 00H, 08H, 2DH, 00H, 00H, 09H, 0BBH, 00H
|
|
db 00H, 08H, 0DH, 00H, 00H, 08H, 8DH, 00H
|
|
db 00H, 08H, 4DH, 00H, 00H, 09H, 0FBH, 00H
|
|
db 10H, 07H, 03H, 00H, 00H, 08H, 53H, 00H
|
|
db 00H, 08H, 13H, 00H, 15H, 08H, 0C3H, 00H
|
|
db 13H, 07H, 23H, 00H, 00H, 08H, 73H, 00H
|
|
db 00H, 08H, 33H, 00H, 00H, 09H, 0C7H, 00H
|
|
db 11H, 07H, 0BH, 00H, 00H, 08H, 63H, 00H
|
|
db 00H, 08H, 23H, 00H, 00H, 09H, 0A7H, 00H
|
|
db 00H, 08H, 03H, 00H, 00H, 08H, 83H, 00H
|
|
db 00H, 08H, 43H, 00H, 00H, 09H, 0E7H, 00H
|
|
db 10H, 07H, 07H, 00H, 00H, 08H, 5BH, 00H
|
|
db 00H, 08H, 1BH, 00H, 00H, 09H, 97H, 00H
|
|
db 14H, 07H, 43H, 00H, 00H, 08H, 7BH, 00H
|
|
db 00H, 08H, 3BH, 00H, 00H, 09H, 0D7H, 00H
|
|
db 12H, 07H, 13H, 00H, 00H, 08H, 6BH, 00H
|
|
db 00H, 08H, 2BH, 00H, 00H, 09H, 0B7H, 00H
|
|
db 00H, 08H, 0BH, 00H, 00H, 08H, 8BH, 00H
|
|
db 00H, 08H, 4BH, 00H, 00H, 09H, 0F7H, 00H
|
|
db 10H, 07H, 05H, 00H, 00H, 08H, 57H, 00H
|
|
db 00H, 08H, 17H, 00H, 40H, 08H, 00H, 00H
|
|
db 13H, 07H, 33H, 00H, 00H, 08H, 77H, 00H
|
|
db 00H, 08H, 37H, 00H, 00H, 09H, 0CFH, 00H
|
|
db 11H, 07H, 0FH, 00H, 00H, 08H, 67H, 00H
|
|
db 00H, 08H, 27H, 00H, 00H, 09H, 0AFH, 00H
|
|
db 00H, 08H, 07H, 00H, 00H, 08H, 87H, 00H
|
|
db 00H, 08H, 47H, 00H, 00H, 09H, 0EFH, 00H
|
|
db 10H, 07H, 09H, 00H, 00H, 08H, 5FH, 00H
|
|
db 00H, 08H, 1FH, 00H, 00H, 09H, 9FH, 00H
|
|
db 14H, 07H, 63H, 00H, 00H, 08H, 7FH, 00H
|
|
db 00H, 08H, 3FH, 00H, 00H, 09H, 0DFH, 00H
|
|
db 12H, 07H, 1BH, 00H, 00H, 08H, 6FH, 00H
|
|
db 00H, 08H, 2FH, 00H, 00H, 09H, 0BFH, 00H
|
|
db 00H, 08H, 0FH, 00H, 00H, 08H, 8FH, 00H
|
|
db 00H, 08H, 4FH, 00H, 00H, 09H, 0FFH, 00H
|
|
|
|
@@250: db 10H, 05H, 01H, 00H, 17H, 05H, 01H, 01H
|
|
db 13H, 05H, 11H, 00H, 1BH, 05H, 01H, 10H
|
|
db 11H, 05H, 05H, 00H, 19H, 05H, 01H, 04H
|
|
db 15H, 05H, 41H, 00H, 1DH, 05H, 01H, 40H
|
|
db 10H, 05H, 03H, 00H, 18H, 05H, 01H, 02H
|
|
db 14H, 05H, 21H, 00H, 1CH, 05H, 01H, 20H
|
|
db 12H, 05H, 09H, 00H, 1AH, 05H, 01H, 08H
|
|
db 16H, 05H, 81H, 00H, 40H, 05H, 00H, 00H
|
|
db 10H, 05H, 02H, 00H, 17H, 05H, 81H, 01H
|
|
db 13H, 05H, 19H, 00H, 1BH, 05H, 01H, 18H
|
|
db 11H, 05H, 07H, 00H, 19H, 05H, 01H, 06H
|
|
db 15H, 05H, 61H, 00H, 1DH, 05H, 01H, 60H
|
|
db 10H, 05H, 04H, 00H, 18H, 05H, 01H, 03H
|
|
db 14H, 05H, 31H, 00H, 1CH, 05H, 01H, 30H
|
|
db 12H, 05H, 0DH, 00H, 1AH, 05H, 01H, 0CH
|
|
db 16H, 05H, 0C1H, 00H, 40H, 05H, 00H, 00H
|
|
|
|
@@263: db 03H, 00H, 04H, 00H, 05H, 00H, 06H, 00H
|
|
db 07H, 00H, 08H, 00H, 09H, 00H, 0AH, 00H
|
|
db 0BH, 00H, 0DH, 00H, 0FH, 00H, 11H, 00H
|
|
db 13H, 00H, 17H, 00H, 1BH, 00H, 1FH, 00H
|
|
db 23H, 00H, 2BH, 00H, 33H, 00H, 3BH, 00H
|
|
db 43H, 00H, 53H, 00H, 63H, 00H, 73H, 00H
|
|
db 83H, 00H, 0A3H, 00H, 0C3H, 00H, 0E3H, 00H
|
|
db 02H, 01H, 00H, 00H, 00H, 00H, 00H, 00H
|
|
|
|
@@264: db 10H, 00H, 10H, 00H, 10H, 00H, 10H, 00H
|
|
db 10H, 00H, 10H, 00H, 10H, 00H, 10H, 00H
|
|
db 11H, 00H, 11H, 00H, 11H, 00H, 11H, 00H
|
|
db 12H, 00H, 12H, 00H, 12H, 00H, 12H, 00H
|
|
db 13H, 00H, 13H, 00H, 13H, 00H, 13H, 00H
|
|
db 14H, 00H, 14H, 00H, 14H, 00H, 14H, 00H
|
|
db 15H, 00H, 15H, 00H, 15H, 00H, 15H, 00H
|
|
db 10H, 00H, 0C9H, 00H, 0C4H, 00H, 00H, 00H
|
|
|
|
@@265: db 01H, 00H, 02H, 00H, 03H, 00H, 04H, 00H
|
|
db 05H, 00H, 07H, 00H, 09H, 00H, 0DH, 00H
|
|
db 11H, 00H, 19H, 00H, 21H, 00H, 31H, 00H
|
|
db 41H, 00H, 61H, 00H, 81H, 00H, 0C1H, 00H
|
|
db 01H, 01H, 81H, 01H, 01H, 02H, 01H, 03H
|
|
db 01H, 04H, 01H, 06H, 01H, 08H, 01H, 0CH
|
|
db 01H, 10H, 01H, 18H, 01H, 20H, 01H, 30H
|
|
db 01H, 40H, 01H, 60H, 00H, 00H, 00H, 00H
|
|
|
|
@@266: db 10H, 00H, 10H, 00H, 10H, 00H, 10H, 00H
|
|
db 11H, 00H, 11H, 00H, 12H, 00H, 12H, 00H
|
|
db 13H, 00H, 13H, 00H, 14H, 00H, 14H, 00H
|
|
db 15H, 00H, 15H, 00H, 16H, 00H, 16H, 00H
|
|
db 17H, 00H, 17H, 00H, 18H, 00H, 18H, 00H
|
|
db 19H, 00H, 19H, 00H, 1AH, 00H, 1AH, 00H
|
|
db 1BH, 00H, 1BH, 00H, 1CH, 00H, 1CH, 00H
|
|
db 1DH, 00H, 1DH, 00H, 40H, 00H, 40H, 00H
|
|
end;
|
|
|
|
function inflateEnd;
|
|
asm pop ebp // auto-generated push ebp; mov ebp,esp
|
|
push esi
|
|
mov esi, dword ptr [esp + 08H]
|
|
test esi, esi
|
|
jz @@195
|
|
mov eax, dword ptr [esi + 1CH]
|
|
test eax, eax
|
|
jz @@195
|
|
mov ecx, dword ptr [esi + 24H]
|
|
test ecx, ecx
|
|
jz @@195
|
|
mov eax, dword ptr [eax + 34H]
|
|
test eax, eax
|
|
jz @@194
|
|
push eax
|
|
mov eax, dword ptr [esi + 28H]
|
|
push eax
|
|
call ecx
|
|
@@194: mov ecx, dword ptr [esi + 1CH]
|
|
mov edx, dword ptr [esi + 28H]
|
|
push ecx
|
|
push edx
|
|
call dword ptr [esi + 24H]
|
|
mov dword ptr [esi + 1CH], 0
|
|
xor eax, eax
|
|
pop esi
|
|
ret 4
|
|
|
|
@@195: mov eax, -2
|
|
pop esi
|
|
ret 4
|
|
end;
|
|
|
|
{$else}
|
|
|
|
{$LINK infback.obj}
|
|
{$LINK inffast.obj}
|
|
{$LINK inflate.obj}
|
|
{$LINK inftrees.obj}
|
|
|
|
function inflateInit_(var strm: TZStream; version: PAnsiChar; stream_size: integer): integer; external;
|
|
function inflateInit2_; external;
|
|
function inflate; external;
|
|
function inflateEnd; external;
|
|
|
|
{$endif USEINLINEASM}
|
|
|
|
{$endif USEZLIB}
|
|
|
|
{$ifdef USEZLIB}
|
|
|
|
function adler32(adler: cardinal; buf: PAnsiChar; len: cardinal): cardinal;
|
|
begin
|
|
result := ZLib.adler32(adler,pointer(buf),len);
|
|
end;
|
|
|
|
function crc32(crc: cardinal; buf: PAnsiChar; len: cardinal): cardinal;
|
|
begin
|
|
result := ZLib.crc32(crc,pointer(buf),len);
|
|
end;
|
|
|
|
function deflateInit2_(var strm: TZStream; level: integer; method: integer; windowBits: integer; memLevel: integer;strategy: integer; version: PAnsiChar; stream_size: integer): integer;
|
|
begin
|
|
result := ZLib.deflateInit2_(z_streamp(@strm)^,level,method,windowBits,memLevel,strategy,version,stream_size);
|
|
end;
|
|
|
|
function deflate(var strm: TZStream; flush: integer): integer;
|
|
begin
|
|
result := ZLib.deflate(z_streamp(@strm)^,flush);
|
|
end;
|
|
|
|
function deflateEnd(var strm: TZStream): integer;
|
|
begin
|
|
result := ZLib.deflateEnd(z_streamp(@strm)^);
|
|
end;
|
|
|
|
function inflateInit2_(var strm: TZStream; windowBits: integer; version: PAnsiChar; stream_size: integer): integer;
|
|
begin
|
|
result := ZLib.inflateInit2_(z_streamp(@strm)^,windowBits,version,stream_size);
|
|
end;
|
|
|
|
function inflate(var strm: TZStream; flush: integer): integer;
|
|
begin
|
|
result := ZLib.inflate(z_streamp(@strm)^,flush);
|
|
end;
|
|
|
|
function inflateEnd(var strm: TZStream): integer;
|
|
begin
|
|
result := ZLib.inflateEnd(z_streamp(@strm)^);
|
|
end;
|
|
|
|
function get_crc_table: pointer;
|
|
begin
|
|
result := ZLib.get_crc_table;
|
|
end;
|
|
|
|
{$else}
|
|
|
|
function adler32;
|
|
// our optimized asm version, faster than the original zlib C implementation
|
|
asm
|
|
push ebx
|
|
push esi
|
|
push edi
|
|
mov edi,eax
|
|
shr edi,16
|
|
movzx ebx,ax
|
|
push ebp
|
|
mov esi,edx
|
|
test esi,esi
|
|
mov ebp,ecx
|
|
jne @31
|
|
mov eax,1
|
|
jmp @32
|
|
@31:
|
|
test ebp,ebp
|
|
jbe @34
|
|
@33:
|
|
cmp ebp,5552
|
|
jae @35
|
|
mov eax,ebp
|
|
jmp @36
|
|
nop; nop
|
|
@35:
|
|
mov eax,5552
|
|
@36:
|
|
sub ebp,eax
|
|
cmp eax,16
|
|
jl @38
|
|
xor edx,edx
|
|
xor ecx,ecx
|
|
@39:
|
|
sub eax,16
|
|
mov dl,[esi]
|
|
mov cl,[esi+1]
|
|
add ebx,edx
|
|
add edi,ebx
|
|
add ebx,ecx
|
|
mov dl,[esi+2]
|
|
add edi,ebx
|
|
add ebx,edx
|
|
mov cl,[esi+3]
|
|
add edi,ebx
|
|
add ebx,ecx
|
|
mov dl,[esi+4]
|
|
add edi,ebx
|
|
add ebx,edx
|
|
mov cl,[esi+5]
|
|
add edi,ebx
|
|
add ebx,ecx
|
|
mov dl,[esi+6]
|
|
add edi,ebx
|
|
add ebx,edx
|
|
mov cl,[esi+7]
|
|
add edi,ebx
|
|
add ebx,ecx
|
|
mov dl,[esi+8]
|
|
add edi,ebx
|
|
add ebx,edx
|
|
mov cl,[esi+9]
|
|
add edi,ebx
|
|
add ebx,ecx
|
|
mov dl,[esi+10]
|
|
add edi,ebx
|
|
add ebx,edx
|
|
mov cl,[esi+11]
|
|
add edi,ebx
|
|
add ebx,ecx
|
|
mov dl,[esi+12]
|
|
add edi,ebx
|
|
add ebx,edx
|
|
mov cl,[esi+13]
|
|
add edi,ebx
|
|
add ebx,ecx
|
|
mov dl,[esi+14]
|
|
add edi,ebx
|
|
add ebx,edx
|
|
mov cl,[esi+15]
|
|
add edi,ebx
|
|
add ebx,ecx
|
|
cmp eax,16
|
|
lea esi,[esi+16]
|
|
lea edi,[edi+ebx]
|
|
jge @39
|
|
@38:
|
|
test eax,eax
|
|
je @42
|
|
@43:
|
|
xor edx,edx
|
|
mov dl,[esi]
|
|
add ebx,edx
|
|
dec eax
|
|
lea esi,[esi+1]
|
|
lea edi,[edi+ebx]
|
|
jg @43
|
|
@42:
|
|
mov ecx,65521
|
|
mov eax,ebx
|
|
xor edx,edx
|
|
div ecx
|
|
mov ebx,edx
|
|
mov ecx,65521
|
|
mov eax,edi
|
|
xor edx,edx
|
|
div ecx
|
|
test ebp,ebp
|
|
mov edi,edx
|
|
ja @33
|
|
@34:
|
|
mov eax,edi
|
|
shl eax,16
|
|
or eax,ebx
|
|
@45:
|
|
@32:
|
|
pop ebp
|
|
pop edi
|
|
pop esi
|
|
pop ebx
|
|
end;
|
|
|
|
{$define BYFOUR}
|
|
// if defined, the crc32 hashing is performed using 8 tables, for better
|
|
// CPU pipelining and faster execution
|
|
|
|
var
|
|
// tables content is created from code in initialization section below
|
|
// (save 8 KB of code size from standard crc32.obj, with no speed penalty)
|
|
crc32tab: array[0..{$ifdef BYFOUR}7{$else}0{$endif},byte] of cardinal;
|
|
|
|
function crc32(crc: cardinal; buf: PAnsiChar; len: cardinal): cardinal;
|
|
// adapted from fast Aleksandr Sharahov version
|
|
asm
|
|
{$ifdef BYFOUR}
|
|
test edx, edx
|
|
jz @ret
|
|
neg ecx
|
|
jz @ret
|
|
not eax
|
|
push ebx
|
|
@head:
|
|
test dl, 3
|
|
jz @bodyinit
|
|
movzx ebx, byte [edx]
|
|
inc edx
|
|
xor bl, al
|
|
shr eax, 8
|
|
xor eax,dword ptr [ebx*4 + crc32tab]
|
|
inc ecx
|
|
jnz @head
|
|
pop ebx
|
|
not eax
|
|
@ret:
|
|
ret
|
|
@bodyinit:
|
|
sub edx, ecx
|
|
add ecx, 8
|
|
jg @bodydone
|
|
push esi
|
|
push edi
|
|
mov edi, edx
|
|
mov edx, eax
|
|
@bodyloop:
|
|
mov ebx, [edi + ecx - 4]
|
|
xor edx, [edi + ecx - 8]
|
|
movzx esi, bl
|
|
mov eax,dword ptr [esi*4 + crc32tab + 1024*3]
|
|
movzx esi, bh
|
|
xor eax,dword ptr [esi*4 + crc32tab + 1024*2]
|
|
shr ebx, 16
|
|
movzx esi, bl
|
|
xor eax,dword ptr [esi*4 + crc32tab + 1024*1]
|
|
movzx esi, bh
|
|
xor eax,dword ptr [esi*4 + crc32tab + 1024*0]
|
|
movzx esi, dl
|
|
xor eax,dword ptr [esi*4 + crc32tab + 1024*7]
|
|
movzx esi, dh
|
|
xor eax,dword ptr [esi*4 + crc32tab + 1024*6]
|
|
shr edx, 16
|
|
movzx esi, dl
|
|
xor eax,dword ptr [esi*4 + crc32tab + 1024*5]
|
|
movzx esi, dh
|
|
xor eax,dword ptr [esi*4 + crc32tab + 1024*4]
|
|
add ecx, 8
|
|
jg @done
|
|
mov ebx, [edi + ecx - 4]
|
|
xor eax, [edi + ecx - 8]
|
|
movzx esi, bl
|
|
mov edx,dword ptr [esi*4 + crc32tab + 1024*3]
|
|
movzx esi, bh
|
|
xor edx,dword ptr [esi*4 + crc32tab + 1024*2]
|
|
shr ebx, 16
|
|
movzx esi, bl
|
|
xor edx,dword ptr [esi*4 + crc32tab + 1024*1]
|
|
movzx esi, bh
|
|
xor edx,dword ptr [esi*4 + crc32tab + 1024*0]
|
|
movzx esi, al
|
|
xor edx,dword ptr [esi*4 + crc32tab + 1024*7]
|
|
movzx esi, ah
|
|
xor edx,dword ptr [esi*4 + crc32tab + 1024*6]
|
|
shr eax, 16
|
|
movzx esi, al
|
|
xor edx,dword ptr [esi*4 + crc32tab + 1024*5]
|
|
movzx esi, ah
|
|
xor edx,dword ptr [esi*4 + crc32tab + 1024*4]
|
|
add ecx, 8
|
|
jle @bodyloop
|
|
mov eax, edx
|
|
@done:
|
|
mov edx, edi
|
|
pop edi
|
|
pop esi
|
|
@bodydone:
|
|
sub ecx, 8
|
|
jl @tail
|
|
pop ebx
|
|
not eax
|
|
ret
|
|
@tail:
|
|
movzx ebx, byte [edx + ecx]
|
|
xor bl,al
|
|
shr eax,8
|
|
xor eax,dword ptr [ebx*4 + crc32tab]
|
|
inc ecx
|
|
jnz @tail
|
|
pop ebx
|
|
not eax
|
|
{$else}
|
|
test edx, edx
|
|
jz @ret
|
|
neg ecx
|
|
jz @ret
|
|
not eax
|
|
sub edx,ecx
|
|
push ebx
|
|
@next:
|
|
movzx ebx, byte [edx + ecx]
|
|
xor bl, al
|
|
shr eax, 8
|
|
xor eax, [ebx*4 + crc32tab]
|
|
add ecx, 1
|
|
jnz @next
|
|
pop ebx
|
|
not eax
|
|
@ret:
|
|
{$endif BYFOUR}
|
|
end;
|
|
|
|
function get_crc_table: pointer;
|
|
begin
|
|
result := @crc32tab;
|
|
end;
|
|
|
|
{$endif USEZLIB}
|
|
|
|
{$endif LINUX}
|
|
|
|
function compressBound(sourceLen: cardinal): cardinal;
|
|
begin
|
|
result := sourceLen + (sourceLen shr 12) + (sourceLen shr 14) + 11;
|
|
end;
|
|
|
|
procedure TZStream.Init;
|
|
begin
|
|
fillchar(Self,sizeof(Self),0);
|
|
end;
|
|
|
|
function zcalloc(AppData: Pointer; Items, Size: cardinal): Pointer;
|
|
begin // direct use of the (FastMM4) delphi heap for all zip memory allocation
|
|
Getmem(Result,Items * Size);
|
|
end;
|
|
|
|
procedure zcfree(AppData, Block: Pointer);
|
|
begin // direct use of the (FastMM4) delphi heap for all zip memory allocation
|
|
FreeMem(Block);
|
|
end;
|
|
|
|
procedure _memcpy(dest, src: Pointer; count: integer); cdecl;
|
|
begin // will use fastcode if compiled within
|
|
Move(src^, dest^, count);
|
|
end;
|
|
|
|
procedure _memset(dest: Pointer; val: Integer; count: integer); cdecl;
|
|
begin // will use fastcode if compiled within
|
|
FillChar(dest^, count, val);
|
|
end;
|
|
|
|
function TZStream.DeflateInit(CompressionLevel: integer; ZipFormat: Boolean): Boolean;
|
|
var Bits: integer;
|
|
begin
|
|
if ZipFormat then
|
|
Bits := MAX_WBITS else
|
|
Bits := -MAX_WBITS;
|
|
result := deflateInit2_(self, CompressionLevel, Z_DEFLATED, Bits, DEF_MEM_LEVEL,
|
|
Z_DEFAULT_STRATEGY, ZLIB_VERSION, sizeof(self))>=0
|
|
end;
|
|
|
|
|
|
procedure MessageError(const Text, Caption: string);
|
|
// simple Error MessageBox with translation (if any available)
|
|
{$ifdef MSWINDOWS}
|
|
begin
|
|
MessageBox(0,pointer(Text),pointer(Caption),MB_ICONERROR);
|
|
{$else}
|
|
const EOL: word = $0A0D; // #13#10
|
|
Point: integer = $200A0D3A; // ':'#13#10' '
|
|
begin
|
|
__write(stderr, EOL, 2);
|
|
__write(stderr, Caption, Length(Caption)); __write(stderr, Point, 4);
|
|
__write(stderr, Text, Length(Text)); __write(stderr, EOL, 2);
|
|
{$endif}
|
|
end;
|
|
|
|
function Check(const Code: Integer; const ValidCodes: array of Integer): integer;
|
|
var i: Integer;
|
|
begin
|
|
if Code = Z_MEM_ERROR then
|
|
OutOfMemoryError;
|
|
result := code;
|
|
for i := Low(ValidCodes) to High(ValidCodes) do
|
|
if ValidCodes[i] = Code then
|
|
Exit;
|
|
MessageError(IntToStr(Code),'SynZip');
|
|
end;
|
|
|
|
(*function UpdateCrc32(acrc32: cardinal; inBuf: pointer; inLen: integer) : cardinal;
|
|
{ zlib crc32 : 46.63 ms ict4zip updatecrc32 : 128.94 ms -> no comment ! }
|
|
type b=pByte;
|
|
var i: integer;
|
|
begin
|
|
result := aCRC32;
|
|
for i := 0 to (inLen shr 3)-1 do begin
|
|
result := crc32tab[byte(result xor b(inBuf)^)] xor (result shr 8); inc(b(inBuf));
|
|
result := crc32tab[byte(result xor b(inBuf)^)] xor (result shr 8); inc(b(inBuf));
|
|
result := crc32tab[byte(result xor b(inBuf)^)] xor (result shr 8); inc(b(inBuf));
|
|
result := crc32tab[byte(result xor b(inBuf)^)] xor (result shr 8); inc(b(inBuf));
|
|
result := crc32tab[byte(result xor b(inBuf)^)] xor (result shr 8); inc(b(inBuf));
|
|
result := crc32tab[byte(result xor b(inBuf)^)] xor (result shr 8); inc(b(inBuf));
|
|
result := crc32tab[byte(result xor b(inBuf)^)] xor (result shr 8); inc(b(inBuf));
|
|
result := crc32tab[byte(result xor b(inBuf)^)] xor (result shr 8); inc(b(inBuf));
|
|
end;
|
|
for i := 0 to (inLen and 7)-1 do begin
|
|
result := crc32tab[byte(result xor b(inBuf)^)] xor (result shr 8); inc(b(inBuf)); end;
|
|
end;*)
|
|
|
|
function CompressString(const data: RawByteString; failIfGrow: boolean = false;
|
|
CompressionLevel: integer=6) : RawByteString;
|
|
var i1 : integer;
|
|
begin
|
|
result := '';
|
|
SetLength(result, 12 + (length(data) * 11) div 10 + 12);
|
|
pInt64(result)^ := length(data);
|
|
PCardinalArray(result)^[2] := adler32(0, pointer(data), length(data));
|
|
i1 := CompressMem(pointer(data), @PByteArray(result)[12], length(data),
|
|
length(result) - 12, CompressionLevel);
|
|
if (i1 > 0) and ( (12 + i1 < length(data)) or (not failIfGrow) ) then
|
|
SetLength(result, 12 + i1)
|
|
else result := '';
|
|
end;
|
|
|
|
function UncompressString(const data: RawByteString) : RawByteString;
|
|
begin
|
|
result := '';
|
|
if Length(data) > 12 then begin
|
|
SetLength(result, PCardinal(data)^);
|
|
SetLength(result, UncompressMem(@PByteArray(data)[12], pointer(result),
|
|
length(data) - 12, length(result)));
|
|
if (result <> '') and
|
|
((Adler32(0, pointer(result), length(result))) <> PCardinalArray(data)^[2]) then
|
|
result := '';
|
|
end;
|
|
end;
|
|
|
|
function CompressMem(src, dst: pointer; srcLen, dstLen: integer;
|
|
CompressionLevel: integer=6; ZipFormat: Boolean=false) : integer;
|
|
var strm: TZStream;
|
|
begin
|
|
strm.Init;
|
|
strm.next_in := src;
|
|
strm.avail_in := srcLen;
|
|
strm.next_out := dst;
|
|
strm.avail_out := dstLen; // -MAX_WBITS -> no zLib header => .zip compatible !
|
|
if strm.DeflateInit(CompressionLevel,ZipFormat) then
|
|
try
|
|
Check(deflate(strm,Z_FINISH),[Z_STREAM_END,Z_OK]);
|
|
finally
|
|
deflateEnd(strm);
|
|
end;
|
|
result := strm.total_out;
|
|
end;
|
|
|
|
function CompressStream(src: pointer; srcLen: integer;
|
|
aStream: TStream; CompressionLevel: integer=6; ZipFormat: Boolean=false): cardinal;
|
|
var strm: TZStream;
|
|
code: integer;
|
|
buf: array[word] of byte;
|
|
procedure FlushBuf;
|
|
var Count: integer;
|
|
begin
|
|
Count := SizeOf(buf) - strm.avail_out;
|
|
if Count=0 then exit;
|
|
aStream.Write(buf,Count);
|
|
strm.next_out := @buf;
|
|
strm.avail_out := sizeof(buf);
|
|
end;
|
|
begin
|
|
strm.Init;
|
|
strm.next_in := src;
|
|
strm.avail_in := srcLen;
|
|
strm.next_out := @buf;
|
|
strm.avail_out := sizeof(buf);
|
|
if strm.DeflateInit(CompressionLevel,ZipFormat) then
|
|
try // -MAX_WBITS -> no zLib header => .zip compatible !
|
|
repeat
|
|
code := Check(deflate(strm, Z_FINISH),[Z_OK,Z_STREAM_END,Z_BUF_ERROR]);
|
|
FlushBuf;
|
|
until code=Z_STREAM_END;
|
|
FlushBuf;
|
|
finally
|
|
deflateEnd(strm);
|
|
end;
|
|
result := strm.total_out;
|
|
end;
|
|
|
|
function UnCompressMem(src, dst: pointer; srcLen, dstLen: integer) : integer;
|
|
var strm: TZStream;
|
|
// Z: TMemoryStream; R: Int64Rec;
|
|
begin
|
|
strm.Init;
|
|
strm.next_in := src;
|
|
strm.avail_in := srcLen;
|
|
strm.next_out := dst;
|
|
strm.avail_out := dstLen;
|
|
if inflateInit2_(strm, -MAX_WBITS, ZLIB_VERSION, sizeof(strm))>=0 then
|
|
try // -MAX_WBITS -> no zLib header => .zip compatible !
|
|
Check(inflate(strm, Z_FINISH),[Z_OK,Z_STREAM_END]);
|
|
finally
|
|
inflateEnd(strm);
|
|
end;
|
|
result := strm.total_out;
|
|
{ Z := TMemoryStream.Create; R := UnCompressStream(src,srcLen,Z,nil);
|
|
assert(CompareMem(Z.Memory,dst,R.Lo)); assert(R.Lo=strm.total_out);
|
|
assert(crc32(0,dst,result)=R.Hi); Z.Free; }
|
|
end;
|
|
|
|
function UnCompressStream(
|
|
src: pointer; srcLen: integer; aStream: TStream; checkCRC: PCardinal): cardinal;
|
|
// result:=dstLen checkCRC(<>nil)^:=crc32 (if aStream=nil -> fast crc calc)
|
|
var strm: TZStream;
|
|
code: integer;
|
|
buf: array[word] of byte;
|
|
procedure FlushBuf;
|
|
var Count: integer;
|
|
begin
|
|
Count := SizeOf(buf) - strm.avail_out;
|
|
if Count=0 then exit;
|
|
if CheckCRC<>nil then
|
|
CheckCRC^ := crc32(CheckCRC^,@buf,Count);
|
|
if aStream<>nil then
|
|
aStream.Write(buf,Count);
|
|
strm.next_out := @buf;
|
|
strm.avail_out := sizeof(buf);
|
|
end;
|
|
begin
|
|
strm.Init;
|
|
strm.next_in := src;
|
|
strm.avail_in := srcLen;
|
|
strm.next_out := @buf;
|
|
strm.avail_out := sizeof(buf);
|
|
if checkCRC<>nil then
|
|
CheckCRC^ := 0;
|
|
if inflateInit2_(strm, -MAX_WBITS, ZLIB_VERSION, sizeof(strm))>=0 then
|
|
try // -MAX_WBITS -> no zLib header => .zip compatible !
|
|
repeat
|
|
code := Check(inflate(strm, Z_FINISH),[Z_OK,Z_STREAM_END,Z_BUF_ERROR]);
|
|
FlushBuf;
|
|
until code=Z_STREAM_END;
|
|
FlushBuf;
|
|
finally
|
|
inflateEnd(strm);
|
|
end;
|
|
result := strm.total_out;
|
|
end;
|
|
|
|
const
|
|
gzheader : array [0..2] of cardinal = ($88B1F,0,0);
|
|
|
|
HTTP_LEVEL = 1; // 6 is standard, but 1 is enough and faster
|
|
|
|
function CompressGZip(var Data: RawByteString; Compress: boolean): RawByteString;
|
|
var L: integer;
|
|
P: PAnsiChar;
|
|
begin
|
|
L := length(Data);
|
|
if Compress then begin
|
|
SetString(result,nil,L+128+L shr 3); // maximum possible memory required
|
|
P := pointer(result);
|
|
move(gzheader,P^,10);
|
|
inc(P,10);
|
|
inc(P,CompressMem(pointer(Data),P,L,length(result)-20,HTTP_LEVEL));
|
|
PCardinal(P)^ := crc32(0,pointer(Data),L);
|
|
inc(P,4);
|
|
PCardinal(P)^ := L;
|
|
inc(P,4);
|
|
SetString(Data,PAnsiChar(pointer(result)),P-pointer(result));
|
|
end else
|
|
Data := gzread(pointer(Data),length(Data));
|
|
result := 'gzip';
|
|
end;
|
|
|
|
function CompressDeflate(var Data: RawByteString; Compress: boolean): RawByteString;
|
|
var strm: TZStream;
|
|
code, len: integer;
|
|
begin
|
|
strm.Init;
|
|
strm.next_in := pointer(Data);
|
|
strm.avail_in := length(Data);
|
|
if Compress then begin
|
|
SetString(result,nil,strm.avail_in+256+strm.avail_in shr 3); // max mem required
|
|
strm.next_out := pointer(result);
|
|
strm.avail_out := length(result);
|
|
// +MAX_WBITS below = encode in deflate format
|
|
// Z_HUFFMAN_ONLY instead of Z_DEFAULT_STRATEGY is slowest and bad
|
|
if deflateInit2_(strm, HTTP_LEVEL, Z_DEFLATED, +MAX_WBITS, DEF_MEM_LEVEL,
|
|
Z_DEFAULT_STRATEGY, ZLIB_VERSION, sizeof(strm))>=0 then
|
|
try
|
|
Check(deflate(strm,Z_FINISH),[Z_STREAM_END]);
|
|
finally
|
|
deflateEnd(strm);
|
|
end;
|
|
end else begin
|
|
len := (strm.avail_in*20)shr 3; // initial chunk size = comp. ratio of 60%
|
|
SetString(result,nil,len);
|
|
strm.next_out := pointer(result);
|
|
strm.avail_out := len;
|
|
if inflateInit2_(strm, +MAX_WBITS, ZLIB_VERSION, sizeof(strm))>=0 then
|
|
try // +MAX_WBITS below = decode from deflate format
|
|
repeat
|
|
code := Check(inflate(strm, Z_FINISH),[Z_OK,Z_STREAM_END,Z_BUF_ERROR]);
|
|
if strm.avail_out=0 then begin
|
|
// need to increase buffer by chunk
|
|
SetLength(result,length(result)+len);
|
|
strm.next_out := PAnsiChar(pointer(result))+length(result)-len;
|
|
strm.avail_out := len;
|
|
end;
|
|
until code=Z_STREAM_END;
|
|
finally
|
|
inflateEnd(strm);
|
|
end;
|
|
end;
|
|
SetString(Data,PAnsiChar(pointer(result)),strm.total_out);
|
|
result := 'deflate';
|
|
end;
|
|
|
|
|
|
{ TFileHeader }
|
|
|
|
function TFileHeader.DataPosition: cardinal;
|
|
begin
|
|
result := localHeadOff+sizeof(TLocalFileHeader)+fileInfo.extraLen+fileInfo.nameLen;
|
|
end;
|
|
|
|
procedure TFileHeader.Init;
|
|
begin
|
|
fillchar(self,sizeof(TFileHeader),0);
|
|
signature := $02014b51;
|
|
dec(signature); // avoid finding the signature in the generated code
|
|
madeBy := $14;
|
|
extFileAttr := $A0; // archive, normal
|
|
fileInfo.neededVersion := $14;
|
|
end;
|
|
|
|
{ TFileInfo }
|
|
|
|
function TFileInfo.AlgoID: integer;
|
|
// 1..15 (1=SynLZ e.g.) from flags bits 7..10
|
|
begin
|
|
// in PKware appnote, bits 7..10 of general purpose bit flag are not used
|
|
result := (flags shr 7) and 15; // proprietary flag for SynZipFiles.pas
|
|
end;
|
|
|
|
function TFileInfo.SameAs(aInfo: PFileInfo): boolean;
|
|
begin // tolerate a time change through a network: zcrc32 is accurate enough
|
|
result := (zzipMethod=aInfo.zzipMethod) and (zcrc32=aInfo.zcrc32) and
|
|
(zzipSize=aInfo.zzipSize) and (zzipMethod=aInfo.zzipMethod) and
|
|
(zfullSize=aInfo.zfullSize) and (flags=aInfo.flags);
|
|
end;
|
|
|
|
procedure TFileInfo.SetAlgoID(Algorithm: integer);
|
|
begin
|
|
zzipMethod := 0; // file is stored, accorging to .ZIP standard
|
|
// in PKware appnote, bits 7..10 of general purpose bit flag are not used
|
|
flags := (Algorithm and 15) shl 7; // proprietary flag for SynZipFiles.pas
|
|
end;
|
|
|
|
function TFileInfo.GetUTF8FileName: boolean;
|
|
begin // from PKware appnote, Bit 11: Language encoding flag (EFS)
|
|
result := (flags and (1 shl 11))<>0;
|
|
end;
|
|
|
|
procedure TFileInfo.SetUTF8FileName;
|
|
begin
|
|
flags := flags or (1 shl 11);
|
|
end;
|
|
|
|
procedure TFileInfo.UnSetUTF8FileName;
|
|
begin
|
|
flags := flags and not(1 shl 11);
|
|
end;
|
|
|
|
function CRC32string(const aString: RawByteString): cardinal;
|
|
// crc32 is better than adler32 for short strings, and fast enough in zlib 1.2.5
|
|
begin
|
|
result := length(aString);
|
|
if result<>0 then
|
|
result := crc32(0,pointer(aString),result);
|
|
end;
|
|
|
|
|
|
{ TSynZipCompressor }
|
|
|
|
constructor TSynZipCompressor.Create(outStream: TStream; CompressionLevel: Integer;
|
|
Format: TSynZipCompressorFormat = szcfRaw);
|
|
begin
|
|
fDestStream := outStream;
|
|
fGZFormat := (Format=szcfGZ);
|
|
if fGZFormat then
|
|
fDestStream.Write(gzHeader,10);
|
|
with FStrm do begin
|
|
Init;
|
|
next_out := @FBufferOut;
|
|
avail_out := SizeOf(FBufferOut);
|
|
fInitialized := DeflateInit(CompressionLevel,Format=szcfZip);
|
|
end;
|
|
end;
|
|
|
|
procedure TSynZipCompressor.Flush;
|
|
begin
|
|
if FInitialized then begin
|
|
while (Check(deflate(FStrm, Z_FINISH),[Z_OK, Z_STREAM_END])<>Z_STREAM_END) and
|
|
(FStrm.avail_out=0) do
|
|
FlushBufferOut;
|
|
FlushBufferOut;
|
|
end;
|
|
end;
|
|
|
|
destructor TSynZipCompressor.Destroy;
|
|
begin
|
|
if FInitialized then begin
|
|
Flush;
|
|
FStrm.next_out := nil;
|
|
FStrm.avail_out := 0;
|
|
deflateEnd(FStrm);
|
|
end;
|
|
if fGZFormat then begin
|
|
fDestStream.Write(fCRC,4);
|
|
fDestStream.Write(SizeIn,4);
|
|
end;
|
|
inherited;
|
|
end;
|
|
|
|
function TSynZipCompressor.FlushBufferOut: integer;
|
|
begin
|
|
Result := 0;
|
|
if not FInitialized then
|
|
exit;
|
|
if FStrm.avail_out < SizeOf(FBufferOut) then begin
|
|
Result := SizeOf(FBufferOut) - FStrm.avail_out;
|
|
FDestStream.Write(FBufferOut, Result);
|
|
FStrm.next_out := @FBufferOut;
|
|
FStrm.avail_out := SizeOf(FBufferOut);
|
|
end;
|
|
end;
|
|
|
|
function TSynZipCompressor.Read(var Buffer; Count: Integer): Longint;
|
|
begin
|
|
assert(false);
|
|
result := 0;
|
|
end;
|
|
|
|
function TSynZipCompressor.Seek(Offset: Integer; Origin: Word): Longint;
|
|
begin
|
|
if not FInitialized then
|
|
result := 0 else
|
|
if (Offset = 0) and (Origin = soFromCurrent) then // for TStream.Position
|
|
Result := FStrm.total_in else begin
|
|
Result := 0;
|
|
assert((Offset = 0) and (Origin = soFromBeginning) and (FStrm.total_in = 0));
|
|
end;
|
|
end;
|
|
|
|
function TSynZipCompressor.Write(const Buffer; Count: Integer): Longint;
|
|
begin
|
|
if (self=nil) or not FInitialized or (Count<=0) then begin
|
|
result := 0;
|
|
exit;
|
|
end;
|
|
result := Count;
|
|
fCRC := crc32(fCRC,@Buffer,Count);
|
|
FStrm.next_in := pointer(@Buffer);
|
|
FStrm.avail_in := Count;
|
|
while FStrm.avail_in > 0 do begin // compress pending data
|
|
if Check(deflate(FStrm, Z_NO_FLUSH), [Z_OK])<>Z_OK then
|
|
raise Exception.Create('ZCompress');
|
|
if FStrm.avail_out = 0 then
|
|
FlushBufferOut;
|
|
end;
|
|
FStrm.next_in := nil;
|
|
FStrm.avail_in := 0;
|
|
end;
|
|
|
|
{$ifndef USEZLIB}
|
|
|
|
{
|
|
Generate a table for a byte-wise 32-bit CRC calculation on the polynomial:
|
|
x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1.
|
|
|
|
Polynomials over GF(2) are represented in binary, one bit per coefficient,
|
|
with the lowest powers in the most significant bit. Then adding polynomials
|
|
is just exclusive-or, and multiplying a polynomial by x is a right shift by
|
|
one. If we call the above polynomial p, and represent a byte as the
|
|
polynomial q, also with the lowest power in the most significant bit (so the
|
|
byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p,
|
|
where a mod b means the remainder after dividing a by b.
|
|
|
|
This calculation is done using the shift-register method of multiplying and
|
|
taking the remainder. The register is initialized to zero, and for each
|
|
incoming bit, x^32 is added mod p to the register if the bit is a one (where
|
|
x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by
|
|
x (which is shifting right by one and adding x^32 mod p if the bit shifted
|
|
out is a one). We start with the highest power (least significant bit) of
|
|
q and repeat for all eight bits of q.
|
|
|
|
The table is simply the CRC of all possible eight bit values. This is all
|
|
the information needed to generate CRC's on data a byte at a time for all
|
|
combinations of CRC register values and incoming bytes.
|
|
}
|
|
procedure InitCrc32Tab;
|
|
var i,n: integer;
|
|
crc: cardinal;
|
|
begin // this code size is only 105 bytes, generating 8 KB table content
|
|
for i := 0 to 255 do begin
|
|
crc := i;
|
|
for n := 1 to 8 do
|
|
if (crc and 1)<>0 then
|
|
// $edb88320 from polynomial p=(0,1,2,4,5,7,8,10,11,12,16,22,23,26)
|
|
crc := (crc shr 1) xor $edb88320 else
|
|
crc := crc shr 1;
|
|
crc32tab[0,i] := crc;
|
|
end;
|
|
{$ifdef BYFOUR}
|
|
for i := 0 to 255 do begin
|
|
crc := crc32tab[0,i];
|
|
for n := 1 to 7 do begin
|
|
crc := (crc shr 8) xor crc32tab[0,byte(crc)];
|
|
crc32tab[n,i] := crc;
|
|
end;
|
|
end;
|
|
{$endif}
|
|
end;
|
|
|
|
initialization
|
|
// crc32 tables content is created from code in initialization section below
|
|
// (save 8 KB of code size from standard crc32.obj, with no speed penalty)
|
|
InitCrc32Tab;
|
|
{$endif}
|
|
end.
|
|
|
|
|
|
|