mirror of
https://github.com/ip7z/7zip.git
synced 2025-12-06 07:12:00 +01:00
24.07
This commit is contained in:
parent
89a73b9012
commit
a7a1d4a241
|
|
@ -1,5 +1,5 @@
|
||||||
; LzFindOpt.asm -- ASM version of GetMatchesSpecN_2() function
|
; LzFindOpt.asm -- ASM version of GetMatchesSpecN_2() function
|
||||||
; 2021-07-21: Igor Pavlov : Public domain
|
; 2024-06-18: Igor Pavlov : Public domain
|
||||||
;
|
;
|
||||||
|
|
||||||
ifndef x64
|
ifndef x64
|
||||||
|
|
@ -11,10 +11,31 @@ include 7zAsm.asm
|
||||||
|
|
||||||
MY_ASM_START
|
MY_ASM_START
|
||||||
|
|
||||||
_TEXT$LZFINDOPT SEGMENT ALIGN(64) 'CODE'
|
ifndef Z7_LZ_FIND_OPT_ASM_USE_SEGMENT
|
||||||
|
if (IS_LINUX gt 0)
|
||||||
|
Z7_LZ_FIND_OPT_ASM_USE_SEGMENT equ 1
|
||||||
|
else
|
||||||
|
Z7_LZ_FIND_OPT_ASM_USE_SEGMENT equ 1
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifdef Z7_LZ_FIND_OPT_ASM_USE_SEGMENT
|
||||||
|
_TEXT$LZFINDOPT SEGMENT ALIGN(64) 'CODE'
|
||||||
MY_ALIGN macro num:req
|
MY_ALIGN macro num:req
|
||||||
align num
|
align num
|
||||||
|
; align 16
|
||||||
|
endm
|
||||||
|
else
|
||||||
|
MY_ALIGN macro num:req
|
||||||
|
; We expect that ".text" is aligned for 16-bytes.
|
||||||
|
; So we don't need large alignment inside our function.
|
||||||
|
align 16
|
||||||
|
endm
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
MY_ALIGN_16 macro
|
||||||
|
MY_ALIGN 16
|
||||||
endm
|
endm
|
||||||
|
|
||||||
MY_ALIGN_32 macro
|
MY_ALIGN_32 macro
|
||||||
|
|
@ -136,7 +157,11 @@ COPY_VAR_64 macro dest_var, src_var
|
||||||
endm
|
endm
|
||||||
|
|
||||||
|
|
||||||
|
ifdef Z7_LZ_FIND_OPT_ASM_USE_SEGMENT
|
||||||
; MY_ALIGN_64
|
; MY_ALIGN_64
|
||||||
|
else
|
||||||
|
MY_ALIGN_16
|
||||||
|
endif
|
||||||
MY_PROC GetMatchesSpecN_2, 13
|
MY_PROC GetMatchesSpecN_2, 13
|
||||||
MY_PUSH_PRESERVED_ABI_REGS
|
MY_PUSH_PRESERVED_ABI_REGS
|
||||||
mov r0, RSP
|
mov r0, RSP
|
||||||
|
|
@ -508,6 +533,8 @@ fin:
|
||||||
MY_POP_PRESERVED_ABI_REGS
|
MY_POP_PRESERVED_ABI_REGS
|
||||||
MY_ENDP
|
MY_ENDP
|
||||||
|
|
||||||
|
ifdef Z7_LZ_FIND_OPT_ASM_USE_SEGMENT
|
||||||
_TEXT$LZFINDOPT ENDS
|
_TEXT$LZFINDOPT ENDS
|
||||||
|
endif
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
; LzmaDecOpt.asm -- ASM version of LzmaDec_DecodeReal_3() function
|
; LzmaDecOpt.asm -- ASM version of LzmaDec_DecodeReal_3() function
|
||||||
; 2021-02-23: Igor Pavlov : Public domain
|
; 2024-06-18: Igor Pavlov : Public domain
|
||||||
;
|
;
|
||||||
; 3 - is the code compatibility version of LzmaDec_DecodeReal_*()
|
; 3 - is the code compatibility version of LzmaDec_DecodeReal_*()
|
||||||
; function for check at link time.
|
; function for check at link time.
|
||||||
|
|
@ -17,11 +17,41 @@ include 7zAsm.asm
|
||||||
|
|
||||||
MY_ASM_START
|
MY_ASM_START
|
||||||
|
|
||||||
_TEXT$LZMADECOPT SEGMENT ALIGN(64) 'CODE'
|
; if Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT is defined, we use additional SEGMENT with 64-byte alignment.
|
||||||
|
; if Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT is not defined, we use default SEGMENT (where default 16-byte alignment of segment is expected).
|
||||||
|
; The performance is almost identical in our tests.
|
||||||
|
; But the performance can depend from position of lzmadec code inside instruction cache
|
||||||
|
; or micro-op cache line (depending from low address bits in 32-byte/64-byte cache lines).
|
||||||
|
; And 64-byte alignment provides a more consistent speed regardless
|
||||||
|
; of the code's position in the executable.
|
||||||
|
; But also it's possible that code without Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT can be
|
||||||
|
; slightly faster than 64-bytes aligned code in some cases, if offset of lzmadec
|
||||||
|
; code in 64-byte block after compilation provides better speed by some reason.
|
||||||
|
; Note that Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT adds an extra section to the ELF file.
|
||||||
|
; If you don't want to get that extra section, do not define Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT.
|
||||||
|
|
||||||
|
ifndef Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT
|
||||||
|
if (IS_LINUX gt 0)
|
||||||
|
Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT equ 1
|
||||||
|
else
|
||||||
|
Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT equ 1
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifdef Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT
|
||||||
|
_TEXT$LZMADECOPT SEGMENT ALIGN(64) 'CODE'
|
||||||
MY_ALIGN macro num:req
|
MY_ALIGN macro num:req
|
||||||
align num
|
align num
|
||||||
|
; align 16
|
||||||
endm
|
endm
|
||||||
|
else
|
||||||
|
MY_ALIGN macro num:req
|
||||||
|
; We expect that ".text" is aligned for 16-bytes.
|
||||||
|
; So we don't need large alignment inside out function.
|
||||||
|
align 16
|
||||||
|
endm
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
MY_ALIGN_16 macro
|
MY_ALIGN_16 macro
|
||||||
MY_ALIGN 16
|
MY_ALIGN 16
|
||||||
|
|
@ -610,7 +640,11 @@ PARAM_lzma equ REG_ABI_PARAM_0
|
||||||
PARAM_limit equ REG_ABI_PARAM_1
|
PARAM_limit equ REG_ABI_PARAM_1
|
||||||
PARAM_bufLimit equ REG_ABI_PARAM_2
|
PARAM_bufLimit equ REG_ABI_PARAM_2
|
||||||
|
|
||||||
|
ifdef Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT
|
||||||
; MY_ALIGN_64
|
; MY_ALIGN_64
|
||||||
|
else
|
||||||
|
MY_ALIGN_16
|
||||||
|
endif
|
||||||
MY_PROC LzmaDec_DecodeReal_3, 3
|
MY_PROC LzmaDec_DecodeReal_3, 3
|
||||||
MY_PUSH_PRESERVED_ABI_REGS
|
MY_PUSH_PRESERVED_ABI_REGS
|
||||||
|
|
||||||
|
|
@ -1298,6 +1332,8 @@ fin:
|
||||||
MY_POP_PRESERVED_ABI_REGS
|
MY_POP_PRESERVED_ABI_REGS
|
||||||
MY_ENDP
|
MY_ENDP
|
||||||
|
|
||||||
|
ifdef Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT
|
||||||
_TEXT$LZMADECOPT ENDS
|
_TEXT$LZMADECOPT ENDS
|
||||||
|
endif
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
; Sha1Opt.asm -- SHA-1 optimized code for SHA-1 x86 hardware instructions
|
; Sha1Opt.asm -- SHA-1 optimized code for SHA-1 x86 hardware instructions
|
||||||
; 2021-03-10 : Igor Pavlov : Public domain
|
; 2024-06-16 : Igor Pavlov : Public domain
|
||||||
|
|
||||||
include 7zAsm.asm
|
include 7zAsm.asm
|
||||||
|
|
||||||
|
|
@ -20,7 +20,7 @@ MY_ASM_START
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
CONST SEGMENT
|
CONST SEGMENT READONLY
|
||||||
|
|
||||||
align 16
|
align 16
|
||||||
Reverse_Endian_Mask db 15,14,13,12, 11,10,9,8, 7,6,5,4, 3,2,1,0
|
Reverse_Endian_Mask db 15,14,13,12, 11,10,9,8, 7,6,5,4, 3,2,1,0
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
; Sha256Opt.asm -- SHA-256 optimized code for SHA-256 x86 hardware instructions
|
; Sha256Opt.asm -- SHA-256 optimized code for SHA-256 x86 hardware instructions
|
||||||
; 2022-04-17 : Igor Pavlov : Public domain
|
; 2024-06-16 : Igor Pavlov : Public domain
|
||||||
|
|
||||||
include 7zAsm.asm
|
include 7zAsm.asm
|
||||||
|
|
||||||
|
|
@ -20,7 +20,7 @@ endif
|
||||||
EXTRN K_CONST:xmmword
|
EXTRN K_CONST:xmmword
|
||||||
@
|
@
|
||||||
|
|
||||||
CONST SEGMENT
|
CONST SEGMENT READONLY
|
||||||
|
|
||||||
align 16
|
align 16
|
||||||
Reverse_Endian_Mask db 3,2,1,0, 7,6,5,4, 11,10,9,8, 15,14,13,12
|
Reverse_Endian_Mask db 3,2,1,0, 7,6,5,4, 11,10,9,8, 15,14,13,12
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
#define MY_VER_MAJOR 24
|
#define MY_VER_MAJOR 24
|
||||||
#define MY_VER_MINOR 06
|
#define MY_VER_MINOR 07
|
||||||
#define MY_VER_BUILD 0
|
#define MY_VER_BUILD 0
|
||||||
#define MY_VERSION_NUMBERS "24.06"
|
#define MY_VERSION_NUMBERS "24.07"
|
||||||
#define MY_VERSION MY_VERSION_NUMBERS
|
#define MY_VERSION MY_VERSION_NUMBERS
|
||||||
|
|
||||||
#ifdef MY_CPU_NAME
|
#ifdef MY_CPU_NAME
|
||||||
|
|
@ -10,7 +10,7 @@
|
||||||
#define MY_VERSION_CPU MY_VERSION
|
#define MY_VERSION_CPU MY_VERSION
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define MY_DATE "2024-05-26"
|
#define MY_DATE "2024-06-19"
|
||||||
#undef MY_COPYRIGHT
|
#undef MY_COPYRIGHT
|
||||||
#undef MY_VERSION_COPYRIGHT_DATE
|
#undef MY_VERSION_COPYRIGHT_DATE
|
||||||
#define MY_AUTHOR_NAME "Igor Pavlov"
|
#define MY_AUTHOR_NAME "Igor Pavlov"
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/* CpuArch.h -- CPU specific code
|
/* CpuArch.h -- CPU specific code
|
||||||
2024-05-18 : Igor Pavlov : Public domain */
|
2024-06-17 : Igor Pavlov : Public domain */
|
||||||
|
|
||||||
#ifndef ZIP7_INC_CPU_ARCH_H
|
#ifndef ZIP7_INC_CPU_ARCH_H
|
||||||
#define ZIP7_INC_CPU_ARCH_H
|
#define ZIP7_INC_CPU_ARCH_H
|
||||||
|
|
@ -564,6 +564,7 @@ problem-4 : performace:
|
||||||
#define SetBe32a(p, v) { *(UInt32 *)(void *)(p) = (v); }
|
#define SetBe32a(p, v) { *(UInt32 *)(void *)(p) = (v); }
|
||||||
#define SetBe16a(p, v) { *(UInt16 *)(void *)(p) = (v); }
|
#define SetBe16a(p, v) { *(UInt16 *)(void *)(p) = (v); }
|
||||||
|
|
||||||
|
#define GetUi64a(p) GetUi64(p)
|
||||||
#define GetUi32a(p) GetUi32(p)
|
#define GetUi32a(p) GetUi32(p)
|
||||||
#define GetUi16a(p) GetUi16(p)
|
#define GetUi16a(p) GetUi16(p)
|
||||||
#define SetUi32a(p, v) SetUi32(p, v)
|
#define SetUi32a(p, v) SetUi32(p, v)
|
||||||
|
|
@ -571,6 +572,7 @@ problem-4 : performace:
|
||||||
|
|
||||||
#elif defined(MY_CPU_LE)
|
#elif defined(MY_CPU_LE)
|
||||||
|
|
||||||
|
#define GetUi64a(p) (*(const UInt64 *)(const void *)(p))
|
||||||
#define GetUi32a(p) (*(const UInt32 *)(const void *)(p))
|
#define GetUi32a(p) (*(const UInt32 *)(const void *)(p))
|
||||||
#define GetUi16a(p) (*(const UInt16 *)(const void *)(p))
|
#define GetUi16a(p) (*(const UInt16 *)(const void *)(p))
|
||||||
#define SetUi32a(p, v) { *(UInt32 *)(void *)(p) = (v); }
|
#define SetUi32a(p, v) { *(UInt32 *)(void *)(p) = (v); }
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/* ZstdDec.c -- Zstd Decoder
|
/* ZstdDec.c -- Zstd Decoder
|
||||||
2024-05-26 : the code was developed by Igor Pavlov, using Zstandard format
|
2024-06-18 : the code was developed by Igor Pavlov, using Zstandard format
|
||||||
specification and original zstd decoder code as reference code.
|
specification and original zstd decoder code as reference code.
|
||||||
original zstd decoder code: Copyright (c) Facebook, Inc. All rights reserved.
|
original zstd decoder code: Copyright (c) Facebook, Inc. All rights reserved.
|
||||||
This source code is licensed under BSD 3-Clause License.
|
This source code is licensed under BSD 3-Clause License.
|
||||||
|
|
@ -1308,8 +1308,10 @@ FSE_Decode_SeqTable(CFseRecord * const table,
|
||||||
in->len--;
|
in->len--;
|
||||||
{
|
{
|
||||||
const Byte *ptr = in->ptr;
|
const Byte *ptr = in->ptr;
|
||||||
const Byte sym = ptr[0];
|
const unsigned sym = ptr[0];
|
||||||
in->ptr = ptr + 1;
|
in->ptr = ptr + 1;
|
||||||
|
if (sym >= numSymbolsMax)
|
||||||
|
return SZ_ERROR_DATA;
|
||||||
table[0] = (FastInt32)sym
|
table[0] = (FastInt32)sym
|
||||||
#if defined(Z7_ZSTD_DEC_USE_ML_PLUS3)
|
#if defined(Z7_ZSTD_DEC_USE_ML_PLUS3)
|
||||||
+ (numSymbolsMax == NUM_ML_SYMBOLS ? MATCH_LEN_MIN : 0)
|
+ (numSymbolsMax == NUM_ML_SYMBOLS ? MATCH_LEN_MIN : 0)
|
||||||
|
|
|
||||||
|
|
@ -220,6 +220,9 @@ endif
|
||||||
|
|
||||||
all: $(O) $(PROGPATH) $(STATIC_TARGET)
|
all: $(O) $(PROGPATH) $(STATIC_TARGET)
|
||||||
|
|
||||||
|
# we need $(O) as order-only-prerequisites:
|
||||||
|
$(OBJS): | $(O)
|
||||||
|
|
||||||
$(O):
|
$(O):
|
||||||
$(MY_MKDIR) $(O)
|
$(MY_MKDIR) $(O)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -219,6 +219,14 @@ static int Parse_EXE(const Byte *buf, size_t size, CFilterMode *filterMode)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Filters don't improve the compression ratio for relocatable object files (".o").
|
||||||
|
But we can get compression ratio gain, if we compress object
|
||||||
|
files and executables in same solid block.
|
||||||
|
So we use filters for relocatable object files (".o"):
|
||||||
|
*/
|
||||||
|
// #define Z7_7Z_CREATE_ARC_DISABLE_FILTER_FOR_OBJ
|
||||||
|
|
||||||
/* ---------- ELF ---------- */
|
/* ---------- ELF ---------- */
|
||||||
|
|
||||||
#define ELF_SIG 0x464C457F
|
#define ELF_SIG 0x464C457F
|
||||||
|
|
@ -258,6 +266,12 @@ static int Parse_ELF(const Byte *buf, size_t size, CFilterMode *filterMode)
|
||||||
default: return 0;
|
default: return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef Z7_7Z_CREATE_ARC_DISABLE_FILTER_FOR_OBJ
|
||||||
|
#define ELF_ET_REL 1
|
||||||
|
if (Get16(buf + 0x10, be) == ELF_ET_REL)
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
switch (Get16(buf + 0x12, be))
|
switch (Get16(buf + 0x12, be))
|
||||||
{
|
{
|
||||||
case 3:
|
case 3:
|
||||||
|
|
@ -318,6 +332,12 @@ static unsigned Parse_MACH(const Byte *buf, size_t size, CFilterMode *filterMode
|
||||||
default: return 0;
|
default: return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef Z7_7Z_CREATE_ARC_DISABLE_FILTER_FOR_OBJ
|
||||||
|
#define MACH_TYPE_OBJECT 1
|
||||||
|
if (Get32(buf + 0xC, be) == MACH_TYPE_OBJECT)
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
switch (Get32(buf + 4, be))
|
switch (Get32(buf + 4, be))
|
||||||
{
|
{
|
||||||
case MACH_MACHINE_386:
|
case MACH_MACHINE_386:
|
||||||
|
|
|
||||||
|
|
@ -17,11 +17,13 @@
|
||||||
|
|
||||||
#include "../Compress/CopyCoder.h"
|
#include "../Compress/CopyCoder.h"
|
||||||
|
|
||||||
|
// #define Z7_ELF_SHOW_DETAILS
|
||||||
|
|
||||||
using namespace NWindows;
|
using namespace NWindows;
|
||||||
|
|
||||||
static UInt16 Get16(const Byte *p, bool be) { if (be) return GetBe16(p); return GetUi16(p); }
|
static UInt16 Get16(const Byte *p, bool be) { if (be) return GetBe16a(p); return GetUi16a(p); }
|
||||||
static UInt32 Get32(const Byte *p, bool be) { if (be) return GetBe32(p); return GetUi32(p); }
|
static UInt32 Get32(const Byte *p, bool be) { if (be) return GetBe32a(p); return GetUi32a(p); }
|
||||||
static UInt64 Get64(const Byte *p, bool be) { if (be) return GetBe64(p); return GetUi64(p); }
|
static UInt64 Get64(const Byte *p, bool be) { if (be) return GetBe64a(p); return GetUi64a(p); }
|
||||||
|
|
||||||
#define G16(offs, v) v = Get16(p + (offs), be)
|
#define G16(offs, v) v = Get16(p + (offs), be)
|
||||||
#define G32(offs, v) v = Get32(p + (offs), be)
|
#define G32(offs, v) v = Get32(p + (offs), be)
|
||||||
|
|
@ -31,14 +33,51 @@ namespace NArchive {
|
||||||
namespace NElf {
|
namespace NElf {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
ELF Structure for most files (real order can be different):
|
ELF Structure example:
|
||||||
|
{
|
||||||
Header
|
Header
|
||||||
Program (segment) header table (used at runtime)
|
Program header table (is used at runtime) (list of segment metadata records)
|
||||||
Segment1 (Section ... Section)
|
{
|
||||||
Segment2
|
Segment (Read)
|
||||||
|
Segment : PT_PHDR : header table itself
|
||||||
|
Segment : PT_INTERP
|
||||||
|
Segment : PT_NOTE
|
||||||
|
.rela.dyn (RELA, ALLOC)
|
||||||
|
Segment (Execute/Read)
|
||||||
|
.text section (PROGBITS, SHF_ALLOC | SHF_EXECINSTR)
|
||||||
|
Segment (Read)
|
||||||
|
.rodata (PROGBITS, SHF_ALLOC | SHF_WRITE)
|
||||||
|
Segment : PT_GNU_EH_FRAME
|
||||||
|
.eh_frame_hdr
|
||||||
|
.eh_frame
|
||||||
|
.gcc_except_table
|
||||||
...
|
...
|
||||||
SegmentN
|
Segment (Write/Read) (VaSize > Size)
|
||||||
|
Segment (Read) : PT_GNU_RELRO
|
||||||
|
Segment (Write/Read)
|
||||||
|
.data
|
||||||
|
.bss (Size == 0) (VSize != 0)
|
||||||
|
}
|
||||||
|
.comment (VA == 0)
|
||||||
|
.shstrtab (VA == 0)
|
||||||
Section header table (the data for linking and relocation)
|
Section header table (the data for linking and relocation)
|
||||||
|
}
|
||||||
|
|
||||||
|
Last top level segment contains .bss section that requires additional VA space.
|
||||||
|
So (VaSize > Size) for that segment.
|
||||||
|
|
||||||
|
Segments can be unsorted (by offset) in table.
|
||||||
|
Top level segments has Type=PT_LOAD : "Loadable segment".
|
||||||
|
Top level segments usually are aligned for page size (4 KB).
|
||||||
|
Another segments (non PT_LOAD segments) are inside PT_LOAD segments.
|
||||||
|
|
||||||
|
(VA-offset == 0) is possible for some sections and segments at the beginning of file.
|
||||||
|
(VA-offset == 4KB*N) for most sections and segments where (Size != 0),
|
||||||
|
(VA-offset != 4KB*N) for .bss section (last section), because (Size == 0),
|
||||||
|
and that section is not mapped from image file.
|
||||||
|
Some files contain additional "virtual" 4 KB page in VA space after
|
||||||
|
end of data of top level segments (PT_LOAD) before new top level segments.
|
||||||
|
So (VA-offset) value can increase by 4 KB step.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define ELF_CLASS_32 1
|
#define ELF_CLASS_32 1
|
||||||
|
|
@ -47,14 +86,14 @@ namespace NElf {
|
||||||
#define ELF_DATA_2LSB 1
|
#define ELF_DATA_2LSB 1
|
||||||
#define ELF_DATA_2MSB 2
|
#define ELF_DATA_2MSB 2
|
||||||
|
|
||||||
static const UInt32 kHeaderSize32 = 0x34;
|
static const unsigned kHeaderSize32 = 0x34;
|
||||||
static const UInt32 kHeaderSize64 = 0x40;
|
static const unsigned kHeaderSize64 = 0x40;
|
||||||
|
|
||||||
static const UInt32 kSegmentSize32 = 0x20;
|
static const unsigned kSegmentSize32 = 0x20;
|
||||||
static const UInt32 kSegmentSize64 = 0x38;
|
static const unsigned kSegmentSize64 = 0x38;
|
||||||
|
|
||||||
static const UInt32 kSectionSize32 = 0x28;
|
static const unsigned kSectionSize32 = 0x28;
|
||||||
static const UInt32 kSectionSize64 = 0x40;
|
static const unsigned kSectionSize64 = 0x40;
|
||||||
|
|
||||||
struct CHeader
|
struct CHeader
|
||||||
{
|
{
|
||||||
|
|
@ -78,9 +117,9 @@ struct CHeader
|
||||||
UInt16 NumSections;
|
UInt16 NumSections;
|
||||||
UInt16 NamesSectIndex;
|
UInt16 NamesSectIndex;
|
||||||
|
|
||||||
bool Parse(const Byte *buf);
|
bool Parse(const Byte *p);
|
||||||
|
|
||||||
UInt64 GetHeadersSize() const { return (UInt64)HeaderSize +
|
UInt32 GetHeadersSize() const { return (UInt32)HeaderSize +
|
||||||
(UInt32)NumSegments * SegmentEntrySize +
|
(UInt32)NumSegments * SegmentEntrySize +
|
||||||
(UInt32)NumSections * SectionEntrySize; }
|
(UInt32)NumSections * SectionEntrySize; }
|
||||||
};
|
};
|
||||||
|
|
@ -104,7 +143,7 @@ bool CHeader::Parse(const Byte *p)
|
||||||
if (p[6] != 1) // Version
|
if (p[6] != 1) // Version
|
||||||
return false;
|
return false;
|
||||||
Os = p[7];
|
Os = p[7];
|
||||||
AbiVer = p[8];
|
// AbiVer = p[8];
|
||||||
for (int i = 9; i < 16; i++)
|
for (int i = 9; i < 16; i++)
|
||||||
if (p[i] != 0)
|
if (p[i] != 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -117,16 +156,21 @@ bool CHeader::Parse(const Byte *p)
|
||||||
if (Mode64)
|
if (Mode64)
|
||||||
{
|
{
|
||||||
// G64(0x18, EntryVa);
|
// G64(0x18, EntryVa);
|
||||||
G64(0x20, ProgOffset);
|
G64(0x20, ProgOffset); // == kHeaderSize64 == 0x40 usually
|
||||||
G64(0x28, SectOffset);
|
G64(0x28, SectOffset);
|
||||||
p += 0x30;
|
p += 0x30;
|
||||||
|
// we expect that fields are aligned
|
||||||
|
if (ProgOffset & 7) return false;
|
||||||
|
if (SectOffset & 7) return false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// G32(0x18, EntryVa);
|
// G32(0x18, EntryVa);
|
||||||
G32(0x1C, ProgOffset);
|
G32(0x1C, ProgOffset); // == kHeaderSize32 == 0x34 usually
|
||||||
G32(0x20, SectOffset);
|
G32(0x20, SectOffset);
|
||||||
p += 0x24;
|
p += 0x24;
|
||||||
|
if (ProgOffset & 3) return false;
|
||||||
|
if (SectOffset & 3) return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
G32(0, Flags);
|
G32(0, Flags);
|
||||||
|
|
@ -140,21 +184,20 @@ bool CHeader::Parse(const Byte *p)
|
||||||
G16(12, NumSections);
|
G16(12, NumSections);
|
||||||
G16(14, NamesSectIndex);
|
G16(14, NamesSectIndex);
|
||||||
|
|
||||||
if (ProgOffset < HeaderSize && (ProgOffset != 0 || NumSegments != 0)) return false;
|
if (ProgOffset < HeaderSize && (ProgOffset || NumSegments)) return false;
|
||||||
if (SectOffset < HeaderSize && (SectOffset != 0 || NumSections != 0)) return false;
|
if (SectOffset < HeaderSize && (SectOffset || NumSections)) return false;
|
||||||
|
|
||||||
if (SegmentEntrySize == 0) { if (NumSegments != 0) return false; }
|
if (SegmentEntrySize == 0) { if (NumSegments) return false; }
|
||||||
else if (SegmentEntrySize != (Mode64 ? kSegmentSize64 : kSegmentSize32)) return false;
|
else if (SegmentEntrySize != (Mode64 ? kSegmentSize64 : kSegmentSize32)) return false;
|
||||||
|
|
||||||
if (SectionEntrySize == 0) { if (NumSections != 0) return false; }
|
if (SectionEntrySize == 0) { if (NumSections) return false; }
|
||||||
else if (SectionEntrySize != (Mode64 ? kSectionSize64 : kSectionSize32)) return false;
|
else if (SectionEntrySize != (Mode64 ? kSectionSize64 : kSectionSize32)) return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The program header table itself.
|
|
||||||
|
|
||||||
#define PT_PHDR 6
|
#define PT_PHDR 6 // The program header table itself.
|
||||||
#define PT_GNU_STACK 0x6474e551
|
#define PT_GNU_STACK 0x6474e551
|
||||||
|
|
||||||
static const CUInt32PCharPair g_SegnmentTypes[] =
|
static const CUInt32PCharPair g_SegnmentTypes[] =
|
||||||
|
|
@ -186,14 +229,16 @@ struct CSegment
|
||||||
UInt32 Flags;
|
UInt32 Flags;
|
||||||
UInt64 Offset;
|
UInt64 Offset;
|
||||||
UInt64 Va;
|
UInt64 Va;
|
||||||
// UInt64 Pa;
|
UInt64 Size; // size in file
|
||||||
UInt64 Size;
|
UInt64 VSize; // size in memory
|
||||||
UInt64 VSize;
|
#ifdef Z7_ELF_SHOW_DETAILS
|
||||||
UInt64 Align;
|
UInt64 Pa; // usually == Va, or == 0
|
||||||
|
UInt64 Align; // if (Align != 0), condition must be met:
|
||||||
|
// (VSize % Align == Offset % Alig)
|
||||||
|
#endif
|
||||||
void UpdateTotalSize(UInt64 &totalSize)
|
void UpdateTotalSize(UInt64 &totalSize)
|
||||||
{
|
{
|
||||||
UInt64 t = Offset + Size;
|
const UInt64 t = Offset + Size;
|
||||||
if (totalSize < t)
|
if (totalSize < t)
|
||||||
totalSize = t;
|
totalSize = t;
|
||||||
}
|
}
|
||||||
|
|
@ -208,20 +253,24 @@ void CSegment::Parse(const Byte *p, bool mode64, bool be)
|
||||||
G32(4, Flags);
|
G32(4, Flags);
|
||||||
G64(8, Offset);
|
G64(8, Offset);
|
||||||
G64(0x10, Va);
|
G64(0x10, Va);
|
||||||
// G64(0x18, Pa);
|
|
||||||
G64(0x20, Size);
|
G64(0x20, Size);
|
||||||
G64(0x28, VSize);
|
G64(0x28, VSize);
|
||||||
|
#ifdef Z7_ELF_SHOW_DETAILS
|
||||||
|
G64(0x18, Pa);
|
||||||
G64(0x30, Align);
|
G64(0x30, Align);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
G32(4, Offset);
|
G32(4, Offset);
|
||||||
G32(8, Va);
|
G32(8, Va);
|
||||||
// G32(0x0C, Pa);
|
|
||||||
G32(0x10, Size);
|
G32(0x10, Size);
|
||||||
G32(0x14, VSize);
|
G32(0x14, VSize);
|
||||||
G32(0x18, Flags);
|
G32(0x18, Flags);
|
||||||
|
#ifdef Z7_ELF_SHOW_DETAILS
|
||||||
|
G32(0x0C, Pa);
|
||||||
G32(0x1C, Align);
|
G32(0x1C, Align);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -290,6 +339,8 @@ static const CUInt32PCharPair g_SectTypes[] =
|
||||||
{ 0x70000005, "ARM_OVERLAYSECTION" }
|
{ 0x70000005, "ARM_OVERLAYSECTION" }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// SHF_ flags
|
||||||
static const CUInt32PCharPair g_SectionFlags[] =
|
static const CUInt32PCharPair g_SectionFlags[] =
|
||||||
{
|
{
|
||||||
{ 0, "WRITE" },
|
{ 0, "WRITE" },
|
||||||
|
|
@ -303,7 +354,7 @@ static const CUInt32PCharPair g_SectionFlags[] =
|
||||||
{ 8, "OS_NONCONFORMING" },
|
{ 8, "OS_NONCONFORMING" },
|
||||||
{ 9, "GROUP" },
|
{ 9, "GROUP" },
|
||||||
{ 10, "TLS" },
|
{ 10, "TLS" },
|
||||||
{ 11, "CP_SECTION" },
|
{ 11, "COMPRESSED" },
|
||||||
{ 12, "DP_SECTION" },
|
{ 12, "DP_SECTION" },
|
||||||
{ 13, "XCORE_SHF_CP_SECTION" },
|
{ 13, "XCORE_SHF_CP_SECTION" },
|
||||||
{ 28, "64_LARGE" },
|
{ 28, "64_LARGE" },
|
||||||
|
|
@ -326,7 +377,7 @@ struct CSection
|
||||||
|
|
||||||
void UpdateTotalSize(UInt64 &totalSize)
|
void UpdateTotalSize(UInt64 &totalSize)
|
||||||
{
|
{
|
||||||
UInt64 t = Offset + GetSize();
|
const UInt64 t = Offset + GetSize();
|
||||||
if (totalSize < t)
|
if (totalSize < t)
|
||||||
totalSize = t;
|
totalSize = t;
|
||||||
}
|
}
|
||||||
|
|
@ -412,7 +463,7 @@ static const char * const g_Machines[] =
|
||||||
, "TRW RH-32"
|
, "TRW RH-32"
|
||||||
, "Motorola RCE"
|
, "Motorola RCE"
|
||||||
, "ARM"
|
, "ARM"
|
||||||
, "Alpha"
|
, "Alpha-STD"
|
||||||
, "Hitachi SH"
|
, "Hitachi SH"
|
||||||
, "SPARC-V9"
|
, "SPARC-V9"
|
||||||
, "Siemens Tricore"
|
, "Siemens Tricore"
|
||||||
|
|
@ -577,8 +628,8 @@ static const char * const g_Machines[] =
|
||||||
static const CUInt32PCharPair g_MachinePairs[] =
|
static const CUInt32PCharPair g_MachinePairs[] =
|
||||||
{
|
{
|
||||||
{ 243, "RISC-V" },
|
{ 243, "RISC-V" },
|
||||||
{ 47787, "Xilinx MicroBlaze" }
|
{ 0x9026, "Alpha" }, // EM_ALPHA_EXP, obsolete, (used by NetBSD/alpha) (written in the absence of an ABI)
|
||||||
// { 0x9026, "Alpha" }
|
{ 0xbaab, "Xilinx MicroBlaze" }
|
||||||
};
|
};
|
||||||
|
|
||||||
static const CUInt32PCharPair g_OS[] =
|
static const CUInt32PCharPair g_OS[] =
|
||||||
|
|
@ -600,6 +651,8 @@ static const CUInt32PCharPair g_OS[] =
|
||||||
{ 14, "HP NSK" },
|
{ 14, "HP NSK" },
|
||||||
{ 15, "AROS" },
|
{ 15, "AROS" },
|
||||||
{ 16, "FenixOS" },
|
{ 16, "FenixOS" },
|
||||||
|
{ 17, "CloudABI" },
|
||||||
|
{ 18, "OpenVOS" },
|
||||||
{ 64, "Bare-metal TMS320C6000" },
|
{ 64, "Bare-metal TMS320C6000" },
|
||||||
{ 65, "Linux TMS320C6000" },
|
{ 65, "Linux TMS320C6000" },
|
||||||
{ 97, "ARM" },
|
{ 97, "ARM" },
|
||||||
|
|
@ -693,7 +746,9 @@ public:
|
||||||
void CHandler::GetSectionName(UInt32 index, NCOM::CPropVariant &prop, bool showNULL) const
|
void CHandler::GetSectionName(UInt32 index, NCOM::CPropVariant &prop, bool showNULL) const
|
||||||
{
|
{
|
||||||
if (index >= _sections.Size())
|
if (index >= _sections.Size())
|
||||||
return;
|
prop = index; // it's possible for some file, but maybe it's ERROR case
|
||||||
|
else
|
||||||
|
{
|
||||||
const CSection §ion = _sections[index];
|
const CSection §ion = _sections[index];
|
||||||
const UInt32 offset = section.Name;
|
const UInt32 offset = section.Name;
|
||||||
if (index == SHN_UNDEF /* && section.Type == SHT_NULL && offset == 0 */)
|
if (index == SHN_UNDEF /* && section.Type == SHT_NULL && offset == 0 */)
|
||||||
|
|
@ -703,13 +758,15 @@ void CHandler::GetSectionName(UInt32 index, NCOM::CPropVariant &prop, bool showN
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const Byte *p = _namesData;
|
const Byte *p = _namesData;
|
||||||
size_t size = _namesData.Size();
|
const size_t size = _namesData.Size();
|
||||||
for (size_t i = offset; i < size; i++)
|
for (size_t i = offset; i < size; i++)
|
||||||
if (p[i] == 0)
|
if (p[i] == 0)
|
||||||
{
|
{
|
||||||
prop = (const char *)(p + offset);
|
prop = (const char *)(p + offset);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
prop = "ERROR";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static const Byte kArcProps[] =
|
static const Byte kArcProps[] =
|
||||||
|
|
@ -726,7 +783,14 @@ static const Byte kArcProps[] =
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
kpidLinkSection = kpidUserDefined,
|
kpidLinkSection = kpidUserDefined,
|
||||||
kpidInfoSection
|
kpidInfoSection,
|
||||||
|
kpidEntrySize
|
||||||
|
#ifdef Z7_ELF_SHOW_DETAILS
|
||||||
|
// , kpidAlign
|
||||||
|
, kpidPa
|
||||||
|
, kpidDelta
|
||||||
|
, kpidOffsetEnd
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
static const CStatProp kProps[] =
|
static const CStatProp kProps[] =
|
||||||
|
|
@ -738,6 +802,14 @@ static const CStatProp kProps[] =
|
||||||
{ NULL, kpidVa, VT_UI8 },
|
{ NULL, kpidVa, VT_UI8 },
|
||||||
{ NULL, kpidType, VT_BSTR },
|
{ NULL, kpidType, VT_BSTR },
|
||||||
{ NULL, kpidCharacts, VT_BSTR }
|
{ NULL, kpidCharacts, VT_BSTR }
|
||||||
|
#ifdef Z7_ELF_SHOW_DETAILS
|
||||||
|
// , { "Align", kpidAlign, VT_UI8 }
|
||||||
|
, { NULL, kpidClusterSize, VT_UI8 }
|
||||||
|
, { "PA", kpidPa, VT_UI8 }
|
||||||
|
, { "End offset", kpidOffsetEnd, VT_UI8 }
|
||||||
|
, { "Delta (VA-Offset)", kpidDelta, VT_UI8 }
|
||||||
|
#endif
|
||||||
|
, { "Entry Size", kpidEntrySize, VT_UI8}
|
||||||
, { "Link Section", kpidLinkSection, VT_BSTR}
|
, { "Link Section", kpidLinkSection, VT_BSTR}
|
||||||
, { "Info Section", kpidInfoSection, VT_BSTR}
|
, { "Info Section", kpidInfoSection, VT_BSTR}
|
||||||
};
|
};
|
||||||
|
|
@ -769,7 +841,7 @@ Z7_COM7F_IMF(CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value))
|
||||||
if (s.IsEmpty())
|
if (s.IsEmpty())
|
||||||
s = TypePairToString(g_MachinePairs, Z7_ARRAY_SIZE(g_MachinePairs), _header.Machine);
|
s = TypePairToString(g_MachinePairs, Z7_ARRAY_SIZE(g_MachinePairs), _header.Machine);
|
||||||
UInt32 flags = _header.Flags;
|
UInt32 flags = _header.Flags;
|
||||||
if (flags != 0)
|
if (flags)
|
||||||
{
|
{
|
||||||
s.Add_Space();
|
s.Add_Space();
|
||||||
if (_header.Machine == k_Machine_ARM)
|
if (_header.Machine == k_Machine_ARM)
|
||||||
|
|
@ -783,10 +855,10 @@ Z7_COM7F_IMF(CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value))
|
||||||
const UInt32 ver = flags >> 28;
|
const UInt32 ver = flags >> 28;
|
||||||
s += "v";
|
s += "v";
|
||||||
s.Add_UInt32(ver);
|
s.Add_UInt32(ver);
|
||||||
flags &= (((UInt32)1 << 28) - 1);
|
flags &= ((UInt32)1 << 28) - 1;
|
||||||
|
|
||||||
UInt32 abi = (flags >> 12) & 7;
|
const UInt32 abi = (flags >> 12) & 7;
|
||||||
if (abi != 0)
|
if (abi)
|
||||||
{
|
{
|
||||||
s += " ABI:";
|
s += " ABI:";
|
||||||
s.Add_UInt32(abi);
|
s.Add_UInt32(abi);
|
||||||
|
|
@ -827,13 +899,39 @@ Z7_COM7F_IMF(CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value))
|
||||||
case kpidHostOS: PAIR_TO_PROP(g_OS, _header.Os, prop); break;
|
case kpidHostOS: PAIR_TO_PROP(g_OS, _header.Os, prop); break;
|
||||||
case kpidCharacts: TYPE_TO_PROP(g_Types, _header.Type, prop); break;
|
case kpidCharacts: TYPE_TO_PROP(g_Types, _header.Type, prop); break;
|
||||||
case kpidComment:
|
case kpidComment:
|
||||||
|
{
|
||||||
|
AString s;
|
||||||
if (_stackFlags_Defined)
|
if (_stackFlags_Defined)
|
||||||
{
|
{
|
||||||
AString s ("STACK: ");
|
s += "STACK: ";
|
||||||
s += FlagsToString(g_SegmentFlags, Z7_ARRAY_SIZE(g_SegmentFlags), _stackFlags);
|
s += FlagsToString(g_SegmentFlags, Z7_ARRAY_SIZE(g_SegmentFlags), _stackFlags);
|
||||||
prop = s;
|
s.Add_LF();
|
||||||
|
/*
|
||||||
|
if (_header.EntryVa)
|
||||||
|
{
|
||||||
|
s += "Entry point: 0x";
|
||||||
|
char temp[16 + 4];
|
||||||
|
ConvertUInt64ToHex(_header.EntryVa, temp);
|
||||||
|
s += temp;
|
||||||
|
s.Add_LF();
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
if (_header.NumSegments)
|
||||||
|
{
|
||||||
|
s += "Segments: ";
|
||||||
|
s.Add_UInt32(_header.NumSegments);
|
||||||
|
s.Add_LF();
|
||||||
|
}
|
||||||
|
if (_header.NumSections)
|
||||||
|
{
|
||||||
|
s += "Sections: ";
|
||||||
|
s.Add_UInt32(_header.NumSections);
|
||||||
|
s.Add_LF();
|
||||||
|
}
|
||||||
|
prop = s;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case kpidExtension:
|
case kpidExtension:
|
||||||
{
|
{
|
||||||
const char *s = NULL;
|
const char *s = NULL;
|
||||||
|
|
@ -878,12 +976,17 @@ Z7_COM7F_IMF(CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *val
|
||||||
}
|
}
|
||||||
case kpidOffset: prop = item.Offset; break;
|
case kpidOffset: prop = item.Offset; break;
|
||||||
case kpidVa: prop = item.Va; break;
|
case kpidVa: prop = item.Va; break;
|
||||||
|
#ifdef Z7_ELF_SHOW_DETAILS
|
||||||
|
case kpidDelta: if (item.Va) { prop = item.Va - item.Offset; } break;
|
||||||
|
case kpidOffsetEnd: prop = item.Offset + item.Size; break;
|
||||||
|
case kpidPa: prop = item.Pa; break;
|
||||||
|
case kpidClusterSize: prop = item.Align; break;
|
||||||
|
#endif
|
||||||
case kpidSize:
|
case kpidSize:
|
||||||
case kpidPackSize: prop = (UInt64)item.Size; break;
|
case kpidPackSize: prop = (UInt64)item.Size; break;
|
||||||
case kpidVirtualSize: prop = (UInt64)item.VSize; break;
|
case kpidVirtualSize: prop = (UInt64)item.VSize; break;
|
||||||
case kpidType: PAIR_TO_PROP(g_SegnmentTypes, item.Type, prop); break;
|
case kpidType: PAIR_TO_PROP(g_SegnmentTypes, item.Type, prop); break;
|
||||||
case kpidCharacts: FLAGS_TO_PROP(g_SegmentFlags, item.Flags, prop); break;
|
case kpidCharacts: FLAGS_TO_PROP(g_SegmentFlags, item.Flags, prop); break;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -895,13 +998,19 @@ Z7_COM7F_IMF(CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *val
|
||||||
case kpidPath: GetSectionName(index, prop, true); break;
|
case kpidPath: GetSectionName(index, prop, true); break;
|
||||||
case kpidOffset: prop = item.Offset; break;
|
case kpidOffset: prop = item.Offset; break;
|
||||||
case kpidVa: prop = item.Va; break;
|
case kpidVa: prop = item.Va; break;
|
||||||
|
#ifdef Z7_ELF_SHOW_DETAILS
|
||||||
|
case kpidDelta: if (item.Va) { prop = item.Va - item.Offset; } break;
|
||||||
|
case kpidOffsetEnd: prop = item.Offset + item.GetSize(); break;
|
||||||
|
#endif
|
||||||
case kpidSize:
|
case kpidSize:
|
||||||
case kpidPackSize: prop = (UInt64)(item.Type == SHT_NOBITS ? 0 : item.VSize); break;
|
case kpidPackSize: prop = (UInt64)(item.Type == SHT_NOBITS ? 0 : item.VSize); break;
|
||||||
case kpidVirtualSize: prop = item.GetSize(); break;
|
case kpidVirtualSize: prop = item.GetSize(); break;
|
||||||
case kpidType: PAIR_TO_PROP(g_SectTypes, item.Type, prop); break;
|
case kpidType: PAIR_TO_PROP(g_SectTypes, item.Type, prop); break;
|
||||||
case kpidCharacts: FLAGS_TO_PROP(g_SectionFlags, (UInt32)item.Flags, prop); break;
|
case kpidCharacts: FLAGS_TO_PROP(g_SectionFlags, (UInt32)item.Flags, prop); break;
|
||||||
|
// case kpidAlign: prop = item.Align; break;
|
||||||
case kpidLinkSection: GetSectionName(item.Link, prop, false); break;
|
case kpidLinkSection: GetSectionName(item.Link, prop, false); break;
|
||||||
case kpidInfoSection: GetSectionName(item.Info, prop, false); break;
|
case kpidInfoSection: GetSectionName(item.Info, prop, false); break;
|
||||||
|
case kpidEntrySize: prop = (UInt64)item.EntSize; break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
prop.Detach(value);
|
prop.Detach(value);
|
||||||
|
|
@ -911,42 +1020,46 @@ Z7_COM7F_IMF(CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *val
|
||||||
|
|
||||||
HRESULT CHandler::Open2(IInStream *stream)
|
HRESULT CHandler::Open2(IInStream *stream)
|
||||||
{
|
{
|
||||||
|
{
|
||||||
const UInt32 kStartSize = kHeaderSize64;
|
const UInt32 kStartSize = kHeaderSize64;
|
||||||
Byte h[kStartSize];
|
UInt64 h64[kStartSize / 8];
|
||||||
RINOK(ReadStream_FALSE(stream, h, kStartSize))
|
RINOK(ReadStream_FALSE(stream, h64, kStartSize))
|
||||||
if (h[0] != 0x7F || h[1] != 'E' || h[2] != 'L' || h[3] != 'F')
|
const Byte *h = (const Byte *)(const void *)h64;
|
||||||
|
if (GetUi32a(h) != 0x464c457f)
|
||||||
return S_FALSE;
|
return S_FALSE;
|
||||||
if (!_header.Parse(h))
|
if (!_header.Parse(h))
|
||||||
return S_FALSE;
|
return S_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
_totalSize = _header.HeaderSize;
|
_totalSize = _header.HeaderSize;
|
||||||
|
|
||||||
bool addSegments = false;
|
bool addSegments = false;
|
||||||
bool addSections = false;
|
bool addSections = false;
|
||||||
|
// first section usually is NULL (with zero offsets and zero sizes).
|
||||||
if (_header.NumSections > 1)
|
if (_header.NumSegments == 0 || _header.NumSections > 1)
|
||||||
addSections = true;
|
addSections = true;
|
||||||
else
|
else
|
||||||
addSegments = true;
|
addSegments = true;
|
||||||
|
#ifdef Z7_ELF_SHOW_DETAILS
|
||||||
|
addSections = true;
|
||||||
|
addSegments = true;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (_header.NumSegments != 0)
|
if (_header.NumSegments)
|
||||||
{
|
{
|
||||||
if (_header.ProgOffset > (UInt64)1 << 60) return S_FALSE;
|
if (_header.ProgOffset > (UInt64)1 << 60) return S_FALSE;
|
||||||
RINOK(InStream_SeekSet(stream, _header.ProgOffset))
|
RINOK(InStream_SeekSet(stream, _header.ProgOffset))
|
||||||
const size_t size = (size_t)_header.SegmentEntrySize * _header.NumSegments;
|
const size_t size = (size_t)_header.SegmentEntrySize * _header.NumSegments;
|
||||||
|
|
||||||
CByteArr buf(size);
|
CByteArr buf(size);
|
||||||
|
|
||||||
RINOK(ReadStream_FALSE(stream, buf, size))
|
RINOK(ReadStream_FALSE(stream, buf, size))
|
||||||
|
{
|
||||||
const UInt64 total = _header.ProgOffset + size;
|
const UInt64 total = _header.ProgOffset + size;
|
||||||
if (_totalSize < total)
|
if (_totalSize < total)
|
||||||
_totalSize = total;
|
_totalSize = total;
|
||||||
|
}
|
||||||
const Byte *p = buf;
|
|
||||||
|
|
||||||
if (addSegments)
|
if (addSegments)
|
||||||
_segments.ClearAndReserve(_header.NumSegments);
|
_segments.ClearAndReserve(_header.NumSegments);
|
||||||
|
const Byte *p = buf;
|
||||||
for (unsigned i = 0; i < _header.NumSegments; i++, p += _header.SegmentEntrySize)
|
for (unsigned i = 0; i < _header.NumSegments; i++, p += _header.SegmentEntrySize)
|
||||||
{
|
{
|
||||||
CSegment seg;
|
CSegment seg;
|
||||||
|
|
@ -957,29 +1070,29 @@ HRESULT CHandler::Open2(IInStream *stream)
|
||||||
_stackFlags = seg.Flags;
|
_stackFlags = seg.Flags;
|
||||||
_stackFlags_Defined = true;
|
_stackFlags_Defined = true;
|
||||||
}
|
}
|
||||||
if (addSegments && seg.Type != PT_PHDR)
|
if (addSegments
|
||||||
|
// we don't show program header table segment
|
||||||
|
&& seg.Type != PT_PHDR
|
||||||
|
)
|
||||||
_segments.AddInReserved(seg);
|
_segments.AddInReserved(seg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_header.NumSections != 0)
|
if (_header.NumSections)
|
||||||
{
|
{
|
||||||
if (_header.SectOffset > (UInt64)1 << 60) return S_FALSE;
|
if (_header.SectOffset > (UInt64)1 << 60) return S_FALSE;
|
||||||
RINOK(InStream_SeekSet(stream, _header.SectOffset))
|
RINOK(InStream_SeekSet(stream, _header.SectOffset))
|
||||||
size_t size = (size_t)_header.SectionEntrySize * _header.NumSections;
|
const size_t size = (size_t)_header.SectionEntrySize * _header.NumSections;
|
||||||
|
|
||||||
CByteArr buf(size);
|
CByteArr buf(size);
|
||||||
|
|
||||||
RINOK(ReadStream_FALSE(stream, buf, size))
|
RINOK(ReadStream_FALSE(stream, buf, size))
|
||||||
|
{
|
||||||
UInt64 total = _header.SectOffset + size;
|
const UInt64 total = _header.SectOffset + size;
|
||||||
if (_totalSize < total)
|
if (_totalSize < total)
|
||||||
_totalSize = total;
|
_totalSize = total;
|
||||||
|
}
|
||||||
const Byte *p = buf;
|
|
||||||
|
|
||||||
if (addSections)
|
if (addSections)
|
||||||
_sections.ClearAndReserve(_header.NumSections);
|
_sections.ClearAndReserve(_header.NumSections);
|
||||||
|
const Byte *p = buf;
|
||||||
for (unsigned i = 0; i < _header.NumSections; i++, p += _header.SectionEntrySize)
|
for (unsigned i = 0; i < _header.NumSections; i++, p += _header.SectionEntrySize)
|
||||||
{
|
{
|
||||||
CSection sect;
|
CSection sect;
|
||||||
|
|
@ -1000,8 +1113,7 @@ HRESULT CHandler::Open2(IInStream *stream)
|
||||||
{
|
{
|
||||||
const CSection § = _sections[_header.NamesSectIndex];
|
const CSection § = _sections[_header.NamesSectIndex];
|
||||||
const UInt64 size = sect.GetSize();
|
const UInt64 size = sect.GetSize();
|
||||||
if (size != 0
|
if (size && size < ((UInt64)1 << 31)
|
||||||
&& size < ((UInt64)1 << 31)
|
|
||||||
&& (Int64)sect.Offset >= 0)
|
&& (Int64)sect.Offset >= 0)
|
||||||
{
|
{
|
||||||
_namesData.Alloc((size_t)size);
|
_namesData.Alloc((size_t)size);
|
||||||
|
|
@ -1009,9 +1121,9 @@ HRESULT CHandler::Open2(IInStream *stream)
|
||||||
RINOK(ReadStream_FALSE(stream, _namesData, (size_t)size))
|
RINOK(ReadStream_FALSE(stream, _namesData, (size_t)size))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
// we will not delete NULL sections, since we have links to section via indexes
|
// we cannot delete "NULL" sections,
|
||||||
|
// because we have links to sections array via indexes
|
||||||
for (int i = _sections.Size() - 1; i >= 0; i--)
|
for (int i = _sections.Size() - 1; i >= 0; i--)
|
||||||
if (_sections[i].Type == SHT_NULL)
|
if (_sections[i].Type == SHT_NULL)
|
||||||
_items.Delete(i);
|
_items.Delete(i);
|
||||||
|
|
@ -1080,7 +1192,7 @@ Z7_COM7F_IMF(CHandler::Extract(const UInt32 *indices, UInt32 numItems,
|
||||||
}
|
}
|
||||||
RINOK(extractCallback->SetTotal(totalSize))
|
RINOK(extractCallback->SetTotal(totalSize))
|
||||||
|
|
||||||
UInt64 currentTotalSize = 0;
|
totalSize = 0;
|
||||||
UInt64 currentItemSize;
|
UInt64 currentItemSize;
|
||||||
|
|
||||||
CMyComPtr2_Create<ICompressCoder, NCompress::CCopyCoder> copyCoder;
|
CMyComPtr2_Create<ICompressCoder, NCompress::CCopyCoder> copyCoder;
|
||||||
|
|
@ -1089,9 +1201,9 @@ Z7_COM7F_IMF(CHandler::Extract(const UInt32 *indices, UInt32 numItems,
|
||||||
CMyComPtr2_Create<ISequentialInStream, CLimitedSequentialInStream> inStream;
|
CMyComPtr2_Create<ISequentialInStream, CLimitedSequentialInStream> inStream;
|
||||||
inStream->SetStream(_inStream);
|
inStream->SetStream(_inStream);
|
||||||
|
|
||||||
for (i = 0;; i++, currentTotalSize += currentItemSize)
|
for (i = 0;; i++, totalSize += currentItemSize)
|
||||||
{
|
{
|
||||||
lps->InSize = lps->OutSize = currentTotalSize;
|
lps->InSize = lps->OutSize = totalSize;
|
||||||
RINOK(lps->SetCur())
|
RINOK(lps->SetCur())
|
||||||
if (i >= numItems)
|
if (i >= numItems)
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -473,8 +473,8 @@ Z7_COM7F_IMF(CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *val
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case kpidIsDir: prop = item.IsDir(); break;
|
case kpidIsDir: prop = item.IsDir(); break;
|
||||||
case kpidSize: prop = item.Size; break;
|
case kpidSize: prop = (UInt64)item.Size; break;
|
||||||
case kpidPackSize: prop = item.PackSize; break;
|
case kpidPackSize: prop = (UInt64)item.PackSize; break;
|
||||||
case kpidCRC: prop = (UInt32)item.CRC; break;
|
case kpidCRC: prop = (UInt32)item.CRC; break;
|
||||||
case kpidHostOS: PAIR_TO_PROP(g_OsPairs, item.OsId, prop); break;
|
case kpidHostOS: PAIR_TO_PROP(g_OsPairs, item.OsId, prop); break;
|
||||||
case kpidMTime:
|
case kpidMTime:
|
||||||
|
|
|
||||||
|
|
@ -1579,6 +1579,8 @@ HRESULT CHandler::OpenCapsule(IInStream *stream)
|
||||||
|| _h.CapsuleImageSize < _h.HeaderSize
|
|| _h.CapsuleImageSize < _h.HeaderSize
|
||||||
|| _h.OffsetToCapsuleBody < _h.HeaderSize
|
|| _h.OffsetToCapsuleBody < _h.HeaderSize
|
||||||
|| _h.OffsetToCapsuleBody > _h.CapsuleImageSize
|
|| _h.OffsetToCapsuleBody > _h.CapsuleImageSize
|
||||||
|
|| _h.CapsuleImageSize > (1u << 30) // to reduce false detection
|
||||||
|
|| _h.HeaderSize > (1u << 28) // to reduce false detection
|
||||||
)
|
)
|
||||||
return S_FALSE;
|
return S_FALSE;
|
||||||
_phySize = _h.CapsuleImageSize;
|
_phySize = _h.CapsuleImageSize;
|
||||||
|
|
@ -1587,7 +1589,7 @@ HRESULT CHandler::OpenCapsule(IInStream *stream)
|
||||||
_h.OffsetToSplitInformation != 0 )
|
_h.OffsetToSplitInformation != 0 )
|
||||||
return E_NOTIMPL;
|
return E_NOTIMPL;
|
||||||
|
|
||||||
unsigned bufIndex = AddBuf(_h.CapsuleImageSize);
|
const unsigned bufIndex = AddBuf(_h.CapsuleImageSize);
|
||||||
CByteBuffer &buf0 = _bufs[bufIndex];
|
CByteBuffer &buf0 = _bufs[bufIndex];
|
||||||
memcpy(buf0, buf, kHeaderSize);
|
memcpy(buf0, buf, kHeaderSize);
|
||||||
ReadStream_FALSE(stream, buf0 + kHeaderSize, _h.CapsuleImageSize - kHeaderSize);
|
ReadStream_FALSE(stream, buf0 + kHeaderSize, _h.CapsuleImageSize - kHeaderSize);
|
||||||
|
|
|
||||||
|
|
@ -422,7 +422,7 @@ int Main2(
|
||||||
{
|
{
|
||||||
CExtractCallbackConsole *ecs = new CExtractCallbackConsole;
|
CExtractCallbackConsole *ecs = new CExtractCallbackConsole;
|
||||||
CMyComPtr<IFolderArchiveExtractCallback> extractCallback = ecs;
|
CMyComPtr<IFolderArchiveExtractCallback> extractCallback = ecs;
|
||||||
ecs->Init(g_StdStream, &g_StdErr, g_StdStream);
|
ecs->Init(g_StdStream, &g_StdErr, g_StdStream, false);
|
||||||
|
|
||||||
#ifndef Z7_NO_CRYPTO
|
#ifndef Z7_NO_CRYPTO
|
||||||
ecs->PasswordIsDefined = passwordEnabled;
|
ecs->PasswordIsDefined = passwordEnabled;
|
||||||
|
|
|
||||||
|
|
@ -196,29 +196,17 @@ static void x86_Filter(Byte *data, UInt32 size, Int32 *history)
|
||||||
|
|
||||||
const Byte b = p[0];
|
const Byte b = p[0];
|
||||||
|
|
||||||
if (b == 0x48)
|
if ((b & 0x80) == 0) // REX (0x48 or 0x4c)
|
||||||
{
|
{
|
||||||
if (p[1] == 0x8B)
|
const unsigned b2 = p[2] - 0x5; // [RIP + disp32]
|
||||||
|
if (b2 & 0x7)
|
||||||
|
continue;
|
||||||
|
if (p[1] != 0x8d) // LEA
|
||||||
{
|
{
|
||||||
if ((p[2] & 0xF7) != 0x5)
|
if (p[1] != 0x8b || b != 0x48 || (b2 & 0xf7))
|
||||||
continue;
|
continue;
|
||||||
// MOV RAX / RCX, [RIP + disp32]
|
// MOV RAX / RCX, [RIP + disp32]
|
||||||
}
|
}
|
||||||
else if (p[1] == 0x8D) // LEA
|
|
||||||
{
|
|
||||||
if ((p[2] & 0x7) != 0x5)
|
|
||||||
continue;
|
|
||||||
// LEA R**, []
|
|
||||||
}
|
|
||||||
else
|
|
||||||
continue;
|
|
||||||
codeLen = 3;
|
|
||||||
}
|
|
||||||
else if (b == 0x4C)
|
|
||||||
{
|
|
||||||
if (p[1] != 0x8D || (p[2] & 0x7) != 0x5)
|
|
||||||
continue;
|
|
||||||
// LEA R*, []
|
|
||||||
codeLen = 3;
|
codeLen = 3;
|
||||||
}
|
}
|
||||||
else if (b == 0xE8)
|
else if (b == 0xE8)
|
||||||
|
|
|
||||||
|
|
@ -1039,6 +1039,9 @@ void CArcCmdLineParser::Parse1(const UStringVector &commandStrings,
|
||||||
options.TechMode = parser[NKey::kTechMode].ThereIs;
|
options.TechMode = parser[NKey::kTechMode].ThereIs;
|
||||||
options.ShowTime = parser[NKey::kShowTime].ThereIs;
|
options.ShowTime = parser[NKey::kShowTime].ThereIs;
|
||||||
|
|
||||||
|
if (parser[NKey::kDisablePercents].ThereIs)
|
||||||
|
options.DisablePercents = true;
|
||||||
|
|
||||||
if (parser[NKey::kDisablePercents].ThereIs
|
if (parser[NKey::kDisablePercents].ThereIs
|
||||||
|| options.StdOutMode
|
|| options.StdOutMode
|
||||||
|| !options.IsStdOutTerminal)
|
|| !options.IsStdOutTerminal)
|
||||||
|
|
|
||||||
|
|
@ -60,6 +60,8 @@ struct CArcCmdLineOptions
|
||||||
bool StdInMode;
|
bool StdInMode;
|
||||||
bool StdOutMode;
|
bool StdOutMode;
|
||||||
bool EnableHeaders;
|
bool EnableHeaders;
|
||||||
|
bool DisablePercents;
|
||||||
|
|
||||||
|
|
||||||
bool YesToAll;
|
bool YesToAll;
|
||||||
bool ShowDialog;
|
bool ShowDialog;
|
||||||
|
|
@ -132,6 +134,7 @@ struct CArcCmdLineOptions
|
||||||
StdOutMode(false),
|
StdOutMode(false),
|
||||||
|
|
||||||
EnableHeaders(false),
|
EnableHeaders(false),
|
||||||
|
DisablePercents(false),
|
||||||
|
|
||||||
YesToAll(false),
|
YesToAll(false),
|
||||||
ShowDialog(false),
|
ShowDialog(false),
|
||||||
|
|
|
||||||
|
|
@ -343,7 +343,7 @@ Z7_COM7F_IMF(CExtractCallbackConsole::PrepareOperation(const wchar_t *name, Int3
|
||||||
default: s = "???"; requiredLevel = 2;
|
default: s = "???"; requiredLevel = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool show2 = (LogLevel >= requiredLevel && _so);
|
const bool show2 = (LogLevel >= requiredLevel && _so);
|
||||||
|
|
||||||
if (show2)
|
if (show2)
|
||||||
{
|
{
|
||||||
|
|
@ -373,6 +373,7 @@ Z7_COM7F_IMF(CExtractCallbackConsole::PrepareOperation(const wchar_t *name, Int3
|
||||||
|
|
||||||
if (NeedFlush)
|
if (NeedFlush)
|
||||||
_so->Flush();
|
_so->Flush();
|
||||||
|
// _so->Flush(); // for debug only
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NeedPercents())
|
if (NeedPercents())
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,7 @@ class CExtractScanConsole Z7_final: public IDirItemsCallback
|
||||||
|
|
||||||
// CErrorPathCodes2 ScanErrors;
|
// CErrorPathCodes2 ScanErrors;
|
||||||
|
|
||||||
bool NeedPercents() const { return _percent._so != NULL; }
|
bool NeedPercents() const { return _percent._so && !_percent.DisablePrint; }
|
||||||
|
|
||||||
void ClosePercentsAndFlush()
|
void ClosePercentsAndFlush()
|
||||||
{
|
{
|
||||||
|
|
@ -56,11 +56,16 @@ class CExtractScanConsole Z7_final: public IDirItemsCallback
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
void Init(CStdOutStream *outStream, CStdOutStream *errorStream, CStdOutStream *percentStream)
|
void Init(
|
||||||
|
CStdOutStream *outStream,
|
||||||
|
CStdOutStream *errorStream,
|
||||||
|
CStdOutStream *percentStream,
|
||||||
|
bool disablePercents)
|
||||||
{
|
{
|
||||||
_so = outStream;
|
_so = outStream;
|
||||||
_se = errorStream;
|
_se = errorStream;
|
||||||
_percent._so = percentStream;
|
_percent._so = percentStream;
|
||||||
|
_percent.DisablePrint = disablePercents;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetWindowWidth(unsigned width) { _percent.MaxLen = width - 1; }
|
void SetWindowWidth(unsigned width) { _percent.MaxLen = width - 1; }
|
||||||
|
|
@ -177,9 +182,13 @@ public:
|
||||||
|
|
||||||
void SetWindowWidth(unsigned width) { _percent.MaxLen = width - 1; }
|
void SetWindowWidth(unsigned width) { _percent.MaxLen = width - 1; }
|
||||||
|
|
||||||
void Init(CStdOutStream *outStream, CStdOutStream *errorStream, CStdOutStream *percentStream)
|
void Init(
|
||||||
|
CStdOutStream *outStream,
|
||||||
|
CStdOutStream *errorStream,
|
||||||
|
CStdOutStream *percentStream,
|
||||||
|
bool disablePercents)
|
||||||
{
|
{
|
||||||
COpenCallbackConsole::Init(outStream, errorStream, percentStream);
|
COpenCallbackConsole::Init(outStream, errorStream, percentStream, disablePercents);
|
||||||
|
|
||||||
NumTryArcs = 0;
|
NumTryArcs = 0;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1155,7 +1155,7 @@ HRESULT ListArchives(
|
||||||
CArchiveLink arcLink;
|
CArchiveLink arcLink;
|
||||||
|
|
||||||
COpenCallbackConsole openCallback;
|
COpenCallbackConsole openCallback;
|
||||||
openCallback.Init(&g_StdOut, g_ErrStream, NULL);
|
openCallback.Init(&g_StdOut, g_ErrStream, NULL, listOptions.DisablePercents);
|
||||||
|
|
||||||
#ifndef Z7_NO_CRYPTO
|
#ifndef Z7_NO_CRYPTO
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,10 +11,12 @@ struct CListOptions
|
||||||
{
|
{
|
||||||
bool ExcludeDirItems;
|
bool ExcludeDirItems;
|
||||||
bool ExcludeFileItems;
|
bool ExcludeFileItems;
|
||||||
|
bool DisablePercents;
|
||||||
|
|
||||||
CListOptions():
|
CListOptions():
|
||||||
ExcludeDirItems(false),
|
ExcludeDirItems(false),
|
||||||
ExcludeFileItems(false)
|
ExcludeFileItems(false),
|
||||||
|
DisablePercents(false)
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1280,7 +1280,9 @@ int Main2(
|
||||||
{
|
{
|
||||||
CExtractScanConsole scan;
|
CExtractScanConsole scan;
|
||||||
|
|
||||||
scan.Init(options.EnableHeaders ? g_StdStream : NULL, g_ErrStream, percentsStream);
|
scan.Init(options.EnableHeaders ? g_StdStream : NULL,
|
||||||
|
g_ErrStream, percentsStream,
|
||||||
|
options.DisablePercents);
|
||||||
scan.SetWindowWidth(consoleWidth);
|
scan.SetWindowWidth(consoleWidth);
|
||||||
|
|
||||||
if (g_StdStream && options.EnableHeaders)
|
if (g_StdStream && options.EnableHeaders)
|
||||||
|
|
@ -1330,7 +1332,7 @@ int Main2(
|
||||||
ecs->Password = options.Password;
|
ecs->Password = options.Password;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ecs->Init(g_StdStream, g_ErrStream, percentsStream);
|
ecs->Init(g_StdStream, g_ErrStream, percentsStream, options.DisablePercents);
|
||||||
ecs->MultiArcMode = (ArchivePathsSorted.Size() > 1);
|
ecs->MultiArcMode = (ArchivePathsSorted.Size() > 1);
|
||||||
|
|
||||||
ecs->LogLevel = options.LogLevel;
|
ecs->LogLevel = options.LogLevel;
|
||||||
|
|
@ -1494,6 +1496,7 @@ int Main2(
|
||||||
CListOptions lo;
|
CListOptions lo;
|
||||||
lo.ExcludeDirItems = options.Censor.ExcludeDirItems;
|
lo.ExcludeDirItems = options.Censor.ExcludeDirItems;
|
||||||
lo.ExcludeFileItems = options.Censor.ExcludeFileItems;
|
lo.ExcludeFileItems = options.Censor.ExcludeFileItems;
|
||||||
|
lo.DisablePercents = options.DisablePercents;
|
||||||
|
|
||||||
hresultMain = ListArchives(
|
hresultMain = ListArchives(
|
||||||
lo,
|
lo,
|
||||||
|
|
@ -1538,7 +1541,7 @@ int Main2(
|
||||||
uo.SfxModule = kDefaultSfxModule;
|
uo.SfxModule = kDefaultSfxModule;
|
||||||
|
|
||||||
COpenCallbackConsole openCallback;
|
COpenCallbackConsole openCallback;
|
||||||
openCallback.Init(g_StdStream, g_ErrStream, percentsStream);
|
openCallback.Init(g_StdStream, g_ErrStream, percentsStream, options.DisablePercents);
|
||||||
|
|
||||||
#ifndef Z7_NO_CRYPTO
|
#ifndef Z7_NO_CRYPTO
|
||||||
bool passwordIsDefined =
|
bool passwordIsDefined =
|
||||||
|
|
@ -1563,7 +1566,7 @@ int Main2(
|
||||||
callback.StdOutMode = uo.StdOutMode;
|
callback.StdOutMode = uo.StdOutMode;
|
||||||
callback.Init(
|
callback.Init(
|
||||||
// NULL,
|
// NULL,
|
||||||
g_StdStream, g_ErrStream, percentsStream);
|
g_StdStream, g_ErrStream, percentsStream, options.DisablePercents);
|
||||||
|
|
||||||
CUpdateErrorInfo errorInfo;
|
CUpdateErrorInfo errorInfo;
|
||||||
|
|
||||||
|
|
@ -1598,7 +1601,7 @@ int Main2(
|
||||||
if (percentsStream)
|
if (percentsStream)
|
||||||
callback.SetWindowWidth(consoleWidth);
|
callback.SetWindowWidth(consoleWidth);
|
||||||
|
|
||||||
callback.Init(g_StdStream, g_ErrStream, percentsStream);
|
callback.Init(g_StdStream, g_ErrStream, percentsStream, options.DisablePercents);
|
||||||
callback.PrintHeaders = options.EnableHeaders;
|
callback.PrintHeaders = options.EnableHeaders;
|
||||||
callback.PrintFields = options.ListFields;
|
callback.PrintFields = options.ListFields;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ protected:
|
||||||
bool _totalFilesDefined;
|
bool _totalFilesDefined;
|
||||||
// bool _totalBytesDefined;
|
// bool _totalBytesDefined;
|
||||||
|
|
||||||
bool NeedPercents() const { return _percent._so != NULL; }
|
bool NeedPercents() const { return _percent._so && !_percent.DisablePrint; }
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
|
@ -49,11 +49,16 @@ public:
|
||||||
|
|
||||||
virtual ~COpenCallbackConsole() {}
|
virtual ~COpenCallbackConsole() {}
|
||||||
|
|
||||||
void Init(CStdOutStream *outStream, CStdOutStream *errorStream, CStdOutStream *percentStream)
|
void Init(
|
||||||
|
CStdOutStream *outStream,
|
||||||
|
CStdOutStream *errorStream,
|
||||||
|
CStdOutStream *percentStream,
|
||||||
|
bool disablePercents)
|
||||||
{
|
{
|
||||||
_so = outStream;
|
_so = outStream;
|
||||||
_se = errorStream;
|
_se = errorStream;
|
||||||
_percent._so = percentStream;
|
_percent._so = percentStream;
|
||||||
|
_percent.DisablePrint = disablePercents;
|
||||||
}
|
}
|
||||||
|
|
||||||
Z7_IFACE_IMP(IOpenCallbackUI)
|
Z7_IFACE_IMP(IOpenCallbackUI)
|
||||||
|
|
|
||||||
|
|
@ -88,6 +88,8 @@ void CPercentPrinter::GetPercents()
|
||||||
|
|
||||||
void CPercentPrinter::Print()
|
void CPercentPrinter::Print()
|
||||||
{
|
{
|
||||||
|
if (DisablePrint)
|
||||||
|
return;
|
||||||
DWORD tick = 0;
|
DWORD tick = 0;
|
||||||
if (_tickStep != 0)
|
if (_tickStep != 0)
|
||||||
tick = GetTickCount();
|
tick = GetTickCount();
|
||||||
|
|
|
||||||
|
|
@ -43,12 +43,14 @@ class CPercentPrinter: public CPercentPrinterState
|
||||||
public:
|
public:
|
||||||
CStdOutStream *_so;
|
CStdOutStream *_so;
|
||||||
|
|
||||||
|
bool DisablePrint;
|
||||||
bool NeedFlush;
|
bool NeedFlush;
|
||||||
unsigned MaxLen;
|
unsigned MaxLen;
|
||||||
|
|
||||||
CPercentPrinter(UInt32 tickStep = 200):
|
CPercentPrinter(UInt32 tickStep = 200):
|
||||||
_tickStep(tickStep),
|
_tickStep(tickStep),
|
||||||
_prevTick(0),
|
_prevTick(0),
|
||||||
|
DisablePrint(false),
|
||||||
NeedFlush(true),
|
NeedFlush(true),
|
||||||
MaxLen(80 - 1)
|
MaxLen(80 - 1)
|
||||||
{}
|
{}
|
||||||
|
|
|
||||||
|
|
@ -64,13 +64,18 @@ public:
|
||||||
|
|
||||||
void SetWindowWidth(unsigned width) { _percent.MaxLen = width - 1; }
|
void SetWindowWidth(unsigned width) { _percent.MaxLen = width - 1; }
|
||||||
|
|
||||||
void Init(CStdOutStream *outStream, CStdOutStream *errorStream, CStdOutStream *percentStream)
|
void Init(
|
||||||
|
CStdOutStream *outStream,
|
||||||
|
CStdOutStream *errorStream,
|
||||||
|
CStdOutStream *percentStream,
|
||||||
|
bool disablePercents)
|
||||||
{
|
{
|
||||||
FailedFiles.Clear();
|
FailedFiles.Clear();
|
||||||
|
|
||||||
_so = outStream;
|
_so = outStream;
|
||||||
_se = errorStream;
|
_se = errorStream;
|
||||||
_percent._so = percentStream;
|
_percent._so = percentStream;
|
||||||
|
_percent.DisablePrint = disablePercents;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClosePercents2()
|
void ClosePercents2()
|
||||||
|
|
|
||||||
|
|
@ -939,7 +939,8 @@ void CBrowseDialog2::OnDelete(/* bool toRecycleBin */)
|
||||||
s.Add_LF();
|
s.Add_LF();
|
||||||
s += s2;
|
s += s2;
|
||||||
}
|
}
|
||||||
if (::MessageBoxW((HWND)*this, s, LangString(titleID), MB_OKCANCEL | MB_ICONQUESTION) != IDOK)
|
if (::MessageBoxW((HWND)*this, s, LangString(titleID),
|
||||||
|
MB_YESNOCANCEL | MB_ICONQUESTION) != IDYES)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -609,7 +609,7 @@ HRESULT CPanel::OpenParentArchiveFolder()
|
||||||
if (folderLink.WasChanged(newFileInfo))
|
if (folderLink.WasChanged(newFileInfo))
|
||||||
{
|
{
|
||||||
UString message = MyFormatNew(IDS_WANT_UPDATE_MODIFIED_FILE, folderLink.RelPath);
|
UString message = MyFormatNew(IDS_WANT_UPDATE_MODIFIED_FILE, folderLink.RelPath);
|
||||||
if (::MessageBoxW((HWND)*this, message, L"7-Zip", MB_OKCANCEL | MB_ICONQUESTION) == IDOK)
|
if (::MessageBoxW((HWND)*this, message, L"7-Zip", MB_YESNOCANCEL | MB_ICONQUESTION) == IDYES)
|
||||||
{
|
{
|
||||||
if (OnOpenItemChanged(folderLink.FileIndex, fs2us(folderLink.FilePath),
|
if (OnOpenItemChanged(folderLink.FileIndex, fs2us(folderLink.FilePath),
|
||||||
folderLinkPrev.UsePassword, folderLinkPrev.Password) != S_OK)
|
folderLinkPrev.UsePassword, folderLinkPrev.Password) != S_OK)
|
||||||
|
|
@ -1249,7 +1249,7 @@ static THREAD_FUNC_DECL MyThreadFunction(void *param)
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
const UString message = MyFormatNew(IDS_WANT_UPDATE_MODIFIED_FILE, tpi->RelPath);
|
const UString message = MyFormatNew(IDS_WANT_UPDATE_MODIFIED_FILE, tpi->RelPath);
|
||||||
if (::MessageBoxW(g_HWND, message, L"7-Zip", MB_OKCANCEL | MB_ICONQUESTION) == IDOK)
|
if (::MessageBoxW(g_HWND, message, L"7-Zip", MB_YESNOCANCEL | MB_ICONQUESTION) == IDYES)
|
||||||
{
|
{
|
||||||
// DEBUG_PRINT_NUM("SendMessage", GetCurrentThreadId());
|
// DEBUG_PRINT_NUM("SendMessage", GetCurrentThreadId());
|
||||||
if (SendMessage(tpi->Window, kOpenItemChanged, 0, (LONG_PTR)tpi.get()) != 1)
|
if (SendMessage(tpi->Window, kOpenItemChanged, 0, (LONG_PTR)tpi.get()) != 1)
|
||||||
|
|
|
||||||
|
|
@ -244,7 +244,8 @@ Z7_DIAGNOSTIC_IGNORE_CAST_FUNCTION
|
||||||
messageID = IDS_WANT_TO_DELETE_ITEMS;
|
messageID = IDS_WANT_TO_DELETE_ITEMS;
|
||||||
messageParam = NumberToString(indices.Size());
|
messageParam = NumberToString(indices.Size());
|
||||||
}
|
}
|
||||||
if (::MessageBoxW(GetParent(), MyFormatNew(messageID, messageParam), LangString(titleID), MB_OKCANCEL | MB_ICONQUESTION) != IDOK)
|
if (::MessageBoxW(GetParent(), MyFormatNew(messageID, messageParam), LangString(titleID),
|
||||||
|
MB_YESNOCANCEL | MB_ICONQUESTION) != IDYES)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
CDisableNotify disableNotify(*this);
|
CDisableNotify disableNotify(*this);
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
<?xml version="1.0"?>
|
<?xml version="1.0"?>
|
||||||
|
|
||||||
<?define VerMajor = "24" ?>
|
<?define VerMajor = "24" ?>
|
||||||
<?define VerMinor = "06" ?>
|
<?define VerMinor = "07" ?>
|
||||||
<?define VerBuild = "00" ?>
|
<?define VerBuild = "00" ?>
|
||||||
<?define MmVer = "$(var.VerMajor).$(var.VerMinor)" ?>
|
<?define MmVer = "$(var.VerMajor).$(var.VerMinor)" ?>
|
||||||
<?define MmHex = "$(var.VerMajor)$(var.VerMinor)" ?>
|
<?define MmHex = "$(var.VerMajor)$(var.VerMinor)" ?>
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
LZMA compression
|
LZMA compression
|
||||||
----------------
|
----------------
|
||||||
Version: 24.06
|
Version: 24.07
|
||||||
|
|
||||||
This file describes LZMA encoding and decoding functions written in C language.
|
This file describes LZMA encoding and decoding functions written in C language.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
7-Zip 24.06 Sources
|
7-Zip 24.07 Sources
|
||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
7-Zip is a file archiver for Windows.
|
7-Zip is a file archiver for Windows.
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,16 @@
|
||||||
HISTORY of the 7-Zip source code
|
HISTORY of the 7-Zip source code
|
||||||
--------------------------------
|
--------------------------------
|
||||||
|
|
||||||
|
24.07 2024-06-19
|
||||||
|
-------------------------
|
||||||
|
- Changes in files:
|
||||||
|
Asm/x86/Sha256Opt.asm
|
||||||
|
Asm/x86/Sha1Opt.asm
|
||||||
|
Now it uses "READONLY" flag for constant array segment.
|
||||||
|
It fixes an issue where ".rodata" section in 7-Zip for x86/x64 Linux had a "WRITE" attribute.
|
||||||
|
- The bug was fixed: 7-Zip could crash for some incorrect ZSTD archives.
|
||||||
|
|
||||||
|
|
||||||
24.06 2024-05-26
|
24.06 2024-05-26
|
||||||
-------------------------
|
-------------------------
|
||||||
- The bug was fixed: 7-Zip could not unpack some ZSTD archives.
|
- The bug was fixed: 7-Zip could not unpack some ZSTD archives.
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue