chore: initial commit (extracted from Launchers monorepo)

Plugin: ns7zip v2.0.0
Architectures: x86-ansi, x86-unicode, amd64-unicode
License: LGPL-2.1-or-later
This commit is contained in:
Simone
2026-04-29 14:07:51 +02:00
commit d074cc7c07
3848 changed files with 1076682 additions and 0 deletions
+187
View File
@@ -0,0 +1,187 @@
7z ANSI-C Decoder 9.35
----------------------
7z ANSI-C provides 7z/LZMA decoding.
7z ANSI-C version is simplified version ported from C++ code.
LZMA is default and general compression method of 7z format
in 7-Zip compression program (www.7-zip.org). LZMA provides high
compression ratio and very fast decompression.
LICENSE
-------
7z ANSI-C Decoder is part of the LZMA SDK.
LZMA SDK is written and placed in the public domain by Igor Pavlov.
Files
---------------------
7zDecode.* - Low level 7z decoding
7zExtract.* - High level 7z decoding
7zHeader.* - .7z format constants
7zIn.* - .7z archive opening
7zItem.* - .7z structures
7zMain.c - Test application
How To Use
----------
You can create .7z archive with 7z.exe, 7za.exe or 7zr.exe:
7z.exe a archive.7z *.htm -r -mx -m0fb=255
If you have big number of files in archive, and you need fast extracting,
you can use partly-solid archives:
7za.exe a archive.7z *.htm -ms=512K -r -mx -m0fb=255 -m0d=512K
In that example 7-Zip will use 512KB solid blocks. So it needs to decompress only
512KB for extracting one file from such archive.
Limitations of current version of 7z ANSI-C Decoder
---------------------------------------------------
- It reads only "FileName", "Size", "LastWriteTime" and "CRC" information for each file in archive.
- It supports only LZMA and Copy (no compression) methods with BCJ or BCJ2 filters.
- It converts original UTF-16 Unicode file names to UTF-8 Unicode file names.
These limitations will be fixed in future versions.
Using 7z ANSI-C Decoder Test application:
-----------------------------------------
Usage: 7zDec <command> <archive_name>
<Command>:
e: Extract files from archive
l: List contents of archive
t: Test integrity of archive
Example:
7zDec l archive.7z
lists contents of archive.7z
7zDec e archive.7z
extracts files from archive.7z to current folder.
How to use .7z Decoder
----------------------
Memory allocation
~~~~~~~~~~~~~~~~~
7z Decoder uses two memory pools:
1) Temporary pool
2) Main pool
Such scheme can allow you to avoid fragmentation of allocated blocks.
Steps for using 7z decoder
--------------------------
Use code at 7zMain.c as example.
1) Declare variables:
inStream /* implements ILookInStream interface */
CSzArEx db; /* 7z archive database structure */
ISzAlloc allocImp; /* memory functions for main pool */
ISzAlloc allocTempImp; /* memory functions for temporary pool */
2) call CrcGenerateTable(); function to initialize CRC structures.
3) call SzArEx_Init(&db); function to initialize db structures.
4) call SzArEx_Open(&db, inStream, &allocMain, &allocTemp) to open archive
This function opens archive "inStream" and reads headers to "db".
All items in "db" will be allocated with "allocMain" functions.
SzArEx_Open function allocates and frees temporary structures by "allocTemp" functions.
5) List items or Extract items
Listing code:
~~~~~~~~~~~~~
Use SzArEx_GetFileNameUtf16 function. Look example code in C\Util\7z\7zMain.c file.
Extracting code:
~~~~~~~~~~~~~~~~
SZ_RESULT SzAr_Extract(
CArchiveDatabaseEx *db,
ILookInStream *inStream,
UInt32 fileIndex, /* index of file */
UInt32 *blockIndex, /* index of solid block */
Byte **outBuffer, /* pointer to pointer to output buffer (allocated with allocMain) */
size_t *outBufferSize, /* buffer size for output buffer */
size_t *offset, /* offset of stream for required file in *outBuffer */
size_t *outSizeProcessed, /* size of file in *outBuffer */
ISzAlloc *allocMain,
ISzAlloc *allocTemp);
If you need to decompress more than one file, you can send these values from previous call:
blockIndex,
outBuffer,
outBufferSize,
You can consider "outBuffer" as cache of solid block. If your archive is solid,
it will increase decompression speed.
After decompressing you must free "outBuffer":
allocImp.Free(outBuffer);
6) call SzArEx_Free(&db, allocImp.Free) to free allocated items in "db".
Memory requirements for .7z decoding
------------------------------------
Memory usage for Archive opening:
- Temporary pool:
- Memory for uncompressed .7z headers
- some other temporary blocks
- Main pool:
- Memory for database:
Estimated size of one file structures in solid archive:
- Size (4 or 8 Bytes)
- CRC32 (4 bytes)
- LastWriteTime (8 bytes)
- Some file information (4 bytes)
- File Name (variable length) + pointer + allocation structures
Memory usage for archive Decompressing:
- Temporary pool:
- Memory for LZMA decompressing structures
- Main pool:
- Memory for decompressed solid block
- Memory for temprorary buffers, if BCJ2 fileter is used. Usually these
temprorary buffers can be about 15% of solid block size.
7z Decoder doesn't allocate memory for compressed blocks.
Instead of this, you must allocate buffer with desired
size before calling 7z Decoder. Use 7zMain.c as example.
Defines
-------
_SZ_ALLOC_DEBUG - define it if you want to debug alloc/free operations to stderr.
---
http://www.7-zip.org
http://www.7-zip.org/sdk.html
http://www.7-zip.org/support.html
+469
View File
@@ -0,0 +1,469 @@
7z Format description (18.06)
----------------------------
This file contains description of 7z archive format.
7z archive can contain files compressed with any method.
See "Methods.txt" for description for defined compressing methods.
Format structure Overview
-------------------------
Some fields can be optional.
Archive structure
~~~~~~~~~~~~~~~~~
SignatureHeader
[PackedStreams]
[PackedStreamsForHeaders]
[
Header
or
{
Packed Header
HeaderInfo
}
]
Header structure
~~~~~~~~~~~~~~~~
{
ArchiveProperties
AdditionalStreams
{
PackInfo
{
PackPos
NumPackStreams
Sizes[NumPackStreams]
CRCs[NumPackStreams]
}
CodersInfo
{
NumFolders
Folders[NumFolders]
{
NumCoders
CodersInfo[NumCoders]
{
ID
NumInStreams;
NumOutStreams;
PropertiesSize
Properties[PropertiesSize]
}
NumBindPairs
BindPairsInfo[NumBindPairs]
{
InIndex;
OutIndex;
}
PackedIndices
}
UnPackSize[Folders][Folders.NumOutstreams]
CRCs[NumFolders]
}
SubStreamsInfo
{
NumUnPackStreamsInFolders[NumFolders];
UnPackSizes[]
CRCs[]
}
}
MainStreamsInfo
{
(Same as in AdditionalStreams)
}
FilesInfo
{
NumFiles
Properties[]
{
ID
Size
Data
}
}
}
HeaderInfo structure
~~~~~~~~~~~~~~~~~~~~
{
(Same as in AdditionalStreams)
}
Notes about Notation and encoding
---------------------------------
7z uses little endian encoding.
7z archive format has optional headers that are marked as
[]
Header
[]
REAL_UINT64 means real UINT64.
UINT64 means real UINT64 encoded with the following scheme:
Size of encoding sequence depends from first byte:
First_Byte Extra_Bytes Value
(binary)
0xxxxxxx : ( xxxxxxx )
10xxxxxx BYTE y[1] : ( xxxxxx << (8 * 1)) + y
110xxxxx BYTE y[2] : ( xxxxx << (8 * 2)) + y
...
1111110x BYTE y[6] : ( x << (8 * 6)) + y
11111110 BYTE y[7] : y
11111111 BYTE y[8] : y
Property IDs
------------
0x00 = kEnd
0x01 = kHeader
0x02 = kArchiveProperties
0x03 = kAdditionalStreamsInfo
0x04 = kMainStreamsInfo
0x05 = kFilesInfo
0x06 = kPackInfo
0x07 = kUnPackInfo
0x08 = kSubStreamsInfo
0x09 = kSize
0x0A = kCRC
0x0B = kFolder
0x0C = kCodersUnPackSize
0x0D = kNumUnPackStream
0x0E = kEmptyStream
0x0F = kEmptyFile
0x10 = kAnti
0x11 = kName
0x12 = kCTime
0x13 = kATime
0x14 = kMTime
0x15 = kWinAttributes
0x16 = kComment
0x17 = kEncodedHeader
0x18 = kStartPos
0x19 = kDummy
7z format headers
-----------------
SignatureHeader
~~~~~~~~~~~~~~~
BYTE kSignature[6] = {'7', 'z', 0xBC, 0xAF, 0x27, 0x1C};
ArchiveVersion
{
BYTE Major; // now = 0
BYTE Minor; // now = 4
};
UINT32 StartHeaderCRC;
StartHeader
{
REAL_UINT64 NextHeaderOffset
REAL_UINT64 NextHeaderSize
UINT32 NextHeaderCRC
}
...........................
ArchiveProperties
~~~~~~~~~~~~~~~~~
BYTE NID::kArchiveProperties (0x02)
for (;;)
{
BYTE PropertyType;
if (aType == 0)
break;
UINT64 PropertySize;
BYTE PropertyData[PropertySize];
}
Digests (NumStreams)
~~~~~~~~~~~~~~~~~~~~~
BYTE AllAreDefined
if (AllAreDefined == 0)
{
for(NumStreams)
BIT Defined
}
UINT32 CRCs[NumDefined]
PackInfo
~~~~~~~~~~~~
BYTE NID::kPackInfo (0x06)
UINT64 PackPos
UINT64 NumPackStreams
[]
BYTE NID::kSize (0x09)
UINT64 PackSizes[NumPackStreams]
[]
[]
BYTE NID::kCRC (0x0A)
PackStreamDigests[NumPackStreams]
[]
BYTE NID::kEnd
Folder
~~~~~~
UINT64 NumCoders;
for (NumCoders)
{
BYTE
{
0:3 CodecIdSize
4: Is Complex Coder
5: There Are Attributes
6: Reserved
7: There are more alternative methods. (Not used anymore, must be 0).
}
BYTE CodecId[CodecIdSize]
if (Is Complex Coder)
{
UINT64 NumInStreams;
UINT64 NumOutStreams;
}
if (There Are Attributes)
{
UINT64 PropertiesSize
BYTE Properties[PropertiesSize]
}
}
NumBindPairs = NumOutStreamsTotal - 1;
for (NumBindPairs)
{
UINT64 InIndex;
UINT64 OutIndex;
}
NumPackedStreams = NumInStreamsTotal - NumBindPairs;
if (NumPackedStreams > 1)
for(NumPackedStreams)
{
UINT64 Index;
};
Coders Info
~~~~~~~~~~~
BYTE NID::kUnPackInfo (0x07)
BYTE NID::kFolder (0x0B)
UINT64 NumFolders
BYTE External
switch(External)
{
case 0:
Folders[NumFolders]
case 1:
UINT64 DataStreamIndex
}
BYTE ID::kCodersUnPackSize (0x0C)
for(Folders)
for(Folder.NumOutStreams)
UINT64 UnPackSize;
[]
BYTE NID::kCRC (0x0A)
UnPackDigests[NumFolders]
[]
BYTE NID::kEnd
SubStreams Info
~~~~~~~~~~~~~~
BYTE NID::kSubStreamsInfo; (0x08)
[]
BYTE NID::kNumUnPackStream; (0x0D)
UINT64 NumUnPackStreamsInFolders[NumFolders];
[]
[]
BYTE NID::kSize (0x09)
UINT64 UnPackSizes[]
[]
[]
BYTE NID::kCRC (0x0A)
Digests[Number of streams with unknown CRC]
[]
BYTE NID::kEnd
Streams Info
~~~~~~~~~~~~
[]
PackInfo
[]
[]
CodersInfo
[]
[]
SubStreamsInfo
[]
BYTE NID::kEnd
FilesInfo
~~~~~~~~~
BYTE NID::kFilesInfo; (0x05)
UINT64 NumFiles
for (;;)
{
BYTE PropertyType;
if (aType == 0)
break;
UINT64 Size;
switch(PropertyType)
{
kEmptyStream: (0x0E)
for(NumFiles)
BIT IsEmptyStream
kEmptyFile: (0x0F)
for(EmptyStreams)
BIT IsEmptyFile
kAnti: (0x10)
for(EmptyStreams)
BIT IsAntiFile
case kCTime: (0x12)
case kATime: (0x13)
case kMTime: (0x14)
BYTE AllAreDefined
if (AllAreDefined == 0)
{
for(NumFiles)
BIT TimeDefined
}
BYTE External;
if(External != 0)
UINT64 DataIndex
[]
for(Definded Items)
REAL_UINT64 Time
[]
kNames: (0x11)
BYTE External;
if(External != 0)
UINT64 DataIndex
[]
for(Files)
{
wchar_t Names[NameSize];
wchar_t 0;
}
[]
kAttributes: (0x15)
BYTE AllAreDefined
if (AllAreDefined == 0)
{
for(NumFiles)
BIT AttributesAreDefined
}
BYTE External;
if(External != 0)
UINT64 DataIndex
[]
for(Definded Attributes)
UINT32 Attributes
[]
}
}
Header
~~~~~~
BYTE NID::kHeader (0x01)
[]
ArchiveProperties
[]
[]
BYTE NID::kAdditionalStreamsInfo; (0x03)
StreamsInfo
[]
[]
BYTE NID::kMainStreamsInfo; (0x04)
StreamsInfo
[]
[]
FilesInfo
[]
BYTE NID::kEnd
HeaderInfo
~~~~~~~~~~
[]
BYTE NID::kEncodedHeader; (0x17)
StreamsInfo for Encoded Header
[]
---
End of document
+84
View File
@@ -0,0 +1,84 @@
[OPTIONS]
Compatibility=1.1 or later
Compiled file=7-zip.chm
Contents file=7zip.hhc
Default topic=start.htm
Display compile progress=No
Full-text search=Yes
Index file=7zip.hhk
Language=0x409 English (United States)
[FILES]
start.htm
general\thanks.htm
general\faq.htm
general\formats.htm
general\index.htm
general\license.htm
general\performance.htm
general\7z.htm
cmdline\index.htm
cmdline\syntax.htm
cmdline\exit_codes.htm
cmdline\commands\add.htm
cmdline\commands\bench.htm
cmdline\commands\delete.htm
cmdline\commands\extract.htm
cmdline\commands\extract_full.htm
cmdline\commands\update.htm
cmdline\commands\hash.htm
cmdline\commands\index.htm
cmdline\commands\list.htm
cmdline\commands\rename.htm
cmdline\commands\test.htm
cmdline\switches\index.htm
cmdline\switches\yes.htm
cmdline\switches\include.htm
cmdline\switches\method.htm
cmdline\switches\ar_include.htm
cmdline\switches\ar_exclude.htm
cmdline\switches\ar_no.htm
cmdline\switches\bb.htm
cmdline\switches\bs.htm
cmdline\switches\charset.htm
cmdline\switches\email.htm
cmdline\switches\list_tech.htm
cmdline\switches\large_pages.htm
cmdline\switches\output_dir.htm
cmdline\switches\overwrite.htm
cmdline\switches\password.htm
cmdline\switches\recurse.htm
cmdline\switches\sa.htm
cmdline\switches\scc.htm
cmdline\switches\scrc.htm
cmdline\switches\sdel.htm
cmdline\switches\sfx.htm
cmdline\switches\shared.htm
cmdline\switches\sni.htm
cmdline\switches\sns.htm
cmdline\switches\spf.htm
cmdline\switches\spm.htm
cmdline\switches\ssc.htm
cmdline\switches\stdin.htm
cmdline\switches\stdout.htm
cmdline\switches\stl.htm
cmdline\switches\stop_switch.htm
cmdline\switches\stx.htm
cmdline\switches\type.htm
cmdline\switches\update.htm
cmdline\switches\working_dir.htm
cmdline\switches\exclude.htm
fm\options.htm
fm\benchmark.htm
fm\temp.htm
fm\index.htm
fm\menu.htm
fm\about.htm
fm\plugins\index.htm
fm\plugins\7-zip\extract.htm
fm\plugins\7-zip\index.htm
fm\plugins\7-zip\add.htm
[INFOTYPES]
+403
View File
@@ -0,0 +1,403 @@
<?xml version="1.0"?>
<?define VerMajor = "25" ?>
<?define VerMinor = "01" ?>
<?define VerBuild = "00" ?>
<?define MmVer = "$(var.VerMajor).$(var.VerMinor)" ?>
<?define MmHex = "$(var.VerMajor)$(var.VerMinor)" ?>
<?define MmmmVer = "$(var.MmVer).$(var.VerBuild).0" ?>
<?define UpgradeMinVer = "4.38" ?>
<?define ProductName = "7-Zip" ?>
<?ifndef MyCPU?>
<?define MyCPU = "Intel" ?>
<?endif?>
<?if $(var.MyCPU) = "x64" ?>
<?define CpuId = "2" ?>
<?define PFilesFolder = "ProgramFiles64Folder" ?>
<?define Platforms = "x64" ?>
<?define CpuPostfix = " (x64 edition)" ?>
<?define Is64 = "yes" ?>
<?define NumBits = "64" ?>
<?elseif $(var.MyCPU) = "ia64" ?>
<?define CpuId = "3" ?>
<?define PFilesFolder = "ProgramFiles64Folder" ?>
<?define Platforms = "Intel64" ?>
<?define CpuPostfix = " (ia64 edition)" ?>
<?define Is64 = "yes" ?>
<?define NumBits = "64" ?>
<?else ?>
<?define CpuId = "1" ?>
<?define PFilesFolder = "ProgramFilesFolder" ?>
<?define Platforms = "Intel" ?>
<?define CpuPostfix = "" ?>
<?define Is64 = "no" ?>
<?define NumBits = "32" ?>
<?endif ?>
<?define ShellExtId = "{23170F69-40C1-278A-1000-000100020000}" ?>
<?define BaseId = "23170F69-40C1-270$(var.CpuId)" ?>
<?define BaseIdVer = "$(var.BaseId)-$(var.MmHex)-$(var.VerBuild)00" ?>
<?define ProductId = "$(var.BaseIdVer)01000000" ?>
<?define PackageId = "$(var.BaseIdVer)02000000" ?>
<?define CompId = "$(var.BaseIdVer)030000" ?>
<?define UpgradeCode = "$(var.BaseId)-0000-000004000000" ?>
<?define CompFm = "$(var.CompId)01" ?>
<?define CompShellExt = "$(var.CompId)02" ?>
<?define CompCmdLine = "$(var.CompId)03" ?>
<?define CompCmdLineA = "$(var.CompId)04" ?>
<?define CompGui = "$(var.CompId)05" ?>
<?define CompGuiSfx = "$(var.CompId)06" ?>
<?define CompConSfx = "$(var.CompId)07" ?>
<?define CompHelp = "$(var.CompId)08" ?>
<?define CompDocs = "$(var.CompId)09" ?>
<?define CompFormats = "$(var.CompId)10" ?>
<?define CompCodecs = "$(var.CompId)11" ?>
<?define CompLang = "$(var.CompId)12" ?>
<?define CompShellExt2 = "$(var.CompId)13" ?>
<?define CompInstallRegCU = "$(var.CompId)80" ?>
<?define CompInstallRegLM = "$(var.CompId)81" ?>
<?define CompInstallRegWild = "$(var.CompId)82" ?>
<?define CompInstallRegDirectory = "$(var.CompId)83" ?>
<?define CompInstallRegDirDD = "$(var.CompId)84" ?>
<?define CompInstallRegDriveDD = "$(var.CompId)85" ?>
<?define CompInstallRegApproved = "$(var.CompId)86" ?>
<?define CompInstallRegAppPath = "$(var.CompId)87" ?>
<?define CompInstallRegFolder = "$(var.CompId)88" ?>
<?define Manufacturer = "Igor Pavlov" ?>
<?define HomePage = "http://www.7-zip.org/" ?>
<?define AboutURL = "$(var.HomePage)" ?>
<?define UpdatesURL = "$(var.HomePage)download.html" ?>
<?define SupportURL = "$(var.HomePage)support.html" ?>
<Wix xmlns="http://schemas.microsoft.com/wix/2003/01/wi">
<Product
Id="$(var.ProductId)"
UpgradeCode="$(var.UpgradeCode)"
Name="$(var.ProductName) $(var.MmVer)$(var.CpuPostfix)"
Language="1033"
Version="$(var.MmmmVer)"
Manufacturer="$(var.Manufacturer)">
<Package
Id="$(var.PackageId)"
Description="$(var.ProductName)$(var.CpuPostfix) Package"
Comments="$(var.ProductName)$(var.CpuPostfix) Package"
Manufacturer="$(var.Manufacturer)"
InstallerVersion="200"
Compressed="yes"
Platforms="$(var.Platforms)"
/>
<!-- Major upgrade -->
<Upgrade Id="$(var.UpgradeCode)">
<UpgradeVersion Minimum="$(var.UpgradeMinVer)" IncludeMinimum="yes"
Maximum="$(var.MmmmVer)" IncludeMaximum="no" Property="OLDERVERSIONBEINGUPGRADED" />
</Upgrade>
<Media Id="1" Cabinet="product.cab" EmbedCab="yes" CompressionLevel="high" />
<Property Id="MSIRMSHUTDOWN" Value="2"/>
<Property Id="INSTALLDIR">
<RegistrySearch Id="My7zipPathLM" Type="raw" Root="HKLM" Key="Software\7-Zip" Name="Path" />
<RegistrySearch Id="My7zipPathLM2" Type="raw" Root="HKLM" Key="Software\7-Zip" Name="Path$(var.NumBits)" />
<RegistrySearch Id="My7zipPath" Type="raw" Root="HKCU" Key="Software\7-Zip" Name="Path" />
<RegistrySearch Id="My7zipPath2" Type="raw" Root="HKCU" Key="Software\7-Zip" Name="Path$(var.NumBits)" />
</Property>
<Property Id="ALLUSERS">2</Property>
<Property Id="LicenseAccepted">1</Property>
<Property Id="ARPURLINFOABOUT" Value="$(var.AboutURL)" />
<Property Id="ARPHELPLINK" Value="$(var.SupportURL)" />
<Property Id="ARPURLUPDATEINFO" Value="$(var.UpdatesURL)" />
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="$(var.PFilesFolder)" Name="Files">
<Directory Id="INSTALLDIR" Name="7-Zip">
<Component Id="InstallRegCU" Guid="$(var.CompInstallRegCU)" DiskId="1" Win64="$(var.Is64)">
<Registry Id="MyInstallRegCU" Root="HKCU" Key="Software\7-Zip" Name="Path" Action="write" Type="string" Value="[INSTALLDIR]" />
<Registry Id="MyInstallRegCU2" Root="HKCU" Key="Software\7-Zip" Name="Path$(var.NumBits)" Action="write" Type="string" Value="[INSTALLDIR]" />
</Component>
<Component Id="InstallRegLM" Guid="$(var.CompInstallRegLM)" DiskId="1" Win64="$(var.Is64)">
<Condition>Privileged</Condition>
<Registry Id="MyInstallRegLM" Root="HKLM" Key="Software\7-Zip" Name="Path" Action="write" Type="string" Value="[INSTALLDIR]" />
<Registry Id="MyInstallRegLM2" Root="HKLM" Key="Software\7-Zip" Name="Path$(var.NumBits)" Action="write" Type="string" Value="[INSTALLDIR]" />
</Component>
<Component Id="InstallRegWild" Guid="$(var.CompInstallRegWild)" DiskId="1" Win64="$(var.Is64)">
<Registry Id="MyInstallRegWild" Action="write" Type="string"
Root="HKCR" Key="*\shellex\ContextMenuHandlers\7-Zip"
Value="$(var.ShellExtId)" />
</Component>
<Component Id="InstallRegDirectory" Guid="$(var.CompInstallRegDirectory)" DiskId="1" Win64="$(var.Is64)">
<Registry Id="MyInstallRegDirectory" Action="write" Type="string"
Root="HKCR" Key="Directory\shellex\ContextMenuHandlers\7-Zip"
Value="$(var.ShellExtId)" />
</Component>
<Component Id="InstallRegFolder" Guid="$(var.CompInstallRegFolder)" DiskId="1" Win64="$(var.Is64)">
<Registry Id="MyInstallRegFolder" Action="write" Type="string"
Root="HKCR" Key="Folder\shellex\ContextMenuHandlers\7-Zip"
Value="$(var.ShellExtId)" />
</Component>
<Component Id="InstallRegDirDD" Guid="$(var.CompInstallRegDirDD)" DiskId="1" Win64="$(var.Is64)">
<Registry Id="MyInstallRegDirDD" Action="write" Type="string"
Root="HKCR" Key="Directory\shellex\DragDropHandlers\7-Zip"
Value="$(var.ShellExtId)" />
</Component>
<Component Id="InstallRegDriveDD" Guid="$(var.CompInstallRegDriveDD)" DiskId="1" Win64="$(var.Is64)">
<Registry Id="MyInstallRegDriveDD" Action="write" Type="string"
Root="HKCR" Key="Drive\shellex\DragDropHandlers\7-Zip"
Value="$(var.ShellExtId)" />
</Component>
<Component Id="InstallRegApproved" Guid="$(var.CompInstallRegApproved)" DiskId="1" Win64="$(var.Is64)">
<Condition>Privileged</Condition>
<Registry Id="MyInstallRegApproved" Action="write" Type="string"
Root="HKLM" Key="Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved"
Name="$(var.ShellExtId)" Value="7-Zip Shell Extension" />
</Component>
<Component Id="InstallRegAppPath" Guid="$(var.CompInstallRegAppPath)" DiskId="1" Win64="$(var.Is64)">
<Condition>Privileged</Condition>
<Registry Id="MyInstallRegAppPath" Action="write" Type="string"
Root="HKLM" Key="Software\Microsoft\Windows\CurrentVersion\App Paths\7zFM.exe"
Value="[INSTALLDIR]7zFM.exe" />
<Registry Id="MyInstallRegAppPath2" Action="write" Type="string"
Root="HKLM" Key="Software\Microsoft\Windows\CurrentVersion\App Paths\7zFM.exe" Name="Path"
Value="[INSTALLDIR]" />
</Component>
<Component Id="Fm" Guid="$(var.CompFm)" DiskId="1" Win64="$(var.Is64)">
<File Id="_7zFM.exe" Name="7zFM.exe">
<Shortcut Id="startmenuFmShortcut" Directory="PMenu" Name="7zipFM" LongName="7-Zip File Manager" />
</File>
</Component>
<?if $(var.MyCPU) = "x64" ?>
<Component Id="ShellExt32" Guid="$(var.CompShellExt2)" DiskId="1" Win64="no">
<File Id="_7zip32.dll" Name="7-zip32.dll" />
<Registry Id="shellReg0_32" Action="write" Type="string" Root="HKCR"
Key="CLSID\$(var.ShellExtId)\InprocServer32"
Value="[INSTALLDIR]7-zip32.dll" />
<Registry Id="shellReg1_32" Action="write" Type="string" Root="HKCR"
Key="CLSID\$(var.ShellExtId)\InprocServer32"
Name="ThreadingModel"
Value="Apartment" />
</Component>
<?endif ?>
<Component Id="ShellExt" Guid="$(var.CompShellExt)" DiskId="1" Win64="$(var.Is64)">
<File Id="_7zip.dll" Name="7-zip.dll" />
<Registry Id="shellReg0" Action="write" Type="string" Root="HKCR"
Key="CLSID\$(var.ShellExtId)\InprocServer32"
Value="[INSTALLDIR]7-zip.dll" />
<Registry Id="shellReg1" Action="write" Type="string" Root="HKCR"
Key="CLSID\$(var.ShellExtId)\InprocServer32"
Name="ThreadingModel"
Value="Apartment" />
</Component>
<Component Id="Gui" Guid="$(var.CompGui)" DiskId="1" Win64="$(var.Is64)">
<File Id="_7zG.exe" Name="7zG.exe" />
</Component>
<Component Id="Formats" Guid="$(var.CompFormats)" DiskId="1" Win64="$(var.Is64)">
<File Id="_7z.dll" Name="7z.dll" />
</Component>
<Component Id="CmdLine" Guid="$(var.CompCmdLine)" DiskId="1" Win64="$(var.Is64)">
<File Id="_7z.exe" Name="7z.exe" />
</Component>
<Component Id="GuiSfx" Guid="$(var.CompGuiSfx)" DiskId="1" Win64="$(var.Is64)">
<File Id="_7z.sfx" Name="7z.sfx" />
</Component>
<Component Id="ConSfx" Guid="$(var.CompConSfx)" DiskId="1" Win64="$(var.Is64)">
<File Id="_7zCon.sfx" Name="7zCon.sfx" />
</Component>
<Component Id="Docs" Guid="$(var.CompDocs)" DiskId="1" Win64="$(var.Is64)">
<File Id="descript.ion" Name="descript.ion" />
<File Id="History.txt" Name="History.txt" />
<File Id="License.txt" Name="License.txt" />
<File Id="readme.txt" Name="readme.txt" />
</Component>
<Component Id="Help" Guid="$(var.CompHelp)">
<File Id="_7zip.chm" Name="7-zip.chm" DiskId="1" >
<Shortcut Id="startmenuHelpShortcut" Directory="PMenu" Name="7zipHelp" LongName="7-Zip Help" />
</File>
</Component>
<Directory Id="MyLang" Name="Lang">
<Component Id="Lang" Guid="$(var.CompLang)" DiskId="1" Win64="$(var.Is64)">
<File Id="en.ttt" Name="en.ttt" />
<File Id="af.txt" Name="af.txt" />
<File Id="an.txt" Name="an.txt" />
<File Id="ar.txt" Name="ar.txt" />
<File Id="ast.txt" Name="ast.txt" />
<File Id="az.txt" Name="az.txt" />
<File Id="ba.txt" Name="ba.txt" />
<File Id="be.txt" Name="be.txt" />
<File Id="bg.txt" Name="bg.txt" />
<File Id="bn.txt" Name="bn.txt" />
<File Id="br.txt" Name="br.txt" />
<File Id="ca.txt" Name="ca.txt" />
<File Id="co.txt" Name="co.txt" />
<File Id="cs.txt" Name="cs.txt" />
<File Id="cy.txt" Name="cy.txt" />
<File Id="da.txt" Name="da.txt" />
<File Id="de.txt" Name="de.txt" />
<File Id="el.txt" Name="el.txt" />
<File Id="eo.txt" Name="eo.txt" />
<File Id="es.txt" Name="es.txt" />
<File Id="et.txt" Name="et.txt" />
<File Id="eu.txt" Name="eu.txt" />
<File Id="ext.txt" Name="ext.txt" />
<File Id="fa.txt" Name="fa.txt" />
<File Id="fi.txt" Name="fi.txt" />
<File Id="fr.txt" Name="fr.txt" />
<File Id="fur.txt" Name="fur.txt" />
<File Id="fy.txt" Name="fy.txt" />
<File Id="ga.txt" Name="ga.txt" />
<File Id="gl.txt" Name="gl.txt" />
<File Id="gu.txt" Name="gu.txt" />
<File Id="he.txt" Name="he.txt" />
<File Id="hi.txt" Name="hi.txt" />
<File Id="hr.txt" Name="hr.txt" />
<File Id="hu.txt" Name="hu.txt" />
<File Id="hy.txt" Name="hy.txt" />
<File Id="id.txt" Name="id.txt" />
<File Id="io.txt" Name="io.txt" />
<File Id="is.txt" Name="is.txt" />
<File Id="it.txt" Name="it.txt" />
<File Id="ja.txt" Name="ja.txt" />
<File Id="ka.txt" Name="ka.txt" />
<File Id="kaa.txt" Name="kaa.txt" />
<File Id="kab.txt" Name="kab.txt" />
<File Id="kk.txt" Name="kk.txt" />
<File Id="ko.txt" Name="ko.txt" />
<File Id="ku.txt" Name="ku.txt" />
<File Id="ku_ckb.txt" Name="ku-ckb.txt" />
<File Id="ky.txt" Name="ky.txt" />
<File Id="lij.txt" Name="lij.txt" />
<File Id="lt.txt" Name="lt.txt" />
<File Id="lv.txt" Name="lv.txt" />
<File Id="mk.txt" Name="mk.txt" />
<File Id="mn.txt" Name="mn.txt" />
<File Id="mng.txt" Name="mng.txt" />
<File Id="mng2.txt" Name="mng2.txt" />
<File Id="mr.txt" Name="mr.txt" />
<File Id="ms.txt" Name="ms.txt" />
<File Id="ne.txt" Name="ne.txt" />
<File Id="nl.txt" Name="nl.txt" />
<File Id="nb.txt" Name="nb.txt" />
<File Id="nn.txt" Name="nn.txt" />
<File Id="pa_in.txt" Name="pa-in.txt" />
<File Id="pl.txt" Name="pl.txt" />
<File Id="ps.txt" Name="ps.txt" />
<File Id="pt.txt" Name="pt.txt" />
<File Id="pt_br.txt" Name="pt-br.txt" />
<File Id="ro.txt" Name="ro.txt" />
<File Id="ru.txt" Name="ru.txt" />
<File Id="sa.txt" Name="sa.txt" />
<File Id="si.txt" Name="si.txt" />
<File Id="sk.txt" Name="sk.txt" />
<File Id="sl.txt" Name="sl.txt" />
<File Id="sq.txt" Name="sq.txt" />
<File Id="sr_spl.txt" Name="sr-spl.txt" />
<File Id="sr_spc.txt" Name="sr-spc.txt" />
<File Id="sv.txt" Name="sv.txt" />
<File Id="sw.txt" Name="sw.txt" />
<File Id="ta.txt" Name="ta.txt" />
<File Id="tg.txt" Name="tg.txt" />
<File Id="th.txt" Name="th.txt" />
<File Id="tk.txt" Name="tk.txt" />
<File Id="tr.txt" Name="tr.txt" />
<File Id="tt.txt" Name="tt.txt" />
<File Id="ug.txt" Name="ug.txt" />
<File Id="uk.txt" Name="uk.txt" />
<File Id="uz.txt" Name="uz.txt" />
<File Id="uz_cyrl.txt" Name="uz-cyrl.txt" />
<File Id="va.txt" Name="va.txt" />
<File Id="vi.txt" Name="vi.txt" />
<File Id="yo.txt" Name="yo.txt" />
<File Id="zh_cn.txt" Name="zh-cn.txt" />
<File Id="zh_tw.txt" Name="zh-tw.txt" />
</Component>
</Directory>
</Directory>
</Directory>
<Directory Id="ProgramMenuFolder" Name="PMenu" LongName="Programs">
<Directory Id="PMenu" Name="7zip" LongName="7-Zip" />
</Directory>
</Directory>
<Feature Id="Complete" Title="7-Zip" Description="The complete package."
Display="expand" Level="1" ConfigurableDirectory="INSTALLDIR"
Absent="disallow" AllowAdvertise="no" >
<Feature Id="Program" Title="Program files" Description="Program files." Level="1"
Absent="disallow" AllowAdvertise="no">
<ComponentRef Id="Fm" />
<ComponentRef Id="ShellExt" />
<?if $(var.MyCPU) = "x64" ?>
<ComponentRef Id="ShellExt32" />
<?endif ?>
<ComponentRef Id="CmdLine" />
<ComponentRef Id="Gui" />
<ComponentRef Id="GuiSfx" />
<ComponentRef Id="ConSfx" />
<ComponentRef Id="Formats" />
<ComponentRef Id="Docs" />
<ComponentRef Id="Help" />
<ComponentRef Id="InstallRegCU" />
<ComponentRef Id="InstallRegLM" />
<ComponentRef Id="InstallRegWild" />
<ComponentRef Id="InstallRegDirectory" />
<ComponentRef Id="InstallRegDirDD" />
<ComponentRef Id="InstallRegDriveDD" />
<ComponentRef Id="InstallRegApproved" />
<ComponentRef Id="InstallRegAppPath" />
<ComponentRef Id="InstallRegFolder" />
</Feature>
<Feature Id="LanguageFiles" Title="Localization files" Description="Localization files for 71 languages."
Level="1" AllowAdvertise="no">
<ComponentRef Id="Lang" />
</Feature>
</Feature>
<UIRef Id="WixUI" />
<!-- Install Sequences -->
<InstallExecuteSequence>
<RemoveExistingProducts After="InstallValidate" />
</InstallExecuteSequence>
</Product>
</Wix>
+151
View File
@@ -0,0 +1,151 @@
7-Zip source code
~~~~~~~~~~~~~~~~~
License for use and distribution
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
7-Zip Copyright (C) 1999-2025 Igor Pavlov.
The licenses for files are:
- CPP/7zip/Compress/Rar* files: the "GNU LGPL" with "unRAR license restriction"
- CPP/7zip/Compress/LzfseDecoder.cpp: the "BSD 3-clause License"
- C/ZstdDec.c: the "BSD 3-clause License"
- C/Xxh64.c: the "BSD 2-clause License"
- Some files are "public domain" files, if "public domain" status is stated in source file.
- the "GNU LGPL" for all other files. If there is no license information in
some source file, that file is under the "GNU LGPL".
The "GNU LGPL" with "unRAR license restriction" means that you must follow both
"GNU LGPL" rules and "unRAR license restriction" rules.
GNU LGPL information
--------------------
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not,
you can get a copy of the GNU Lesser General Public License from
http://www.gnu.org/
BSD 3-clause License in 7-Zip code
----------------------------------
The "BSD 3-clause License" is used for the following code in 7z.dll
1) LZFSE data decompression.
CPP/7zip/Compress/LzfseDecoder.cpp.
That code was derived from the code in the "LZFSE compression library" developed by Apple Inc,
that also uses the "BSD 3-clause License".
2) ZSTD data decompression.
C/ZstdDec.c
that code was developed using original zstd decoder code as reference code.
The original zstd decoder code was developed by Facebook Inc,
that also uses the "BSD 3-clause License".
Copyright (c) 2015-2016, Apple Inc. All rights reserved.
Copyright (c) Facebook, Inc. All rights reserved.
Copyright (c) 2023-2025 Igor Pavlov.
Text of the "BSD 3-clause License"
----------------------------------
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its contributors may
be used to endorse or promote products derived from this software without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---
BSD 2-clause License in 7-Zip code
----------------------------------
The "BSD 2-clause License" is used for the XXH64 code in 7-Zip.
C/Xxh64.c
XXH64 code in 7-Zip was derived from the original XXH64 code developed by Yann Collet.
Copyright (c) 2012-2021 Yann Collet.
Copyright (c) 2023-2025 Igor Pavlov.
Text of the "BSD 2-clause License"
----------------------------------
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---
unRAR license restriction
-------------------------
The decompression engine for RAR archives was developed using source
code of unRAR program.
All copyrights to original unRAR code are owned by Alexander Roshal.
The license for original unRAR code has the following restriction:
The unRAR sources cannot be used to re-create the RAR compression algorithm,
which is proprietary. Distribution of modified unRAR sources in separate form
or as a part of other software is permitted, provided that it is clearly
stated in the documentation and source comments that the code may
not be used to develop a RAR (WinRAR) compatible archiver.
--
+177
View File
@@ -0,0 +1,177 @@
7-Zip method IDs for 7z and xz archives
---------------------------------------
Version: 24.02
Date: 2024-03-22
Each compression or crypto method in 7z is associated with unique binary value (ID).
The length of ID in bytes is arbitrary but it can not exceed 63 bits (8 bytes).
xz and 7z formats use same ID map.
If you want to add some new ID, you have two ways:
1) Write request for allocating IDs to 7-Zip developers.
2) Generate 8-bytes ID:
3F ZZ ZZ ZZ ZZ ZZ MM MM
3F - Prefix for random IDs (1 byte)
ZZ ZZ ZZ ZZ ZZ - Developer ID (5 bytes). Use real random bytes.
MM MM - Method ID (2 bytes)
You can notify 7-Zip developers about your Developer ID / Method ID.
Note: Use new ID, if old codec can not decode data encoded with new version.
List of defined IDs
-------------------
00 - Copy
03 - Delta
04 - BCJ (x86)
05 - PPC (big-endian)
06 - IA64
07 - ARM (little-endian)
08 - ARMT (little-endian)
09 - SPARC
0A - ARM64
0B - RISCV
21 - LZMA2
02.. - Common
03 [Swap]
- 2 Swap2
- 4 Swap4
03.. - 7z
01 -
01 - LZMA
03 - [Branch Codecs]
01 - [x86 Codecs]
03 - BCJ
1B - BCJ2 (4 packed streams)
02 -
05 - PPC (big-endian)
03 -
01 - Alpha
04 -
01 - IA64
05 -
01 - ARM (little-endian)
06 -
05 - M68 (big-endian)
07 -
01 - ARMT (little-endian)
08 -
05 - SPARC
04 -
01 - PPMD
7F -
01 - experimental method.
04.. - Misc codecs
00 - Reserved
01 - [Zip]
00 - Copy (not used. Use {00} instead)
01 - Shrink
06 - Implode
08 - Deflate
09 - Deflate64
0A - Imploding
0C - BZip2 (not used. Use {040202} instead)
0E - LZMA (LZMA-zip)
5D - ZSTD
5F - xz
60 - Jpeg
61 - WavPack
62 - PPMd (PPMd-zip)
63 - wzAES
02 -
02 - BZip2
03 - [Rar]
01 - Rar1
02 - Rar2
03 - Rar3
05 - Rar5
04 - [Arj]
01 - Arj(1,2,3)
02 - Arj4
05 - [Z]
06 - [Lzh]
07 - Reserved for 7z
08 - [Cab]
09 - [NSIS]
01 - DeflateNSIS
02 - BZip2NSIS
F7 - External codecs (that are not included to 7-Zip)
0x xx - reserved
10 xx - reserved (LZHAM)
01 - LZHAM
11 xx - reserved (Tino Reichardt)
01 - ZSTD
02 - BROTLI
04 - LZ4
05 - LZ5
06 - LIZARD
12 xx - reserverd (Denis Anisimov)
01 - WavPack2
FE - eSplitter
FF - RawSplitter
06.. - Crypto
F0 - Ciphers without hashing algo
01 - [AES]
0x - AES-128
4x - AES-192
8x - AES-256
Cx - AES
x0 - ECB
x1 - CBC
x2 - CFB
x3 - OFB
x4 - CTR
F1 - Combine Ciphers
01 - [Zip]
01 - ZipCrypto (Main Zip crypto algo)
03 - [RAR]
02 -
03 - Rar29AES (AES-128 + modified SHA-1)
07 - [7z]
01 - 7zAES (AES-256 + SHA-256)
---
End of document
+502
View File
@@ -0,0 +1,502 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some
specially designated software packages--typically libraries--of the
Free Software Foundation and other authors who decide to use it. You
can use it too, but we suggest you first think carefully about whether
this license or the ordinary General Public License is the better
strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use,
not price. Our General Public Licenses are designed to make sure that
you have the freedom to distribute copies of free software (and charge
for this service if you wish); that you receive source code or can get
it if you want it; that you can change the software and use pieces of
it in new free programs; and that you are informed that you can do
these things.
To protect your rights, we need to make restrictions that forbid
distributors to deny you these rights or to ask you to surrender these
rights. These restrictions translate to certain responsibilities for
you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you. You must make sure that they, too, receive or can get the source
code. If you link other code with the library, you must provide
complete object files to the recipients, so that they can relink them
with the library after making changes to the library and recompiling
it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the
library, and (2) we offer you this license, which gives you legal
permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that
there is no warranty for the free library. Also, if the library is
modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.
Finally, software patents pose a constant threat to the existence of
any free program. We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
restrictive license from a patent holder. Therefore, we insist that
any patent license obtained for a version of the library must be
consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the
ordinary GNU General Public License. This license, the GNU Lesser
General Public License, applies to certain designated libraries, and
is quite different from the ordinary General Public License. We use
this license for certain libraries in order to permit linking those
libraries into non-free programs.
When a program is linked with a library, whether statically or using
a shared library, the combination of the two is legally speaking a
combined work, a derivative of the original library. The ordinary
General Public License therefore permits such linking only if the
entire combination fits its criteria of freedom. The Lesser General
Public License permits more lax criteria for linking other code with
the library.
We call this license the "Lesser" General Public License because it
does Less to protect the user's freedom than the ordinary General
Public License. It also provides other free software developers Less
of an advantage over competing non-free programs. These disadvantages
are the reason we use the ordinary General Public License for many
libraries. However, the Lesser license provides advantages in certain
special circumstances.
For example, on rare occasions, there may be a special need to
encourage the widest possible use of a certain library, so that it becomes
a de-facto standard. To achieve this, non-free programs must be
allowed to use the library. A more frequent case is that a free
library does the same job as widely used non-free libraries. In this
case, there is little to gain by limiting the free library to free
software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free
programs enables a greater number of people to use a large body of
free software. For example, permission to use the GNU C Library in
non-free programs enables many more people to use the whole GNU
operating system, as well as its variant, the GNU/Linux operating
system.
Although the Lesser General Public License is Less protective of the
users' freedom, it does ensure that the user of a program that is
linked with the Library has the freedom and the wherewithal to run
that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and
modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.
GNU LESSER GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other
program which contains a notice placed by the copyright holder or
other authorized party saying it may be distributed under the terms of
this Lesser General Public License (also called "this License").
Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work
which has been distributed under these terms. A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language. (Hereinafter, translation is
included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for
making modifications to it. For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control compilation
and installation of the library.
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it). Whether that is true depends on what the Library does
and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.
You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.
2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices
stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no
charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a
table of data to be supplied by an application program that uses
the facility, other than as an argument passed when the facility
is invoked, then you must make a good faith effort to ensure that,
in the event an application does not supply such function or
table, the facility still operates, and performs whatever part of
its purpose remains meaningful.
(For example, a function in a library to compute square roots has
a purpose that is entirely well-defined independent of the
application. Therefore, Subsection 2d requires that any
application-supplied function or table used by this function must
be optional: if the application does not supply it, the square
root function must still compute square roots.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.
In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library. To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in
these notices.
Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.
If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library". Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library". The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library. The
threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work. (Executables containing this object code plus portions of the
Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License. You must supply a copy of this License. If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License. Also, you must do one
of these things:
a) Accompany the work with the complete corresponding
machine-readable source code for the Library including whatever
changes were used in the work (which must be distributed under
Sections 1 and 2 above); and, if the work is an executable linked
with the Library, with the complete machine-readable "work that
uses the Library", as object code and/or source code, so that the
user can modify the Library and then relink to produce a modified
executable containing the modified Library. (It is understood
that the user who changes the contents of definitions files in the
Library will not necessarily be able to recompile the application
to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (1) uses at run time a
copy of the library already present on the user's computer system,
rather than copying library functions into the executable, and (2)
will operate properly with a modified version of the library, if
the user installs one, as long as the modified version is
interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at
least three years, to give the same user the materials
specified in Subsection 6a, above, for a charge no more
than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy
from a designated place, offer equivalent access to copy the above
specified materials from the same place.
e) Verify that the user has already received a copy of these
materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it. However, as a special exception,
the materials to be distributed need not include anything that is
normally distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.
It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.
7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work
based on the Library, uncombined with any other library
facilities. This must be distributed under the terms of the
Sections above.
b) Give prominent notice with the combined library of the fact
that part of it is a work based on the Library, and explaining
where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License. Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License. However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Library or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with
this License.
11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all. For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply,
and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License may add
an explicit geographical distribution limitation excluding those countries,
so that distribution is permitted only in or among countries not thus
excluded. In such case, this License incorporates the limitation as if
written in the body of this License.
13. The Free Software Foundation may publish revised and/or new
versions of the Lesser General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation. If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission. For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this. Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest
possible use to the public, we recommend making it free software that
everyone can redistribute and change. You can do so by permitting
redistribution under these terms (or, alternatively, under the terms of the
ordinary General Public License).
To apply these terms, attach the following notices to the library. It is
safest to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.
<one line to give the library's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the library, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
<signature of Ty Coon>, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
+345
View File
@@ -0,0 +1,345 @@
LZMA compression
----------------
Version: 24.07
This file describes LZMA encoding and decoding functions written in C language.
LZMA is an improved version of famous LZ77 compression algorithm.
It was improved in way of maximum increasing of compression ratio,
keeping high decompression speed and low memory requirements for
decompressing.
Note: you can read also LZMA Specification (lzma-specification.txt from LZMA SDK)
Also you can look source code for LZMA encoding and decoding:
C/Util/Lzma/LzmaUtil.c
LZMA compressed file format
---------------------------
Offset Size Description
0 1 Special LZMA properties (lc,lp, pb in encoded form)
1 4 Dictionary size (little endian)
5 8 Uncompressed size (little endian). -1 means unknown size
13 Compressed data
ANSI-C LZMA Decoder
~~~~~~~~~~~~~~~~~~~
Please note that interfaces for ANSI-C code were changed in LZMA SDK 4.58.
If you want to use old interfaces you can download previous version of LZMA SDK
from sourceforge.net site.
To use ANSI-C LZMA Decoder you need the following files:
1) LzmaDec.h + LzmaDec.c + 7zTypes.h + Precomp.h + Compiler.h
Look example code:
C/Util/Lzma/LzmaUtil.c
Memory requirements for LZMA decoding
-------------------------------------
Stack usage of LZMA decoding function for local variables is not
larger than 200-400 bytes.
LZMA Decoder uses dictionary buffer and internal state structure.
Internal state structure consumes
state_size = (4 + (1.5 << (lc + lp))) KB
by default (lc=3, lp=0), state_size = 16 KB.
How To decompress data
----------------------
LZMA Decoder (ANSI-C version) now supports 2 interfaces:
1) Single-call Decompressing
2) Multi-call State Decompressing (zlib-like interface)
You must use external allocator:
Example:
void *SzAlloc(void *p, size_t size) { p = p; return malloc(size); }
void SzFree(void *p, void *address) { p = p; free(address); }
ISzAlloc alloc = { SzAlloc, SzFree };
You can use p = p; operator to disable compiler warnings.
Single-call Decompressing
-------------------------
When to use: RAM->RAM decompressing
Compile files: LzmaDec.h + LzmaDec.c + 7zTypes.h
Compile defines: no defines
Memory Requirements:
- Input buffer: compressed size
- Output buffer: uncompressed size
- LZMA Internal Structures: state_size (16 KB for default settings)
Interface:
int LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,
const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode,
ELzmaStatus *status, ISzAlloc *alloc);
In:
dest - output data
destLen - output data size
src - input data
srcLen - input data size
propData - LZMA properties (5 bytes)
propSize - size of propData buffer (5 bytes)
finishMode - It has meaning only if the decoding reaches output limit (*destLen).
LZMA_FINISH_ANY - Decode just destLen bytes.
LZMA_FINISH_END - Stream must be finished after (*destLen).
You can use LZMA_FINISH_END, when you know that
current output buffer covers last bytes of stream.
alloc - Memory allocator.
Out:
destLen - processed output size
srcLen - processed input size
Output:
SZ_OK
status:
LZMA_STATUS_FINISHED_WITH_MARK
LZMA_STATUS_NOT_FINISHED
LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK
SZ_ERROR_DATA - Data error
SZ_ERROR_MEM - Memory allocation error
SZ_ERROR_UNSUPPORTED - Unsupported properties
SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src).
If LZMA decoder sees end_marker before reaching output limit, it returns OK result,
and output value of destLen will be less than output buffer size limit.
You can use multiple checks to test data integrity after full decompression:
1) Check Result and "status" variable.
2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize.
3) Check that output(srcLen) = compressedSize, if you know real compressedSize.
You must use correct finish mode in that case. */
Multi-call State Decompressing (zlib-like interface)
----------------------------------------------------
When to use: file->file decompressing
Compile files: LzmaDec.h + LzmaDec.c + 7zTypes.h
Memory Requirements:
- Buffer for input stream: any size (for example, 16 KB)
- Buffer for output stream: any size (for example, 16 KB)
- LZMA Internal Structures: state_size (16 KB for default settings)
- LZMA dictionary (dictionary size is encoded in LZMA properties header)
1) read LZMA properties (5 bytes) and uncompressed size (8 bytes, little-endian) to header:
unsigned char header[LZMA_PROPS_SIZE + 8];
ReadFile(inFile, header, sizeof(header)
2) Allocate CLzmaDec structures (state + dictionary) using LZMA properties
CLzmaDec state;
LzmaDec_Constr(&state);
res = LzmaDec_Allocate(&state, header, LZMA_PROPS_SIZE, &g_Alloc);
if (res != SZ_OK)
return res;
3) Init LzmaDec structure before any new LZMA stream. And call LzmaDec_DecodeToBuf in loop
LzmaDec_Init(&state);
for (;;)
{
...
int res = LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen,
const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode);
...
}
4) Free all allocated structures
LzmaDec_Free(&state, &g_Alloc);
Look example code:
C/Util/Lzma/LzmaUtil.c
How To compress data
--------------------
Compile files:
7zTypes.h
Threads.h
Threads.c
LzmaEnc.h
LzmaEnc.c
LzFind.h
LzFind.c
LzFindMt.h
LzFindMt.c
LzFindOpt.c
LzHash.h
Memory Requirements:
- (dictSize * 11.5 + 6 MB) + state_size
Lzma Encoder can use two memory allocators:
1) alloc - for small arrays.
2) allocBig - for big arrays.
For example, you can use Large RAM Pages (2 MB) in allocBig allocator for
better compression speed. Note that Windows has bad implementation for
Large RAM Pages.
It's OK to use same allocator for alloc and allocBig.
Single-call Compression with callbacks
--------------------------------------
Look example code:
C/Util/Lzma/LzmaUtil.c
When to use: file->file compressing
1) you must implement callback structures for interfaces:
ISeqInStream
ISeqOutStream
ICompressProgress
ISzAlloc
static void *SzAlloc(void *p, size_t size) { p = p; return MyAlloc(size); }
static void SzFree(void *p, void *address) { p = p; MyFree(address); }
static ISzAlloc g_Alloc = { SzAlloc, SzFree };
CFileSeqInStream inStream;
CFileSeqOutStream outStream;
inStream.funcTable.Read = MyRead;
inStream.file = inFile;
outStream.funcTable.Write = MyWrite;
outStream.file = outFile;
2) Create CLzmaEncHandle object;
CLzmaEncHandle enc;
enc = LzmaEnc_Create(&g_Alloc);
if (enc == 0)
return SZ_ERROR_MEM;
3) initialize CLzmaEncProps properties;
LzmaEncProps_Init(&props);
Then you can change some properties in that structure.
4) Send LZMA properties to LZMA Encoder
res = LzmaEnc_SetProps(enc, &props);
5) Write encoded properties to header
Byte header[LZMA_PROPS_SIZE + 8];
size_t headerSize = LZMA_PROPS_SIZE;
UInt64 fileSize;
int i;
res = LzmaEnc_WriteProperties(enc, header, &headerSize);
fileSize = MyGetFileLength(inFile);
for (i = 0; i < 8; i++)
header[headerSize++] = (Byte)(fileSize >> (8 * i));
MyWriteFileAndCheck(outFile, header, headerSize)
6) Call encoding function:
res = LzmaEnc_Encode(enc, &outStream.funcTable, &inStream.funcTable,
NULL, &g_Alloc, &g_Alloc);
7) Destroy LZMA Encoder Object
LzmaEnc_Destroy(enc, &g_Alloc, &g_Alloc);
If callback function return some error code, LzmaEnc_Encode also returns that code
or it can return the code like SZ_ERROR_READ, SZ_ERROR_WRITE or SZ_ERROR_PROGRESS.
Single-call RAM->RAM Compression
--------------------------------
Single-call RAM->RAM Compression is similar to Compression with callbacks,
but you provide pointers to buffers instead of pointers to stream callbacks:
SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark,
ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);
Return code:
SZ_OK - OK
SZ_ERROR_MEM - Memory allocation error
SZ_ERROR_PARAM - Incorrect paramater
SZ_ERROR_OUTPUT_EOF - output buffer overflow
SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version)
Defines
-------
Z7_LZMA_SIZE_OPT - Enable some code size optimizations in LZMA Decoder to get smaller executable code.
Z7_LZMA_PROB32 - It can increase the speed on some 32-bit CPUs, but memory usage for
some structures will be doubled in that case.
Z7_DECL_Int32_AS_long - Define it if int is 16-bit on your compiler and long is 32-bit.
Z7_DECL_SizeT_AS_unsigned_int - Define it if you don't want to use size_t type.
Defines for 7z decoder written in C
-----------------------------------
These defines are for 7zDec.c only (the decoder in C).
C++ 7z decoder doesn't uses these macros.
Z7_PPMD_SUPPORT - define it if you need PPMD method support.
Z7_NO_METHODS_FILTERS - do not use filters (except of BCJ2 filter).
Z7_USE_NATIVE_BRANCH_FILTER - use filter for native ISA:
use x86 filter, if compiled to x86 executable,
use arm64 filter, if compiled to arm64 executable.
C++ LZMA Encoder/Decoder
~~~~~~~~~~~~~~~~~~~~~~~~
C++ LZMA code use COM-like interfaces. So if you want to use it,
you can study basics of COM/OLE.
C++ LZMA code is just wrapper over ANSI-C code.
C++ Notes
~~~~~~~~~~~~~~~~~~~~~~~~
If you use some C++ code folders in 7-Zip (for example, C++ code for 7z archive handling),
you must check that you correctly work with "new" operator.
7-Zip can be compiled with MSVC 6.0 that doesn't throw "exception" from "new" operator.
So 7-Zip uses "CPP\Common\NewHandler.cpp" that redefines "new" operator,
if compiled by old MSVC compilers (MSVC before version VS 2010):
operator new(size_t size)
{
void *p = ::malloc(size);
if (!p)
throw CNewException();
return p;
}
If the compiler is VS 2010 or newer, NewHandler.cpp doesn't redefine "new" operator.
Sp if you use new compiler (VS 2010 or newer), you still can include "NewHandler.cpp"
to compilation, and it will not redefine operator new.
Also you can compile without "NewHandler.cpp" with new compilers.
If 7-zip doesn't redefine operator "new", standard exception will be used instead of CNewException.
Some code of 7-Zip catches any exception in internal code and converts it to HRESULT code.
So you don't need to catch CNewException, if you call COM interfaces of 7-Zip.
---
http://www.7-zip.org
http://www.7-zip.org/sdk.html
http://www.7-zip.org/support.html
+299
View File
@@ -0,0 +1,299 @@
7-Zip 25.01 Sources
-------------------
7-Zip is a file archiver for Windows.
7-Zip Copyright (C) 1999-2025 Igor Pavlov.
License Info
------------
7-Zip is free software distributed under the GNU LGPL
(except for unRar code). Also some code
is licensed under the "BSD 3-clause License".
Read "License.txt" for more infomation about license.
Notes about unRAR license:
Please check main restriction from unRar license:
2. The unRAR sources may be used in any software to handle RAR
archives without limitations free of charge, but cannot be used
to re-create the RAR compression algorithm, which is proprietary.
Distribution of modified unRAR sources in separate form or as a
part of other software is permitted, provided that it is clearly
stated in the documentation and source comments that the code may
not be used to develop a RAR (WinRAR) compatible archiver.
In brief it means:
1) You can compile and use compiled files under GNU LGPL rules, since
unRAR license almost has no restrictions for compiled files.
You can link these compiled files to LGPL programs.
2) You can fix bugs in source code and use compiled fixed version.
3) You can not use unRAR sources to re-create the RAR compression algorithm.
LZMA SDK
--------
This package also contains some files from LZMA SDK
You can download LZMA SDK from:
http://www.7-zip.org/sdk.html
LZMA SDK is written and placed in the public domain by Igor Pavlov.
How to compile in Windows
-------------------------
To compile the sources to Windows binaries you need Visual Studio compiler and/or Windows SDK.
You can use latest Windows Studio 2017/2019/2022 to compile binaries for x86, x64, arm64 and arm platforms.
Also you can use old compilers for some platforms:
x86 : Visual C++ 6.0 with Platform SDK
x64 : Windows Server 2003 R2 Platform SDK
ia64 (itanium) : Windows Server 2003 R2 Platform SDK
arm for Windows CE : Standard SDK for Windows CE 5.0
If you use MSVC6, specify also Platform SDK directories at top of directories lists:
Tools / Options / Directories
- Include files
- Library files
Also you need Microsoft Macro Assembler:
- ml.exe for x86
- ml64.exe for x64
You can use ml.exe from Windows SDK for Windows Vista or some later versions.
There are two ways to compile 7-Zip binaries:
1) via makefile in command line.
2) via dsp file in Visual Studio.
The dsp file compiling can be used for development and debug purposes.
All final 7-Zip binaries are compiled via makefiles, that provide best
optimization options.
How to compile with makefile in Windows
---------------------------------------
Some macronames can be defined for compiling with makefile:
PLATFORM
with possible values: x64, x86, arm64, arm, ia64
OLD_COMPILER
for old VC compiler, like MSCV 6.0.
MY_DYNAMIC_LINK
for dynamic linking to the run-time library (msvcrt.dll).
The default makefile option is static linking to the run-time library.
To compile all 7-Zip files for x64 with Visual Studio 2022,
use the following command sequence:
cd SRC\CPP\7zip
%comspec% /k "C:\Program Files\VS2022\VC\Auxiliary\Build\vcvars64.bat"
nmake
You can use another "vcvars*.bat" files from "VS2022\VC\Auxiliary\Build" directory
to compile for other platforms:
vcvars64.bat
vcvarsamd64_arm64.bat
vcvarsamd64_x86.bat
Also you can compile single binary from directory with related project.
For example, to compile 7za.exe, use the following command sequence:
cd SRC\CPP\7zip\Bundles\Alone\
nmake
Compiling 7-Zip for Unix/Linux
------------------------------
There are several options to compile 7-Zip with different compilers: gcc and clang.
Also 7-Zip code contains two versions for some parts of code: in C and in Assembeler.
So if you compile the version with Assembeler code, you will get faster 7-Zip binary.
7-Zip's assembler code uses the following syntax for different platforms:
1) x86 and x86-64 (AMD64): MASM syntax.
Now there are 3 programs that supports MASM syntax in Linux.
' 'Asmc Macro Assembler, JWasm, and UASM. Note that JWasm now doesn't support some
cpu instructions used in 7-Zip.
So you must install Asmc Macro Assembler in Linux or UASM, if you want to compile
fastest version of 7-Zip x86 and x86-64:
https://github.com/nidud/asmc
https://github.com/Terraspace/UASM
2) arm64: GNU assembler for ARM64 with preprocessor.
That systax is supported by GCC and CLANG for ARM64.
There are different binaries that can be compiled from 7-Zip source.
There are 2 main files in folder for compiling:
makefile - that can be used for compiling Windows version of 7-Zip with nmake command
makefile.gcc - that can be used for compiling Linux/macOS versions of 7-Zip or Windows version
with MINGW (GCC) with make command.
At first you must change the current folder to folder that contains `makefile.gcc`:
cd CPP/7zip/Bundles/Alone2
Then you can compile `makefile.gcc` with the command:
make -j -f makefile.gcc
Also there are additional "*.mak" files in folder "CPP/7zip/" that can be used to compile
7-Zip binaries with optimized code and optimzing options.
To compile with GCC without assembler:
cd CPP/7zip/Bundles/Alone2
make -j -f ../../cmpl_gcc.mak
To compile with CLANG without assembler:
make -j -f ../../cmpl_clang.mak
To compile 7-Zip for x86-64 with asmc assembler:
make -j -f ../../cmpl_gcc_x64.mak
To compile 7-Zip for arm64 with assembler:
make -j -f ../../cmpl_gcc_arm64.mak
To compile 7-Zip for arm64 for macOS:
make -j -f ../../cmpl_mac_arm64.mak
Also you can change some compiler options in the "mak" files:
cmpl_gcc.mak
var_gcc.mak
warn_gcc.mak
makefile.gcc supports some variables that can change compile options
USE_JWASM=1
use JWasm assembler instead of Asmc.
Note that JWasm doesn't support AES instructions. So AES code from C version AesOpt.c
will be used instead of assembler code from AesOpt.asm.
If you want to use UASM for x86-64 compiling, you can change 7zip_gcc.mak,
or send IS_X64=1 USE_ASM=1 MY_ASM="$UASM" to make command calling:
UASM="$PWD/GccUnixR/uasm"
cd "7zip-src/CPP/7zip/Bundles/Alone2"
make -f makefile.gcc -j IS_X64=1 USE_ASM=1 MY_ASM="$UASM"
DISABLE_RAR=1
removes whole RAR related code from compilation.
DISABLE_RAR_COMPRESS=1
removes "not fully free" code of RAR decompression codecs from compilation.
RAR decompression codecs in 7-Zip code has some additional license restrictions,
that can be treated as not fully compatible with free-software licenses.
DISABLE_RAR_COMPRESS=1 allows to exclude such "not-fully-free" RAR code from compilation.
if DISABLE_RAR_COMPRESS=1 is specified, 7-zip will not be able to decompress files
from rar archives, but 7-zip still will be able to open rar archives to get list of
files or to extract files that are stored without compression.
if DISABLE_RAR=1 is specified, 7-zip will not be able to work with RAR archives.
7-Zip and p7zip
===============
Now there are two different ports of 7-Zip for Linux/macOS:
1) p7zip - another port of 7-Zip for Linux, made by an independent developer.
The latest version of p7zip now is 16.02, and that p7zip 16.02 is outdated now.
http://sourceforge.net/projects/p7zip/
2) 7-Zip for Linux/macOS - this package - it's new code with all changes from latest 7-Zip for Windows.
These two ports are not identical.
Note also that some Linux specific things can be implemented better in p7zip than in new 7-Zip for Linux.
Notes:
------
7-Zip consists of COM modules (DLL files).
But 7-Zip doesn't use standard COM interfaces for creating objects.
Look at
7zip\UI\Client7z folder for example of using DLL files of 7-Zip.
Some DLL files can use other DLL files from 7-Zip.
If you don't like it, you must use standalone version of DLL.
To compile standalone version of DLL you must include all used parts
to project and define some defs.
For example, 7zip\Bundles\Format7z is a standalone version of 7z.dll
that works with 7z format. So you can use such DLL in your project
without additional DLL files.
Description of 7-Zip sources package
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DOC Documentation
---
readme.txt - Readme file
src-history.txt - Sources history
7zC.txt - 7z ANSI-C Decoder description
7zFormat.txt - 7z format description
Methods.txt - Compression method IDs
lzma.txt - LZMA compression description
License.txt - license information
copying.txt - GNU LGPL license
unRarLicense.txt - License for unRAR part of source code
7zip.wxs - installer script for WIX
7zip.hhp - html help project file
Asm - Source code in Assembler : optimized code for CRC, SHA, AES, LZMA decoding.
C - Source code in C
CPP - Source code in C++
Common common files for C++ projects
Windows common files for Windows related code
7zip
Common Common modules for 7-zip
Archive files related to archiving
Bundle Modules that are bundles of other modules (files)
Alone 7za.exe: Standalone version of 7-Zip console that supports only 7z/xz/cab/zip/gzip/bzip2/tar.
Alone2 7zz.exe: Standalone version of 7-Zip console that supports all formats.
Alone7z 7zr.exe: Standalone version of 7-Zip console that supports only 7z (reduced version)
Fm Standalone version of 7-Zip File Manager
Format7z 7za.dll: .7z support
Format7zExtract 7zxa.dll: .7z support, extracting only
Format7zR 7zr.dll: .7z support, reduced version
Format7zExtractR 7zxr.dll: .7z support, reduced version, extracting only
Format7zF 7z.dll: all formats
LzmaCon lzma.exe: LZMA compression/decompression
SFXCon 7zCon.sfx: Console 7z SFX module
SFXWin 7z.sfx: Windows 7z SFX module
SFXSetup 7zS.sfx: Windows 7z SFX module for Installers
Compress files for compression / decompression
Crypto files for encryption / decryption
UI
Agent Intermediary modules for FAR plugin and Explorer plugin
Client7z Test application for 7za.dll
Common Common UI files
Console 7z.exe : Console version
Explorer 7-zip.dll: 7-Zip Shell extension
Far plugin for Far Manager
FileManager 7zFM.exe: 7-Zip File Manager
GUI 7zG.exe: 7-Zip GUI version
---
Igor Pavlov
http://www.7-zip.org
+826
View File
@@ -0,0 +1,826 @@
HISTORY of the 7-Zip source code
--------------------------------
25.01 2025-08-03
-------------------------
- The code for handling symbolic links has been changed
to provide greater security when extracting files from archives.
Command line switch -snld20 can be used to bypass default security
checks when creating symbolic links.
25.00 2025-07-05
-------------------------
- 7-Zip for Windows can now use more than 64 CPU threads for compression
to zip/7z/xz archives and for the 7-Zip benchmark.
If there are more than one processor group in Windows (on systems with more than
64 cpu threads), 7-Zip distributes running CPU threads across different processor groups.
- bzip2 compression speed was increased by 15-40%.
- deflate (zip/gz) compression speed was increased by 1-3%.
- improved support for zip, cpio and fat archives.
- fixed some bugs and vulnerabilities.
- the bug was fixed : CVE-2025-53816 : 7-Zip could work incorrectly for some incorrect RAR archives.
- the bug was fixed : CVE-2025-53817 : 7-Zip could crash for some incorrect COM (Compound File) archives.
24.09 2024-11-29
-------------------------
- The default dictionary size values for LZMA/LZMA2 compression methods were increased:
dictionary size compression level
v24.08 v24.09 v24.09
32-bit 64-bit
8 MB 16 MB 16 MB -mx4
16 MB 32 MB 32 MB -mx5 : Normal
32 MB 64 MB 64 MB -mx6
32 MB 64 MB 128 MB -mx7 : Maximum
64 MB 64 MB 256 MB -mx8
64 MB 64 MB 256 MB -mx9 : Ultra
The default dictionary size values for 32-bit versions of LZMA/LZMA2 don't exceed 64 MB.
- 7-Zip now can calculate the following hash checksums: SHA-512, SHA-384, SHA3-256 and MD5.
- APM and HFS support was improved.
- If an archive update operation uses a temporary archive folder and
the archive is moved to the destination folder, 7-Zip shows the progress of moving
the archive file, as this operation can take a long time if the archive is large.
- The bug was fixed: 7-Zip File Manager didn't propagate Zone.Identifier stream
for extacted files from nested archives (if there is open archive inside another open archive).
- Some bugs were fixed.
24.08 2024-08-11
-------------------------
- The bug in 7-Zip 24.00-24.07 was fixed:
For creating a zip archive: 7-Zip could write extra zero bytes after the end of the archive,
if a file included to archive cannot be compressed to a size smaller than original.
The created zip archive is correct except for the useless zero bytes after the end of the archive.
When unpacking such a zip archive, 7-Zip displays a warning:
"WARNING: There are data after the end of archive".
- Some bugs were fixed.
24.07 2024-06-19
-------------------------
- Changes in files:
Asm/x86/Sha256Opt.asm
Asm/x86/Sha1Opt.asm
Now it uses "READONLY" flag for constant array segment.
It fixes an issue where ".rodata" section in 7-Zip for x86/x64 Linux had a "WRITE" attribute.
- The bug was fixed: 7-Zip could crash for some incorrect ZSTD archives.
24.06 2024-05-26
-------------------------
- The bug was fixed: 7-Zip could not unpack some ZSTD archives.
24.05 2024-05-14
-------------------------
- New switch -myv={MMNN} to set decoder compatibility version for 7z archive creating.
{MMNN} is 4-digit number that represents the version of 7-Zip without a dot.
If -myv={MMNN} switch is specified, 7-Zip will only use compression methods that can
be decoded by the specified version {MMNN} of 7-Zip and newer versions.
If -myv={MMNN} switch is not specified, -myv=2300 is used, and 7-Zip will only
use compression methods that can be decoded by 7-Zip 23.00 and newer versions.
- New switch -myfa={FilterID} to allow 7-Zip to use the specified filter method for 7z archive creating.
- New switch -myfd={FilterID} to disallow 7-Zip to use the specified filter method for 7z archive creating.
24.03 2024-03-23
-------------------------
- 7-Zip now can use new RISCV filter for compression to 7z and xz archives.
RISCV filter can increase compression ratio for data containing executable
files compiled for RISC-V architecture.
- The speed for LZMA and LZMA2 decompression in ARM64 version for Windows
was increased by 20%-60%.
It uses arm64 assembler code, and clang-cl is required for arm64 assembler code compiling.
- Some bugs were fixed.
24.01 2024-01-31
-------------------------
- 7-Zip uses file C/Precomp.h that is included to all c and c++ files.
CPP/Common/Common.h also includes C/Precomp.h.
C/Precomp.h defines the following macros (if _WIN32 is defined):
Z7_LARGE_PAGES 1
Z7_LONG_PATH 1
Z7_WIN32_WINNT_MIN 0x0500 (or higher)
_WIN32_WINNT 0x0500 (or higher)
WINVER _WIN32_WINNT
UNICODE 1
_UNICODE 1
if _WIN32_WINNT is defined already, C/Precomp.h doesn't redefine it.
- 7-Zip now can unpack ZSTD archives (.zst extension).
- 7-Zip now can unpack ZIP and SquashFS archives that use ZSTD compression method.
- 7-Zip now supports fast hash algorithm XXH64 that is used in ZSTD.
- Speed optimizations for archive unpacking: rar, zip, gz, wim, cab.
- Speed optimizations for hash caclulation: CRC-32, CRC-64, Blake2sp.
- The bug was fixed: 7-Zip for Linux could fail for multivolume creation in some cases.
- Some bugs were fixed.
23.01 2023-06-20
-------------------------
- All external macros for compiling C/C++ code of 7-Zip now have Z7_ prefix.
- 7-Zip COM interfaces now use new macros that allow to declare and implement COM interface.
- The code has been modified to compile with the maximum diagnostic warning level:
-Wall in MSVC and -Weverything in CLANG.
And some warning types are disabled in 2 files:
- C/Compiler.h for C/C++ code warnings.
- CPP/Common/Common.h for C++ code warnings.
- Linux/macOS versions of 7-Zip: IUnknown interface in new code doesn't use
virtual destructor that was used in previous 7-Zip and p7zip:
// virtual ~IUnknown() {}
So 7-Zip's dynamically linked shared libraries (codecs) are not compatible
between new 7-Zip for Linux/macOS and old 7-Zip (and p7zip).
- Some optimizations in filters code: BCJ, BCJ2, Swap* and opthers.
- If 7-Zip uses BCJ2 filter for big datasets compressing, it can use additional temp
files in system's TEMP folder. 7-Zip uses temp file for additional compressed
data stream, if size of such compressed stream is larger than predefined limit:
16 MiB in 32-bit version, 4 GiB in 64-bit version.
- Some bugs were fixed.
22.00 2022-06-16
-------------------------
- 7-Zip interfaces now support high precision (1 ns) timestamps with reserved
fields of tagPROPVARIANT (VT_FILETIME).
21.07 2021-12-26
-------------------------
- The sorting order of files in archives was slightly changed to be more consistent
for cases where the name of some directory is the same as the prefix part of the name
of another directory or file.
- TAR archives created by 7-Zip now are more consistent with archives created by GNU TAR program.
21.06 2021-11-24
-------------------------
- Bug in LZMA encoder in file LzmaEnc.c was fixed:
LzmaEnc_MemEncode(), LzmaEncode() and LzmaCompress() could work incorrectly,
if size value for output buffer is smaller than size required for all compressed data.
LzmaEnc_Encode() could work incorrectly,
if callback ISeqOutStream::Write() doesn't write all compressed data.
NCompress::NLzma::CEncoder::Code() could work incorrectly,
if callback ISequentialOutStream::Write() returns error code.
- Bug in versions 21.00-21.05 was fixed:
7-Zip didn't set attributes of directories during archive extracting.
21.04 beta 2021-11-02
-------------------------
- 7-Zip now reduces the number of working CPU threads for compression,
if RAM size is not enough for compression with big LZMA2 dictionary.
- 7-Zip now can create and check "file.sha256" and "file.sha1" text files
that contain the list of file names and SHA-1 / SHA-256 checksums in format
compatible with sha1sum/sha256sum programs.
21.03 beta 2021-07-20
-------------------------
- The maximum dictionary size for LZMA/LZMA2 compressing was increased to 4 GB (3840 MiB).
- Minor speed optimizations in LZMA/LZMA2 compressing.
21.02 alpha 2021-05-06
-------------------------
- 7-Zip now writes additional field for filename in UTF-8 encoding to zip archives.
It allows to extract correct file name from zip archives on different systems.
- The command line version of 7-Zip for macOS was released.
- The speed for LZMA and LZMA2 decompression in arm64 versions for macOS and Linux
was increased by 20%-60%.
- Some changes and improvements in ZIP, TAR and NSIS code.
21.01 alpha 2021-03-09
-------------------------
- The command line version of 7-Zip for Linux was released.
- The improvements for speed of ARM64 version using hardware CPU instructions
for AES, CRC-32, SHA-1 and SHA-256.
- The bug in versions 18.02 - 21.00 was fixed:
7-Zip could not correctly extract some ZIP archives created with xz compression method.
- Some bugs were fixed.
20.02 alpha 2020-08-08
-------------------------
- The default number of LZMA2 chunks per solid block in 7z archive was increased to 64.
It allows to increase the compression speed for big 7z archives, if there is a big number
of CPU cores and threads.
- The speed of PPMd compressing/decompressing was increased for 7z/ZIP/RAR archives.
- The new -ssp switch. If the switch -ssp is specified, 7-Zip doesn't allow the system
to modify "Last Access Time" property of source files for archiving and hashing operations.
- Some bugs were fixed.
20.00 alpha 2020-02-06
-------------------------
- 7-Zip now supports new optional match finders for LZMA/LZMA2 compression: bt5 and hc5,
that can work faster than bt4 and hc4 match finders for the data with big redundancy.
- The compression ratio was improved for Fast and Fastest compression levels with the
following default settings:
- Fastest level (-mx1) : hc5 match finder with 256 KB dictionary.
- Fast level (-mx3) : hc5 match finder with 4 MB dictionary.
- Minor speed optimizations in multithreaded LZMA/LZMA2 compression for Normal/Maximum/Ultra
compression levels.
- bzip2 decoding code was updated to support bzip2 archives, created by lbzip2 program.
19.02 2019-09-05
-------------------------
- Support for SHA-1/SHA-256 optimized code in
Sha1Opt.c, Sha256Opt.c, Sha256Opt.asm, Sha1Opt.asm.
19.00 2019-02-21
-------------------------
- Encryption strength for 7z archives was increased:
the size of random initialization vector was increased from 64-bit to 128-bit,
and the pseudo-random number generator was improved.
- Some bugs were fixed.
18.06 2018-12-30
-------------------------
- The speed for LZMA/LZMA2 compressing was increased by 3-10%,
and there are minor changes in compression ratio.
- Some bugs were fixed.
- The bug in 7-Zip 18.02-18.05 was fixed:
There was memory leak in multithreading xz decoder - XzDecMt_Decode(),
if xz stream contains only one block.
- 7-Zip 18.02-18.05 used only one CPU thread for bz2 archive creation.
- The changes for MSVS compiler makefiles:
- the makefiles now use "PLATFORM" macroname with values (x64, x86, arm64)
instead of "CPU" macroname with values (AMD64, ARM64).
- the makefiles by default now use static version of the run-time library.
18.05 2018-04-30
-------------------------
- The speed for LZMA/LZMA2 compressing was increased
by 8% for fastest/fast compression levels and
by 3% for normal/maximum compression levels.
- Previous versions of 7-Zip could work incorrectly in "Large memory pages" mode in
Windows 10 because of some BUG with "Large Pages" in Windows 10.
Now 7-Zip doesn't use "Large Pages" on Windows 10 up to revision 1709 (16299).
18.03 beta 2018-03-04
-------------------------
- Asm\x86\LzmaDecOpt.asm: new optimized LZMA decoder written in asm
for x64 with about 30% higher speed than main version of LZMA decoder written in C.
- The speed for single-thread LZMA/LZMA2 decoder written in C was increased by 3%.
- 7-Zip now can use multi-threading for 7z/LZMA2 decoding,
if there are multiple independent data chunks in LZMA2 stream.
- 7-Zip now can use multi-threading for xz decoding,
if there are multiple blocks in xz stream.
17.00 beta 2017-04-29
-------------------------
- NewHandler.h / NewHandler.cpp:
now it redefines operator new() only for old MSVC compilers (_MSC_VER < 1900).
- C/7zTypes.h : the names of variables in interface structures were changed (vt).
- Some bugs were fixed. 7-Zip could crash in some cases.
- Some internal changes in code.
16.02 2016-05-21
-------------------------
- The BUG in 16.00 - 16.01 was fixed:
Split Handler (SplitHandler.cpp) returned incorrect
total size value (kpidSize) for split archives.
16.01 2016-05-19
-------------------------
- Some bugs were fixed,
- Some internal changes to reduce the number of compiler warnings.
16.00 2016-05-10
-------------------------
- 7-Zip now can extract multivolume ZIP archives (z01, z02, ... , zip).
- Some bugs were fixed,
15.12 2015-11-19
-------------------------
- The BUG in C version of 7z decoder was fixed:
7zDec.c : SzDecodeLzma2()
7z decoder could mistakenly report about decoding error for some 7z archives
that use LZMA2 compression method.
The probability to get that mistaken decoding error report was about
one error per 16384 solid blocks for solid blocks larger than 16 KB (compressed size).
- The BUG (in 9.26-15.11) in C version of 7z decoder was fixed:
7zArcIn.c : SzReadHeader2()
7z decoder worked incorrectly for 7z archives that contain
empty solid blocks, that can be placed to 7z archive, if some file is
unavailable for reading during archive creation.
15.09 beta 2015-10-16
-------------------------
- The BUG in LZMA / LZMA2 encoding code was fixed.
The BUG in LzFind.c::MatchFinder_ReadBlock() function.
If input data size is larger than (4 GiB - dictionary_size),
the following code worked incorrectly:
- LZMA : LzmaEnc_MemEncode(), LzmaEncode() : LZMA encoding functions
for compressing from memory to memory.
That BUG is not related to LZMA encoder version that works via streams.
- LZMA2 : multi-threaded version of LZMA2 encoder worked incorrectly, if
default value of chunk size (CLzma2EncProps::blockSize) is changed
to value larger than (4 GiB - dictionary_size).
9.38 beta 2015-01-03
-------------------------
- The BUG in 9.31-9.37 was fixed:
IArchiveGetRawProps interface was disabled for 7z archives.
- The BUG in 9.26-9.36 was fixed:
Some code in CPP\7zip\Archive\7z\ worked correctly only under Windows.
9.36 beta 2014-12-26
-------------------------
- The BUG in command line version was fixed:
7-Zip created temporary archive in current folder during update archive
operation, if -w{Path} switch was not specified.
The fixed 7-Zip creates temporary archive in folder that contains updated archive.
- The BUG in 9.33-9.35 was fixed:
7-Zip silently ignored file reading errors during 7z or gz archive creation,
and the created archive contained only part of file that was read before error.
The fixed 7-Zip stops archive creation and it reports about error.
9.31 2012-10-31
-------------------------
- InBuffer.h : CInBuffer uses ISequentialInStream *_stream; instead of CMyComPtr<ISequentialInStream>
OutBuffer.h: COutBuffer uses ISequentialOutStream *_stream; instead of CMyComPtr<ISequentialOutStream>
9.26 2011-04-11
-------------------------
- The BUG was fixed: multi-threaded ZIP stored file size that was at scan stage,
So if the file was changed after scan, the Unpack Size field was incorrect
9.21 2011-04-11
-------------------------
- New class FString for file names at file systems.
- Speed optimization in CRC code for big-endian CPUs.
9.18 2010-11-02
-------------------------
- New small SFX module for installers (C/Util/SfxSetup).
9.17 2010-10-04
-------------------------
- IStream.h::IOutStream::
STDMETHOD(SetSize)(Int64 newSize) PURE;
was changed to
STDMETHOD(SetSize)(UInt64 newSize) PURE;
9.09 2009-12-12
-------------------------
- The bug was fixed:
Utf16_To_Utf8 funstions in UTFConvert.cpp and 7zMain.c
incorrectly converted surrogate characters (the code >= 0x10000) to UTF-8.
9.05 2009-07-05
-------------------------
- FileMapping.h::CFileMapping now returns WRes
9.04 2009-05-30
-------------------------
- ICoder.h: NCoderPropID::EEnum values were changed
9.02 2009-04-23
-------------------------
- Bug was fixed: if swap2 filter was requests at compression,
7-zip used swap4 filter instead (but id was swap2), so archives were incorrect.
4.61 2008-11-23
-------------------------
- Bug in ver. 4.58+ was fixed:
7-Zip didn't use any -m* switch after -mtc, -mcl or -mcu for .zip archives.
- Bug in .CAB code was fixed. 7-Zip didn't show some empty files,
if .CAB archive contains more than one empty file.
4.59 2008-07-27
-------------------------
- Bug was fixed:
LZMA Encoder in fast compression mode could access memory outside of
allocated range in some rare cases.
4.59 alpha 2008-05-30
-------------------------
- BUGS was fixed:
7zOut.cpp: 7-Zip incorrectly wrote size of property records in some cases.
7zIn.cpp: 7-Zip incorrectly work with archive, containg archive properties.
4.58 alpha 9 2008-04-29
-------------------------
- BUG was fixed: 7-Zip showed incorrect timestamps in ISO files.
4.58 alpha 8 2008-04-15
-------------------------
- BUG in 4.58 alpha 5/6/7 was fixed:
LZMA encoder worked incorrectly, if lp != 0.
- Unicode (UTF-8) support for filenames in .ZIP archives. Now there are 3 modes:
1) Default mode: 7-Zip uses UTF-8, if the local code page doesn't contain required symbols.
2) -mcu switch: 7-Zip uses UTF-8, if there are non-ASCII symbols.
3) -mcl switch: 7-Zip uses local code page.
- Now it's possible to use -mSW- and -mSW+ switches instead of -mSW=off and -mSW=on
4.58 alpha 7 2008-04-08
-------------------------
- BUG was fixed: BZip2Encoder and BZip2Decoder used CEvent objects without
creating, when BZip2 code was called with one thread (with -mmt1 switch or with
default switches on single thread CPU).
- .lzma support.
- RPM and NSIS support was improved.
- LZMA now stores only (2 << n) or (3 << n) dictionary size value to LZMA properties.
4.58 alpha 6 2008-03-27
-------------------------
- NTFS time extra in ZIP.
- New item property - kpidTimeType - VT_UI4 (0 - NTFS, 1 - Unix, 2 - DOS).
- Static CRC table is not required now for Lzma Encoder (in Lz MatchFinder).
4.58 alpha 5 2008-03-19
-------------------------
- Creation time (-mtc switch) for .7z archives
- LZMA encoder was converted to ANSI-C
4.58 alpha 3 2008-02-25
-------------------------
- Speed optimizations for LZMA decoding. Now it uses C code instead of C++.
- 7-Zip now has 128 MB dictionary limit for 32-bit version:
It's for speed optimization: kNumLogBits = 9 + sizeof(size_t) / 2;
- TAR: 'D' link flag support.
- 7-Zip now can unpack multivolume RAR archives created with
"old style volume names" scheme (-vn switch) and names *.001, *.002, ...
- Fixed bugs:
- 7-Zip FM could not copy / move files to root network folders like \\COMPNAME\FOLDERNAME\
In case of move it removed original files.
- SFX-WIN: if there are errors, it still could return 0.
- ZIP (.XPS file) isZip64 && thisDiskNumber16 == 0xFFFF.
- ZIP name updating:
If zip file contains extra field and you try to change properties of files,
7-zip tries to delete all extra fileds (except for WzAES).
And that code could hang.
- 7-Zip GUI didn't suggest BZip2 dictionary size used in previous run.
- If creation time stamp was included in .RAR archive, 7-zip used creation time stamp
as modification time stamp.
4.58 alpha 2 2007-12-31
-------------------------
- Small changes in Deflate and LZMA compression.
- Some speed optimizations.
4.57
----
- Bug was fixed:
Anti item is created for wrong file:
http://sourceforge.net/forum/forum.php?thread_id=1880366&forum_id=45798
4.52 beta 2007-07-32
-------------------------
- 7-Zip could not decompress some cab files
- "." dir creating at FAT was fixed / long names
4.50 beta 2007-07-24
-------------------------
- 7-Zip now replaces unsupported filenames (like "nul", "com1") during extracting.
- New switch for command line version:
-ssc[-] enables/disables case-sensitive mode.
- 7z.exe l shows archive comment for zip archives
- Some bugs were fixed: long paths names shorter than 4.
- Speed optimizations for AES encryption.
4.56 beta 2007-09-13
-------------------------
- some fixes in LZ encoder (LZMA and Deflate) code.
size_t was replaces to ptrdiff_t.
size_t version worked incorrectly with some compilers.
4.46 beta 2007-05-25
-------------------------
- CPP Synchronization objects now return HRes (error code) instead of bool.
4.45 beta 2007-04-16
-------------------------
- 7-Zip now uses C version of CRC, so you must call CrcGenerateTable at
stratup code, or you must add CPP/Common/CRC.cpp to your project.
- Method ID in .7z now is 63-bit integer (UInt64).
- Open error messages
- unRar 1.5 fixed
- unShrink fixed
- BUG of 4.43 beta and 4.44 beta was fixed.
7-Zip compressing to .zip in multi-threading mode didn't work in some cases.
4.44 beta 2007-01-20
-------------------------
- Bug was fixed: LZMAEncoder.cpp::CEncoder::GetOptimumFast
it was:
data++
fixed version:
data = _matchFinder.GetPointerToCurrentPos(_matchFinderObj) - 1;
It could lead to very small cpmpression ratio decreasing when block needs move.
4.30 beta 2005-11-18
-------------------------
- Security.h::AddLockMemoryPrivilege - installs "Large pages" feature
- MemoryLock.h::EnableLockMemoryPrivilege - enables "Large pages" feature
- Alloc.h::SetLargePageSize - sets optimal LargePageSize size
4.27 2005-09-21
-------------------------
- Some GUIDs/interfaces were changed.
IStream.h:
ISequentialInStream::Read now works as old ReadPart
ISequentialOutStream::Write now works as old WritePart
4.26 beta 2005-08-05
-------------------------
- MyAlloc(0)/BigAlloc(0) now return 0
4.25 beta 2005-07-31
-------------------------
- More 64-bit compatibilty
4.24 beta 2005-07-06
-------------------------
- Common\NewHandler.h: using throw() for code size optimization.
4.23 2005-06-29
-------------------------
- Bug was fixed: memory leak in Cab decoder.
4.19 beta 2005-05-21
-------------------------
- BZip2 code was rewritten. Now 7-Zip doesn't use original BZip2 code.
Old (original) version was moved to folder 7zip/Compress/BZip2Original/
4.14 beta 2005-01-11
-------------------------
- STL using was reduced
- 7za now supports Split(001) archves
4.10 beta 2004-10-21
-------------------------
- Codecs now use new interface: ICompressSetDecoderProperties2
4.07 beta 2004-10-03
-------------------------
- some interfaces were changed slightly to support
-stdin -stdout mode.
- FilterCoder for simple filters
- Wildcard censor class was changed.
- Bug was fixed: when encrypted stream was multiple 16,
it used additional 16 empty bytes.
3.11 2003-10-06
-------------------------
File functions support unicode strings even
on Windows 95/98/ME.
3.08.02 2003-09-20
-------------------------
More compatible with GCC.
3.08.02 beta 2003-08-20
-------------------------
Extracting bug in 7zExtract.cpp was fixed.
3.08 beta 2003-08-19
-------------------------
Big source code reconstruction.
2.30 Beta 32 2003-05-15
-------------------------
Small changes in Deflate decoder.
2.30 Beta 31 2003-04-29
-------------------------
Common/NewHandler.cpp
HeapAlloc in (included to beta 30) was changed to malloc.
HeapAlloc worked slower in Win95/98/Me.
2.30 Beta 30 2003-04-21
-------------------------
new file: Common/String.cpp
Common/NewHandler.* were changed
2.30 Beta 29 2003-04-07
-------------------------
Small changes in LZMA code.
2.30 Beta 28 2003-02-16
-------------------------
Processing anti-files was corrected.
2.30 Beta 27 2003-01-24
-------------------------
Project/Archiver/Format/Common/ArchiveInterface.h:
new IArchiveOpenVolumeCallback interface.
2.30 Beta 26 2003-01-12
-------------------------
SDK/Interface/PropID.h:
kpidComment now is kpidCommented
2.30 Beta 25 2003-01-02
-------------------------
Main archive interfaces were changed.
2.30 Beta 24 2002-11-01
-------------------------
SDK/Windows/Synchronization.h
SDK/Windows/Synchronization.cpp
- some changes.
2.30 Beta 23 2002-09-07
-------------------------
Project/FileManager folder was added.
Notation of some source files was changed.
2.30 Beta 22 2002-08-28
-------------------------
Project/FileManager folder was added.
Notation of some source files was changed.
2.30 Beta 21 2002-07-08
-------------------------
Project/Compress/LZ/MatchFinder/BinTree/BinTree.h
Project/Compress/LZ/MatchFinder/BinTree/BinTreeMain.h
Project/Compress/LZ/MatchFinder/BinTree/HC.h
Project/Compress/LZ/MatchFinder/BinTree/HCMain.h
- RAM requirements for LZMA (7z) compression were reduced.
2.30 Beta 20 2002-07-01
-------------------------
- SDK/Stream/WindowOut.h
now it uses only required memory (dictionary size).
- Project/Archiver/Resource
contains common resurces
2.30 Beta 19 2002-04-11
-------------------------
- SDK/Archive/Rar/Handler.cpp
supporting RAR29
2.30 Beta 18 2002-03-25
-------------------------
- SDK/Archive/Cab/MSZipDecoder.cpp
SDK/Archive/Cab/LZXDecoder.cpp:
bug with corrupted archives was fixed
- Project/Compress/LZ/MatchFinder/BinTree/BinTree.h
- Project/Compress/LZ/MatchFinder/BinTree/BinTreeMain.h
some speed optimization (using prefetching)
2.30 Beta 17 2002-03-03
-------------------------
- ARJ suppport.
2.30 Beta 16 2002-02-24
-------------------------
- Project/Compress/LZ/LZMA/Decoder.cpp:
Bug was fixed: LZMA could not extract more than 4 GB.
- RPM and CPIO formats.
- Project/Compress/LZ/LZMA/Encoder.*
Project/Archiver/Format/7z/OutHandler.cpp
New fast compression mode for LZMA: -m0a=0.
- New match finders for LZMA: bt4b, hc3, hc4.
2.30 Beta 15 2002-02-17
-------------------------
- Compression ratio in LZMA was slightly improved:
Project/Compress/LZ/LZMA/Encoder.*
Project/Archiver/Format/7z/OutHandler.cpp
2.30 Beta 14 2002-02-10
-------------------------
- Supporting multithreading for LZMA:
Project/Compress/LZ/MatchFinder/MT
- Common/String.h:
CStringBase::Replace function was fixed.
2.30 Beta 13 2002-01-27
-------------------------
- Compress/LZ/MatchFinder/BinTree3.h:
method
- Compress/LZ/MatchFinder/BinTreemain.h:
- one VirtualAlloc array was splitted to
the for 3 arrays.
- Hash-functions were changed.
2.30 Beta 12 2002-01-16
-------------------------
- Compress/LZ/MatchFinder/BinTreemain.h:
Compress/LZ/MatchFinder/Patricia.h:
Compress/PPM/PPMd/SubAlloc.h:
Beta 11 bugs were fixed:
- VirtualFree was used incorrectly
- checking WIN32 instead _WINDOWS.
Compress/LZ/MatchFinder/Patricia.h:
Beta 11 bug with deleting m_Hash2Descendants was fixed.
2.30 Beta 11 2002-01-15
-------------------------
- Compress/LZ/MatchFinder/BinTreemain.h:
Compress/LZ/MatchFinder/Patricia.h:
Compress/PPM/PPMd/SubAlloc.h:
using VirtualAlloc for memory allocating
- Exlorer/ContextMenu.cpp:
Testing supporting.
CreateProcess instead WinExec
- Format/Common/IArchiveHandler.h:
Exlorer/ProxyHandler.cpp:
FAR/Plugin.cpp:
New properties names: Method, HostOS.
- Exlorer/OverwriteDialog.cpp:
FAR/OverwriteDialog.cpp:
Windows/PropVariantConversions.h
Using National time format was eliminated.
2.30 Beta 10 2002-01-11
-------------------------
- Exlorer/ContextMenu.cpp: bug with context menu on
Windows NT4 in Unicode version was fixed.
- Format/7z/UpdateArchiveEngine.cpp: bug was fixed -
Updating in Beta 8 and 9 didn't work.
- Exlorer/CCompressDialog.cpp: history growing bug was fixed.
2.30 Beta 9 2002-01-08
-------------------------
- SDK/Common/Vector.h: sopporting sorted object vectors .
- Lang features.
- Two new match finders: pat3h and pat4h.
- SDK/Archive/Zip/InEngine.cpp: bug was fixed.
- SDK/Windows/FileDir.cpp: function CreateComplexDirectory
was changed.
+41
View File
@@ -0,0 +1,41 @@
****** ***** ****** unRAR - free utility for RAR archives
** ** ** ** ** ** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
****** ******* ****** License for use and distribution of
** ** ** ** ** ** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
** ** ** ** ** ** FREE portable version
~~~~~~~~~~~~~~~~~~~~~
The source code of unRAR utility is freeware. This means:
1. All copyrights to RAR and the utility unRAR are exclusively
owned by the author - Alexander Roshal.
2. The unRAR sources may be used in any software to handle RAR
archives without limitations free of charge, but cannot be used
to re-create the RAR compression algorithm, which is proprietary.
Distribution of modified unRAR sources in separate form or as a
part of other software is permitted, provided that it is clearly
stated in the documentation and source comments that the code may
not be used to develop a RAR (WinRAR) compatible archiver.
3. The unRAR utility may be freely distributed. No person or company
may charge a fee for the distribution of unRAR without written
permission from the copyright holder.
4. THE RAR ARCHIVER AND THE UNRAR UTILITY ARE DISTRIBUTED "AS IS".
NO WARRANTY OF ANY KIND IS EXPRESSED OR IMPLIED. YOU USE AT
YOUR OWN RISK. THE AUTHOR WILL NOT BE LIABLE FOR DATA LOSS,
DAMAGES, LOSS OF PROFITS OR ANY OTHER KIND OF LOSS WHILE USING
OR MISUSING THIS SOFTWARE.
5. Installing and using the unRAR utility signifies acceptance of
these terms and conditions of the license.
6. If you don't agree with terms of the license you must remove
unRAR files from your storage devices and cease to use the
utility.
Thank you for your interest in RAR and unRAR.
Alexander L. Roshal