seven-zip 1.4.2 → 1.7.0.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/rake.yml +49 -0
- data/.github/workflows/release.yml +21 -0
- data/README.md +13 -2
- data/Rakefile +2 -0
- data/ext/p7zip/C/7zBuf.h +4 -8
- data/ext/p7zip/C/7zBuf2.c +9 -3
- data/ext/p7zip/C/7zCrc.c +84 -32
- data/ext/p7zip/C/7zCrc.h +2 -2
- data/ext/p7zip/C/7zCrcOpt.c +89 -8
- data/ext/p7zip/C/7zStream.c +4 -2
- data/ext/p7zip/C/{Types.h → 7zTypes.h} +8 -6
- data/ext/p7zip/C/7zVersion.h +21 -6
- data/ext/p7zip/C/Aes.c +28 -15
- data/ext/p7zip/C/Aes.h +2 -2
- data/ext/p7zip/C/Alloc.c +60 -12
- data/ext/p7zip/C/Alloc.h +6 -7
- data/ext/p7zip/C/Bcj2.c +256 -0
- data/ext/p7zip/C/Bcj2.h +146 -0
- data/ext/p7zip/C/Bcj2Enc.c +312 -0
- data/ext/p7zip/C/Blake2.h +48 -0
- data/ext/p7zip/C/Blake2s.c +244 -0
- data/ext/p7zip/C/Bra.c +2 -0
- data/ext/p7zip/C/Bra.h +4 -8
- data/ext/p7zip/C/Bra86.c +48 -51
- data/ext/p7zip/C/BraIA64.c +3 -1
- data/ext/p7zip/C/BwtSort.c +3 -4
- data/ext/p7zip/C/BwtSort.h +4 -8
- data/ext/p7zip/C/Compiler.h +32 -0
- data/ext/p7zip/C/CpuArch.c +50 -7
- data/ext/p7zip/C/CpuArch.h +112 -41
- data/ext/p7zip/C/Delta.c +2 -0
- data/ext/p7zip/C/Delta.h +4 -8
- data/ext/p7zip/C/HuffEnc.c +8 -6
- data/ext/p7zip/C/HuffEnc.h +4 -8
- data/ext/p7zip/C/LzFind.c +391 -108
- data/ext/p7zip/C/LzFind.h +20 -18
- data/ext/p7zip/C/LzFindMt.c +100 -90
- data/ext/p7zip/C/LzFindMt.h +4 -8
- data/ext/p7zip/C/LzHash.h +23 -20
- data/ext/p7zip/C/Lzma2Dec.c +48 -26
- data/ext/p7zip/C/Lzma2Dec.h +4 -8
- data/ext/p7zip/C/Lzma2Enc.c +58 -15
- data/ext/p7zip/C/Lzma2Enc.h +3 -7
- data/ext/p7zip/C/{LzmaUtil/Lzma86Enc.h → Lzma86.h} +47 -14
- data/ext/p7zip/C/{LzmaUtil/Lzma86Dec.c → Lzma86Dec.c} +6 -13
- data/ext/p7zip/C/{LzmaUtil/Lzma86Enc.c → Lzma86Enc.c} +8 -15
- data/ext/p7zip/C/LzmaDec.c +180 -79
- data/ext/p7zip/C/LzmaDec.h +4 -8
- data/ext/p7zip/C/LzmaEnc.c +230 -147
- data/ext/p7zip/C/LzmaEnc.h +6 -8
- data/ext/p7zip/C/MtCoder.c +3 -3
- data/ext/p7zip/C/Ppmd.h +5 -5
- data/ext/p7zip/C/Ppmd7.c +9 -7
- data/ext/p7zip/C/Ppmd7.h +3 -3
- data/ext/p7zip/C/Ppmd7Dec.c +2 -0
- data/ext/p7zip/C/Ppmd7Enc.c +4 -2
- data/ext/p7zip/C/Ppmd8.c +34 -31
- data/ext/p7zip/C/Ppmd8.h +5 -1
- data/ext/p7zip/C/Ppmd8Dec.c +2 -0
- data/ext/p7zip/C/Ppmd8Enc.c +2 -0
- data/ext/p7zip/C/Precomp.h +10 -0
- data/ext/p7zip/C/RotateDefs.h +11 -1
- data/ext/p7zip/C/Sha1.c +340 -0
- data/ext/p7zip/C/Sha1.h +38 -0
- data/ext/p7zip/C/Sha256.c +107 -63
- data/ext/p7zip/C/Sha256.h +2 -2
- data/ext/p7zip/C/Sort.c +59 -11
- data/ext/p7zip/C/Sort.h +8 -10
- data/ext/p7zip/C/Threads.h +1 -1
- data/ext/p7zip/C/Xz.c +7 -5
- data/ext/p7zip/C/Xz.h +40 -17
- data/ext/p7zip/C/XzCrc64.c +69 -16
- data/ext/p7zip/C/XzCrc64.h +2 -2
- data/ext/p7zip/C/XzCrc64Opt.c +69 -0
- data/ext/p7zip/C/XzDec.c +93 -55
- data/ext/p7zip/C/XzEnc.c +206 -165
- data/ext/p7zip/C/XzEnc.h +23 -9
- data/ext/p7zip/C/XzIn.c +50 -43
- data/ext/p7zip/CPP/7zip/Archive/7z/7zCompressionMode.h +37 -13
- data/ext/p7zip/CPP/7zip/Archive/7z/7zDecode.cpp +392 -181
- data/ext/p7zip/CPP/7zip/Archive/7z/7zDecode.h +29 -29
- data/ext/p7zip/CPP/7zip/Archive/7z/7zEncode.cpp +424 -212
- data/ext/p7zip/CPP/7zip/Archive/7z/7zEncode.h +53 -16
- data/ext/p7zip/CPP/7zip/Archive/7z/7zExtract.cpp +312 -174
- data/ext/p7zip/CPP/7zip/Archive/7z/7zFolderInStream.cpp +74 -61
- data/ext/p7zip/CPP/7zip/Archive/7z/7zFolderInStream.h +22 -19
- data/ext/p7zip/CPP/7zip/Archive/7z/7zHandler.cpp +505 -232
- data/ext/p7zip/CPP/7zip/Archive/7z/7zHandler.h +70 -16
- data/ext/p7zip/CPP/7zip/Archive/7z/7zHandlerOut.cpp +602 -172
- data/ext/p7zip/CPP/7zip/Archive/7z/7zHeader.cpp +5 -0
- data/ext/p7zip/CPP/7zip/Archive/7z/7zHeader.h +54 -3
- data/ext/p7zip/CPP/7zip/Archive/7z/7zIn.cpp +981 -616
- data/ext/p7zip/CPP/7zip/Archive/7z/7zIn.h +275 -89
- data/ext/p7zip/CPP/7zip/Archive/7z/7zItem.h +77 -162
- data/ext/p7zip/CPP/7zip/Archive/7z/7zOut.cpp +288 -238
- data/ext/p7zip/CPP/7zip/Archive/7z/7zOut.h +189 -20
- data/ext/p7zip/CPP/7zip/Archive/7z/7zProperties.cpp +59 -49
- data/ext/p7zip/CPP/7zip/Archive/7z/7zRegister.cpp +12 -9
- data/ext/p7zip/CPP/7zip/Archive/7z/7zSpecStream.cpp +4 -6
- data/ext/p7zip/CPP/7zip/Archive/7z/7zSpecStream.h +5 -5
- data/ext/p7zip/CPP/7zip/Archive/7z/7zUpdate.cpp +1743 -447
- data/ext/p7zip/CPP/7zip/Archive/7z/7zUpdate.h +61 -10
- data/ext/p7zip/CPP/7zip/Archive/ApmHandler.cpp +84 -120
- data/ext/p7zip/CPP/7zip/Archive/ArHandler.cpp +854 -0
- data/ext/p7zip/CPP/7zip/Archive/ArchiveExports.cpp +48 -32
- data/ext/p7zip/CPP/7zip/Archive/ArjHandler.cpp +519 -340
- data/ext/p7zip/CPP/7zip/Archive/Bz2Handler.cpp +223 -203
- data/ext/p7zip/CPP/7zip/Archive/Cab/CabBlockInStream.cpp +50 -139
- data/ext/p7zip/CPP/7zip/Archive/Cab/CabBlockInStream.h +17 -18
- data/ext/p7zip/CPP/7zip/Archive/Cab/CabHandler.cpp +566 -234
- data/ext/p7zip/CPP/7zip/Archive/Cab/CabHandler.h +10 -1
- data/ext/p7zip/CPP/7zip/Archive/Cab/CabHeader.cpp +2 -2
- data/ext/p7zip/CPP/7zip/Archive/Cab/CabHeader.h +12 -15
- data/ext/p7zip/CPP/7zip/Archive/Cab/CabIn.cpp +341 -122
- data/ext/p7zip/CPP/7zip/Archive/Cab/CabIn.h +81 -66
- data/ext/p7zip/CPP/7zip/Archive/Cab/CabItem.h +17 -14
- data/ext/p7zip/CPP/7zip/Archive/Cab/CabRegister.cpp +10 -4
- data/ext/p7zip/CPP/7zip/Archive/Chm/ChmHandler.cpp +190 -83
- data/ext/p7zip/CPP/7zip/Archive/Chm/ChmHandler.h +7 -1
- data/ext/p7zip/CPP/7zip/Archive/Chm/ChmIn.cpp +292 -174
- data/ext/p7zip/CPP/7zip/Archive/Chm/ChmIn.h +73 -47
- data/ext/p7zip/CPP/7zip/Archive/ComHandler.cpp +886 -0
- data/ext/p7zip/CPP/7zip/Archive/Common/CoderMixer2.cpp +994 -71
- data/ext/p7zip/CPP/7zip/Archive/Common/CoderMixer2.h +364 -101
- data/ext/p7zip/CPP/7zip/Archive/Common/DummyOutStream.cpp +7 -12
- data/ext/p7zip/CPP/7zip/Archive/Common/DummyOutStream.h +4 -3
- data/ext/p7zip/CPP/7zip/Archive/Common/FindSignature.cpp +6 -6
- data/ext/p7zip/CPP/7zip/Archive/Common/FindSignature.h +2 -2
- data/ext/p7zip/CPP/7zip/Archive/Common/HandlerOut.cpp +77 -543
- data/ext/p7zip/CPP/7zip/Archive/Common/HandlerOut.h +31 -51
- data/ext/p7zip/CPP/7zip/Archive/Common/InStreamWithCRC.cpp +18 -14
- data/ext/p7zip/CPP/7zip/Archive/Common/ItemNameUtils.cpp +34 -7
- data/ext/p7zip/CPP/7zip/Archive/Common/ItemNameUtils.h +5 -2
- data/ext/p7zip/CPP/7zip/Archive/Common/MultiStream.cpp +25 -24
- data/ext/p7zip/CPP/7zip/Archive/Common/MultiStream.h +8 -3
- data/ext/p7zip/CPP/7zip/Archive/Common/OutStreamWithCRC.h +1 -0
- data/ext/p7zip/CPP/7zip/Archive/Common/OutStreamWithSha1.cpp +2 -2
- data/ext/p7zip/CPP/7zip/Archive/Common/OutStreamWithSha1.h +5 -5
- data/ext/p7zip/CPP/7zip/Archive/Common/ParseProperties.cpp +0 -174
- data/ext/p7zip/CPP/7zip/Archive/Common/ParseProperties.h +2 -14
- data/ext/p7zip/CPP/7zip/Archive/CpioHandler.cpp +506 -335
- data/ext/p7zip/CPP/7zip/Archive/CramfsHandler.cpp +227 -84
- data/ext/p7zip/CPP/7zip/Archive/DeflateProps.cpp +0 -115
- data/ext/p7zip/CPP/7zip/Archive/DeflateProps.h +0 -29
- data/ext/p7zip/CPP/7zip/Archive/DllExports2.cpp +63 -17
- data/ext/p7zip/CPP/7zip/Archive/DmgHandler.cpp +1007 -339
- data/ext/p7zip/CPP/7zip/Archive/ElfHandler.cpp +618 -177
- data/ext/p7zip/CPP/7zip/Archive/ExtHandler.cpp +2867 -0
- data/ext/p7zip/CPP/7zip/Archive/FatHandler.cpp +136 -76
- data/ext/p7zip/CPP/7zip/Archive/FlvHandler.cpp +132 -150
- data/ext/p7zip/CPP/7zip/Archive/GptHandler.cpp +405 -0
- data/ext/p7zip/CPP/7zip/Archive/GzHandler.cpp +560 -214
- data/ext/p7zip/CPP/7zip/Archive/HandlerCont.cpp +288 -0
- data/ext/p7zip/CPP/7zip/Archive/HandlerCont.h +116 -0
- data/ext/p7zip/CPP/7zip/Archive/HfsHandler.cpp +1880 -0
- data/ext/p7zip/CPP/7zip/Archive/IArchive.h +415 -51
- data/ext/p7zip/CPP/7zip/Archive/IhexHandler.cpp +497 -0
- data/ext/p7zip/CPP/7zip/Archive/Iso/IsoHandler.cpp +158 -71
- data/ext/p7zip/CPP/7zip/Archive/Iso/IsoHandler.h +2 -1
- data/ext/p7zip/CPP/7zip/Archive/Iso/IsoHeader.cpp +0 -9
- data/ext/p7zip/CPP/7zip/Archive/Iso/IsoHeader.h +8 -5
- data/ext/p7zip/CPP/7zip/Archive/Iso/IsoIn.cpp +311 -91
- data/ext/p7zip/CPP/7zip/Archive/Iso/IsoIn.h +101 -83
- data/ext/p7zip/CPP/7zip/Archive/Iso/IsoItem.h +48 -39
- data/ext/p7zip/CPP/7zip/Archive/Iso/IsoRegister.cpp +12 -4
- data/ext/p7zip/CPP/7zip/Archive/LzhHandler.cpp +127 -114
- data/ext/p7zip/CPP/7zip/Archive/LzmaHandler.cpp +264 -121
- data/ext/p7zip/CPP/7zip/Archive/MachoHandler.cpp +402 -242
- data/ext/p7zip/CPP/7zip/Archive/MbrHandler.cpp +56 -114
- data/ext/p7zip/CPP/7zip/Archive/MslzHandler.cpp +230 -90
- data/ext/p7zip/CPP/7zip/Archive/MubHandler.cpp +129 -153
- data/ext/p7zip/CPP/7zip/Archive/Nsis/NsisDecode.cpp +179 -58
- data/ext/p7zip/CPP/7zip/Archive/Nsis/NsisDecode.h +36 -7
- data/ext/p7zip/CPP/7zip/Archive/Nsis/NsisHandler.cpp +407 -237
- data/ext/p7zip/CPP/7zip/Archive/Nsis/NsisHandler.h +9 -16
- data/ext/p7zip/CPP/7zip/Archive/Nsis/NsisIn.cpp +5535 -1098
- data/ext/p7zip/CPP/7zip/Archive/Nsis/NsisIn.h +345 -81
- data/ext/p7zip/CPP/7zip/Archive/Nsis/NsisRegister.cpp +11 -4
- data/ext/p7zip/CPP/7zip/Archive/NtfsHandler.cpp +1424 -434
- data/ext/p7zip/CPP/7zip/Archive/PeHandler.cpp +1831 -521
- data/ext/p7zip/CPP/7zip/Archive/PpmdHandler.cpp +50 -35
- data/ext/p7zip/CPP/7zip/Archive/QcowHandler.cpp +615 -0
- data/ext/p7zip/CPP/7zip/Archive/Rar/Rar5Handler.cpp +2746 -0
- data/ext/p7zip/CPP/7zip/Archive/Rar/Rar5Handler.h +411 -0
- data/ext/p7zip/CPP/7zip/Archive/Rar/RarHandler.cpp +1241 -355
- data/ext/p7zip/CPP/7zip/Archive/Rar/RarHandler.h +70 -20
- data/ext/p7zip/CPP/7zip/Archive/Rar/RarHeader.h +38 -34
- data/ext/p7zip/CPP/7zip/Archive/Rar/RarItem.h +34 -16
- data/ext/p7zip/CPP/7zip/Archive/Rar/RarVol.h +129 -0
- data/ext/p7zip/CPP/7zip/Archive/RpmHandler.cpp +641 -194
- data/ext/p7zip/CPP/7zip/Archive/SplitHandler.cpp +174 -181
- data/ext/p7zip/CPP/7zip/Archive/SquashfsHandler.cpp +237 -174
- data/ext/p7zip/CPP/7zip/Archive/SwfHandler.cpp +471 -192
- data/ext/p7zip/CPP/7zip/Archive/Tar/TarHandler.cpp +350 -59
- data/ext/p7zip/CPP/7zip/Archive/Tar/TarHandler.h +24 -7
- data/ext/p7zip/CPP/7zip/Archive/Tar/TarHandlerOut.cpp +79 -27
- data/ext/p7zip/CPP/7zip/Archive/Tar/TarHeader.cpp +5 -7
- data/ext/p7zip/CPP/7zip/Archive/Tar/TarHeader.h +20 -44
- data/ext/p7zip/CPP/7zip/Archive/Tar/TarIn.cpp +279 -64
- data/ext/p7zip/CPP/7zip/Archive/Tar/TarIn.h +10 -1
- data/ext/p7zip/CPP/7zip/Archive/Tar/TarItem.h +34 -8
- data/ext/p7zip/CPP/7zip/Archive/Tar/TarOut.cpp +145 -87
- data/ext/p7zip/CPP/7zip/Archive/Tar/TarOut.h +13 -5
- data/ext/p7zip/CPP/7zip/Archive/Tar/TarRegister.cpp +14 -9
- data/ext/p7zip/CPP/7zip/Archive/Tar/TarUpdate.cpp +154 -27
- data/ext/p7zip/CPP/7zip/Archive/Tar/TarUpdate.h +10 -6
- data/ext/p7zip/CPP/7zip/Archive/Udf/UdfHandler.cpp +53 -128
- data/ext/p7zip/CPP/7zip/Archive/Udf/UdfHandler.h +6 -5
- data/ext/p7zip/CPP/7zip/Archive/Udf/UdfIn.cpp +384 -119
- data/ext/p7zip/CPP/7zip/Archive/Udf/UdfIn.h +40 -21
- data/ext/p7zip/CPP/7zip/Archive/UefiHandler.cpp +1618 -0
- data/ext/p7zip/CPP/7zip/Archive/VdiHandler.cpp +362 -0
- data/ext/p7zip/CPP/7zip/Archive/VhdHandler.cpp +438 -247
- data/ext/p7zip/CPP/7zip/Archive/VmdkHandler.cpp +1518 -0
- data/ext/p7zip/CPP/7zip/Archive/Wim/WimHandler.cpp +837 -249
- data/ext/p7zip/CPP/7zip/Archive/Wim/WimHandler.h +73 -47
- data/ext/p7zip/CPP/7zip/Archive/Wim/WimHandlerOut.cpp +1614 -351
- data/ext/p7zip/CPP/7zip/Archive/Wim/WimIn.cpp +1519 -513
- data/ext/p7zip/CPP/7zip/Archive/Wim/WimIn.h +498 -139
- data/ext/p7zip/CPP/7zip/Archive/Wim/WimRegister.cpp +13 -9
- data/ext/p7zip/CPP/7zip/Archive/XarHandler.cpp +272 -128
- data/ext/p7zip/CPP/7zip/Archive/XzHandler.cpp +502 -253
- data/ext/p7zip/CPP/7zip/Archive/XzHandler.h +65 -0
- data/ext/p7zip/CPP/7zip/Archive/ZHandler.cpp +114 -39
- data/ext/p7zip/CPP/7zip/Archive/Zip/ZipAddCommon.cpp +118 -134
- data/ext/p7zip/CPP/7zip/Archive/Zip/ZipAddCommon.h +6 -0
- data/ext/p7zip/CPP/7zip/Archive/Zip/ZipCompressionMode.h +40 -20
- data/ext/p7zip/CPP/7zip/Archive/Zip/ZipHandler.cpp +541 -274
- data/ext/p7zip/CPP/7zip/Archive/Zip/ZipHandler.h +13 -40
- data/ext/p7zip/CPP/7zip/Archive/Zip/ZipHandlerOut.cpp +165 -254
- data/ext/p7zip/CPP/7zip/Archive/Zip/ZipHeader.h +70 -178
- data/ext/p7zip/CPP/7zip/Archive/Zip/ZipIn.cpp +1934 -550
- data/ext/p7zip/CPP/7zip/Archive/Zip/ZipIn.h +294 -63
- data/ext/p7zip/CPP/7zip/Archive/Zip/ZipItem.cpp +160 -86
- data/ext/p7zip/CPP/7zip/Archive/Zip/ZipItem.h +139 -110
- data/ext/p7zip/CPP/7zip/Archive/Zip/ZipOut.cpp +177 -154
- data/ext/p7zip/CPP/7zip/Archive/Zip/ZipOut.h +50 -18
- data/ext/p7zip/CPP/7zip/Archive/Zip/ZipRegister.cpp +18 -9
- data/ext/p7zip/CPP/7zip/Archive/Zip/ZipUpdate.cpp +367 -201
- data/ext/p7zip/CPP/7zip/Archive/Zip/ZipUpdate.h +11 -10
- data/ext/p7zip/CPP/7zip/Bundles/Format7zFree/makefile +2 -319
- data/ext/p7zip/CPP/7zip/Bundles/Format7zFree/makefile.depend +0 -4962
- data/ext/p7zip/CPP/7zip/Bundles/Format7zFree/makefile.list +1004 -259
- data/ext/p7zip/CPP/7zip/Common/CWrappers.cpp +26 -22
- data/ext/p7zip/CPP/7zip/Common/CWrappers.h +19 -14
- data/ext/p7zip/CPP/7zip/Common/CreateCoder.cpp +298 -130
- data/ext/p7zip/CPP/7zip/Common/CreateCoder.h +118 -34
- data/ext/p7zip/CPP/7zip/Common/FilePathAutoRename.cpp +24 -28
- data/ext/p7zip/CPP/7zip/Common/FilePathAutoRename.h +5 -5
- data/ext/p7zip/CPP/7zip/Common/FileStreams.cpp +268 -65
- data/ext/p7zip/CPP/7zip/Common/FileStreams.h +70 -33
- data/ext/p7zip/CPP/7zip/Common/FilterCoder.cpp +302 -131
- data/ext/p7zip/CPP/7zip/Common/FilterCoder.h +141 -43
- data/ext/p7zip/CPP/7zip/Common/InBuffer.cpp +87 -35
- data/ext/p7zip/CPP/7zip/Common/InBuffer.h +54 -45
- data/ext/p7zip/CPP/7zip/Common/InOutTempBuffer.cpp +22 -17
- data/ext/p7zip/CPP/7zip/Common/InOutTempBuffer.h +5 -5
- data/ext/p7zip/CPP/7zip/Common/LimitedStreams.cpp +256 -43
- data/ext/p7zip/CPP/7zip/Common/LimitedStreams.h +135 -8
- data/ext/p7zip/CPP/7zip/Common/MemBlocks.cpp +5 -5
- data/ext/p7zip/CPP/7zip/Common/MemBlocks.h +3 -3
- data/ext/p7zip/CPP/7zip/Common/MethodId.cpp +0 -24
- data/ext/p7zip/CPP/7zip/Common/MethodId.h +1 -1
- data/ext/p7zip/CPP/7zip/Common/MethodProps.cpp +430 -71
- data/ext/p7zip/CPP/7zip/Common/MethodProps.h +170 -17
- data/ext/p7zip/CPP/7zip/Common/OffsetStream.cpp +8 -4
- data/ext/p7zip/CPP/7zip/Common/OffsetStream.h +4 -3
- data/ext/p7zip/CPP/7zip/Common/OutBuffer.cpp +26 -31
- data/ext/p7zip/CPP/7zip/Common/OutBuffer.h +17 -18
- data/ext/p7zip/CPP/7zip/Common/OutMemStream.cpp +5 -5
- data/ext/p7zip/CPP/7zip/Common/OutMemStream.h +5 -4
- data/ext/p7zip/CPP/7zip/Common/ProgressUtils.cpp +22 -13
- data/ext/p7zip/CPP/7zip/Common/ProgressUtils.h +4 -3
- data/ext/p7zip/CPP/7zip/Common/PropId.cpp +108 -0
- data/ext/p7zip/CPP/7zip/Common/RegisterArc.h +63 -17
- data/ext/p7zip/CPP/7zip/Common/RegisterCodec.h +79 -6
- data/ext/p7zip/CPP/7zip/Common/StreamBinder.cpp +95 -90
- data/ext/p7zip/CPP/7zip/Common/StreamBinder.h +46 -23
- data/ext/p7zip/CPP/7zip/Common/StreamObjects.cpp +88 -24
- data/ext/p7zip/CPP/7zip/Common/StreamObjects.h +36 -14
- data/ext/p7zip/CPP/7zip/Common/StreamUtils.cpp +4 -4
- data/ext/p7zip/CPP/7zip/Common/StreamUtils.h +6 -6
- data/ext/p7zip/CPP/7zip/Common/UniqBlocks.cpp +57 -0
- data/ext/p7zip/CPP/7zip/Common/UniqBlocks.h +26 -0
- data/ext/p7zip/CPP/7zip/Common/VirtThread.cpp +8 -6
- data/ext/p7zip/CPP/7zip/Common/VirtThread.h +6 -5
- data/ext/p7zip/CPP/7zip/Compress/BZip2Const.h +13 -12
- data/ext/p7zip/CPP/7zip/Compress/BZip2Crc.h +1 -1
- data/ext/p7zip/CPP/7zip/Compress/BZip2Decoder.cpp +198 -147
- data/ext/p7zip/CPP/7zip/Compress/BZip2Decoder.h +60 -27
- data/ext/p7zip/CPP/7zip/Compress/BZip2Encoder.cpp +111 -116
- data/ext/p7zip/CPP/7zip/Compress/BZip2Encoder.h +53 -59
- data/ext/p7zip/CPP/7zip/Compress/BZip2Register.cpp +12 -7
- data/ext/p7zip/CPP/7zip/Compress/Bcj2Coder.cpp +554 -282
- data/ext/p7zip/CPP/7zip/Compress/Bcj2Coder.h +73 -71
- data/ext/p7zip/CPP/7zip/Compress/Bcj2Register.cpp +10 -5
- data/ext/p7zip/CPP/7zip/Compress/BcjCoder.cpp +13 -4
- data/ext/p7zip/CPP/7zip/Compress/BcjCoder.h +17 -5
- data/ext/p7zip/CPP/7zip/Compress/BcjRegister.cpp +7 -9
- data/ext/p7zip/CPP/7zip/Compress/BitlDecoder.cpp +2 -2
- data/ext/p7zip/CPP/7zip/Compress/BitlDecoder.h +58 -61
- data/ext/p7zip/CPP/7zip/Compress/BitlEncoder.h +24 -25
- data/ext/p7zip/CPP/7zip/Compress/BitmDecoder.h +46 -17
- data/ext/p7zip/CPP/7zip/Compress/BitmEncoder.h +18 -19
- data/ext/p7zip/CPP/7zip/Compress/BranchMisc.cpp +14 -28
- data/ext/p7zip/CPP/7zip/Compress/BranchMisc.h +27 -6
- data/ext/p7zip/CPP/7zip/Compress/BranchRegister.cpp +26 -15
- data/ext/p7zip/CPP/7zip/Compress/ByteSwap.cpp +45 -26
- data/ext/p7zip/CPP/7zip/Compress/CodecExports.cpp +254 -70
- data/ext/p7zip/CPP/7zip/Compress/CopyCoder.cpp +65 -17
- data/ext/p7zip/CPP/7zip/Compress/CopyCoder.h +15 -3
- data/ext/p7zip/CPP/7zip/Compress/CopyRegister.cpp +5 -4
- data/ext/p7zip/CPP/7zip/Compress/Deflate64Register.cpp +12 -6
- data/ext/p7zip/CPP/7zip/Compress/DeflateConst.h +43 -46
- data/ext/p7zip/CPP/7zip/Compress/DeflateDecoder.cpp +145 -81
- data/ext/p7zip/CPP/7zip/Compress/DeflateDecoder.h +31 -33
- data/ext/p7zip/CPP/7zip/Compress/DeflateEncoder.cpp +179 -162
- data/ext/p7zip/CPP/7zip/Compress/DeflateEncoder.h +35 -30
- data/ext/p7zip/CPP/7zip/Compress/DeflateRegister.cpp +11 -7
- data/ext/p7zip/CPP/7zip/Compress/DeltaFilter.cpp +55 -39
- data/ext/p7zip/CPP/7zip/Compress/{DllExports2.cpp → DllExports2Compress.cpp} +8 -8
- data/ext/p7zip/CPP/7zip/Compress/DllExportsCompress.cpp +48 -0
- data/ext/p7zip/CPP/7zip/Compress/HuffmanDecoder.h +220 -49
- data/ext/p7zip/CPP/7zip/Compress/ImplodeDecoder.cpp +14 -9
- data/ext/p7zip/CPP/7zip/Compress/ImplodeDecoder.h +2 -3
- data/ext/p7zip/CPP/7zip/Compress/ImplodeHuffmanDecoder.cpp +7 -7
- data/ext/p7zip/CPP/7zip/Compress/ImplodeHuffmanDecoder.h +1 -1
- data/ext/p7zip/CPP/7zip/Compress/LzOutWindow.cpp +1 -1
- data/ext/p7zip/CPP/7zip/Compress/LzOutWindow.h +21 -18
- data/ext/p7zip/CPP/7zip/Compress/LzhDecoder.cpp +171 -141
- data/ext/p7zip/CPP/7zip/Compress/LzhDecoder.h +32 -64
- data/ext/p7zip/CPP/7zip/Compress/Lzham/LICENSE +22 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/LzhamRegister.cpp +783 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/README.md +211 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/include/lzham.h +803 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/include/lzham_dynamic_lib.h +156 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/include/lzham_exports.inc +31 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/include/lzham_static_lib.h +59 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/include/zlib.h +2 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamcomp/CMakeLists.txt +69 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamcomp/lzham_comp.h +38 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamcomp/lzham_lzbase.cpp +244 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamcomp/lzham_lzbase.h +46 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamcomp/lzham_lzcomp.cpp +750 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamcomp/lzham_lzcomp_internal.cpp +2240 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamcomp/lzham_lzcomp_internal.h +503 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamcomp/lzham_lzcomp_state.cpp +1684 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamcomp/lzham_match_accel.cpp +947 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamcomp/lzham_match_accel.h +164 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamcomp/lzham_null_threading.h +98 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamcomp/lzham_pthreads_threading.cpp +214 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamcomp/lzham_pthreads_threading.h +535 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamcomp/lzham_threading.h +12 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamcomp/lzham_win32_threading.cpp +232 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamcomp/lzham_win32_threading.h +387 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamcomp/lzhamcomp.vcxproj +208 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/CMakeLists.txt +86 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_assert.cpp +80 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_assert.h +58 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_checksum.cpp +73 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_checksum.h +13 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_config.h +25 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_core.h +303 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_decomp.h +37 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_helpers.h +54 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_huffman_codes.cpp +286 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_huffman_codes.h +32 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_lzdecomp.cpp +1586 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_lzdecompbase.cpp +131 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_lzdecompbase.h +89 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_math.h +142 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_mem.cpp +463 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_mem.h +115 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_platform.cpp +159 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_platform.h +284 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_prefix_coding.cpp +431 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_prefix_coding.h +157 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_symbol_codec.cpp +1527 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_symbol_codec.h +494 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_timer.cpp +147 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_timer.h +99 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_traits.h +141 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_types.h +72 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_utils.h +58 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_vector.cpp +83 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzham_vector.h +628 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamdecomp/lzhamdecomp.vcxproj +224 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamlib/lzham_lib.cpp +179 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/lzhamlib/lzhamlib.vcxproj +187 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/makefile +10 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/makefile.depend +0 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzham/makefile.list +129 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzma2Decoder.cpp +123 -46
- data/ext/p7zip/CPP/7zip/Compress/Lzma2Decoder.h +29 -14
- data/ext/p7zip/CPP/7zip/Compress/Lzma2Encoder.cpp +14 -9
- data/ext/p7zip/CPP/7zip/Compress/Lzma2Encoder.h +1 -1
- data/ext/p7zip/CPP/7zip/Compress/Lzma2Register.cpp +9 -7
- data/ext/p7zip/CPP/7zip/Compress/LzmaDecoder.cpp +24 -8
- data/ext/p7zip/CPP/7zip/Compress/LzmaDecoder.h +8 -1
- data/ext/p7zip/CPP/7zip/Compress/LzmaEncoder.cpp +30 -27
- data/ext/p7zip/CPP/7zip/Compress/LzmaEncoder.h +3 -1
- data/ext/p7zip/CPP/7zip/Compress/LzmaRegister.cpp +9 -7
- data/ext/p7zip/CPP/7zip/Compress/LzmsDecoder.cpp +576 -0
- data/ext/p7zip/CPP/7zip/Compress/LzmsDecoder.h +271 -0
- data/ext/p7zip/CPP/7zip/Compress/Lzx.h +32 -36
- data/ext/p7zip/CPP/7zip/Compress/LzxDecoder.cpp +380 -238
- data/ext/p7zip/CPP/7zip/Compress/LzxDecoder.h +170 -83
- data/ext/p7zip/CPP/7zip/Compress/Mtf8.h +7 -9
- data/ext/p7zip/CPP/7zip/Compress/PpmdDecoder.cpp +1 -5
- data/ext/p7zip/CPP/7zip/Compress/PpmdEncoder.cpp +51 -18
- data/ext/p7zip/CPP/7zip/Compress/PpmdEncoder.h +18 -8
- data/ext/p7zip/CPP/7zip/Compress/PpmdRegister.cpp +9 -8
- data/ext/p7zip/CPP/7zip/Compress/PpmdZip.cpp +61 -25
- data/ext/p7zip/CPP/7zip/Compress/PpmdZip.h +21 -6
- data/ext/p7zip/CPP/7zip/Compress/QuantumDecoder.cpp +122 -102
- data/ext/p7zip/CPP/7zip/Compress/QuantumDecoder.h +68 -157
- data/ext/p7zip/CPP/7zip/Compress/Rar/makefile +33 -18
- data/ext/p7zip/CPP/7zip/Compress/Rar/makefile.depend +0 -158
- data/ext/p7zip/CPP/7zip/Compress/Rar/makefile.list +105 -56
- data/ext/p7zip/CPP/7zip/Compress/Rar1Decoder.cpp +34 -21
- data/ext/p7zip/CPP/7zip/Compress/Rar1Decoder.h +2 -0
- data/ext/p7zip/CPP/7zip/Compress/Rar2Decoder.cpp +77 -67
- data/ext/p7zip/CPP/7zip/Compress/Rar2Decoder.h +12 -10
- data/ext/p7zip/CPP/7zip/Compress/Rar3Decoder.cpp +139 -118
- data/ext/p7zip/CPP/7zip/Compress/Rar3Decoder.h +48 -33
- data/ext/p7zip/CPP/7zip/Compress/Rar3Vm.cpp +148 -113
- data/ext/p7zip/CPP/7zip/Compress/Rar3Vm.h +35 -19
- data/ext/p7zip/CPP/7zip/Compress/Rar5Decoder.cpp +961 -0
- data/ext/p7zip/CPP/7zip/Compress/Rar5Decoder.h +335 -0
- data/ext/p7zip/CPP/7zip/Compress/RarCodecsRegister.cpp +13 -6
- data/ext/p7zip/CPP/7zip/Compress/ShrinkDecoder.cpp +91 -71
- data/ext/p7zip/CPP/7zip/Compress/ShrinkDecoder.h +2 -4
- data/ext/p7zip/CPP/7zip/Compress/XpressDecoder.cpp +129 -0
- data/ext/p7zip/CPP/7zip/Compress/XpressDecoder.h +13 -0
- data/ext/p7zip/CPP/7zip/Compress/ZDecoder.cpp +98 -20
- data/ext/p7zip/CPP/7zip/Compress/ZDecoder.h +19 -7
- data/ext/p7zip/CPP/7zip/Compress/ZlibDecoder.cpp +14 -11
- data/ext/p7zip/CPP/7zip/Compress/ZlibDecoder.h +32 -1
- data/ext/p7zip/CPP/7zip/Crypto/7zAes.cpp +137 -101
- data/ext/p7zip/CPP/7zip/Crypto/7zAes.h +31 -30
- data/ext/p7zip/CPP/7zip/Crypto/7zAesRegister.cpp +8 -9
- data/ext/p7zip/CPP/7zip/Crypto/HmacSha1.cpp +39 -28
- data/ext/p7zip/CPP/7zip/Crypto/HmacSha1.h +3 -3
- data/ext/p7zip/CPP/7zip/Crypto/HmacSha256.cpp +62 -0
- data/ext/p7zip/CPP/7zip/Crypto/HmacSha256.h +27 -0
- data/ext/p7zip/CPP/7zip/Crypto/MyAes.cpp +73 -7
- data/ext/p7zip/CPP/7zip/Crypto/MyAes.h +25 -8
- data/ext/p7zip/CPP/7zip/Crypto/MyAesReg.cpp +16 -0
- data/ext/p7zip/CPP/7zip/Crypto/Pbkdf2HmacSha1.cpp +29 -15
- data/ext/p7zip/CPP/7zip/Crypto/Pbkdf2HmacSha1.h +2 -1
- data/ext/p7zip/CPP/7zip/Crypto/RandGen.cpp +49 -34
- data/ext/p7zip/CPP/7zip/Crypto/RandGen.h +2 -2
- data/ext/p7zip/CPP/7zip/Crypto/Rar20Crypto.cpp +36 -39
- data/ext/p7zip/CPP/7zip/Crypto/Rar20Crypto.h +15 -17
- data/ext/p7zip/CPP/7zip/Crypto/Rar5Aes.cpp +257 -0
- data/ext/p7zip/CPP/7zip/Crypto/Rar5Aes.h +84 -0
- data/ext/p7zip/CPP/7zip/Crypto/RarAes.cpp +70 -71
- data/ext/p7zip/CPP/7zip/Crypto/RarAes.h +24 -19
- data/ext/p7zip/CPP/7zip/Crypto/Sha1Cls.h +51 -0
- data/ext/p7zip/CPP/7zip/Crypto/WzAes.cpp +68 -54
- data/ext/p7zip/CPP/7zip/Crypto/WzAes.h +37 -27
- data/ext/p7zip/CPP/7zip/Crypto/ZipCrypto.cpp +60 -34
- data/ext/p7zip/CPP/7zip/Crypto/ZipCrypto.h +28 -11
- data/ext/p7zip/CPP/7zip/Crypto/ZipStrong.cpp +90 -28
- data/ext/p7zip/CPP/7zip/Crypto/ZipStrong.h +13 -2
- data/ext/p7zip/CPP/7zip/Guid.txt +57 -11
- data/ext/p7zip/CPP/7zip/ICoder.h +202 -17
- data/ext/p7zip/CPP/7zip/IDecl.h +16 -3
- data/ext/p7zip/CPP/7zip/IPassword.h +1 -2
- data/ext/p7zip/CPP/7zip/IProgress.h +2 -16
- data/ext/p7zip/CPP/7zip/IStream.h +82 -13
- data/ext/p7zip/CPP/7zip/MyVersion.h +2 -11
- data/ext/p7zip/CPP/7zip/PropID.h +60 -9
- data/ext/p7zip/CPP/Common/C_FileIO.cpp +5 -1
- data/ext/p7zip/CPP/Common/C_FileIO.h +7 -1
- data/ext/p7zip/CPP/Common/CommandLineParser.cpp +122 -148
- data/ext/p7zip/CPP/Common/CommandLineParser.h +20 -29
- data/ext/p7zip/CPP/Common/Common.h +13 -0
- data/ext/p7zip/CPP/Common/CrcReg.cpp +98 -0
- data/ext/p7zip/CPP/Common/Defs.h +5 -10
- data/ext/p7zip/CPP/Common/DynLimBuf.cpp +93 -0
- data/ext/p7zip/CPP/Common/DynLimBuf.h +40 -0
- data/ext/p7zip/CPP/Common/DynamicBuffer.h +45 -31
- data/ext/p7zip/CPP/Common/IntToString.cpp +109 -40
- data/ext/p7zip/CPP/Common/IntToString.h +14 -9
- data/ext/p7zip/CPP/Common/Lang.cpp +120 -87
- data/ext/p7zip/CPP/Common/Lang.h +10 -15
- data/ext/p7zip/CPP/Common/ListFileUtils.cpp +82 -40
- data/ext/p7zip/CPP/Common/ListFileUtils.h +7 -4
- data/ext/p7zip/CPP/Common/MyBuffer.h +244 -0
- data/ext/p7zip/CPP/Common/MyCom.h +65 -28
- data/ext/p7zip/CPP/Common/MyGuidDef.h +1 -1
- data/ext/p7zip/CPP/Common/MyInitGuid.h +23 -0
- data/ext/p7zip/CPP/Common/MyLinux.h +42 -0
- data/ext/p7zip/CPP/Common/MyMap.cpp +8 -8
- data/ext/p7zip/CPP/Common/MyMap.h +2 -2
- data/ext/p7zip/CPP/Common/MyString.cpp +1643 -117
- data/ext/p7zip/CPP/Common/MyString.h +677 -486
- data/ext/p7zip/CPP/Common/MyTypes.h +38 -0
- data/ext/p7zip/CPP/Common/MyUnknown.h +4 -0
- data/ext/p7zip/CPP/Common/MyVector.cpp +0 -84
- data/ext/p7zip/CPP/Common/MyVector.h +472 -112
- data/ext/p7zip/CPP/Common/MyWindows.cpp +18 -1
- data/ext/p7zip/CPP/Common/MyWindows.h +8 -0
- data/ext/p7zip/CPP/Common/MyXml.cpp +169 -118
- data/ext/p7zip/CPP/Common/MyXml.h +14 -11
- data/ext/p7zip/CPP/Common/NewHandler.cpp +39 -0
- data/ext/p7zip/CPP/Common/NewHandler.h +55 -2
- data/ext/p7zip/CPP/Common/Random.h +14 -0
- data/ext/p7zip/CPP/Common/Sha1Reg.cpp +40 -0
- data/ext/p7zip/CPP/Common/Sha256Reg.cpp +40 -0
- data/ext/p7zip/CPP/Common/StdInStream.cpp +46 -27
- data/ext/p7zip/CPP/Common/StdInStream.h +11 -10
- data/ext/p7zip/CPP/Common/StdOutStream.cpp +48 -35
- data/ext/p7zip/CPP/Common/StdOutStream.h +44 -17
- data/ext/p7zip/CPP/Common/StringConvert.cpp +56 -17
- data/ext/p7zip/CPP/Common/StringConvert.h +7 -3
- data/ext/p7zip/CPP/Common/StringToInt.cpp +102 -48
- data/ext/p7zip/CPP/Common/StringToInt.h +13 -10
- data/ext/p7zip/CPP/Common/TextConfig.cpp +33 -47
- data/ext/p7zip/CPP/Common/TextConfig.h +3 -6
- data/ext/p7zip/CPP/Common/UTFConvert.cpp +218 -75
- data/ext/p7zip/CPP/Common/UTFConvert.h +4 -3
- data/ext/p7zip/CPP/Common/Wildcard.cpp +345 -125
- data/ext/p7zip/CPP/Common/Wildcard.h +82 -13
- data/ext/p7zip/CPP/Common/XzCrc64Reg.cpp +42 -0
- data/ext/p7zip/CPP/Windows/FileDir.cpp +427 -475
- data/ext/p7zip/CPP/Windows/FileDir.h +94 -72
- data/ext/p7zip/CPP/Windows/FileFind.cpp +235 -244
- data/ext/p7zip/CPP/Windows/FileFind.h +63 -59
- data/ext/p7zip/CPP/Windows/FileIO.cpp +29 -46
- data/ext/p7zip/CPP/Windows/FileIO.h +40 -42
- data/ext/p7zip/CPP/Windows/FileName.cpp +696 -17
- data/ext/p7zip/CPP/Windows/FileName.h +11 -3
- data/ext/p7zip/CPP/Windows/NtCheck.h +2 -0
- data/ext/p7zip/CPP/Windows/PropVariant.cpp +134 -30
- data/ext/p7zip/CPP/Windows/PropVariant.h +80 -24
- data/ext/p7zip/CPP/Windows/PropVariantUtils.cpp +89 -18
- data/ext/p7zip/CPP/Windows/PropVariantUtils.h +12 -7
- data/ext/p7zip/CPP/Windows/System.cpp +20 -15
- data/ext/p7zip/CPP/Windows/System.h +3 -2
- data/ext/p7zip/CPP/Windows/TimeUtils.cpp +203 -0
- data/ext/p7zip/CPP/Windows/TimeUtils.h +24 -0
- data/ext/p7zip/CPP/include_windows/basetyps.h +4 -4
- data/ext/p7zip/CPP/include_windows/windows.h +17 -11
- data/ext/p7zip/CPP/myWindows/StdAfx.h +97 -5
- data/ext/p7zip/CPP/myWindows/config.h +20 -5
- data/ext/p7zip/CPP/myWindows/myPrivate.h +8 -0
- data/ext/p7zip/CPP/myWindows/wine_date_and_time.cpp +34 -0
- data/ext/p7zip/ChangeLog +283 -35
- data/ext/p7zip/{DOCS → DOC}/7zC.txt +6 -13
- data/ext/p7zip/{DOCS → DOC}/License.txt +3 -2
- data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/commands/add.htm +93 -87
- data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/commands/bench.htm +88 -79
- data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/commands/delete.htm +62 -59
- data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/commands/extract.htm +96 -91
- data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/commands/extract_full.htm +73 -68
- data/ext/p7zip/DOC/MANUAL/cmdline/commands/hash.htm +65 -0
- data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/commands/index.htm +36 -33
- data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/commands/list.htm +78 -77
- data/ext/p7zip/DOC/MANUAL/cmdline/commands/rename.htm +51 -0
- data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/commands/style.css +232 -232
- data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/commands/test.htm +47 -46
- data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/commands/update.htm +71 -66
- data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/exit_codes.htm +27 -27
- data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/index.htm +29 -29
- data/ext/p7zip/{DOCS/MANUAL/switches → DOC/MANUAL/cmdline}/style.css +232 -232
- data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/ar_exclude.htm +56 -56
- data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/ar_include.htm +80 -83
- data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/ar_no.htm +52 -52
- data/ext/p7zip/DOC/MANUAL/cmdline/switches/bb.htm +61 -0
- data/ext/p7zip/DOC/MANUAL/cmdline/switches/bs.htm +67 -0
- data/ext/p7zip/DOC/MANUAL/cmdline/switches/charset.htm +61 -0
- data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/exclude.htm +71 -60
- data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/include.htm +89 -87
- data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/index.htm +95 -64
- data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/large_pages.htm +59 -50
- data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/list_tech.htm +36 -36
- data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/method.htm +738 -625
- data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/output_dir.htm +53 -53
- data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/overwrite.htm +56 -56
- data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/password.htm +55 -54
- data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/recurse.htm +85 -83
- data/ext/p7zip/DOC/MANUAL/cmdline/switches/sa.htm +58 -0
- data/ext/p7zip/DOC/MANUAL/cmdline/switches/scc.htm +42 -0
- data/ext/p7zip/DOC/MANUAL/cmdline/switches/scrc.htm +53 -0
- data/ext/p7zip/DOC/MANUAL/cmdline/switches/sdel.htm +39 -0
- data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/sfx.htm +153 -156
- data/ext/p7zip/DOC/MANUAL/cmdline/switches/shared.htm +40 -0
- data/ext/p7zip/DOC/MANUAL/cmdline/switches/sni.htm +56 -0
- data/ext/p7zip/DOC/MANUAL/cmdline/switches/sns.htm +77 -0
- data/ext/p7zip/DOC/MANUAL/cmdline/switches/spf.htm +80 -0
- data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/ssc.htm +50 -50
- data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/stdin.htm +56 -55
- data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/stdout.htm +54 -50
- data/ext/p7zip/DOC/MANUAL/cmdline/switches/stl.htm +39 -0
- data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/stop_switch.htm +31 -31
- data/ext/p7zip/DOC/MANUAL/cmdline/switches/stx.htm +50 -0
- data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline/switches}/style.css +232 -232
- data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/type.htm +121 -83
- data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/update.htm +177 -176
- data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/volume.htm +49 -49
- data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/working_dir.htm +56 -55
- data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/switches/yes.htm +48 -48
- data/ext/p7zip/{DOCS/MANUAL → DOC/MANUAL/cmdline}/syntax.htm +120 -120
- data/ext/p7zip/DOC/MANUAL/fm/about.htm +21 -0
- data/ext/p7zip/DOC/MANUAL/fm/benchmark.htm +56 -0
- data/ext/p7zip/DOC/MANUAL/fm/index.htm +54 -0
- data/ext/p7zip/DOC/MANUAL/fm/menu.htm +154 -0
- data/ext/p7zip/DOC/MANUAL/fm/options.htm +152 -0
- data/ext/p7zip/DOC/MANUAL/fm/plugins/7-zip/add.htm +311 -0
- data/ext/p7zip/DOC/MANUAL/fm/plugins/7-zip/extract.htm +78 -0
- data/ext/p7zip/DOC/MANUAL/fm/plugins/7-zip/index.htm +63 -0
- data/ext/p7zip/DOC/MANUAL/fm/plugins/7-zip/style.css +232 -0
- data/ext/p7zip/DOC/MANUAL/fm/plugins/index.htm +22 -0
- data/ext/p7zip/DOC/MANUAL/fm/plugins/style.css +232 -0
- data/ext/p7zip/DOC/MANUAL/fm/style.css +232 -0
- data/ext/p7zip/DOC/MANUAL/general/7z.htm +117 -0
- data/ext/p7zip/DOC/MANUAL/general/faq.htm +125 -0
- data/ext/p7zip/DOC/MANUAL/general/formats.htm +100 -0
- data/ext/p7zip/DOC/MANUAL/general/index.htm +27 -0
- data/ext/p7zip/DOC/MANUAL/general/license.htm +30 -0
- data/ext/p7zip/DOC/MANUAL/general/performance.htm +98 -0
- data/ext/p7zip/DOC/MANUAL/general/style.css +232 -0
- data/ext/p7zip/DOC/MANUAL/general/thanks.htm +43 -0
- data/ext/p7zip/DOC/MANUAL/start.htm +37 -0
- data/ext/p7zip/DOC/MANUAL/style.css +232 -0
- data/ext/p7zip/DOC/Methods.txt +158 -0
- data/ext/p7zip/{DOCS → DOC}/copying.txt +9 -11
- data/ext/p7zip/DOC/lzma.txt +328 -0
- data/ext/p7zip/{DOCS → DOC}/readme.txt +42 -65
- data/ext/p7zip/{DOCS/history.txt → DOC/src-history.txt} +88 -2
- data/ext/p7zip/README +117 -91
- data/ext/p7zip/TODO +0 -2
- data/ext/p7zip/install.sh +31 -29
- data/ext/p7zip/last_error +1 -0
- data/ext/p7zip/makefile +29 -125
- data/ext/p7zip/makefile.afl +23 -0
- data/ext/p7zip/makefile.aix_gcc +5 -4
- data/ext/p7zip/makefile.android_arm +49 -0
- data/ext/p7zip/makefile.beos +5 -4
- data/ext/p7zip/makefile.common +150 -0
- data/ext/p7zip/makefile.crc32 +3 -3
- data/ext/p7zip/makefile.cygwin +5 -4
- data/ext/p7zip/makefile.cygwin64 +21 -0
- data/ext/p7zip/makefile.cygwin64_asm +22 -0
- data/ext/p7zip/makefile.cygwin_asm +6 -4
- data/ext/p7zip/makefile.cygwin_clang +21 -0
- data/ext/p7zip/makefile.cygwin_clang_asm +23 -0
- data/ext/p7zip/{makefile.djgpp_old → makefile.djgpp} +5 -4
- data/ext/p7zip/makefile.djgpp_watt +7 -5
- data/ext/p7zip/makefile.freebsd5 +5 -4
- data/ext/p7zip/{makefile.freebsd6 → makefile.freebsd6+} +6 -5
- data/ext/p7zip/makefile.glb +27 -18
- data/ext/p7zip/makefile.gprof +3 -2
- data/ext/p7zip/makefile.haiku +19 -0
- data/ext/p7zip/makefile.hpux-acc +3 -2
- data/ext/p7zip/makefile.hpux-acc_64 +3 -2
- data/ext/p7zip/makefile.hpux-gcc +5 -4
- data/ext/p7zip/makefile.linux_amd64 +5 -4
- data/ext/p7zip/makefile.linux_amd64_asm +12 -5
- data/ext/p7zip/makefile.linux_amd64_asm_icc +5 -3
- data/ext/p7zip/makefile.linux_amd64_sanitizer +26 -0
- data/ext/p7zip/makefile.linux_any_cpu +5 -4
- data/ext/p7zip/makefile.linux_any_cpu_gcc_4.X +7 -4
- data/ext/p7zip/makefile.linux_clang_amd64_asm +25 -0
- data/ext/p7zip/makefile.linux_clang_amd64_asm_sanitize +27 -0
- data/ext/p7zip/makefile.linux_cross_aarch64 +25 -0
- data/ext/p7zip/makefile.linux_cross_arm +7 -4
- data/ext/p7zip/makefile.linux_cross_djgpp +27 -0
- data/ext/p7zip/makefile.linux_cross_m68k +26 -0
- data/ext/p7zip/makefile.linux_cross_mipsel +27 -0
- data/ext/p7zip/makefile.linux_cross_ppc +25 -0
- data/ext/p7zip/makefile.linux_cross_ppc64 +25 -0
- data/ext/p7zip/makefile.linux_cross_ppc64le +25 -0
- data/ext/p7zip/makefile.linux_cross_s390x +25 -0
- data/ext/p7zip/makefile.linux_cross_sparc64 +25 -0
- data/ext/p7zip/makefile.linux_gcc6_sanitize +23 -0
- data/ext/p7zip/makefile.linux_gcc_2.95_no_need_for_libstdc +6 -4
- data/ext/p7zip/makefile.linux_other +6 -5
- data/ext/p7zip/makefile.linux_s390x +5 -4
- data/ext/p7zip/{makefile.machine_base → makefile.linux_scan-build} +5 -4
- data/ext/p7zip/makefile.linux_valgrind +25 -0
- data/ext/p7zip/{makefile.linux_clang_amd64 → makefile.linux_x32} +6 -5
- data/ext/p7zip/makefile.linux_x86_asm_gcc_4.X +10 -5
- data/ext/p7zip/makefile.linux_x86_asm_gcc_4.X_fltk +8 -4
- data/ext/p7zip/makefile.linux_x86_asm_gcc_mudflap_4.X +4 -2
- data/ext/p7zip/makefile.linux_x86_asm_icc +4 -2
- data/ext/p7zip/makefile.linux_x86_icc +3 -2
- data/ext/p7zip/makefile.macosx_arm64 +17 -0
- data/ext/p7zip/{makefile.macosx_32bits → makefile.macosx_gcc_32bits} +3 -2
- data/ext/p7zip/{makefile.macosx_32bits_asm → makefile.macosx_gcc_32bits_asm} +5 -3
- data/ext/p7zip/{makefile.macosx_32bits_ppc → makefile.macosx_gcc_32bits_ppc} +3 -2
- data/ext/p7zip/{makefile.macosx_64bits → makefile.macosx_gcc_64bits} +3 -2
- data/ext/p7zip/makefile.macosx_llvm_64bits +9 -3
- data/ext/p7zip/makefile.netbsd +5 -4
- data/ext/p7zip/makefile.netware_asm_gcc_3.X +6 -4
- data/ext/p7zip/makefile.oldmake +41 -130
- data/ext/p7zip/makefile.openbsd +7 -3
- data/ext/p7zip/makefile.openbsd_no_port +9 -5
- data/ext/p7zip/makefile.qnx_shared.bin +5 -4
- data/ext/p7zip/makefile.qnx_static +5 -4
- data/ext/p7zip/makefile.solaris_sparc_CC_32 +5 -4
- data/ext/p7zip/makefile.solaris_sparc_CC_64 +6 -4
- data/ext/p7zip/makefile.solaris_sparc_gcc +7 -6
- data/ext/p7zip/makefile.solaris_x86 +5 -4
- data/ext/p7zip/makefile.tru64 +5 -4
- data/ext/seven_zip_ruby/extconf.rb +92 -6
- data/ext/seven_zip_ruby/seven_zip_archive.cpp +40 -17
- data/ext/seven_zip_ruby/seven_zip_archive.h +1 -1
- data/ext/seven_zip_ruby/utils.cpp +267 -124
- data/ext/seven_zip_ruby/utils.h +2 -0
- data/lib/seven_zip_ruby/7z.dll +0 -0
- data/lib/seven_zip_ruby/7z.sfx +0 -0
- data/lib/seven_zip_ruby/7z64.dll +0 -0
- data/lib/seven_zip_ruby/7zCon.sfx +0 -0
- data/lib/seven_zip_ruby/seven_zip_reader.rb +16 -1
- data/lib/seven_zip_ruby/version.rb +1 -1
- data/p7zip/.gitignore +7 -0
- data/p7zip/README.txt +29 -0
- data/p7zip/extract.sh +134 -0
- data/spec/seven_zip_ruby_spec.rb +22 -13
- data/test/res/The Flying Spaghetti Monster.txt +3 -0
- data/test/res/The Three Little Pigs.txt +5 -0
- data/test/res/UTF_content.txt +3 -0
- data/test/res/test_reader_data.7z +0 -0
- data/test/res/test_reader_filename_cp932.7z +0 -0
- data/test/res/test_reader_files.7z +0 -0
- data/test/test_seven_zip_reader.rb +187 -0
- data/test/test_seven_zip_writer.rb +184 -0
- metadata +267 -219
- data/.github/workflows/test-and-release.yml +0 -43
- data/ext/C/Types.h +0 -254
- data/ext/CPP/7zip/Archive/IArchive.h +0 -234
- data/ext/CPP/7zip/IDecl.h +0 -15
- data/ext/CPP/7zip/IPassword.h +0 -24
- data/ext/CPP/7zip/IProgress.h +0 -33
- data/ext/CPP/7zip/IStream.h +0 -58
- data/ext/CPP/7zip/PropID.h +0 -76
- data/ext/CPP/Common/MyCom.h +0 -225
- data/ext/CPP/Common/MyGuidDef.h +0 -54
- data/ext/CPP/Common/MyInitGuid.h +0 -22
- data/ext/CPP/Common/MyUnknown.h +0 -13
- data/ext/CPP/Common/MyWindows.h +0 -204
- data/ext/CPP/Common/Types.h +0 -11
- data/ext/CPP/Windows/PropVariant.h +0 -56
- data/ext/CPP/include_windows/basetyps.h +0 -19
- data/ext/CPP/include_windows/tchar.h +0 -89
- data/ext/CPP/include_windows/windows.h +0 -194
- data/ext/p7zip/Asm/x64/7zCrcT8U.asm +0 -103
- data/ext/p7zip/Asm/x86/7zCrcT8U.asm +0 -101
- data/ext/p7zip/C/7zCrcT8.c +0 -43
- data/ext/p7zip/C/Alloc.back3 +0 -238
- data/ext/p7zip/C/Alloc.c.back +0 -243
- data/ext/p7zip/C/Alloc.c.back2 +0 -222
- data/ext/p7zip/C/LzmaUtil/Lzma86Dec.h +0 -51
- data/ext/p7zip/CPP/7zip/Archive/7z/7zFolderOutStream.cpp +0 -149
- data/ext/p7zip/CPP/7zip/Archive/7z/7zFolderOutStream.h +0 -58
- data/ext/p7zip/CPP/7zip/Archive/Chm/ChmHeader.cpp +0 -24
- data/ext/p7zip/CPP/7zip/Archive/Chm/ChmHeader.h +0 -28
- data/ext/p7zip/CPP/7zip/Archive/Chm/ChmRegister.cpp +0 -13
- data/ext/p7zip/CPP/7zip/Archive/Com/ComHandler.cpp +0 -239
- data/ext/p7zip/CPP/7zip/Archive/Com/ComHandler.h +0 -28
- data/ext/p7zip/CPP/7zip/Archive/Com/ComIn.cpp +0 -389
- data/ext/p7zip/CPP/7zip/Archive/Com/ComIn.h +0 -119
- data/ext/p7zip/CPP/7zip/Archive/Com/ComRegister.cpp +0 -13
- data/ext/p7zip/CPP/7zip/Archive/Common/CoderMixer2MT.cpp +0 -240
- data/ext/p7zip/CPP/7zip/Archive/Common/CoderMixer2MT.h +0 -80
- data/ext/p7zip/CPP/7zip/Archive/Common/CoderMixer2ST.cpp +0 -239
- data/ext/p7zip/CPP/7zip/Archive/Common/CoderMixer2ST.h +0 -88
- data/ext/p7zip/CPP/7zip/Archive/Common/CrossThreadProgress.cpp +0 -15
- data/ext/p7zip/CPP/7zip/Archive/Common/CrossThreadProgress.h +0 -37
- data/ext/p7zip/CPP/7zip/Archive/DebHandler.cpp +0 -413
- data/ext/p7zip/CPP/7zip/Archive/Hfs/HfsHandler.cpp +0 -243
- data/ext/p7zip/CPP/7zip/Archive/Hfs/HfsHandler.h +0 -26
- data/ext/p7zip/CPP/7zip/Archive/Hfs/HfsIn.cpp +0 -480
- data/ext/p7zip/CPP/7zip/Archive/Hfs/HfsIn.h +0 -154
- data/ext/p7zip/CPP/7zip/Archive/Hfs/HfsRegister.cpp +0 -13
- data/ext/p7zip/CPP/7zip/Archive/Rar/RarHeader.cpp +0 -21
- data/ext/p7zip/CPP/7zip/Archive/Rar/RarIn.cpp +0 -478
- data/ext/p7zip/CPP/7zip/Archive/Rar/RarIn.h +0 -123
- data/ext/p7zip/CPP/7zip/Archive/Rar/RarItem.cpp +0 -55
- data/ext/p7zip/CPP/7zip/Archive/Rar/RarRegister.cpp +0 -13
- data/ext/p7zip/CPP/7zip/Archive/Rar/RarVolumeInStream.cpp +0 -78
- data/ext/p7zip/CPP/7zip/Archive/Rar/RarVolumeInStream.h +0 -49
- data/ext/p7zip/CPP/7zip/Archive/Udf/UdfRegister.cpp +0 -13
- data/ext/p7zip/CPP/7zip/Archive/Zip/ZipHeader.cpp +0 -36
- data/ext/p7zip/CPP/7zip/Archive/Zip/ZipItemEx.h +0 -34
- data/ext/p7zip/CPP/7zip/CMAKE/CMakeLists_7zFM.txt +0 -163
- data/ext/p7zip/CPP/7zip/CMAKE/CMakeLists_7zG.txt +0 -131
- data/ext/p7zip/CPP/7zip/CMAKE/CMakeLists_7za.txt +0 -253
- data/ext/p7zip/CPP/7zip/CMAKE/CMakeLists_ALL.txt +0 -32
- data/ext/p7zip/CPP/7zip/CMAKE/CMakeLists_Format7zFree.txt +0 -290
- data/ext/p7zip/CPP/7zip/CMAKE/generate.sh +0 -37
- data/ext/p7zip/CPP/7zip/CMAKE/generate_xcode.sh +0 -32
- data/ext/p7zip/CPP/7zip/Common/LockedStream.cpp +0 -23
- data/ext/p7zip/CPP/7zip/Common/LockedStream.h +0 -38
- data/ext/p7zip/CPP/7zip/Compress/ArjDecoder1.cpp +0 -309
- data/ext/p7zip/CPP/7zip/Compress/ArjDecoder1.h +0 -98
- data/ext/p7zip/CPP/7zip/Compress/ArjDecoder2.cpp +0 -90
- data/ext/p7zip/CPP/7zip/Compress/ArjDecoder2.h +0 -59
- data/ext/p7zip/CPP/7zip/Compress/BranchCoder.cpp +0 -19
- data/ext/p7zip/CPP/7zip/Compress/BranchCoder.h +0 -44
- data/ext/p7zip/CPP/7zip/Compress/DllExports.cpp +0 -39
- data/ext/p7zip/CPP/7zip/Compress/LZMA_Alone/LzmaAlone.cpp +0 -531
- data/ext/p7zip/CPP/7zip/Compress/LZMA_Alone/LzmaBench.cpp +0 -1018
- data/ext/p7zip/CPP/7zip/Compress/LZMA_Alone/LzmaBench.h +0 -48
- data/ext/p7zip/CPP/7zip/Compress/LZMA_Alone/LzmaBenchCon.cpp +0 -311
- data/ext/p7zip/CPP/7zip/Compress/LZMA_Alone/LzmaBenchCon.h +0 -20
- data/ext/p7zip/CPP/7zip/Compress/LZMA_Alone/makefile +0 -173
- data/ext/p7zip/CPP/7zip/Compress/Lzx86Converter.cpp +0 -90
- data/ext/p7zip/CPP/7zip/Compress/Lzx86Converter.h +0 -46
- data/ext/p7zip/CPP/7zip/Compress/RangeCoder.h +0 -205
- data/ext/p7zip/CPP/7zip/Compress/RangeCoderBit.h +0 -114
- data/ext/p7zip/CPP/7zip/Crypto/Sha1.cpp +0 -229
- data/ext/p7zip/CPP/7zip/Crypto/Sha1.h +0 -68
- data/ext/p7zip/CPP/7zip/PREMAKE/generate.sh +0 -18
- data/ext/p7zip/CPP/7zip/PREMAKE/premake4.lua +0 -263
- data/ext/p7zip/CPP/7zip/QMAKE/7ZA/7ZA.pro +0 -228
- data/ext/p7zip/CPP/7zip/QMAKE/7ZA/7ZA_osx.pro +0 -228
- data/ext/p7zip/CPP/7zip/QMAKE/test_emul/test_emul.pro +0 -26
- data/ext/p7zip/CPP/7zip/TEST/TestUI/TestUI.cpp +0 -560
- data/ext/p7zip/CPP/7zip/TEST/TestUI/makefile +0 -33
- data/ext/p7zip/CPP/7zip/TEST/TestUI/makefile.depend +0 -577
- data/ext/p7zip/CPP/7zip/TEST/TestUI/makefile.list +0 -16
- data/ext/p7zip/CPP/Common/Buffer.h +0 -77
- data/ext/p7zip/CPP/Common/Types.h +0 -11
- data/ext/p7zip/CPP/Windows/COM.cpp +0 -37
- data/ext/p7zip/CPP/Windows/COM.h +0 -69
- data/ext/p7zip/CPP/Windows/Clipboard.cpp +0 -160
- data/ext/p7zip/CPP/Windows/Clipboard.h +0 -28
- data/ext/p7zip/CPP/Windows/CommonDialog.h +0 -19
- data/ext/p7zip/CPP/Windows/Control/ComboBox.h +0 -82
- data/ext/p7zip/CPP/Windows/Control/Controls.cpp +0 -515
- data/ext/p7zip/CPP/Windows/Control/Dialog.cpp +0 -560
- data/ext/p7zip/CPP/Windows/Control/Dialog.h +0 -179
- data/ext/p7zip/CPP/Windows/Control/DialogImpl.h +0 -73
- data/ext/p7zip/CPP/Windows/Control/Edit.h +0 -24
- data/ext/p7zip/CPP/Windows/Control/ListView.h +0 -164
- data/ext/p7zip/CPP/Windows/Control/ProgressBar.h +0 -34
- data/ext/p7zip/CPP/Windows/Control/Static.h +0 -23
- data/ext/p7zip/CPP/Windows/Control/StatusBar.h +0 -56
- data/ext/p7zip/CPP/Windows/Control/Window2.cpp +0 -211
- data/ext/p7zip/CPP/Windows/Control/Window2.h +0 -111
- data/ext/p7zip/CPP/Windows/DLL.cpp +0 -193
- data/ext/p7zip/CPP/Windows/DLL.h +0 -48
- data/ext/p7zip/CPP/Windows/Error.cpp +0 -58
- data/ext/p7zip/CPP/Windows/Error.h +0 -33
- data/ext/p7zip/CPP/Windows/Menu.h +0 -4
- data/ext/p7zip/CPP/Windows/PropVariantConversions.cpp +0 -142
- data/ext/p7zip/CPP/Windows/PropVariantConversions.h +0 -14
- data/ext/p7zip/CPP/Windows/Registry.cpp +0 -313
- data/ext/p7zip/CPP/Windows/Registry.h +0 -113
- data/ext/p7zip/CPP/Windows/ResourceString.h +0 -22
- data/ext/p7zip/CPP/Windows/Shell.h +0 -21
- data/ext/p7zip/CPP/Windows/Time.cpp +0 -88
- data/ext/p7zip/CPP/Windows/Time.h +0 -21
- data/ext/p7zip/CPP/Windows/Window.cpp +0 -101
- data/ext/p7zip/CPP/Windows/Window.h +0 -43
- data/ext/p7zip/CPP/myWindows/initguid.h +0 -4
- data/ext/p7zip/CPP/myWindows/makefile +0 -21
- data/ext/p7zip/CPP/myWindows/makefile.depend +0 -32
- data/ext/p7zip/CPP/myWindows/makefile.list +0 -28
- data/ext/p7zip/CPP/myWindows/myAddExeFlag.cpp +0 -20
- data/ext/p7zip/CPP/myWindows/myGetTickCount.cpp +0 -8
- data/ext/p7zip/CPP/myWindows/mySplitCommandLine.cpp +0 -82
- data/ext/p7zip/CPP/myWindows/test_emul.cpp +0 -745
- data/ext/p7zip/CPP/myWindows/wine_GetXXXDefaultLangID.cpp +0 -741
- data/ext/p7zip/DOCS/MANUAL/switches/charset.htm +0 -49
- data/ext/p7zip/DOCS/Methods.txt +0 -152
- data/ext/p7zip/DOCS/lzma.txt +0 -598
- data/ext/p7zip/contrib/VirtualFileSystemForMidnightCommander/ChangeLog +0 -41
- data/ext/p7zip/contrib/VirtualFileSystemForMidnightCommander/readme +0 -21
- data/ext/p7zip/contrib/VirtualFileSystemForMidnightCommander/readme.u7z +0 -30
- data/ext/p7zip/contrib/VirtualFileSystemForMidnightCommander/u7z +0 -133
- data/ext/p7zip/contrib/gzip-like_CLI_wrapper_for_7z/README +0 -21
- data/ext/p7zip/contrib/gzip-like_CLI_wrapper_for_7z/check/check.sh +0 -117
- data/ext/p7zip/contrib/gzip-like_CLI_wrapper_for_7z/check/files.tar +0 -0
- data/ext/p7zip/contrib/gzip-like_CLI_wrapper_for_7z/man1/p7zip.1 +0 -33
- data/ext/p7zip/contrib/gzip-like_CLI_wrapper_for_7z/p7zip +0 -144
- data/ext/p7zip/contrib/qnx630sp3/qnx630sp3-shared +0 -14
- data/ext/p7zip/contrib/qnx630sp3/qnx630sp3-static +0 -10
- data/ext/p7zip/integration_context_menu.txt +0 -51
- data/ext/p7zip/makefile.rules +0 -661
- /data/ext/p7zip/{DOCS → DOC}/7zFormat.txt +0 -0
- /data/ext/p7zip/{DOCS → DOC}/unRarLicense.txt +0 -0
@@ -0,0 +1,1618 @@
|
|
1
|
+
// UefiHandler.cpp
|
2
|
+
|
3
|
+
#include "StdAfx.h"
|
4
|
+
|
5
|
+
// #define SHOW_DEBUG_INFO
|
6
|
+
|
7
|
+
#ifdef SHOW_DEBUG_INFO
|
8
|
+
#include <stdio.h>
|
9
|
+
#endif
|
10
|
+
|
11
|
+
#include "../../../C/7zCrc.h"
|
12
|
+
#include "../../../C/Alloc.h"
|
13
|
+
#include "../../../C/CpuArch.h"
|
14
|
+
#include "../../../C/LzmaDec.h"
|
15
|
+
|
16
|
+
#include "../../Common/ComTry.h"
|
17
|
+
#include "../../Common/IntToString.h"
|
18
|
+
#include "../../Common/MyBuffer.h"
|
19
|
+
#include "../../Common/StringConvert.h"
|
20
|
+
|
21
|
+
#include "../../Windows/PropVariantUtils.h"
|
22
|
+
|
23
|
+
#include "../Common/ProgressUtils.h"
|
24
|
+
#include "../Common/RegisterArc.h"
|
25
|
+
#include "../Common/StreamObjects.h"
|
26
|
+
#include "../Common/StreamUtils.h"
|
27
|
+
|
28
|
+
#include "../Compress/CopyCoder.h"
|
29
|
+
#include "../Compress/LzhDecoder.h"
|
30
|
+
|
31
|
+
#ifdef SHOW_DEBUG_INFO
|
32
|
+
#define PRF(x) x
|
33
|
+
#else
|
34
|
+
#define PRF(x)
|
35
|
+
#endif
|
36
|
+
|
37
|
+
#define Get16(p) GetUi16(p)
|
38
|
+
#define Get32(p) GetUi32(p)
|
39
|
+
#define Get64(p) GetUi64(p)
|
40
|
+
#define Get24(p) (Get32(p) & 0xFFFFFF)
|
41
|
+
|
42
|
+
namespace NArchive {
|
43
|
+
namespace NUefi {
|
44
|
+
|
45
|
+
static const size_t kBufTotalSizeMax = (1 << 29);
|
46
|
+
static const unsigned kNumFilesMax = (1 << 18);
|
47
|
+
static const unsigned kLevelMax = 64;
|
48
|
+
|
49
|
+
static const unsigned kFvHeaderSize = 0x38;
|
50
|
+
|
51
|
+
static const unsigned kGuidSize = 16;
|
52
|
+
#define CAPSULE_SIGNATURE \
|
53
|
+
{ 0xBD,0x86,0x66,0x3B,0x76,0x0D,0x30,0x40,0xB7,0x0E,0xB5,0x51,0x9E,0x2F,0xC5,0xA0 }
|
54
|
+
static const Byte kCapsuleSig[kGuidSize] = CAPSULE_SIGNATURE;
|
55
|
+
|
56
|
+
static const unsigned kFfsGuidOffset = 16;
|
57
|
+
#define FFS_SIGNATURE \
|
58
|
+
{ 0xD9,0x54,0x93,0x7A,0x68,0x04,0x4A,0x44,0x81,0xCE,0x0B,0xF6,0x17,0xD8,0x90,0xDF }
|
59
|
+
static const Byte k_FFS_Guid[kGuidSize] = FFS_SIGNATURE;
|
60
|
+
|
61
|
+
static const Byte k_MacFS_Guid[kGuidSize] =
|
62
|
+
{ 0xAD,0xEE,0xAD,0x04,0xFF,0x61,0x31,0x4D,0xB6,0xBA,0x64,0xF8,0xBF,0x90,0x1F,0x5A };
|
63
|
+
|
64
|
+
static const UInt32 kFvSignature = 0x4856465F; // "_FVH"
|
65
|
+
|
66
|
+
static const Byte kGuids[][kGuidSize] =
|
67
|
+
{
|
68
|
+
{ 0xB0,0xCD,0x1B,0xFC,0x31,0x7D,0xAA,0x49,0x93,0x6A,0xA4,0x60,0x0D,0x9D,0xD0,0x83 },
|
69
|
+
{ 0x2E,0x06,0xA0,0x1B,0x79,0xC7,0x82,0x45,0x85,0x66,0x33,0x6A,0xE8,0xF7,0x8F,0x09 },
|
70
|
+
{ 0x25,0x4E,0x37,0x7E,0x01,0x8E,0xEE,0x4F,0x87,0xf2,0x39,0x0C,0x23,0xC6,0x06,0xCD },
|
71
|
+
{ 0x97,0xE5,0x1B,0x16,0xC5,0xE9,0xDB,0x49,0xAE,0x50,0xC4,0x62,0xAB,0x54,0xEE,0xDA },
|
72
|
+
{ 0xDB,0x7F,0xAD,0x77,0x2A,0xDF,0x02,0x43,0x88,0x98,0xC7,0x2E,0x4C,0xDB,0xD0,0xF4 },
|
73
|
+
{ 0xAB,0x71,0xCF,0xF5,0x4B,0xB0,0x7E,0x4B,0x98,0x8A,0xD8,0xA0,0xD4,0x98,0xE6,0x92 },
|
74
|
+
{ 0x91,0x45,0x53,0x7A,0xCE,0x37,0x81,0x48,0xB3,0xC9,0x71,0x38,0x14,0xF4,0x5D,0x6B },
|
75
|
+
{ 0x84,0xE6,0x7A,0x36,0x5D,0x33,0x71,0x46,0xA1,0x6D,0x89,0x9D,0xBF,0xEA,0x6B,0x88 },
|
76
|
+
{ 0x98,0x07,0x40,0x24,0x07,0x38,0x42,0x4A,0xB4,0x13,0xA1,0xEC,0xEE,0x20,0x5D,0xD8 },
|
77
|
+
{ 0xEE,0xA2,0x3F,0x28,0x2C,0x53,0x4D,0x48,0x93,0x83,0x9F,0x93,0xB3,0x6F,0x0B,0x7E },
|
78
|
+
{ 0x9B,0xD5,0xB8,0x98,0xBA,0xE8,0xEE,0x48,0x98,0xDD,0xC2,0x95,0x39,0x2F,0x1E,0xDB },
|
79
|
+
{ 0x09,0x6D,0xE3,0xC3,0x94,0x82,0x97,0x4B,0xA8,0x57,0xD5,0x28,0x8F,0xE3,0x3E,0x28 },
|
80
|
+
{ 0x18,0x88,0x53,0x4A,0xE0,0x5A,0xB2,0x4E,0xB2,0xEB,0x48,0x8B,0x23,0x65,0x70,0x22 }
|
81
|
+
};
|
82
|
+
|
83
|
+
|
84
|
+
static const char * const kGuidNames[] =
|
85
|
+
{
|
86
|
+
"CRC"
|
87
|
+
, "VolumeTopFile"
|
88
|
+
, "ACPI"
|
89
|
+
, "ACPI2"
|
90
|
+
, "Main"
|
91
|
+
, "Intel32"
|
92
|
+
, "Intel64"
|
93
|
+
, "Intel32c"
|
94
|
+
, "Intel64c"
|
95
|
+
, "MacVolume"
|
96
|
+
, "MacUpdate.txt"
|
97
|
+
, "MacName"
|
98
|
+
, "Insyde"
|
99
|
+
};
|
100
|
+
|
101
|
+
enum
|
102
|
+
{
|
103
|
+
kGuidIndex_CRC = 0
|
104
|
+
};
|
105
|
+
|
106
|
+
struct CSigExtPair
|
107
|
+
{
|
108
|
+
const char *ext;
|
109
|
+
unsigned sigSize;
|
110
|
+
Byte sig[16];
|
111
|
+
};
|
112
|
+
|
113
|
+
static const CSigExtPair g_Sigs[] =
|
114
|
+
{
|
115
|
+
{ "bmp", 2, { 'B','M' } },
|
116
|
+
{ "riff", 4, { 'R','I','F','F' } },
|
117
|
+
{ "pe", 2, { 'M','Z'} },
|
118
|
+
{ "gif", 6, { 'G','I','F','8','9', 'a' } },
|
119
|
+
{ "png", 8, { 0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A } },
|
120
|
+
{ "jpg", 10, { 0xFF,0xD8,0xFF,0xE0,0x00,0x10,0x4A,0x46,0x49,0x46 } },
|
121
|
+
{ "rom", 2, { 0x55,0xAA } }
|
122
|
+
};
|
123
|
+
|
124
|
+
enum
|
125
|
+
{
|
126
|
+
kSig_BMP,
|
127
|
+
kSig_RIFF,
|
128
|
+
kSig_PE
|
129
|
+
};
|
130
|
+
|
131
|
+
static const char *FindExt(const Byte *p, size_t size)
|
132
|
+
{
|
133
|
+
unsigned i;
|
134
|
+
for (i = 0; i < ARRAY_SIZE(g_Sigs); i++)
|
135
|
+
{
|
136
|
+
const CSigExtPair &pair = g_Sigs[i];
|
137
|
+
if (size >= pair.sigSize)
|
138
|
+
if (memcmp(p, pair.sig, pair.sigSize) == 0)
|
139
|
+
break;
|
140
|
+
}
|
141
|
+
if (i == ARRAY_SIZE(g_Sigs))
|
142
|
+
return NULL;
|
143
|
+
switch (i)
|
144
|
+
{
|
145
|
+
case kSig_BMP:
|
146
|
+
if (GetUi32(p + 2) > size || GetUi32(p + 0xA) > size)
|
147
|
+
return NULL;
|
148
|
+
break;
|
149
|
+
case kSig_RIFF:
|
150
|
+
if (GetUi32(p + 8) == 0x45564157 || GetUi32(p + 0xC) == 0x20746D66 )
|
151
|
+
return "wav";
|
152
|
+
break;
|
153
|
+
case kSig_PE:
|
154
|
+
{
|
155
|
+
if (size < 512)
|
156
|
+
return NULL;
|
157
|
+
UInt32 peOffset = GetUi32(p + 0x3C);
|
158
|
+
if (peOffset >= 0x1000 || peOffset + 512 > size || (peOffset & 7) != 0)
|
159
|
+
return NULL;
|
160
|
+
if (GetUi32(p + peOffset) != 0x00004550)
|
161
|
+
return NULL;
|
162
|
+
break;
|
163
|
+
}
|
164
|
+
}
|
165
|
+
return g_Sigs[i].ext;
|
166
|
+
}
|
167
|
+
|
168
|
+
static bool AreGuidsEq(const Byte *p1, const Byte *p2)
|
169
|
+
{
|
170
|
+
return memcmp(p1, p2, kGuidSize) == 0;
|
171
|
+
}
|
172
|
+
|
173
|
+
static int FindGuid(const Byte *p)
|
174
|
+
{
|
175
|
+
for (unsigned i = 0; i < ARRAY_SIZE(kGuids); i++)
|
176
|
+
if (AreGuidsEq(p, kGuids[i]))
|
177
|
+
return i;
|
178
|
+
return -1;
|
179
|
+
}
|
180
|
+
|
181
|
+
static bool IsFfs(const Byte *p)
|
182
|
+
{
|
183
|
+
return (Get32(p + 0x28) == kFvSignature && AreGuidsEq(p + kFfsGuidOffset, k_FFS_Guid));
|
184
|
+
}
|
185
|
+
|
186
|
+
#define FVB_ERASE_POLARITY (1 << 11)
|
187
|
+
|
188
|
+
/*
|
189
|
+
static const CUInt32PCharPair g_FV_Attribs[] =
|
190
|
+
{
|
191
|
+
{ 0, "ReadDisabledCap" },
|
192
|
+
{ 1, "ReadEnabledCap" },
|
193
|
+
{ 2, "ReadEnabled" },
|
194
|
+
{ 3, "WriteDisabledCap" },
|
195
|
+
{ 4, "WriteEnabledCap" },
|
196
|
+
{ 5, "WriteEnabled" },
|
197
|
+
{ 6, "LockCap" },
|
198
|
+
{ 7, "Locked" },
|
199
|
+
|
200
|
+
{ 9, "StickyWrite" },
|
201
|
+
{ 10, "MemoryMapped" },
|
202
|
+
{ 11, "ErasePolarity" },
|
203
|
+
|
204
|
+
{ 12, "ReadLockCap" },
|
205
|
+
{ 13, "WriteLockCap" },
|
206
|
+
{ 14, "WriteLockCap" }
|
207
|
+
};
|
208
|
+
*/
|
209
|
+
|
210
|
+
enum
|
211
|
+
{
|
212
|
+
FV_FILETYPE_ALL,
|
213
|
+
FV_FILETYPE_RAW,
|
214
|
+
FV_FILETYPE_FREEFORM,
|
215
|
+
FV_FILETYPE_SECURITY_CORE,
|
216
|
+
FV_FILETYPE_PEI_CORE,
|
217
|
+
FV_FILETYPE_DXE_CORE,
|
218
|
+
FV_FILETYPE_PEIM,
|
219
|
+
FV_FILETYPE_DRIVER,
|
220
|
+
FV_FILETYPE_COMBINED_PEIM_DRIVER,
|
221
|
+
FV_FILETYPE_APPLICATION,
|
222
|
+
// The value 0x0A is reserved and should not be used
|
223
|
+
FV_FILETYPE_FIRMWARE_VOLUME_IMAGE = 0x0B,
|
224
|
+
// types 0xF0 - 0xFF are FFS file types
|
225
|
+
FV_FILETYPE_FFS_PAD = 0xF0
|
226
|
+
};
|
227
|
+
|
228
|
+
static const char *g_FileTypes[] =
|
229
|
+
{
|
230
|
+
"ALL"
|
231
|
+
, "RAW"
|
232
|
+
, "FREEFORM"
|
233
|
+
, "SECURITY_CORE"
|
234
|
+
, "PEI_CORE"
|
235
|
+
, "DXE_CORE"
|
236
|
+
, "PEIM"
|
237
|
+
, "DRIVER"
|
238
|
+
, "COMBINED_PEIM_DRIVER"
|
239
|
+
, "APPLICATION"
|
240
|
+
, "0xA"
|
241
|
+
, "VOLUME"
|
242
|
+
};
|
243
|
+
|
244
|
+
// typedef Byte FFS_FILE_ATTRIBUTES;
|
245
|
+
// FFS File Attributes
|
246
|
+
#define FFS_ATTRIB_TAIL_PRESENT 0x01
|
247
|
+
// #define FFS_ATTRIB_RECOVERY 0x02
|
248
|
+
// #define FFS_ATTRIB_HEADER_EXTENSION 0x04
|
249
|
+
// #define FFS_ATTRIB_DATA_ALIGNMENT 0x38
|
250
|
+
#define FFS_ATTRIB_CHECKSUM 0x40
|
251
|
+
|
252
|
+
static const CUInt32PCharPair g_FFS_FILE_ATTRIBUTES[] =
|
253
|
+
{
|
254
|
+
{ 0, "" /* "TAIL" */ },
|
255
|
+
{ 1, "RECOVERY" },
|
256
|
+
// { 2, "HEADER_EXTENSION" }, // reserved for future
|
257
|
+
{ 6, "" /* "CHECKSUM" */ }
|
258
|
+
};
|
259
|
+
|
260
|
+
// static const Byte g_Allignment[8] = { 3, 4, 7, 9, 10, 12, 15, 16 };
|
261
|
+
|
262
|
+
// typedef Byte FFS_FILE_STATE;
|
263
|
+
|
264
|
+
// Look also FVB_ERASE_POLARITY.
|
265
|
+
// Lower-order State bits are superceded by higher-order State bits.
|
266
|
+
|
267
|
+
// #define FILE_HEADER_CONSTRUCTION 0x01
|
268
|
+
// #define FILE_HEADER_VALID 0x02
|
269
|
+
#define FILE_DATA_VALID 0x04
|
270
|
+
// #define FILE_MARKED_FOR_UPDATE 0x08
|
271
|
+
// #define FILE_DELETED 0x10
|
272
|
+
// #define FILE_HEADER_INVALID 0x20
|
273
|
+
|
274
|
+
// SECTION_TYPE
|
275
|
+
|
276
|
+
#define SECTION_ALL 0x00
|
277
|
+
|
278
|
+
#define SECTION_COMPRESSION 0x01
|
279
|
+
#define SECTION_GUID_DEFINED 0x02
|
280
|
+
|
281
|
+
// Leaf section Type values
|
282
|
+
#define SECTION_PE32 0x10
|
283
|
+
#define SECTION_PIC 0x11
|
284
|
+
#define SECTION_TE 0x12
|
285
|
+
#define SECTION_DXE_DEPEX 0x13
|
286
|
+
#define SECTION_VERSION 0x14
|
287
|
+
#define SECTION_USER_INTERFACE 0x15
|
288
|
+
#define SECTION_COMPATIBILITY16 0x16
|
289
|
+
#define SECTION_FIRMWARE_VOLUME_IMAGE 0x17
|
290
|
+
#define SECTION_FREEFORM_SUBTYPE_GUID 0x18
|
291
|
+
#define SECTION_RAW 0x19
|
292
|
+
#define SECTION_PEI_DEPEX 0x1B
|
293
|
+
|
294
|
+
|
295
|
+
// #define GUIDED_SECTION_PROCESSING_REQUIRED 0x01
|
296
|
+
// #define GUIDED_SECTION_AUTH_STATUS_VALID 0x02
|
297
|
+
|
298
|
+
static const CUInt32PCharPair g_GUIDED_SECTION_ATTRIBUTES[] =
|
299
|
+
{
|
300
|
+
{ 0, "PROCESSING_REQUIRED" },
|
301
|
+
{ 1, "AUTH" }
|
302
|
+
};
|
303
|
+
|
304
|
+
static const CUInt32PCharPair g_SECTION_TYPE[] =
|
305
|
+
{
|
306
|
+
{ 0x01, "COMPRESSION" },
|
307
|
+
{ 0x02, "GUID" },
|
308
|
+
{ 0x10, "efi" },
|
309
|
+
{ 0x11, "PIC" },
|
310
|
+
{ 0x12, "te" },
|
311
|
+
{ 0x13, "DXE_DEPEX" },
|
312
|
+
{ 0x14, "VERSION" },
|
313
|
+
{ 0x15, "USER_INTERFACE" },
|
314
|
+
{ 0x16, "COMPATIBILITY16" },
|
315
|
+
{ 0x17, "VOLUME" },
|
316
|
+
{ 0x18, "FREEFORM_SUBTYPE_GUID" },
|
317
|
+
{ 0x19, "raw" },
|
318
|
+
{ 0x1B, "PEI_DEPEX" }
|
319
|
+
};
|
320
|
+
|
321
|
+
#define COMPRESSION_TYPE_NONE 0
|
322
|
+
#define COMPRESSION_TYPE_LZH 1
|
323
|
+
#define COMPRESSION_TYPE_LZMA 2
|
324
|
+
|
325
|
+
static const char * const g_Methods[] =
|
326
|
+
{
|
327
|
+
"COPY"
|
328
|
+
, "LZH"
|
329
|
+
, "LZMA"
|
330
|
+
};
|
331
|
+
|
332
|
+
static AString UInt32ToString(UInt32 val)
|
333
|
+
{
|
334
|
+
char sz[16];
|
335
|
+
ConvertUInt32ToString(val, sz);
|
336
|
+
return sz;
|
337
|
+
}
|
338
|
+
|
339
|
+
static void ConvertByteToHex(unsigned value, char *s)
|
340
|
+
{
|
341
|
+
for (int i = 0; i < 2; i++)
|
342
|
+
{
|
343
|
+
unsigned t = value & 0xF;
|
344
|
+
value >>= 4;
|
345
|
+
s[1 - i] = (char)((t < 10) ? ('0' + t) : ('A' + (t - 10)));
|
346
|
+
}
|
347
|
+
}
|
348
|
+
|
349
|
+
static AString GuidToString(const Byte *p, bool full)
|
350
|
+
{
|
351
|
+
char s[16 * 2 + 8];
|
352
|
+
int i;
|
353
|
+
for (i = 0; i < 4; i++)
|
354
|
+
ConvertByteToHex(p[3 - i], s + i * 2);
|
355
|
+
s[8] = 0;
|
356
|
+
|
357
|
+
if (full)
|
358
|
+
{
|
359
|
+
s[8] = '-';
|
360
|
+
for (i = 4; i < kGuidSize; i++)
|
361
|
+
ConvertByteToHex(p[i], s + 1 + i * 2);
|
362
|
+
s[32 + 1] = 0;
|
363
|
+
}
|
364
|
+
return s;
|
365
|
+
}
|
366
|
+
|
367
|
+
static const char * const kExpressionCommands[] =
|
368
|
+
{
|
369
|
+
"BEFORE", "AFTER", "PUSH", "AND", "OR", "NOT", "TRUE", "FALSE", "END", "SOR"
|
370
|
+
};
|
371
|
+
|
372
|
+
static bool ParseDepedencyExpression(const Byte *p, UInt32 size, AString &res)
|
373
|
+
{
|
374
|
+
res.Empty();
|
375
|
+
for (UInt32 i = 0; i < size;)
|
376
|
+
{
|
377
|
+
unsigned command = p[i++];
|
378
|
+
if (command > ARRAY_SIZE(kExpressionCommands))
|
379
|
+
return false;
|
380
|
+
res += kExpressionCommands[command];
|
381
|
+
if (command < 3)
|
382
|
+
{
|
383
|
+
if (i + kGuidSize > size)
|
384
|
+
return false;
|
385
|
+
res.Add_Space();
|
386
|
+
res += GuidToString(p + i, false);
|
387
|
+
i += kGuidSize;
|
388
|
+
}
|
389
|
+
res += "; ";
|
390
|
+
}
|
391
|
+
return true;
|
392
|
+
}
|
393
|
+
|
394
|
+
static bool ParseUtf16zString(const Byte *p, UInt32 size, UString &res)
|
395
|
+
{
|
396
|
+
if ((size & 1) != 0)
|
397
|
+
return false;
|
398
|
+
res.Empty();
|
399
|
+
UInt32 i;
|
400
|
+
for (i = 0; i < size; i += 2)
|
401
|
+
{
|
402
|
+
wchar_t c = Get16(p + i);
|
403
|
+
if (c == 0)
|
404
|
+
break;
|
405
|
+
res += c;
|
406
|
+
}
|
407
|
+
return (i == size - 2);
|
408
|
+
}
|
409
|
+
|
410
|
+
static bool ParseUtf16zString2(const Byte *p, UInt32 size, AString &res)
|
411
|
+
{
|
412
|
+
UString s;
|
413
|
+
if (!ParseUtf16zString(p, size, s))
|
414
|
+
return false;
|
415
|
+
res = UnicodeStringToMultiByte(s);
|
416
|
+
return true;
|
417
|
+
}
|
418
|
+
|
419
|
+
#define FLAGS_TO_STRING(pairs, value) FlagsToString(pairs, ARRAY_SIZE(pairs), value)
|
420
|
+
#define TYPE_TO_STRING(table, value) TypeToString(table, ARRAY_SIZE(table), value)
|
421
|
+
#define TYPE_PAIR_TO_STRING(table, value) TypePairToString(table, ARRAY_SIZE(table), value)
|
422
|
+
|
423
|
+
static const UInt32 kFileHeaderSize = 24;
|
424
|
+
|
425
|
+
static void AddSpaceAndString(AString &res, const AString &newString)
|
426
|
+
{
|
427
|
+
if (!newString.IsEmpty())
|
428
|
+
{
|
429
|
+
res.Add_Space_if_NotEmpty();
|
430
|
+
res += newString;
|
431
|
+
}
|
432
|
+
}
|
433
|
+
|
434
|
+
class CFfsFileHeader
|
435
|
+
{
|
436
|
+
Byte CheckHeader;
|
437
|
+
Byte CheckFile;
|
438
|
+
Byte Attrib;
|
439
|
+
Byte State;
|
440
|
+
|
441
|
+
UInt16 GetTailReference() const { return (UInt16)(CheckHeader | ((UInt16)CheckFile << 8)); }
|
442
|
+
UInt32 GetTailSize() const { return IsThereTail() ? 2 : 0; }
|
443
|
+
bool IsThereFileChecksum() const { return (Attrib & FFS_ATTRIB_CHECKSUM) != 0; }
|
444
|
+
bool IsThereTail() const { return (Attrib & FFS_ATTRIB_TAIL_PRESENT) != 0; }
|
445
|
+
public:
|
446
|
+
Byte GuidName[kGuidSize];
|
447
|
+
Byte Type;
|
448
|
+
UInt32 Size;
|
449
|
+
|
450
|
+
bool Parse(const Byte *p)
|
451
|
+
{
|
452
|
+
int i;
|
453
|
+
for (i = 0; i < kFileHeaderSize; i++)
|
454
|
+
if (p[i] != 0xFF)
|
455
|
+
break;
|
456
|
+
if (i == kFileHeaderSize)
|
457
|
+
return false;
|
458
|
+
memcpy(GuidName, p, kGuidSize);
|
459
|
+
CheckHeader = p[0x10];
|
460
|
+
CheckFile = p[0x11];
|
461
|
+
Type = p[0x12];
|
462
|
+
Attrib = p[0x13];
|
463
|
+
Size = Get24(p + 0x14);
|
464
|
+
State = p[0x17];
|
465
|
+
return true;
|
466
|
+
}
|
467
|
+
|
468
|
+
UInt32 GetDataSize() const { return Size - kFileHeaderSize - GetTailSize(); }
|
469
|
+
UInt32 GetDataSize2(UInt32 rem) const { return rem - kFileHeaderSize - GetTailSize(); }
|
470
|
+
|
471
|
+
bool Check(const Byte *p, UInt32 size)
|
472
|
+
{
|
473
|
+
if (Size > size)
|
474
|
+
return false;
|
475
|
+
UInt32 tailSize = GetTailSize();
|
476
|
+
if (Size < kFileHeaderSize + tailSize)
|
477
|
+
return false;
|
478
|
+
|
479
|
+
{
|
480
|
+
unsigned checkSum = 0;
|
481
|
+
for (UInt32 i = 0; i < kFileHeaderSize; i++)
|
482
|
+
checkSum += p[i];
|
483
|
+
checkSum -= p[0x17];
|
484
|
+
checkSum -= p[0x11];
|
485
|
+
if ((Byte)checkSum != 0)
|
486
|
+
return false;
|
487
|
+
}
|
488
|
+
|
489
|
+
if (IsThereFileChecksum())
|
490
|
+
{
|
491
|
+
unsigned checkSum = 0;
|
492
|
+
UInt32 checkSize = Size - tailSize;
|
493
|
+
for (UInt32 i = 0; i < checkSize; i++)
|
494
|
+
checkSum += p[i];
|
495
|
+
checkSum -= p[0x17];
|
496
|
+
if ((Byte)checkSum != 0)
|
497
|
+
return false;
|
498
|
+
}
|
499
|
+
|
500
|
+
if (IsThereTail())
|
501
|
+
if (GetTailReference() != (UInt16)~Get16(p + Size - 2))
|
502
|
+
return false;
|
503
|
+
|
504
|
+
int polarity = 0;
|
505
|
+
int i;
|
506
|
+
for (i = 5; i >= 0; i--)
|
507
|
+
if (((State >> i) & 1) == polarity)
|
508
|
+
{
|
509
|
+
// AddSpaceAndString(s, g_FFS_FILE_STATE_Flags[i]);
|
510
|
+
if ((1 << i) != FILE_DATA_VALID)
|
511
|
+
return false;
|
512
|
+
break;
|
513
|
+
}
|
514
|
+
if (i < 0)
|
515
|
+
return false;
|
516
|
+
|
517
|
+
return true;
|
518
|
+
}
|
519
|
+
|
520
|
+
AString GetCharacts() const
|
521
|
+
{
|
522
|
+
AString s;
|
523
|
+
if (Type == FV_FILETYPE_FFS_PAD)
|
524
|
+
s += "PAD";
|
525
|
+
else
|
526
|
+
s += TYPE_TO_STRING(g_FileTypes, Type);
|
527
|
+
AddSpaceAndString(s, FLAGS_TO_STRING(g_FFS_FILE_ATTRIBUTES, Attrib & 0xC7));
|
528
|
+
/*
|
529
|
+
int align = (Attrib >> 3) & 7;
|
530
|
+
if (align != 0)
|
531
|
+
{
|
532
|
+
s += " Align:";
|
533
|
+
s += UInt32ToString((UInt32)1 << g_Allignment[align]);
|
534
|
+
}
|
535
|
+
*/
|
536
|
+
return s;
|
537
|
+
}
|
538
|
+
};
|
539
|
+
|
540
|
+
#define G32(_offs_, dest) dest = Get32(p + (_offs_));
|
541
|
+
|
542
|
+
struct CCapsuleHeader
|
543
|
+
{
|
544
|
+
UInt32 HeaderSize;
|
545
|
+
UInt32 Flags;
|
546
|
+
UInt32 CapsuleImageSize;
|
547
|
+
UInt32 SequenceNumber;
|
548
|
+
// Guid InstanceId;
|
549
|
+
UInt32 OffsetToSplitInformation;
|
550
|
+
UInt32 OffsetToCapsuleBody;
|
551
|
+
UInt32 OffsetToOemDefinedHeader;
|
552
|
+
UInt32 OffsetToAuthorInformation;
|
553
|
+
UInt32 OffsetToRevisionInformation;
|
554
|
+
UInt32 OffsetToShortDescription;
|
555
|
+
UInt32 OffsetToLongDescription;
|
556
|
+
UInt32 OffsetToApplicableDevices;
|
557
|
+
|
558
|
+
void Clear() { memset(this, 0, sizeof(*this)); }
|
559
|
+
|
560
|
+
void Parse(const Byte *p)
|
561
|
+
{
|
562
|
+
G32(0x10, HeaderSize);
|
563
|
+
G32(0x14, Flags);
|
564
|
+
G32(0x18, CapsuleImageSize);
|
565
|
+
G32(0x1C, SequenceNumber);
|
566
|
+
G32(0x30, OffsetToSplitInformation);
|
567
|
+
G32(0x34, OffsetToCapsuleBody);
|
568
|
+
G32(0x38, OffsetToOemDefinedHeader);
|
569
|
+
G32(0x3C, OffsetToAuthorInformation);
|
570
|
+
G32(0x40, OffsetToRevisionInformation);
|
571
|
+
G32(0x44, OffsetToShortDescription);
|
572
|
+
G32(0x48, OffsetToLongDescription);
|
573
|
+
G32(0x4C, OffsetToApplicableDevices);
|
574
|
+
}
|
575
|
+
};
|
576
|
+
|
577
|
+
struct CItem
|
578
|
+
{
|
579
|
+
AString Name;
|
580
|
+
AString Characts;
|
581
|
+
int Parent;
|
582
|
+
int Method;
|
583
|
+
int NameIndex;
|
584
|
+
int NumChilds;
|
585
|
+
bool IsDir;
|
586
|
+
bool Skip;
|
587
|
+
bool ThereAreSubDirs;
|
588
|
+
bool ThereIsUniqueName;
|
589
|
+
bool KeepName;
|
590
|
+
|
591
|
+
int BufIndex;
|
592
|
+
UInt32 Offset;
|
593
|
+
UInt32 Size;
|
594
|
+
|
595
|
+
CItem(): Parent(-1), Method(-1), NameIndex(-1), NumChilds(0),
|
596
|
+
IsDir(false), Skip(false), ThereAreSubDirs(false), ThereIsUniqueName(false), KeepName(true) {}
|
597
|
+
void SetGuid(const Byte *guidName, bool full = false);
|
598
|
+
AString GetName(int numChildsInParent) const;
|
599
|
+
};
|
600
|
+
|
601
|
+
void CItem::SetGuid(const Byte *guidName, bool full)
|
602
|
+
{
|
603
|
+
ThereIsUniqueName = true;
|
604
|
+
int index = FindGuid(guidName);
|
605
|
+
if (index >= 0)
|
606
|
+
Name = kGuidNames[(unsigned)index];
|
607
|
+
else
|
608
|
+
Name = GuidToString(guidName, full);
|
609
|
+
}
|
610
|
+
|
611
|
+
AString CItem::GetName(int numChildsInParent) const
|
612
|
+
{
|
613
|
+
if (numChildsInParent <= 1 || NameIndex < 0)
|
614
|
+
return Name;
|
615
|
+
char sz[32];
|
616
|
+
char sz2[32];
|
617
|
+
ConvertUInt32ToString(NameIndex, sz);
|
618
|
+
ConvertUInt32ToString(numChildsInParent - 1, sz2);
|
619
|
+
unsigned numZeros = (unsigned)strlen(sz2) - (unsigned)strlen(sz);
|
620
|
+
AString res;
|
621
|
+
for (unsigned i = 0; i < numZeros; i++)
|
622
|
+
res += '0';
|
623
|
+
return res + (AString)sz + '.' + Name;
|
624
|
+
}
|
625
|
+
|
626
|
+
struct CItem2
|
627
|
+
{
|
628
|
+
AString Name;
|
629
|
+
AString Characts;
|
630
|
+
int MainIndex;
|
631
|
+
int Parent;
|
632
|
+
|
633
|
+
CItem2(): Parent(-1) {}
|
634
|
+
};
|
635
|
+
|
636
|
+
class CHandler:
|
637
|
+
public IInArchive,
|
638
|
+
public IInArchiveGetStream,
|
639
|
+
public CMyUnknownImp
|
640
|
+
{
|
641
|
+
CObjectVector<CItem> _items;
|
642
|
+
CObjectVector<CItem2> _items2;
|
643
|
+
CObjectVector<CByteBuffer> _bufs;
|
644
|
+
UString _comment;
|
645
|
+
UInt32 _methodsMask;
|
646
|
+
bool _capsuleMode;
|
647
|
+
|
648
|
+
size_t _totalBufsSize;
|
649
|
+
CCapsuleHeader _h;
|
650
|
+
UInt64 _phySize;
|
651
|
+
|
652
|
+
void AddCommentString(const wchar_t *name, UInt32 pos);
|
653
|
+
int AddItem(const CItem &item);
|
654
|
+
int AddFileItemWithIndex(CItem &item);
|
655
|
+
int AddDirItem(CItem &item);
|
656
|
+
unsigned AddBuf(size_t size);
|
657
|
+
|
658
|
+
HRESULT ParseSections(int bufIndex, UInt32 pos, UInt32 size, int parent, int method, unsigned level);
|
659
|
+
HRESULT ParseVolume(int bufIndex, UInt32 posBase,
|
660
|
+
UInt32 exactSize, UInt32 limitSize,
|
661
|
+
int parent, int method, int level);
|
662
|
+
HRESULT OpenCapsule(IInStream *stream);
|
663
|
+
HRESULT OpenFv(IInStream *stream, const UInt64 *maxCheckStartPosition, IArchiveOpenCallback *callback);
|
664
|
+
HRESULT Open2(IInStream *stream, const UInt64 *maxCheckStartPosition, IArchiveOpenCallback *callback);
|
665
|
+
public:
|
666
|
+
CHandler(bool capsuleMode): _capsuleMode(capsuleMode) {}
|
667
|
+
MY_UNKNOWN_IMP2(IInArchive, IInArchiveGetStream)
|
668
|
+
INTERFACE_IInArchive(;)
|
669
|
+
STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);
|
670
|
+
};
|
671
|
+
|
672
|
+
static const Byte kProps[] =
|
673
|
+
{
|
674
|
+
kpidPath,
|
675
|
+
kpidIsDir,
|
676
|
+
kpidSize,
|
677
|
+
kpidMethod,
|
678
|
+
kpidCharacts
|
679
|
+
};
|
680
|
+
|
681
|
+
static const Byte kArcProps[] =
|
682
|
+
{
|
683
|
+
kpidComment,
|
684
|
+
kpidMethod,
|
685
|
+
kpidCharacts
|
686
|
+
};
|
687
|
+
|
688
|
+
IMP_IInArchive_Props
|
689
|
+
IMP_IInArchive_ArcProps
|
690
|
+
|
691
|
+
STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
|
692
|
+
{
|
693
|
+
COM_TRY_BEGIN
|
694
|
+
NWindows::NCOM::CPropVariant prop;
|
695
|
+
const CItem2 &item2 = _items2[index];
|
696
|
+
const CItem &item = _items[item2.MainIndex];
|
697
|
+
switch (propID)
|
698
|
+
{
|
699
|
+
case kpidPath:
|
700
|
+
{
|
701
|
+
AString path = item2.Name;
|
702
|
+
int cur = item2.Parent;
|
703
|
+
while (cur >= 0)
|
704
|
+
{
|
705
|
+
const CItem2 &item3 = _items2[cur];
|
706
|
+
path.InsertAtFront(CHAR_PATH_SEPARATOR);
|
707
|
+
path.Insert(0, item3.Name);
|
708
|
+
cur = item3.Parent;
|
709
|
+
}
|
710
|
+
prop = path;
|
711
|
+
break;
|
712
|
+
}
|
713
|
+
case kpidIsDir: prop = item.IsDir; break;
|
714
|
+
case kpidMethod: if (item.Method >= 0) prop = g_Methods[(unsigned)item.Method]; break;
|
715
|
+
case kpidCharacts: if (!item2.Characts.IsEmpty()) prop = item2.Characts; break;
|
716
|
+
case kpidSize: if (!item.IsDir) prop = (UInt64)item.Size; break;
|
717
|
+
}
|
718
|
+
prop.Detach(value);
|
719
|
+
return S_OK;
|
720
|
+
COM_TRY_END
|
721
|
+
}
|
722
|
+
|
723
|
+
void CHandler::AddCommentString(const wchar_t *name, UInt32 pos)
|
724
|
+
{
|
725
|
+
UString s;
|
726
|
+
const Byte *buf = _bufs[0];
|
727
|
+
if (pos < _h.HeaderSize)
|
728
|
+
return;
|
729
|
+
for (UInt32 i = pos;; i += 2)
|
730
|
+
{
|
731
|
+
if (s.Len() > (1 << 16) || i >= _h.OffsetToCapsuleBody)
|
732
|
+
return;
|
733
|
+
wchar_t c = Get16(buf + i);
|
734
|
+
if (c == 0)
|
735
|
+
{
|
736
|
+
i += 2;
|
737
|
+
if (i >= _h.OffsetToCapsuleBody)
|
738
|
+
return;
|
739
|
+
c = Get16(buf + i);
|
740
|
+
if (c == 0)
|
741
|
+
break;
|
742
|
+
s.Add_LF();
|
743
|
+
}
|
744
|
+
s += c;
|
745
|
+
}
|
746
|
+
if (s.IsEmpty())
|
747
|
+
return;
|
748
|
+
_comment.Add_LF();
|
749
|
+
_comment += name;
|
750
|
+
_comment.AddAscii(": ");
|
751
|
+
_comment += s;
|
752
|
+
}
|
753
|
+
|
754
|
+
STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
|
755
|
+
{
|
756
|
+
COM_TRY_BEGIN
|
757
|
+
NWindows::NCOM::CPropVariant prop;
|
758
|
+
switch (propID)
|
759
|
+
{
|
760
|
+
case kpidMethod:
|
761
|
+
{
|
762
|
+
AString s;
|
763
|
+
for (unsigned i = 0; i < 32; i++)
|
764
|
+
if ((_methodsMask & ((UInt32)1 << i)) != 0)
|
765
|
+
AddSpaceAndString(s, g_Methods[i]);
|
766
|
+
if (!s.IsEmpty())
|
767
|
+
prop = s;
|
768
|
+
break;
|
769
|
+
}
|
770
|
+
case kpidComment: if (!_comment.IsEmpty()) prop = _comment; break;
|
771
|
+
case kpidPhySize: prop = (UInt64)_phySize; break;
|
772
|
+
}
|
773
|
+
prop.Detach(value);
|
774
|
+
return S_OK;
|
775
|
+
COM_TRY_END
|
776
|
+
}
|
777
|
+
|
778
|
+
#ifdef SHOW_DEBUG_INFO
|
779
|
+
static void PrintLevel(int level)
|
780
|
+
{
|
781
|
+
PRF(printf("\n"));
|
782
|
+
for (int i = 0; i < level; i++)
|
783
|
+
PRF(printf(" "));
|
784
|
+
}
|
785
|
+
static void MyPrint(UInt32 posBase, UInt32 size, int level, const char *name)
|
786
|
+
{
|
787
|
+
PrintLevel(level);
|
788
|
+
PRF(printf("%s, pos = %6x, size = %6d", name, posBase, size));
|
789
|
+
}
|
790
|
+
#else
|
791
|
+
#define PrintLevel(level)
|
792
|
+
#define MyPrint(posBase, size, level, name)
|
793
|
+
#endif
|
794
|
+
|
795
|
+
|
796
|
+
|
797
|
+
int CHandler::AddItem(const CItem &item)
|
798
|
+
{
|
799
|
+
if (_items.Size() >= kNumFilesMax)
|
800
|
+
throw 2;
|
801
|
+
return _items.Add(item);
|
802
|
+
}
|
803
|
+
|
804
|
+
int CHandler::AddFileItemWithIndex(CItem &item)
|
805
|
+
{
|
806
|
+
int nameIndex = _items.Size();
|
807
|
+
if (item.Parent >= 0)
|
808
|
+
nameIndex = _items[item.Parent].NumChilds++;
|
809
|
+
item.NameIndex = nameIndex;
|
810
|
+
return AddItem(item);
|
811
|
+
}
|
812
|
+
|
813
|
+
int CHandler::AddDirItem(CItem &item)
|
814
|
+
{
|
815
|
+
if (item.Parent >= 0)
|
816
|
+
_items[item.Parent].ThereAreSubDirs = true;
|
817
|
+
item.IsDir = true;
|
818
|
+
item.Size = 0;
|
819
|
+
return AddItem(item);
|
820
|
+
}
|
821
|
+
|
822
|
+
unsigned CHandler::AddBuf(size_t size)
|
823
|
+
{
|
824
|
+
if (size > kBufTotalSizeMax - _totalBufsSize)
|
825
|
+
throw 1;
|
826
|
+
_totalBufsSize += size;
|
827
|
+
unsigned index = _bufs.Size();
|
828
|
+
_bufs.AddNew().Alloc(size);
|
829
|
+
return index;
|
830
|
+
}
|
831
|
+
|
832
|
+
HRESULT CHandler::ParseSections(int bufIndex, UInt32 posBase, UInt32 size, int parent, int method, unsigned level)
|
833
|
+
{
|
834
|
+
if (level > kLevelMax)
|
835
|
+
return S_FALSE;
|
836
|
+
MyPrint(posBase, size, level, "Sections");
|
837
|
+
level++;
|
838
|
+
const Byte *bufData = _bufs[bufIndex];
|
839
|
+
UInt32 pos = 0;
|
840
|
+
for (;;)
|
841
|
+
{
|
842
|
+
if (size == pos)
|
843
|
+
return S_OK;
|
844
|
+
PrintLevel(level);
|
845
|
+
PRF(printf("%s, pos = %6x", "Sect", pos));
|
846
|
+
pos = (pos + 3) & ~(UInt32)3;
|
847
|
+
if (pos > size)
|
848
|
+
return S_FALSE;
|
849
|
+
UInt32 rem = size - pos;
|
850
|
+
if (rem == 0)
|
851
|
+
return S_OK;
|
852
|
+
if (rem < 4)
|
853
|
+
return S_FALSE;
|
854
|
+
const Byte *p = bufData + posBase + pos;
|
855
|
+
UInt32 sectSize = Get24(p);
|
856
|
+
if (sectSize > rem || sectSize < 4)
|
857
|
+
return S_FALSE;
|
858
|
+
|
859
|
+
Byte type = p[3];
|
860
|
+
PrintLevel(level);
|
861
|
+
PRF(printf("%s, type = %2x, pos = %6x, size = %6d", "Sect", type, pos, sectSize));
|
862
|
+
CItem item;
|
863
|
+
item.Method = method;
|
864
|
+
item.BufIndex = bufIndex;
|
865
|
+
item.Parent = parent;
|
866
|
+
item.Offset = posBase + pos + 4;
|
867
|
+
UInt32 sectDataSize = sectSize - 4;
|
868
|
+
item.Size = sectDataSize;
|
869
|
+
item.Name = TYPE_PAIR_TO_STRING(g_SECTION_TYPE, type);
|
870
|
+
|
871
|
+
if (type == SECTION_COMPRESSION)
|
872
|
+
{
|
873
|
+
if (sectSize < 4 + 5)
|
874
|
+
return S_FALSE;
|
875
|
+
UInt32 uncompressedSize = Get32(p + 4);
|
876
|
+
Byte compressionType = p[8];
|
877
|
+
|
878
|
+
UInt32 newSectSize = sectSize - 9;
|
879
|
+
UInt32 newOffset = posBase + pos + 9;
|
880
|
+
const Byte *pStart = p + 9;
|
881
|
+
|
882
|
+
item.KeepName = false;
|
883
|
+
if (compressionType > 2)
|
884
|
+
{
|
885
|
+
// AddFileItemWithIndex(item);
|
886
|
+
return S_FALSE;
|
887
|
+
}
|
888
|
+
else
|
889
|
+
{
|
890
|
+
item.Name = g_Methods[compressionType];
|
891
|
+
// int parent = AddDirItem(item);
|
892
|
+
if (compressionType == COMPRESSION_TYPE_NONE)
|
893
|
+
{
|
894
|
+
RINOK(ParseSections(bufIndex, newOffset, newSectSize, parent, method, level));
|
895
|
+
}
|
896
|
+
else if (compressionType == COMPRESSION_TYPE_LZH)
|
897
|
+
{
|
898
|
+
unsigned newBufIndex = AddBuf(uncompressedSize);
|
899
|
+
CByteBuffer &buf = _bufs[newBufIndex];
|
900
|
+
|
901
|
+
NCompress::NLzh::NDecoder::CCoder *lzhDecoderSpec = 0;
|
902
|
+
CMyComPtr<ICompressCoder> lzhDecoder;
|
903
|
+
|
904
|
+
lzhDecoderSpec = new NCompress::NLzh::NDecoder::CCoder;
|
905
|
+
lzhDecoder = lzhDecoderSpec;
|
906
|
+
|
907
|
+
{
|
908
|
+
const Byte *src = pStart;
|
909
|
+
if (newSectSize < 8)
|
910
|
+
return S_FALSE;
|
911
|
+
UInt32 packSize = Get32(src);
|
912
|
+
UInt32 unpackSize = Get32(src + 4);
|
913
|
+
if (uncompressedSize != unpackSize || newSectSize - 8 != packSize)
|
914
|
+
return S_FALSE;
|
915
|
+
if (packSize < 1)
|
916
|
+
return S_FALSE;
|
917
|
+
packSize--;
|
918
|
+
src += 8;
|
919
|
+
if (src[packSize] != 0)
|
920
|
+
return S_FALSE;
|
921
|
+
|
922
|
+
CBufInStream *inStreamSpec = new CBufInStream;
|
923
|
+
CMyComPtr<IInStream> inStream = inStreamSpec;
|
924
|
+
inStreamSpec->Init(src, packSize);
|
925
|
+
|
926
|
+
CBufPtrSeqOutStream *outStreamSpec = new CBufPtrSeqOutStream;
|
927
|
+
CMyComPtr<ISequentialOutStream> outStream = outStreamSpec;
|
928
|
+
outStreamSpec->Init(buf, uncompressedSize);
|
929
|
+
|
930
|
+
UInt64 uncompressedSize64 = uncompressedSize;
|
931
|
+
lzhDecoderSpec->FinishMode = true;
|
932
|
+
/*
|
933
|
+
EFI 1.1 probably used small dictionary and (pbit = 4) in LZH. We don't support such archives.
|
934
|
+
New version of compression code (named Tiano) uses LZH with (1 << 19) dictionary.
|
935
|
+
But maybe LZH decoder in UEFI decoder supports larger than (1 << 19) dictionary.
|
936
|
+
*/
|
937
|
+
lzhDecoderSpec->SetDictSize(1 << 19);
|
938
|
+
|
939
|
+
HRESULT res = lzhDecoder->Code(inStream, outStream, NULL, &uncompressedSize64, NULL);
|
940
|
+
if (res != S_OK)
|
941
|
+
return res;
|
942
|
+
|
943
|
+
if (lzhDecoderSpec->GetInputProcessedSize() != packSize)
|
944
|
+
return S_FALSE;
|
945
|
+
}
|
946
|
+
|
947
|
+
RINOK(ParseSections(newBufIndex, 0, uncompressedSize, parent, compressionType, level));
|
948
|
+
}
|
949
|
+
else
|
950
|
+
{
|
951
|
+
if (newSectSize < 4 + 5 + 8)
|
952
|
+
return S_FALSE;
|
953
|
+
unsigned addSize = 4;
|
954
|
+
if (pStart[0] == 0x5d && pStart[1] == 0 && pStart[2] == 0 && pStart[3] == 0x80 && pStart[4] == 0)
|
955
|
+
{
|
956
|
+
addSize = 0;
|
957
|
+
// some archives have such header
|
958
|
+
}
|
959
|
+
else
|
960
|
+
{
|
961
|
+
// normal BIOS contains uncompressed size here
|
962
|
+
// UInt32 uncompressedSize2 = Get24(pStart);
|
963
|
+
// Byte firstSectType = p[9 + 3];
|
964
|
+
// firstSectType can be 0 in some archives
|
965
|
+
}
|
966
|
+
pStart += addSize;
|
967
|
+
UInt64 lzmaUncompressedSize = Get64(pStart + 5);
|
968
|
+
if (lzmaUncompressedSize > (1 << 30))
|
969
|
+
return S_FALSE;
|
970
|
+
if (lzmaUncompressedSize < uncompressedSize)
|
971
|
+
return S_FALSE;
|
972
|
+
SizeT destLen = (SizeT)lzmaUncompressedSize;
|
973
|
+
unsigned newBufIndex = AddBuf((size_t)lzmaUncompressedSize);
|
974
|
+
CByteBuffer &buf = _bufs[newBufIndex];
|
975
|
+
ELzmaStatus status;
|
976
|
+
SizeT srcLen = newSectSize - (addSize + 5 + 8);
|
977
|
+
SizeT srcLen2 = srcLen;
|
978
|
+
SRes res = LzmaDecode(buf, &destLen, pStart + 13, &srcLen,
|
979
|
+
pStart, 5, LZMA_FINISH_END, &status, &g_Alloc);
|
980
|
+
if (res != 0)
|
981
|
+
return S_FALSE;
|
982
|
+
if (srcLen != srcLen2 || destLen != lzmaUncompressedSize || (
|
983
|
+
status != LZMA_STATUS_FINISHED_WITH_MARK &&
|
984
|
+
status != LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK))
|
985
|
+
return S_FALSE;
|
986
|
+
RINOK(ParseSections(newBufIndex, 0, (UInt32)lzmaUncompressedSize, parent, compressionType, level));
|
987
|
+
}
|
988
|
+
_methodsMask |= (1 << compressionType);
|
989
|
+
}
|
990
|
+
}
|
991
|
+
else if (type == SECTION_GUID_DEFINED)
|
992
|
+
{
|
993
|
+
const unsigned kHeaderSize = 4 + kGuidSize + 4;
|
994
|
+
if (sectSize < kHeaderSize)
|
995
|
+
return S_FALSE;
|
996
|
+
item.SetGuid(p + 4);
|
997
|
+
UInt32 dataOffset = Get16(p + 4 + kGuidSize);
|
998
|
+
UInt32 attrib = Get16(p + 4 + kGuidSize + 2);
|
999
|
+
if (dataOffset > sectSize || dataOffset < kHeaderSize)
|
1000
|
+
return S_FALSE;
|
1001
|
+
UInt32 newSectSize = sectSize - dataOffset;
|
1002
|
+
item.Size = newSectSize;
|
1003
|
+
UInt32 newOffset = posBase + pos + dataOffset;
|
1004
|
+
item.Offset = newOffset;
|
1005
|
+
UInt32 propsSize = dataOffset - kHeaderSize;
|
1006
|
+
bool needDir = true;
|
1007
|
+
AddSpaceAndString(item.Characts, FLAGS_TO_STRING(g_GUIDED_SECTION_ATTRIBUTES, attrib));
|
1008
|
+
if (AreGuidsEq(p + 0x4, kGuids[kGuidIndex_CRC]) && propsSize == 4)
|
1009
|
+
{
|
1010
|
+
needDir = false;
|
1011
|
+
item.KeepName = false;
|
1012
|
+
if (CrcCalc(bufData + newOffset, newSectSize) != Get32(p + kHeaderSize))
|
1013
|
+
return S_FALSE;
|
1014
|
+
}
|
1015
|
+
else
|
1016
|
+
{
|
1017
|
+
if (propsSize != 0)
|
1018
|
+
{
|
1019
|
+
CItem item2 = item;
|
1020
|
+
item2.Name += ".prop";
|
1021
|
+
item2.Size = propsSize;
|
1022
|
+
item2.Offset = posBase + pos + kHeaderSize;
|
1023
|
+
AddItem(item2);
|
1024
|
+
}
|
1025
|
+
}
|
1026
|
+
int newParent = parent;
|
1027
|
+
if (needDir)
|
1028
|
+
newParent = AddDirItem(item);
|
1029
|
+
RINOK(ParseSections(bufIndex, newOffset, newSectSize, newParent, method, level));
|
1030
|
+
}
|
1031
|
+
else if (type == SECTION_FIRMWARE_VOLUME_IMAGE)
|
1032
|
+
{
|
1033
|
+
item.KeepName = false;
|
1034
|
+
int newParent = AddDirItem(item);
|
1035
|
+
RINOK(ParseVolume(bufIndex, posBase + pos + 4,
|
1036
|
+
sectSize - 4,
|
1037
|
+
sectSize - 4,
|
1038
|
+
newParent, method, level));
|
1039
|
+
}
|
1040
|
+
else
|
1041
|
+
{
|
1042
|
+
bool needAdd = true;
|
1043
|
+
switch (type)
|
1044
|
+
{
|
1045
|
+
case SECTION_RAW:
|
1046
|
+
{
|
1047
|
+
const UInt32 kInsydeOffset = 12;
|
1048
|
+
if (sectDataSize >= kFvHeaderSize + kInsydeOffset)
|
1049
|
+
{
|
1050
|
+
if (IsFfs(p + 4 + kInsydeOffset) &&
|
1051
|
+
sectDataSize - kInsydeOffset == Get64(p + 4 + kInsydeOffset + 0x20))
|
1052
|
+
{
|
1053
|
+
needAdd = false;
|
1054
|
+
item.Name = "vol";
|
1055
|
+
int newParent = AddDirItem(item);
|
1056
|
+
RINOK(ParseVolume(bufIndex, posBase + pos + 4 + kInsydeOffset,
|
1057
|
+
sectDataSize - kInsydeOffset,
|
1058
|
+
sectDataSize - kInsydeOffset,
|
1059
|
+
newParent, method, level));
|
1060
|
+
}
|
1061
|
+
|
1062
|
+
if (needAdd)
|
1063
|
+
{
|
1064
|
+
const char *ext = FindExt(p + 4, sectDataSize);
|
1065
|
+
if (ext)
|
1066
|
+
item.Name = ext;
|
1067
|
+
}
|
1068
|
+
}
|
1069
|
+
break;
|
1070
|
+
}
|
1071
|
+
case SECTION_DXE_DEPEX:
|
1072
|
+
case SECTION_PEI_DEPEX:
|
1073
|
+
{
|
1074
|
+
AString s;
|
1075
|
+
if (ParseDepedencyExpression(p + 4, sectDataSize, s))
|
1076
|
+
{
|
1077
|
+
if (s.Len() < (1 << 9))
|
1078
|
+
{
|
1079
|
+
s.InsertAtFront('[');
|
1080
|
+
s += ']';
|
1081
|
+
AddSpaceAndString(_items[item.Parent].Characts, s);
|
1082
|
+
needAdd = false;
|
1083
|
+
}
|
1084
|
+
else
|
1085
|
+
{
|
1086
|
+
item.BufIndex = AddBuf(s.Len());
|
1087
|
+
CByteBuffer &buf0 = _bufs[item.BufIndex];
|
1088
|
+
if (s.Len() != 0)
|
1089
|
+
memcpy(buf0, s, s.Len());
|
1090
|
+
item.Offset = 0;
|
1091
|
+
item.Size = s.Len();
|
1092
|
+
}
|
1093
|
+
}
|
1094
|
+
break;
|
1095
|
+
}
|
1096
|
+
case SECTION_VERSION:
|
1097
|
+
{
|
1098
|
+
if (sectDataSize > 2)
|
1099
|
+
{
|
1100
|
+
AString s;
|
1101
|
+
if (ParseUtf16zString2(p + 6, sectDataSize - 2, s))
|
1102
|
+
{
|
1103
|
+
AString s2 = "ver:";
|
1104
|
+
s2 += UInt32ToString(Get16(p + 4));
|
1105
|
+
s2.Add_Space();
|
1106
|
+
s2 += s;
|
1107
|
+
AddSpaceAndString(_items[item.Parent].Characts, s2);
|
1108
|
+
needAdd = false;
|
1109
|
+
}
|
1110
|
+
}
|
1111
|
+
break;
|
1112
|
+
}
|
1113
|
+
case SECTION_USER_INTERFACE:
|
1114
|
+
{
|
1115
|
+
AString s;
|
1116
|
+
if (ParseUtf16zString2(p + 4, sectDataSize, s))
|
1117
|
+
{
|
1118
|
+
_items[parent].Name = s;
|
1119
|
+
needAdd = false;
|
1120
|
+
}
|
1121
|
+
break;
|
1122
|
+
}
|
1123
|
+
case SECTION_FREEFORM_SUBTYPE_GUID:
|
1124
|
+
{
|
1125
|
+
if (sectDataSize >= kGuidSize)
|
1126
|
+
{
|
1127
|
+
item.SetGuid(p + 4);
|
1128
|
+
item.Size = sectDataSize - kGuidSize;
|
1129
|
+
item.Offset = posBase + pos + 4 + kGuidSize;
|
1130
|
+
}
|
1131
|
+
break;
|
1132
|
+
}
|
1133
|
+
}
|
1134
|
+
|
1135
|
+
if (needAdd)
|
1136
|
+
AddFileItemWithIndex(item);
|
1137
|
+
}
|
1138
|
+
pos += sectSize;
|
1139
|
+
}
|
1140
|
+
}
|
1141
|
+
|
1142
|
+
static UInt32 Count_FF_Bytes(const Byte *p, UInt32 size)
|
1143
|
+
{
|
1144
|
+
UInt32 i;
|
1145
|
+
for (i = 0; i < size && p[i] == 0xFF; i++);
|
1146
|
+
return i;
|
1147
|
+
}
|
1148
|
+
|
1149
|
+
static bool Is_FF_Stream(const Byte *p, UInt32 size)
|
1150
|
+
{
|
1151
|
+
return (Count_FF_Bytes(p, size) == size);
|
1152
|
+
}
|
1153
|
+
|
1154
|
+
struct CVolFfsHeader
|
1155
|
+
{
|
1156
|
+
UInt32 HeaderLen;
|
1157
|
+
UInt64 VolSize;
|
1158
|
+
|
1159
|
+
bool Parse(const Byte *p);
|
1160
|
+
};
|
1161
|
+
|
1162
|
+
bool CVolFfsHeader::Parse(const Byte *p)
|
1163
|
+
{
|
1164
|
+
if (Get32(p + 0x28) != kFvSignature)
|
1165
|
+
return false;
|
1166
|
+
|
1167
|
+
UInt32 attribs = Get32(p + 0x2C);
|
1168
|
+
if ((attribs & FVB_ERASE_POLARITY) == 0)
|
1169
|
+
return false;
|
1170
|
+
VolSize = Get64(p + 0x20);
|
1171
|
+
HeaderLen = Get16(p + 0x30);
|
1172
|
+
if (HeaderLen < kFvHeaderSize || (HeaderLen & 0x7) != 0 || VolSize < HeaderLen)
|
1173
|
+
return false;
|
1174
|
+
return true;
|
1175
|
+
};
|
1176
|
+
|
1177
|
+
HRESULT CHandler::ParseVolume(
|
1178
|
+
int bufIndex, UInt32 posBase,
|
1179
|
+
UInt32 exactSize, UInt32 limitSize,
|
1180
|
+
int parent, int method, int level)
|
1181
|
+
{
|
1182
|
+
if (level > kLevelMax)
|
1183
|
+
return S_FALSE;
|
1184
|
+
MyPrint(posBase, size, level, "Volume");
|
1185
|
+
level++;
|
1186
|
+
if (exactSize < kFvHeaderSize)
|
1187
|
+
return S_FALSE;
|
1188
|
+
const Byte *p = _bufs[bufIndex] + posBase;
|
1189
|
+
// first 16 bytes must be zeros, but they are not zeros sometimes.
|
1190
|
+
if (!AreGuidsEq(p + kFfsGuidOffset, k_FFS_Guid) &&
|
1191
|
+
!AreGuidsEq(p + kFfsGuidOffset, k_MacFS_Guid))
|
1192
|
+
{
|
1193
|
+
CItem item;
|
1194
|
+
item.Method = method;
|
1195
|
+
item.BufIndex = bufIndex;
|
1196
|
+
item.Parent = parent;
|
1197
|
+
item.Offset = posBase;
|
1198
|
+
item.Size = exactSize;
|
1199
|
+
item.SetGuid(p + kFfsGuidOffset);
|
1200
|
+
item.Name += " [VOLUME]";
|
1201
|
+
AddItem(item);
|
1202
|
+
return S_OK;
|
1203
|
+
}
|
1204
|
+
|
1205
|
+
CVolFfsHeader ffsHeader;
|
1206
|
+
if (!ffsHeader.Parse(p))
|
1207
|
+
return S_FALSE;
|
1208
|
+
// if (parent >= 0) AddSpaceAndString(_items[parent].Characts, FLAGS_TO_STRING(g_FV_Attribs, attribs));
|
1209
|
+
|
1210
|
+
// VolSize > exactSize (fh.Size) for some UEFI archives (is it correct UEFI?)
|
1211
|
+
// so we check VolSize for limitSize instead.
|
1212
|
+
|
1213
|
+
if (ffsHeader.HeaderLen > limitSize || ffsHeader.VolSize > limitSize)
|
1214
|
+
return S_FALSE;
|
1215
|
+
|
1216
|
+
{
|
1217
|
+
UInt32 checkCalc = 0;
|
1218
|
+
for (UInt32 i = 0; i < ffsHeader.HeaderLen; i += 2)
|
1219
|
+
checkCalc += Get16(p + i);
|
1220
|
+
if ((checkCalc & 0xFFFF) != 0)
|
1221
|
+
return S_FALSE;
|
1222
|
+
}
|
1223
|
+
|
1224
|
+
// 3 reserved bytes are not zeros sometimes.
|
1225
|
+
// UInt16 ExtHeaderOffset; // in new SPECIFICATION?
|
1226
|
+
// Byte revision = p[0x37];
|
1227
|
+
|
1228
|
+
UInt32 pos = kFvHeaderSize;
|
1229
|
+
for (;;)
|
1230
|
+
{
|
1231
|
+
if (pos >= ffsHeader.HeaderLen)
|
1232
|
+
return S_FALSE;
|
1233
|
+
UInt32 numBlocks = Get32(p + pos);
|
1234
|
+
UInt32 length = Get32(p + pos + 4);
|
1235
|
+
pos += 8;
|
1236
|
+
if (numBlocks == 0 && length == 0)
|
1237
|
+
break;
|
1238
|
+
}
|
1239
|
+
if (pos != ffsHeader.HeaderLen)
|
1240
|
+
return S_FALSE;
|
1241
|
+
|
1242
|
+
CRecordVector<UInt32> guidsVector;
|
1243
|
+
|
1244
|
+
for (;;)
|
1245
|
+
{
|
1246
|
+
UInt32 rem = (UInt32)ffsHeader.VolSize - pos;
|
1247
|
+
if (rem < kFileHeaderSize)
|
1248
|
+
break;
|
1249
|
+
pos = (pos + 7) & ~7;
|
1250
|
+
rem = (UInt32)ffsHeader.VolSize - pos;
|
1251
|
+
if (rem < kFileHeaderSize)
|
1252
|
+
break;
|
1253
|
+
|
1254
|
+
CItem item;
|
1255
|
+
item.Method = method;
|
1256
|
+
item.BufIndex = bufIndex;
|
1257
|
+
item.Parent = parent;
|
1258
|
+
|
1259
|
+
const Byte *pFile = p + pos;
|
1260
|
+
CFfsFileHeader fh;
|
1261
|
+
if (!fh.Parse(pFile))
|
1262
|
+
{
|
1263
|
+
UInt32 num_FF_bytes = Count_FF_Bytes(pFile, rem);
|
1264
|
+
if (num_FF_bytes != rem)
|
1265
|
+
{
|
1266
|
+
item.Name = "[junk]";
|
1267
|
+
item.Offset = posBase + pos + num_FF_bytes;
|
1268
|
+
item.Size = rem - num_FF_bytes;
|
1269
|
+
AddItem(item);
|
1270
|
+
}
|
1271
|
+
break;
|
1272
|
+
}
|
1273
|
+
PrintLevel(level); PRF(printf("%s, pos = %6x, size = %6d", "FILE", posBase + pos, fh.Size));
|
1274
|
+
if (!fh.Check(pFile, rem))
|
1275
|
+
return S_FALSE;
|
1276
|
+
|
1277
|
+
UInt32 offset = posBase + pos + kFileHeaderSize;
|
1278
|
+
UInt32 sectSize = fh.GetDataSize();
|
1279
|
+
item.Offset = offset;
|
1280
|
+
item.Size = sectSize;
|
1281
|
+
|
1282
|
+
pos += fh.Size;
|
1283
|
+
|
1284
|
+
if (fh.Type == FV_FILETYPE_FFS_PAD)
|
1285
|
+
if (Is_FF_Stream(pFile + kFileHeaderSize, sectSize))
|
1286
|
+
continue;
|
1287
|
+
|
1288
|
+
UInt32 guid32 = Get32(fh.GuidName);
|
1289
|
+
bool full = true;
|
1290
|
+
if (guidsVector.FindInSorted(guid32) < 0)
|
1291
|
+
{
|
1292
|
+
guidsVector.AddToUniqueSorted(guid32);
|
1293
|
+
full = false;
|
1294
|
+
}
|
1295
|
+
item.SetGuid(fh.GuidName, full);
|
1296
|
+
|
1297
|
+
item.Characts = fh.GetCharacts();
|
1298
|
+
PrintLevel(level);
|
1299
|
+
PRF(printf("%s", item.Characts));
|
1300
|
+
|
1301
|
+
if (fh.Type == FV_FILETYPE_FFS_PAD ||
|
1302
|
+
fh.Type == FV_FILETYPE_RAW)
|
1303
|
+
{
|
1304
|
+
bool isVolume = false;
|
1305
|
+
if (fh.Type == FV_FILETYPE_RAW)
|
1306
|
+
{
|
1307
|
+
if (sectSize >= kFvHeaderSize)
|
1308
|
+
if (IsFfs(pFile + kFileHeaderSize))
|
1309
|
+
isVolume = true;
|
1310
|
+
}
|
1311
|
+
if (isVolume)
|
1312
|
+
{
|
1313
|
+
int newParent = AddDirItem(item);
|
1314
|
+
UInt32 limSize = fh.GetDataSize2(rem);
|
1315
|
+
// volume.VolSize > fh.Size for some UEFI archives (is it correct UEFI?)
|
1316
|
+
// so we will check VolSize for limitSize instead.
|
1317
|
+
RINOK(ParseVolume(bufIndex, offset, sectSize, limSize, newParent, method, level));
|
1318
|
+
}
|
1319
|
+
else
|
1320
|
+
AddItem(item);
|
1321
|
+
}
|
1322
|
+
else
|
1323
|
+
{
|
1324
|
+
int newParent = AddDirItem(item);
|
1325
|
+
RINOK(ParseSections(bufIndex, offset, sectSize, newParent, method, level));
|
1326
|
+
}
|
1327
|
+
}
|
1328
|
+
return S_OK;
|
1329
|
+
}
|
1330
|
+
|
1331
|
+
HRESULT CHandler::OpenCapsule(IInStream *stream)
|
1332
|
+
{
|
1333
|
+
const unsigned kHeaderSize = 80;
|
1334
|
+
Byte buf[kHeaderSize];
|
1335
|
+
RINOK(ReadStream_FALSE(stream, buf, kHeaderSize));
|
1336
|
+
_h.Parse(buf);
|
1337
|
+
if (_h.HeaderSize != kHeaderSize ||
|
1338
|
+
_h.CapsuleImageSize < kHeaderSize ||
|
1339
|
+
_h.OffsetToCapsuleBody < kHeaderSize ||
|
1340
|
+
_h.OffsetToCapsuleBody > _h.CapsuleImageSize)
|
1341
|
+
return S_FALSE;
|
1342
|
+
_phySize = _h.CapsuleImageSize;
|
1343
|
+
|
1344
|
+
if (_h.SequenceNumber != 0 ||
|
1345
|
+
_h.OffsetToSplitInformation != 0 )
|
1346
|
+
return E_NOTIMPL;
|
1347
|
+
|
1348
|
+
unsigned bufIndex = AddBuf(_h.CapsuleImageSize);
|
1349
|
+
CByteBuffer &buf0 = _bufs[bufIndex];
|
1350
|
+
memcpy(buf0, buf, kHeaderSize);
|
1351
|
+
ReadStream_FALSE(stream, buf0 + kHeaderSize, _h.CapsuleImageSize - kHeaderSize);
|
1352
|
+
|
1353
|
+
AddCommentString(L"Author", _h.OffsetToAuthorInformation);
|
1354
|
+
AddCommentString(L"Revision", _h.OffsetToRevisionInformation);
|
1355
|
+
AddCommentString(L"Short Description", _h.OffsetToShortDescription);
|
1356
|
+
AddCommentString(L"Long Description", _h.OffsetToLongDescription);
|
1357
|
+
|
1358
|
+
return ParseVolume(bufIndex, _h.OffsetToCapsuleBody,
|
1359
|
+
_h.CapsuleImageSize - _h.OffsetToCapsuleBody,
|
1360
|
+
_h.CapsuleImageSize - _h.OffsetToCapsuleBody,
|
1361
|
+
-1, -1, 0);
|
1362
|
+
}
|
1363
|
+
|
1364
|
+
HRESULT CHandler::OpenFv(IInStream *stream, const UInt64 * /* maxCheckStartPosition */, IArchiveOpenCallback * /* callback */)
|
1365
|
+
{
|
1366
|
+
Byte buf[kFvHeaderSize];
|
1367
|
+
RINOK(ReadStream_FALSE(stream, buf, kFvHeaderSize));
|
1368
|
+
if (!IsFfs(buf))
|
1369
|
+
return S_FALSE;
|
1370
|
+
CVolFfsHeader ffsHeader;
|
1371
|
+
if (!ffsHeader.Parse(buf))
|
1372
|
+
return S_FALSE;
|
1373
|
+
if (ffsHeader.VolSize > ((UInt32)1 << 30))
|
1374
|
+
return S_FALSE;
|
1375
|
+
_phySize = ffsHeader.VolSize;
|
1376
|
+
RINOK(stream->Seek(0, STREAM_SEEK_SET, NULL));
|
1377
|
+
UInt32 fvSize32 = (UInt32)ffsHeader.VolSize;
|
1378
|
+
unsigned bufIndex = AddBuf(fvSize32);
|
1379
|
+
RINOK(ReadStream_FALSE(stream, _bufs[bufIndex], fvSize32));
|
1380
|
+
return ParseVolume(bufIndex, 0, fvSize32, fvSize32, -1, -1, 0);
|
1381
|
+
}
|
1382
|
+
|
1383
|
+
HRESULT CHandler::Open2(IInStream *stream, const UInt64 *maxCheckStartPosition, IArchiveOpenCallback *callback)
|
1384
|
+
{
|
1385
|
+
if (_capsuleMode)
|
1386
|
+
{
|
1387
|
+
RINOK(OpenCapsule(stream));
|
1388
|
+
}
|
1389
|
+
else
|
1390
|
+
{
|
1391
|
+
RINOK(OpenFv(stream, maxCheckStartPosition, callback));
|
1392
|
+
}
|
1393
|
+
|
1394
|
+
unsigned num = _items.Size();
|
1395
|
+
CIntArr numChilds(num);
|
1396
|
+
|
1397
|
+
unsigned i;
|
1398
|
+
|
1399
|
+
for (i = 0; i < num; i++)
|
1400
|
+
numChilds[i] = 0;
|
1401
|
+
|
1402
|
+
for (i = 0; i < num; i++)
|
1403
|
+
{
|
1404
|
+
int parent = _items[i].Parent;
|
1405
|
+
if (parent >= 0)
|
1406
|
+
numChilds[(unsigned)parent]++;
|
1407
|
+
}
|
1408
|
+
|
1409
|
+
for (i = 0; i < num; i++)
|
1410
|
+
{
|
1411
|
+
const CItem &item = _items[i];
|
1412
|
+
int parent = item.Parent;
|
1413
|
+
if (parent >= 0)
|
1414
|
+
{
|
1415
|
+
CItem &parentItem = _items[(unsigned)parent];
|
1416
|
+
if (numChilds[(unsigned)parent] == 1)
|
1417
|
+
if (!item.ThereIsUniqueName || !parentItem.ThereIsUniqueName || !parentItem.ThereAreSubDirs)
|
1418
|
+
parentItem.Skip = true;
|
1419
|
+
}
|
1420
|
+
}
|
1421
|
+
|
1422
|
+
CUIntVector mainToReduced;
|
1423
|
+
|
1424
|
+
for (i = 0; i < _items.Size(); i++)
|
1425
|
+
{
|
1426
|
+
mainToReduced.Add(_items2.Size());
|
1427
|
+
const CItem &item = _items[i];
|
1428
|
+
if (item.Skip)
|
1429
|
+
continue;
|
1430
|
+
AString name;
|
1431
|
+
int numItems = -1;
|
1432
|
+
int parent = item.Parent;
|
1433
|
+
if (parent >= 0)
|
1434
|
+
numItems = numChilds[(unsigned)parent];
|
1435
|
+
AString name2 = item.GetName(numItems);
|
1436
|
+
AString characts2 = item.Characts;
|
1437
|
+
if (item.KeepName)
|
1438
|
+
name = name2;
|
1439
|
+
|
1440
|
+
while (parent >= 0)
|
1441
|
+
{
|
1442
|
+
const CItem &item3 = _items[(unsigned)parent];
|
1443
|
+
if (!item3.Skip)
|
1444
|
+
break;
|
1445
|
+
if (item3.KeepName)
|
1446
|
+
{
|
1447
|
+
AString name3 = item3.GetName(-1);
|
1448
|
+
if (name.IsEmpty())
|
1449
|
+
name = name3;
|
1450
|
+
else
|
1451
|
+
name = name3 + '.' + name;
|
1452
|
+
}
|
1453
|
+
AddSpaceAndString(characts2, item3.Characts);
|
1454
|
+
parent = item3.Parent;
|
1455
|
+
}
|
1456
|
+
|
1457
|
+
if (name.IsEmpty())
|
1458
|
+
name = name2;
|
1459
|
+
|
1460
|
+
CItem2 item2;
|
1461
|
+
item2.MainIndex = i;
|
1462
|
+
item2.Name = name;
|
1463
|
+
item2.Characts = characts2;
|
1464
|
+
if (parent >= 0)
|
1465
|
+
item2.Parent = mainToReduced[(unsigned)parent];
|
1466
|
+
_items2.Add(item2);
|
1467
|
+
/*
|
1468
|
+
CItem2 item2;
|
1469
|
+
item2.MainIndex = i;
|
1470
|
+
item2.Name = item.Name;
|
1471
|
+
item2.Parent = item.Parent;
|
1472
|
+
_items2.Add(item2);
|
1473
|
+
*/
|
1474
|
+
}
|
1475
|
+
|
1476
|
+
return S_OK;
|
1477
|
+
}
|
1478
|
+
|
1479
|
+
STDMETHODIMP CHandler::Open(IInStream *inStream,
|
1480
|
+
const UInt64 *maxCheckStartPosition,
|
1481
|
+
IArchiveOpenCallback *callback)
|
1482
|
+
{
|
1483
|
+
COM_TRY_BEGIN
|
1484
|
+
Close();
|
1485
|
+
{
|
1486
|
+
HRESULT res = Open2(inStream, maxCheckStartPosition, callback);
|
1487
|
+
if (res == E_NOTIMPL)
|
1488
|
+
res = S_FALSE;
|
1489
|
+
return res;
|
1490
|
+
}
|
1491
|
+
COM_TRY_END
|
1492
|
+
}
|
1493
|
+
|
1494
|
+
STDMETHODIMP CHandler::Close()
|
1495
|
+
{
|
1496
|
+
_phySize = 0;
|
1497
|
+
_totalBufsSize = 0;
|
1498
|
+
_methodsMask = 0;
|
1499
|
+
_items.Clear();
|
1500
|
+
_items2.Clear();
|
1501
|
+
_bufs.Clear();
|
1502
|
+
_comment.Empty();
|
1503
|
+
_h.Clear();
|
1504
|
+
return S_OK;
|
1505
|
+
}
|
1506
|
+
|
1507
|
+
STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
|
1508
|
+
{
|
1509
|
+
*numItems = _items2.Size();
|
1510
|
+
return S_OK;
|
1511
|
+
}
|
1512
|
+
|
1513
|
+
STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
|
1514
|
+
Int32 testMode, IArchiveExtractCallback *extractCallback)
|
1515
|
+
{
|
1516
|
+
COM_TRY_BEGIN
|
1517
|
+
bool allFilesMode = (numItems == (UInt32)(Int32)-1);
|
1518
|
+
if (allFilesMode)
|
1519
|
+
numItems = _items2.Size();
|
1520
|
+
if (numItems == 0)
|
1521
|
+
return S_OK;
|
1522
|
+
UInt64 totalSize = 0;
|
1523
|
+
UInt32 i;
|
1524
|
+
for (i = 0; i < numItems; i++)
|
1525
|
+
totalSize += _items[_items2[allFilesMode ? i : indices[i]].MainIndex].Size;
|
1526
|
+
extractCallback->SetTotal(totalSize);
|
1527
|
+
|
1528
|
+
UInt64 currentTotalSize = 0;
|
1529
|
+
|
1530
|
+
NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder();
|
1531
|
+
CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec;
|
1532
|
+
|
1533
|
+
CLocalProgress *lps = new CLocalProgress;
|
1534
|
+
CMyComPtr<ICompressProgressInfo> progress = lps;
|
1535
|
+
lps->Init(extractCallback, false);
|
1536
|
+
|
1537
|
+
for (i = 0; i < numItems; i++)
|
1538
|
+
{
|
1539
|
+
lps->InSize = lps->OutSize = currentTotalSize;
|
1540
|
+
RINOK(lps->SetCur());
|
1541
|
+
CMyComPtr<ISequentialOutStream> realOutStream;
|
1542
|
+
Int32 askMode = testMode ?
|
1543
|
+
NExtract::NAskMode::kTest :
|
1544
|
+
NExtract::NAskMode::kExtract;
|
1545
|
+
UInt32 index = allFilesMode ? i : indices[i];
|
1546
|
+
const CItem &item = _items[_items2[index].MainIndex];
|
1547
|
+
RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
|
1548
|
+
currentTotalSize += item.Size;
|
1549
|
+
|
1550
|
+
if (!testMode && !realOutStream)
|
1551
|
+
continue;
|
1552
|
+
RINOK(extractCallback->PrepareOperation(askMode));
|
1553
|
+
if (testMode || item.IsDir)
|
1554
|
+
{
|
1555
|
+
RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
|
1556
|
+
continue;
|
1557
|
+
}
|
1558
|
+
int res = NExtract::NOperationResult::kDataError;
|
1559
|
+
CMyComPtr<ISequentialInStream> inStream;
|
1560
|
+
GetStream(index, &inStream);
|
1561
|
+
if (inStream)
|
1562
|
+
{
|
1563
|
+
RINOK(copyCoder->Code(inStream, realOutStream, NULL, NULL, progress));
|
1564
|
+
if (copyCoderSpec->TotalSize == item.Size)
|
1565
|
+
res = NExtract::NOperationResult::kOK;
|
1566
|
+
}
|
1567
|
+
realOutStream.Release();
|
1568
|
+
RINOK(extractCallback->SetOperationResult(res));
|
1569
|
+
}
|
1570
|
+
return S_OK;
|
1571
|
+
COM_TRY_END
|
1572
|
+
}
|
1573
|
+
|
1574
|
+
STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream)
|
1575
|
+
{
|
1576
|
+
COM_TRY_BEGIN
|
1577
|
+
const CItem &item = _items[_items2[index].MainIndex];
|
1578
|
+
if (item.IsDir)
|
1579
|
+
return S_FALSE;
|
1580
|
+
CBufInStream *streamSpec = new CBufInStream;
|
1581
|
+
CMyComPtr<IInStream> streamTemp = streamSpec;
|
1582
|
+
const CByteBuffer &buf = _bufs[item.BufIndex];
|
1583
|
+
/*
|
1584
|
+
if (item.Offset + item.Size > buf.GetCapacity())
|
1585
|
+
return S_FALSE;
|
1586
|
+
*/
|
1587
|
+
streamSpec->Init(buf + item.Offset, item.Size, (IInArchive *)this);
|
1588
|
+
*stream = streamTemp.Detach();
|
1589
|
+
return S_OK;
|
1590
|
+
COM_TRY_END
|
1591
|
+
}
|
1592
|
+
|
1593
|
+
|
1594
|
+
namespace UEFIc {
|
1595
|
+
|
1596
|
+
REGISTER_ARC_I_CLS(
|
1597
|
+
CHandler(true),
|
1598
|
+
"UEFIc", "scap", 0, 0xD0,
|
1599
|
+
kCapsuleSig,
|
1600
|
+
0,
|
1601
|
+
NArcInfoFlags::kFindSignature,
|
1602
|
+
NULL)
|
1603
|
+
|
1604
|
+
}
|
1605
|
+
|
1606
|
+
namespace UEFIf {
|
1607
|
+
|
1608
|
+
REGISTER_ARC_I_CLS(
|
1609
|
+
CHandler(false),
|
1610
|
+
"UEFIf", "uefif", 0, 0xD1,
|
1611
|
+
k_FFS_Guid,
|
1612
|
+
kFfsGuidOffset,
|
1613
|
+
NArcInfoFlags::kFindSignature,
|
1614
|
+
NULL)
|
1615
|
+
|
1616
|
+
}
|
1617
|
+
|
1618
|
+
}}
|