mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-13 06:11:32 -06:00
19.00
This commit is contained in:
committed by
glachancecmaisonneuve
parent
5d7485c7d9
commit
5c10d25476
17
.gitignore
vendored
17
.gitignore
vendored
@@ -1,18 +1 @@
|
|||||||
*.o
|
*.o
|
||||||
out
|
|
||||||
7zAll/x64/
|
|
||||||
*.pdb
|
|
||||||
*.tlog
|
|
||||||
*.obj
|
|
||||||
*.user
|
|
||||||
*.log
|
|
||||||
*.pch
|
|
||||||
*.idb
|
|
||||||
x64/
|
|
||||||
*.exe
|
|
||||||
*.res
|
|
||||||
*.dll
|
|
||||||
*.lib
|
|
||||||
*.exp
|
|
||||||
*.sfx
|
|
||||||
*.txt
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#define MY_VER_MAJOR 18
|
#define MY_VER_MAJOR 19
|
||||||
#define MY_VER_MINOR 06
|
#define MY_VER_MINOR 00
|
||||||
#define MY_VER_BUILD 0
|
#define MY_VER_BUILD 0
|
||||||
#define MY_VERSION_NUMBERS "18.06"
|
#define MY_VERSION_NUMBERS "19.00"
|
||||||
#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 "2018-12-30"
|
#define MY_DATE "2019-02-21"
|
||||||
#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 @@
|
|||||||
/* Bcj2Enc.c -- BCJ2 Encoder (Converter for x86 code)
|
/* Bcj2Enc.c -- BCJ2 Encoder (Converter for x86 code)
|
||||||
2018-07-04 : Igor Pavlov : Public domain */
|
2019-02-02 : Igor Pavlov : Public domain */
|
||||||
|
|
||||||
#include "Precomp.h"
|
#include "Precomp.h"
|
||||||
|
|
||||||
@@ -253,7 +253,7 @@ void Bcj2Enc_Encode(CBcj2Enc *p)
|
|||||||
{
|
{
|
||||||
const Byte *src = p->src;
|
const Byte *src = p->src;
|
||||||
const Byte *srcLim = p->srcLim;
|
const Byte *srcLim = p->srcLim;
|
||||||
unsigned finishMode = p->finishMode;
|
EBcj2Enc_FinishMode finishMode = p->finishMode;
|
||||||
|
|
||||||
p->src = p->temp;
|
p->src = p->temp;
|
||||||
p->srcLim = p->temp + p->tempPos;
|
p->srcLim = p->temp + p->tempPos;
|
||||||
|
|||||||
20
C/CpuArch.c
20
C/CpuArch.c
@@ -1,5 +1,5 @@
|
|||||||
/* CpuArch.c -- CPU specific code
|
/* CpuArch.c -- CPU specific code
|
||||||
2018-07-04: Igor Pavlov : Public domain */
|
2018-02-18: Igor Pavlov : Public domain */
|
||||||
|
|
||||||
#include "Precomp.h"
|
#include "Precomp.h"
|
||||||
|
|
||||||
@@ -197,4 +197,22 @@ BoolInt CPU_Is_Aes_Supported()
|
|||||||
return (p.c >> 25) & 1;
|
return (p.c >> 25) & 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BoolInt CPU_IsSupported_PageGB()
|
||||||
|
{
|
||||||
|
Cx86cpuid cpuid;
|
||||||
|
if (!x86cpuid_CheckAndRead(&cpuid))
|
||||||
|
return False;
|
||||||
|
{
|
||||||
|
UInt32 d[4] = { 0 };
|
||||||
|
MyCPUID(0x80000000, &d[0], &d[1], &d[2], &d[3]);
|
||||||
|
if (d[0] < 0x80000001)
|
||||||
|
return False;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
UInt32 d[4] = { 0 };
|
||||||
|
MyCPUID(0x80000001, &d[0], &d[1], &d[2], &d[3]);
|
||||||
|
return (d[3] >> 26) & 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/* CpuArch.h -- CPU specific code
|
/* CpuArch.h -- CPU specific code
|
||||||
2018-07-04 : Igor Pavlov : Public domain */
|
2018-02-18 : Igor Pavlov : Public domain */
|
||||||
|
|
||||||
#ifndef __CPU_ARCH_H
|
#ifndef __CPU_ARCH_H
|
||||||
#define __CPU_ARCH_H
|
#define __CPU_ARCH_H
|
||||||
@@ -327,6 +327,7 @@ int x86cpuid_GetFirm(const Cx86cpuid *p);
|
|||||||
|
|
||||||
BoolInt CPU_Is_InOrder();
|
BoolInt CPU_Is_InOrder();
|
||||||
BoolInt CPU_Is_Aes_Supported();
|
BoolInt CPU_Is_Aes_Supported();
|
||||||
|
BoolInt CPU_IsSupported_PageGB();
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
25
C/DllSecur.c
25
C/DllSecur.c
@@ -1,5 +1,5 @@
|
|||||||
/* DllSecur.c -- DLL loading security
|
/* DllSecur.c -- DLL loading security
|
||||||
2016-10-04 : Igor Pavlov : Public domain */
|
2018-02-21 : Igor Pavlov : Public domain */
|
||||||
|
|
||||||
#include "Precomp.h"
|
#include "Precomp.h"
|
||||||
|
|
||||||
@@ -28,10 +28,31 @@ static const char * const g_Dlls =
|
|||||||
"CRYPTBASE\0"
|
"CRYPTBASE\0"
|
||||||
"OLEACC\0"
|
"OLEACC\0"
|
||||||
"CLBCATQ\0"
|
"CLBCATQ\0"
|
||||||
|
"VERSION\0"
|
||||||
;
|
;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void My_SetDefaultDllDirectories()
|
||||||
|
{
|
||||||
|
#ifndef UNDER_CE
|
||||||
|
|
||||||
|
OSVERSIONINFO vi;
|
||||||
|
vi.dwOSVersionInfoSize = sizeof(vi);
|
||||||
|
GetVersionEx(&vi);
|
||||||
|
if (!GetVersionEx(&vi) || vi.dwMajorVersion != 6 || vi.dwMinorVersion != 0)
|
||||||
|
{
|
||||||
|
Func_SetDefaultDllDirectories setDllDirs = (Func_SetDefaultDllDirectories)
|
||||||
|
GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "SetDefaultDllDirectories");
|
||||||
|
if (setDllDirs)
|
||||||
|
if (setDllDirs(MY_LOAD_LIBRARY_SEARCH_SYSTEM32 | MY_LOAD_LIBRARY_SEARCH_USER_DIRS))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void LoadSecurityDlls()
|
void LoadSecurityDlls()
|
||||||
{
|
{
|
||||||
#ifndef UNDER_CE
|
#ifndef UNDER_CE
|
||||||
@@ -70,7 +91,7 @@ void LoadSecurityDlls()
|
|||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
char c = *dll++;
|
char c = *dll++;
|
||||||
buf[pos + k] = c;
|
buf[pos + k] = (Byte)c;
|
||||||
k++;
|
k++;
|
||||||
if (c == 0)
|
if (c == 0)
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/* DllSecur.h -- DLL loading for security
|
/* DllSecur.h -- DLL loading for security
|
||||||
2016-06-08 : Igor Pavlov : Public domain */
|
2018-02-19 : Igor Pavlov : Public domain */
|
||||||
|
|
||||||
#ifndef __DLL_SECUR_H
|
#ifndef __DLL_SECUR_H
|
||||||
#define __DLL_SECUR_H
|
#define __DLL_SECUR_H
|
||||||
@@ -10,6 +10,7 @@ EXTERN_C_BEGIN
|
|||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
|
||||||
|
void My_SetDefaultDllDirectories();
|
||||||
void LoadSecurityDlls();
|
void LoadSecurityDlls();
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
18
C/Lzma2Dec.c
18
C/Lzma2Dec.c
@@ -1,5 +1,5 @@
|
|||||||
/* Lzma2Dec.c -- LZMA2 Decoder
|
/* Lzma2Dec.c -- LZMA2 Decoder
|
||||||
2018-07-04 : Igor Pavlov : Public domain */
|
2019-02-02 : Igor Pavlov : Public domain */
|
||||||
|
|
||||||
/* #define SHOW_DEBUG_INFO */
|
/* #define SHOW_DEBUG_INFO */
|
||||||
|
|
||||||
@@ -314,15 +314,15 @@ ELzma2ParseStatus Lzma2Dec_Parse(CLzma2Dec *p,
|
|||||||
while (p->state != LZMA2_STATE_ERROR)
|
while (p->state != LZMA2_STATE_ERROR)
|
||||||
{
|
{
|
||||||
if (p->state == LZMA2_STATE_FINISHED)
|
if (p->state == LZMA2_STATE_FINISHED)
|
||||||
return LZMA_STATUS_FINISHED_WITH_MARK;
|
return (ELzma2ParseStatus)LZMA_STATUS_FINISHED_WITH_MARK;
|
||||||
|
|
||||||
if (outSize == 0 && !checkFinishBlock)
|
if (outSize == 0 && !checkFinishBlock)
|
||||||
return LZMA_STATUS_NOT_FINISHED;
|
return (ELzma2ParseStatus)LZMA_STATUS_NOT_FINISHED;
|
||||||
|
|
||||||
if (p->state != LZMA2_STATE_DATA && p->state != LZMA2_STATE_DATA_CONT)
|
if (p->state != LZMA2_STATE_DATA && p->state != LZMA2_STATE_DATA_CONT)
|
||||||
{
|
{
|
||||||
if (*srcLen == inSize)
|
if (*srcLen == inSize)
|
||||||
return LZMA_STATUS_NEEDS_MORE_INPUT;
|
return (ELzma2ParseStatus)LZMA_STATUS_NEEDS_MORE_INPUT;
|
||||||
(*srcLen)++;
|
(*srcLen)++;
|
||||||
|
|
||||||
p->state = Lzma2Dec_UpdateState(p, *src++);
|
p->state = Lzma2Dec_UpdateState(p, *src++);
|
||||||
@@ -344,7 +344,7 @@ ELzma2ParseStatus Lzma2Dec_Parse(CLzma2Dec *p,
|
|||||||
// checkFinishBlock is true. So we expect that block must be finished,
|
// checkFinishBlock is true. So we expect that block must be finished,
|
||||||
// We can return LZMA_STATUS_NOT_SPECIFIED or LZMA_STATUS_NOT_FINISHED here
|
// We can return LZMA_STATUS_NOT_SPECIFIED or LZMA_STATUS_NOT_FINISHED here
|
||||||
// break;
|
// break;
|
||||||
return LZMA_STATUS_NOT_FINISHED;
|
return (ELzma2ParseStatus)LZMA_STATUS_NOT_FINISHED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p->state == LZMA2_STATE_DATA)
|
if (p->state == LZMA2_STATE_DATA)
|
||||||
@@ -354,7 +354,7 @@ ELzma2ParseStatus Lzma2Dec_Parse(CLzma2Dec *p,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (outSize == 0)
|
if (outSize == 0)
|
||||||
return LZMA_STATUS_NOT_FINISHED;
|
return (ELzma2ParseStatus)LZMA_STATUS_NOT_FINISHED;
|
||||||
|
|
||||||
{
|
{
|
||||||
SizeT inCur = inSize - *srcLen;
|
SizeT inCur = inSize - *srcLen;
|
||||||
@@ -362,7 +362,7 @@ ELzma2ParseStatus Lzma2Dec_Parse(CLzma2Dec *p,
|
|||||||
if (LZMA2_IS_UNCOMPRESSED_STATE(p))
|
if (LZMA2_IS_UNCOMPRESSED_STATE(p))
|
||||||
{
|
{
|
||||||
if (inCur == 0)
|
if (inCur == 0)
|
||||||
return LZMA_STATUS_NEEDS_MORE_INPUT;
|
return (ELzma2ParseStatus)LZMA_STATUS_NEEDS_MORE_INPUT;
|
||||||
if (inCur > p->unpackSize)
|
if (inCur > p->unpackSize)
|
||||||
inCur = p->unpackSize;
|
inCur = p->unpackSize;
|
||||||
if (inCur > outSize)
|
if (inCur > outSize)
|
||||||
@@ -381,7 +381,7 @@ ELzma2ParseStatus Lzma2Dec_Parse(CLzma2Dec *p,
|
|||||||
if (inCur == 0)
|
if (inCur == 0)
|
||||||
{
|
{
|
||||||
if (p->packSize != 0)
|
if (p->packSize != 0)
|
||||||
return LZMA_STATUS_NEEDS_MORE_INPUT;
|
return (ELzma2ParseStatus)LZMA_STATUS_NEEDS_MORE_INPUT;
|
||||||
}
|
}
|
||||||
else if (p->state == LZMA2_STATE_DATA)
|
else if (p->state == LZMA2_STATE_DATA)
|
||||||
{
|
{
|
||||||
@@ -418,7 +418,7 @@ ELzma2ParseStatus Lzma2Dec_Parse(CLzma2Dec *p,
|
|||||||
}
|
}
|
||||||
|
|
||||||
p->state = LZMA2_STATE_ERROR;
|
p->state = LZMA2_STATE_ERROR;
|
||||||
return LZMA_STATUS_NOT_SPECIFIED;
|
return (ELzma2ParseStatus)LZMA_STATUS_NOT_SPECIFIED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/* Lzma2DecMt.c -- LZMA2 Decoder Multi-thread
|
/* Lzma2DecMt.c -- LZMA2 Decoder Multi-thread
|
||||||
2018-07-04 : Igor Pavlov : Public domain */
|
2019-02-02 : Igor Pavlov : Public domain */
|
||||||
|
|
||||||
#include "Precomp.h"
|
#include "Precomp.h"
|
||||||
|
|
||||||
@@ -265,7 +265,7 @@ static void Lzma2DecMt_MtCallback_Parse(void *obj, unsigned coderIndex, CMtDecCa
|
|||||||
t->outPreSize = 0;
|
t->outPreSize = 0;
|
||||||
// t->blockWasFinished = False;
|
// t->blockWasFinished = False;
|
||||||
// t->finishedWithMark = False;
|
// t->finishedWithMark = False;
|
||||||
t->parseStatus = LZMA_STATUS_NOT_SPECIFIED;
|
t->parseStatus = (ELzma2ParseStatus)LZMA_STATUS_NOT_SPECIFIED;
|
||||||
t->state = MTDEC_PARSE_CONTINUE;
|
t->state = MTDEC_PARSE_CONTINUE;
|
||||||
|
|
||||||
t->inCodeSize = 0;
|
t->inCodeSize = 0;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/* LzmaEnc.c -- LZMA Encoder
|
/* LzmaEnc.c -- LZMA Encoder
|
||||||
2018-12-29: Igor Pavlov : Public domain */
|
2019-01-10: Igor Pavlov : Public domain */
|
||||||
|
|
||||||
#include "Precomp.h"
|
#include "Precomp.h"
|
||||||
|
|
||||||
@@ -1497,9 +1497,9 @@ static unsigned GetOptimum(CLzmaEnc *p, UInt32 position)
|
|||||||
|
|
||||||
// here we can allow skip_items in p->opt, if we don't check (nextOpt->price < kInfinityPrice)
|
// here we can allow skip_items in p->opt, if we don't check (nextOpt->price < kInfinityPrice)
|
||||||
// 18.new.06
|
// 18.new.06
|
||||||
if (nextOpt->price < kInfinityPrice
|
if ((nextOpt->price < kInfinityPrice
|
||||||
// && !IsLitState(state)
|
// && !IsLitState(state)
|
||||||
&& matchByte == curByte
|
&& matchByte == curByte)
|
||||||
|| litPrice > nextOpt->price
|
|| litPrice > nextOpt->price
|
||||||
)
|
)
|
||||||
litPrice = 0;
|
litPrice = 0;
|
||||||
|
|||||||
11
C/MtDec.c
11
C/MtDec.c
@@ -1,5 +1,5 @@
|
|||||||
/* MtDec.c -- Multi-thread Decoder
|
/* MtDec.c -- Multi-thread Decoder
|
||||||
2018-07-04 : Igor Pavlov : Public domain */
|
2019-02-02 : Igor Pavlov : Public domain */
|
||||||
|
|
||||||
#include "Precomp.h"
|
#include "Precomp.h"
|
||||||
|
|
||||||
@@ -88,12 +88,13 @@ static WRes ArEvent_OptCreate_And_Reset(CEvent *p)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
struct __CMtDecBufLink
|
||||||
typedef struct
|
|
||||||
{
|
{
|
||||||
void *next;
|
struct __CMtDecBufLink *next;
|
||||||
void *pad[3];
|
void *pad[3];
|
||||||
} CMtDecBufLink;
|
};
|
||||||
|
|
||||||
|
typedef struct __CMtDecBufLink CMtDecBufLink;
|
||||||
|
|
||||||
#define MTDEC__LINK_DATA_OFFSET sizeof(CMtDecBufLink)
|
#define MTDEC__LINK_DATA_OFFSET sizeof(CMtDecBufLink)
|
||||||
#define MTDEC__DATA_PTR_FROM_LINK(link) ((Byte *)(link) + MTDEC__LINK_DATA_OFFSET)
|
#define MTDEC__DATA_PTR_FROM_LINK(link) ((Byte *)(link) + MTDEC__LINK_DATA_OFFSET)
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/* 7zMain.c - Test application for 7z Decoder
|
/* 7zMain.c - Test application for 7z Decoder
|
||||||
2018-08-04 : Igor Pavlov : Public domain */
|
2019-02-02 : Igor Pavlov : Public domain */
|
||||||
|
|
||||||
#include "Precomp.h"
|
#include "Precomp.h"
|
||||||
|
|
||||||
@@ -176,7 +176,7 @@ static SRes Utf16_To_Char(CBuf *buf, const UInt16 *s
|
|||||||
char defaultChar = '_';
|
char defaultChar = '_';
|
||||||
BOOL defUsed;
|
BOOL defUsed;
|
||||||
unsigned numChars = 0;
|
unsigned numChars = 0;
|
||||||
numChars = WideCharToMultiByte(codePage, 0, s, len, (char *)buf->data, size, &defaultChar, &defUsed);
|
numChars = WideCharToMultiByte(codePage, 0, (LPCWSTR)s, len, (char *)buf->data, size, &defaultChar, &defUsed);
|
||||||
if (numChars == 0 || numChars >= size)
|
if (numChars == 0 || numChars >= size)
|
||||||
return SZ_ERROR_FAIL;
|
return SZ_ERROR_FAIL;
|
||||||
buf->data[numChars] = 0;
|
buf->data[numChars] = 0;
|
||||||
@@ -202,7 +202,7 @@ static WRes MyCreateDir(const UInt16 *name)
|
|||||||
{
|
{
|
||||||
#ifdef USE_WINDOWS_FILE
|
#ifdef USE_WINDOWS_FILE
|
||||||
|
|
||||||
return CreateDirectoryW(name, NULL) ? 0 : GetLastError();
|
return CreateDirectoryW((LPCWSTR)name, NULL) ? 0 : GetLastError();
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
@@ -227,7 +227,7 @@ static WRes MyCreateDir(const UInt16 *name)
|
|||||||
static WRes OutFile_OpenUtf16(CSzFile *p, const UInt16 *name)
|
static WRes OutFile_OpenUtf16(CSzFile *p, const UInt16 *name)
|
||||||
{
|
{
|
||||||
#ifdef USE_WINDOWS_FILE
|
#ifdef USE_WINDOWS_FILE
|
||||||
return OutFile_OpenW(p, name);
|
return OutFile_OpenW(p, (LPCWSTR)name);
|
||||||
#else
|
#else
|
||||||
CBuf buf;
|
CBuf buf;
|
||||||
WRes res;
|
WRes res;
|
||||||
@@ -430,7 +430,7 @@ int MY_CDECL main(int numargs, char *args[])
|
|||||||
res = SZ_OK;
|
res = SZ_OK;
|
||||||
|
|
||||||
{
|
{
|
||||||
lookStream.buf = ISzAlloc_Alloc(&allocImp, kInputBufSize);
|
lookStream.buf = (Byte *)ISzAlloc_Alloc(&allocImp, kInputBufSize);
|
||||||
if (!lookStream.buf)
|
if (!lookStream.buf)
|
||||||
res = SZ_ERROR_MEM;
|
res = SZ_ERROR_MEM;
|
||||||
else
|
else
|
||||||
@@ -647,7 +647,7 @@ int MY_CDECL main(int numargs, char *args[])
|
|||||||
We remove posix bits, if we detect posix mode field */
|
We remove posix bits, if we detect posix mode field */
|
||||||
if ((attrib & 0xF0000000) != 0)
|
if ((attrib & 0xF0000000) != 0)
|
||||||
attrib &= 0x7FFF;
|
attrib &= 0x7FFF;
|
||||||
SetFileAttributesW(destPath, attrib);
|
SetFileAttributesW((LPCWSTR)destPath, attrib);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/* 7zipInstall.c - 7-Zip Installer
|
/* 7zipInstall.c - 7-Zip Installer
|
||||||
2018-08-04 : Igor Pavlov : Public domain */
|
2019-02-19 : Igor Pavlov : Public domain */
|
||||||
|
|
||||||
#include "Precomp.h"
|
#include "Precomp.h"
|
||||||
|
|
||||||
@@ -121,13 +121,51 @@ static void PrintErrorMessage(const char *s)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
typedef DWORD (WINAPI * Func_GetFileVersionInfoSizeW)(LPCWSTR lptstrFilename, LPDWORD lpdwHandle);
|
||||||
|
typedef BOOL (WINAPI * Func_GetFileVersionInfoW)(LPCWSTR lptstrFilename, DWORD dwHandle, DWORD dwLen, LPVOID lpData);
|
||||||
|
typedef BOOL (WINAPI * Func_VerQueryValueW)(const LPVOID pBlock, LPWSTR lpSubBlock, LPVOID * lplpBuffer, PUINT puLen);
|
||||||
|
|
||||||
|
static HMODULE g_version_dll_hModule;
|
||||||
|
|
||||||
static DWORD GetFileVersion(LPCWSTR s)
|
static DWORD GetFileVersion(LPCWSTR s)
|
||||||
{
|
{
|
||||||
DWORD size = 0;
|
DWORD size = 0;
|
||||||
BYTE *vi = NULL;
|
void *vi = NULL;
|
||||||
DWORD version = 0;
|
DWORD version = 0;
|
||||||
|
|
||||||
size = GetFileVersionInfoSizeW(s, NULL);
|
Func_GetFileVersionInfoSizeW my_GetFileVersionInfoSizeW;
|
||||||
|
Func_GetFileVersionInfoW my_GetFileVersionInfoW;
|
||||||
|
Func_VerQueryValueW my_VerQueryValueW;
|
||||||
|
|
||||||
|
if (!g_version_dll_hModule)
|
||||||
|
{
|
||||||
|
wchar_t buf[MAX_PATH + 100];
|
||||||
|
{
|
||||||
|
unsigned len = GetSystemDirectoryW(buf, MAX_PATH + 2);
|
||||||
|
if (len == 0 || len > MAX_PATH)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
unsigned pos = (unsigned)lstrlenW(buf);
|
||||||
|
if (buf[pos - 1] != '\\')
|
||||||
|
buf[pos++] = '\\';
|
||||||
|
lstrcpyW(buf + pos, L"version.dll");
|
||||||
|
}
|
||||||
|
g_version_dll_hModule = LoadLibraryW(buf);
|
||||||
|
if (!g_version_dll_hModule)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
my_GetFileVersionInfoSizeW = (Func_GetFileVersionInfoSizeW)GetProcAddress(g_version_dll_hModule, "GetFileVersionInfoSizeW");
|
||||||
|
my_GetFileVersionInfoW = (Func_GetFileVersionInfoW)GetProcAddress(g_version_dll_hModule, "GetFileVersionInfoW");
|
||||||
|
my_VerQueryValueW = (Func_VerQueryValueW)GetProcAddress(g_version_dll_hModule, "VerQueryValueW");
|
||||||
|
|
||||||
|
if (!my_GetFileVersionInfoSizeW
|
||||||
|
|| !my_GetFileVersionInfoW
|
||||||
|
|| !my_VerQueryValueW)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
size = my_GetFileVersionInfoSizeW(s, NULL);
|
||||||
if (size == 0)
|
if (size == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@@ -135,11 +173,11 @@ static DWORD GetFileVersion(LPCWSTR s)
|
|||||||
if (!vi)
|
if (!vi)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (GetFileVersionInfoW(s, 0, size, vi))
|
if (my_GetFileVersionInfoW(s, 0, size, vi))
|
||||||
{
|
{
|
||||||
VS_FIXEDFILEINFO *fi = NULL;
|
VS_FIXEDFILEINFO *fi = NULL;
|
||||||
UINT fiLen = 0;
|
UINT fiLen = 0;
|
||||||
if (VerQueryValueW(vi, L"\\", (LPVOID *)&fi, &fiLen))
|
if (my_VerQueryValueW(vi, L"\\", (LPVOID *)&fi, &fiLen))
|
||||||
version = fi->dwFileVersionMS;
|
version = fi->dwFileVersionMS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1103,7 +1141,7 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
|
|||||||
|
|
||||||
static BoolInt GetErrorMessage(DWORD errorCode, WCHAR *message)
|
static BoolInt GetErrorMessage(DWORD errorCode, WCHAR *message)
|
||||||
{
|
{
|
||||||
LPVOID msgBuf;
|
LPWSTR msgBuf;
|
||||||
if (FormatMessageW(
|
if (FormatMessageW(
|
||||||
FORMAT_MESSAGE_ALLOCATE_BUFFER
|
FORMAT_MESSAGE_ALLOCATE_BUFFER
|
||||||
| FORMAT_MESSAGE_FROM_SYSTEM
|
| FORMAT_MESSAGE_FROM_SYSTEM
|
||||||
@@ -1201,7 +1239,7 @@ if (res == SZ_OK)
|
|||||||
|
|
||||||
if (res == SZ_OK)
|
if (res == SZ_OK)
|
||||||
{
|
{
|
||||||
lookStream.buf = ISzAlloc_Alloc(&allocImp, kInputBufSize);
|
lookStream.buf = (Byte *)ISzAlloc_Alloc(&allocImp, kInputBufSize);
|
||||||
if (!lookStream.buf)
|
if (!lookStream.buf)
|
||||||
res = SZ_ERROR_MEM;
|
res = SZ_ERROR_MEM;
|
||||||
else
|
else
|
||||||
@@ -1272,7 +1310,7 @@ if (res == SZ_OK)
|
|||||||
|
|
||||||
temp = path + pathLen;
|
temp = path + pathLen;
|
||||||
|
|
||||||
SzArEx_GetFileNameUtf16(&db, i, temp);
|
SzArEx_GetFileNameUtf16(&db, i, (UInt16 *)temp);
|
||||||
|
|
||||||
if (!g_SilentMode)
|
if (!g_SilentMode)
|
||||||
SetWindowTextW(g_InfoLine_HWND, temp);
|
SetWindowTextW(g_InfoLine_HWND, temp);
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
PROG = 7zipInstall.exe
|
PROG = 7zipInstall.exe
|
||||||
MY_FIXED = 1
|
MY_FIXED = 1
|
||||||
|
|
||||||
LIBS = $(LIBS) version.lib
|
|
||||||
|
|
||||||
!IFDEF _64BIT_INSTALLER
|
!IFDEF _64BIT_INSTALLER
|
||||||
CFLAGS = $(CFLAGS) -D_64BIT_INSTALLER
|
CFLAGS = $(CFLAGS) -D_64BIT_INSTALLER
|
||||||
!ENDIF
|
!ENDIF
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/* 7zipUninstall.c - 7-Zip Uninstaller
|
/* 7zipUninstall.c - 7-Zip Uninstaller
|
||||||
2018-08-04 : Igor Pavlov : Public domain */
|
2019-02-02 : Igor Pavlov : Public domain */
|
||||||
|
|
||||||
#include "Precomp.h"
|
#include "Precomp.h"
|
||||||
|
|
||||||
@@ -517,7 +517,7 @@ static void AddPathParam(wchar_t *dest, const wchar_t *src)
|
|||||||
|
|
||||||
static BoolInt GetErrorMessage(DWORD errorCode, WCHAR *message)
|
static BoolInt GetErrorMessage(DWORD errorCode, WCHAR *message)
|
||||||
{
|
{
|
||||||
LPVOID msgBuf;
|
LPWSTR msgBuf;
|
||||||
if (FormatMessageW(
|
if (FormatMessageW(
|
||||||
FORMAT_MESSAGE_ALLOCATE_BUFFER
|
FORMAT_MESSAGE_ALLOCATE_BUFFER
|
||||||
| FORMAT_MESSAGE_FROM_SYSTEM
|
| FORMAT_MESSAGE_FROM_SYSTEM
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/* SfxSetup.c - 7z SFX Setup
|
/* SfxSetup.c - 7z SFX Setup
|
||||||
2018-08-04 : Igor Pavlov : Public domain */
|
2019-02-02 : Igor Pavlov : Public domain */
|
||||||
|
|
||||||
#include "Precomp.h"
|
#include "Precomp.h"
|
||||||
|
|
||||||
@@ -379,7 +379,7 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
|
|||||||
|
|
||||||
if (res == SZ_OK)
|
if (res == SZ_OK)
|
||||||
{
|
{
|
||||||
lookStream.buf = ISzAlloc_Alloc(&allocImp, kInputBufSize);
|
lookStream.buf = (Byte *)ISzAlloc_Alloc(&allocImp, kInputBufSize);
|
||||||
if (!lookStream.buf)
|
if (!lookStream.buf)
|
||||||
res = SZ_ERROR_MEM;
|
res = SZ_ERROR_MEM;
|
||||||
else
|
else
|
||||||
@@ -420,7 +420,7 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
|
|||||||
|
|
||||||
temp = path + pathLen;
|
temp = path + pathLen;
|
||||||
|
|
||||||
SzArEx_GetFileNameUtf16(&db, i, temp);
|
SzArEx_GetFileNameUtf16(&db, i, (UInt16 *)temp);
|
||||||
{
|
{
|
||||||
res = SzArEx_Extract(&db, &lookStream.vt, i,
|
res = SzArEx_Extract(&db, &lookStream.vt, i,
|
||||||
&blockIndex, &outBuffer, &outBufferSize,
|
&blockIndex, &outBuffer, &outBufferSize,
|
||||||
@@ -527,7 +527,7 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
|
|||||||
{
|
{
|
||||||
WCHAR *temp = path + pathLen;
|
WCHAR *temp = path + pathLen;
|
||||||
UInt32 j;
|
UInt32 j;
|
||||||
SzArEx_GetFileNameUtf16(&db, executeFileIndex, temp);
|
SzArEx_GetFileNameUtf16(&db, executeFileIndex, (UInt16 *)temp);
|
||||||
for (j = 0; temp[j] != 0; j++)
|
for (j = 0; temp[j] != 0; j++)
|
||||||
if (temp[j] == '/')
|
if (temp[j] == '/')
|
||||||
temp[j] = CHAR_PATH_SEPARATOR;
|
temp[j] = CHAR_PATH_SEPARATOR;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/* XzDec.c -- Xz Decode
|
/* XzDec.c -- Xz Decode
|
||||||
2018-12-29 : Igor Pavlov : Public domain */
|
2019-02-02 : Igor Pavlov : Public domain */
|
||||||
|
|
||||||
#include "Precomp.h"
|
#include "Precomp.h"
|
||||||
|
|
||||||
@@ -245,7 +245,7 @@ SRes BraState_SetFromMethod(IStateCoder *p, UInt64 id, int encodeMode, ISzAllocP
|
|||||||
CBraState *decoder;
|
CBraState *decoder;
|
||||||
if (id < XZ_ID_Delta || id > XZ_ID_SPARC)
|
if (id < XZ_ID_Delta || id > XZ_ID_SPARC)
|
||||||
return SZ_ERROR_UNSUPPORTED;
|
return SZ_ERROR_UNSUPPORTED;
|
||||||
decoder = p->p;
|
decoder = (CBraState *)p->p;
|
||||||
if (!decoder)
|
if (!decoder)
|
||||||
{
|
{
|
||||||
decoder = (CBraState *)ISzAlloc_Alloc(alloc, sizeof(CBraState));
|
decoder = (CBraState *)ISzAlloc_Alloc(alloc, sizeof(CBraState));
|
||||||
@@ -400,7 +400,7 @@ static SRes Lzma2State_Code2(void *pp, Byte *dest, SizeT *destLen, const Byte *s
|
|||||||
res = Lzma2Dec_DecodeToBuf(&spec->decoder, dest, destLen, src, srcLen, (ELzmaFinishMode)finishMode, &status2);
|
res = Lzma2Dec_DecodeToBuf(&spec->decoder, dest, destLen, src, srcLen, (ELzmaFinishMode)finishMode, &status2);
|
||||||
// *wasFinished = (status2 == LZMA_STATUS_FINISHED_WITH_MARK);
|
// *wasFinished = (status2 == LZMA_STATUS_FINISHED_WITH_MARK);
|
||||||
// ECoderStatus values are identical to ELzmaStatus values of LZMA2 decoder
|
// ECoderStatus values are identical to ELzmaStatus values of LZMA2 decoder
|
||||||
*status = status2;
|
*status = (ECoderStatus)status2;
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/* XzEnc.c -- Xz Encode
|
/* XzEnc.c -- Xz Encode
|
||||||
2018-07-04 : Igor Pavlov : Public domain */
|
2019-02-02 : Igor Pavlov : Public domain */
|
||||||
|
|
||||||
#include "Precomp.h"
|
#include "Precomp.h"
|
||||||
|
|
||||||
@@ -366,7 +366,7 @@ static SRes SeqInFilter_Read(const ISeqInStream *pp, void *data, size_t *size)
|
|||||||
SRes res;
|
SRes res;
|
||||||
*size = sizeOriginal;
|
*size = sizeOriginal;
|
||||||
res = p->StateCoder.Code2(p->StateCoder.p,
|
res = p->StateCoder.Code2(p->StateCoder.p,
|
||||||
data, size,
|
(Byte *)data, size,
|
||||||
p->buf + p->curPos, &srcLen,
|
p->buf + p->curPos, &srcLen,
|
||||||
p->srcWasFinished, CODER_FINISH_ANY,
|
p->srcWasFinished, CODER_FINISH_ANY,
|
||||||
&status);
|
&status);
|
||||||
|
|||||||
@@ -355,7 +355,9 @@ HRESULT CDecoder::Decode(
|
|||||||
|
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
|
||||||
|
#if !defined(_7ZIP_ST)
|
||||||
bool mt_wasUsed = false;
|
bool mt_wasUsed = false;
|
||||||
|
#endif
|
||||||
|
|
||||||
for (i = 0; i < folderInfo.Coders.Size(); i++)
|
for (i = 0; i < folderInfo.Coders.Size(); i++)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -733,7 +733,13 @@ HRESULT CDatabase::Open()
|
|||||||
RINOK(OpenProgressFat());
|
RINOK(OpenProgressFat());
|
||||||
|
|
||||||
if ((Fat[0] & 0xFF) != Header.MediaType)
|
if ((Fat[0] & 0xFF) != Header.MediaType)
|
||||||
|
{
|
||||||
|
// that case can mean error in FAT,
|
||||||
|
// but xdf file: (MediaType == 0xF0 && Fat[0] == 0xFF9)
|
||||||
|
// 19.00: so we use non-strict check
|
||||||
|
if ((Fat[0] & 0xFF) < 0xF0)
|
||||||
return S_FALSE;
|
return S_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
RINOK(ReadDir(-1, Header.RootCluster, 0));
|
RINOK(ReadDir(-1, Header.RootCluster, 0));
|
||||||
|
|
||||||
|
|||||||
@@ -41,9 +41,8 @@ static const UInt32 k_Signature32 = 0x00004550;
|
|||||||
|
|
||||||
static HRESULT CalcCheckSum(ISequentialInStream *stream, UInt32 size, UInt32 excludePos, UInt32 &res)
|
static HRESULT CalcCheckSum(ISequentialInStream *stream, UInt32 size, UInt32 excludePos, UInt32 &res)
|
||||||
{
|
{
|
||||||
const UInt32 kBufSizeMax = (UInt32)1 << 16;
|
const UInt32 kBufSizeMax = (UInt32)1 << 15;
|
||||||
UInt32 bufSize = MyMin(kBufSizeMax, size);
|
UInt32 bufSize = kBufSizeMax;
|
||||||
bufSize += (bufSize & 1);
|
|
||||||
CByteBuffer buffer(bufSize);
|
CByteBuffer buffer(bufSize);
|
||||||
Byte *buf = buffer;
|
Byte *buf = buffer;
|
||||||
UInt32 sum = 0;
|
UInt32 sum = 0;
|
||||||
@@ -58,9 +57,6 @@ static HRESULT CalcCheckSum(ISequentialInStream *stream, UInt32 size, UInt32 exc
|
|||||||
size_t processed = rem;
|
size_t processed = rem;
|
||||||
RINOK(ReadStream(stream, buf, &processed));
|
RINOK(ReadStream(stream, buf, &processed));
|
||||||
|
|
||||||
if ((processed & 1) != 0)
|
|
||||||
buf[processed] = 0;
|
|
||||||
|
|
||||||
for (unsigned j = 0; j < 4; j++)
|
for (unsigned j = 0; j < 4; j++)
|
||||||
{
|
{
|
||||||
UInt32 e = excludePos + j;
|
UInt32 e = excludePos + j;
|
||||||
@@ -72,11 +68,30 @@ static HRESULT CalcCheckSum(ISequentialInStream *stream, UInt32 size, UInt32 exc
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (size_t i = 0; i < processed; i += 2)
|
const unsigned kStep = (1 << 4);
|
||||||
{
|
{
|
||||||
sum += Get16(buf + i);
|
for (size_t i = processed; (i & (kStep - 1)) != 0; i++)
|
||||||
sum = (sum + (sum >> 16)) & 0xFFFF;
|
buf[i] = 0;
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
const Byte *buf2 = buf;
|
||||||
|
const Byte *bufLimit = buf + processed;
|
||||||
|
UInt64 sum2 = 0;
|
||||||
|
for (; buf2 < bufLimit; buf2 += kStep)
|
||||||
|
{
|
||||||
|
UInt64 sum3 = (UInt64)Get32(buf2)
|
||||||
|
+ Get32(buf2 + 4)
|
||||||
|
+ Get32(buf2 + 8)
|
||||||
|
+ Get32(buf2 + 12);
|
||||||
|
sum2 += sum3;
|
||||||
|
}
|
||||||
|
sum2 = (UInt32)(sum2) + (UInt64)(sum2 >> 32);
|
||||||
|
UInt32 sum3 = ((UInt32)sum2 + (UInt32)(sum2 >> 32));
|
||||||
|
sum += (sum3 & 0xFFFF) + (sum3 >> 16);
|
||||||
|
sum = (sum & 0xFFFF) + (sum >> 16);
|
||||||
|
sum = (sum & 0xFFFF) + (sum >> 16);
|
||||||
|
}
|
||||||
|
|
||||||
pos += (UInt32)processed;
|
pos += (UInt32)processed;
|
||||||
if (rem != processed)
|
if (rem != processed)
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
#include "../../../Common/ComTry.h"
|
#include "../../../Common/ComTry.h"
|
||||||
#include "../../../Common/IntToString.h"
|
#include "../../../Common/IntToString.h"
|
||||||
|
#include "../../../Common/MyBuffer2.h"
|
||||||
#include "../../../Common/UTFConvert.h"
|
#include "../../../Common/UTFConvert.h"
|
||||||
|
|
||||||
#include "../../../Windows/PropVariantUtils.h"
|
#include "../../../Windows/PropVariantUtils.h"
|
||||||
@@ -104,37 +105,6 @@ static const char * const g_LinkTypes[] =
|
|||||||
static const char g_ExtraTimeFlags[] = { 'u', 'M', 'C', 'A', 'n' };
|
static const char g_ExtraTimeFlags[] = { 'u', 'M', 'C', 'A', 'n' };
|
||||||
|
|
||||||
|
|
||||||
template <unsigned alignMask>
|
|
||||||
struct CAlignedBuffer
|
|
||||||
{
|
|
||||||
Byte *_buf;
|
|
||||||
Byte *_bufBase;
|
|
||||||
size_t _size;
|
|
||||||
|
|
||||||
CAlignedBuffer(): _buf(NULL), _bufBase(NULL), _size(0) {}
|
|
||||||
~CAlignedBuffer() { ::MyFree(_bufBase); }
|
|
||||||
public:
|
|
||||||
operator Byte *() { return _buf; }
|
|
||||||
operator const Byte *() const { return _buf; }
|
|
||||||
|
|
||||||
void AllocAtLeast(size_t size)
|
|
||||||
{
|
|
||||||
if (_buf && _size >= size)
|
|
||||||
return;
|
|
||||||
::MyFree(_bufBase);
|
|
||||||
_buf = NULL;
|
|
||||||
_size = 0;
|
|
||||||
_bufBase = (Byte *)::MyAlloc(size + alignMask);
|
|
||||||
|
|
||||||
if (_bufBase)
|
|
||||||
{
|
|
||||||
_size = size;
|
|
||||||
// _buf = (Byte *)(((uintptr_t)_bufBase + alignMask) & ~(uintptr_t)alignMask);
|
|
||||||
_buf = (Byte *)(((ptrdiff_t)_bufBase + alignMask) & ~(ptrdiff_t)alignMask);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
static unsigned ReadVarInt(const Byte *p, size_t maxSize, UInt64 *val)
|
static unsigned ReadVarInt(const Byte *p, size_t maxSize, UInt64 *val)
|
||||||
{
|
{
|
||||||
*val = 0;
|
*val = 0;
|
||||||
@@ -578,7 +548,7 @@ STDMETHODIMP COutStreamWithHash::Write(const void *data, UInt32 size, UInt32 *pr
|
|||||||
|
|
||||||
class CInArchive
|
class CInArchive
|
||||||
{
|
{
|
||||||
CAlignedBuffer<AES_BLOCK_SIZE - 1> _buf;
|
CAlignedBuffer _buf;
|
||||||
size_t _bufSize;
|
size_t _bufSize;
|
||||||
size_t _bufPos;
|
size_t _bufPos;
|
||||||
ISequentialInStream *_stream;
|
ISequentialInStream *_stream;
|
||||||
@@ -586,7 +556,7 @@ class CInArchive
|
|||||||
NCrypto::NRar5::CDecoder *m_CryptoDecoderSpec;
|
NCrypto::NRar5::CDecoder *m_CryptoDecoderSpec;
|
||||||
CMyComPtr<ICompressFilter> m_CryptoDecoder;
|
CMyComPtr<ICompressFilter> m_CryptoDecoder;
|
||||||
|
|
||||||
|
CLASS_NO_COPY(CInArchive)
|
||||||
|
|
||||||
HRESULT ReadStream_Check(void *data, size_t size);
|
HRESULT ReadStream_Check(void *data, size_t size);
|
||||||
|
|
||||||
@@ -610,6 +580,8 @@ public:
|
|||||||
UInt64 DataSize;
|
UInt64 DataSize;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
CInArchive() {}
|
||||||
|
|
||||||
HRESULT ReadBlockHeader(CHeader &h);
|
HRESULT ReadBlockHeader(CHeader &h);
|
||||||
bool ReadFileHeader(const CHeader &header, CItem &item);
|
bool ReadFileHeader(const CHeader &header, CItem &item);
|
||||||
void AddToSeekValue(UInt64 addValue)
|
void AddToSeekValue(UInt64 addValue)
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
#include "../../../Common/ComTry.h"
|
#include "../../../Common/ComTry.h"
|
||||||
#include "../../../Common/IntToString.h"
|
#include "../../../Common/IntToString.h"
|
||||||
|
#include "../../../Common/MyBuffer2.h"
|
||||||
#include "../../../Common/UTFConvert.h"
|
#include "../../../Common/UTFConvert.h"
|
||||||
|
|
||||||
#include "../../../Windows/PropVariantUtils.h"
|
#include "../../../Windows/PropVariantUtils.h"
|
||||||
@@ -136,8 +137,7 @@ class CInArchive
|
|||||||
NHeader::NBlock::CBlock m_BlockHeader;
|
NHeader::NBlock::CBlock m_BlockHeader;
|
||||||
NCrypto::NRar3::CDecoder *m_RarAESSpec;
|
NCrypto::NRar3::CDecoder *m_RarAESSpec;
|
||||||
CMyComPtr<ICompressFilter> m_RarAES;
|
CMyComPtr<ICompressFilter> m_RarAES;
|
||||||
CByteBuffer m_DecryptedData;
|
CAlignedBuffer m_DecryptedDataAligned;
|
||||||
Byte *m_DecryptedDataAligned;
|
|
||||||
UInt32 m_DecryptedDataSize;
|
UInt32 m_DecryptedDataSize;
|
||||||
bool m_CryptoMode;
|
bool m_CryptoMode;
|
||||||
UInt32 m_CryptoPos;
|
UInt32 m_CryptoPos;
|
||||||
@@ -553,11 +553,12 @@ HRESULT CInArchive::GetNextItem(CItem &item, ICryptoGetTextPassword *getTextPass
|
|||||||
m_RarAESSpec->SetPassword((const Byte *)buffer, len * 2);
|
m_RarAESSpec->SetPassword((const Byte *)buffer, len * 2);
|
||||||
|
|
||||||
const UInt32 kDecryptedBufferSize = (1 << 12);
|
const UInt32 kDecryptedBufferSize = (1 << 12);
|
||||||
if (m_DecryptedData.Size() == 0)
|
if (m_DecryptedDataAligned.Size() == 0)
|
||||||
{
|
{
|
||||||
const UInt32 kAlign = 16;
|
// const UInt32 kAlign = 16;
|
||||||
m_DecryptedData.Alloc(kDecryptedBufferSize + kAlign);
|
m_DecryptedDataAligned.AllocAtLeast(kDecryptedBufferSize);
|
||||||
m_DecryptedDataAligned = (Byte *)((ptrdiff_t)((Byte *)m_DecryptedData + kAlign - 1) & ~(ptrdiff_t)(kAlign - 1));
|
if (!m_DecryptedDataAligned.IsAllocated())
|
||||||
|
return E_OUTOFMEMORY;
|
||||||
}
|
}
|
||||||
RINOK(m_RarAES->Init());
|
RINOK(m_RarAES->Init());
|
||||||
size_t decryptedDataSizeT = kDecryptedBufferSize;
|
size_t decryptedDataSizeT = kDecryptedBufferSize;
|
||||||
|
|||||||
@@ -791,20 +791,24 @@ STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *val
|
|||||||
void CHandler::AddCommentString(const char *name, UInt32 pos)
|
void CHandler::AddCommentString(const char *name, UInt32 pos)
|
||||||
{
|
{
|
||||||
UString s;
|
UString s;
|
||||||
const Byte *buf = _bufs[0];
|
|
||||||
if (pos < _h.HeaderSize)
|
if (pos < _h.HeaderSize)
|
||||||
return;
|
return;
|
||||||
for (UInt32 i = pos;; i += 2)
|
if (pos >= _h.OffsetToCapsuleBody)
|
||||||
|
return;
|
||||||
|
UInt32 limit = (_h.OffsetToCapsuleBody - pos) & ~(UInt32)1;
|
||||||
|
const Byte *buf = _bufs[0] + pos;
|
||||||
|
for (UInt32 i = 0;;)
|
||||||
{
|
{
|
||||||
if (s.Len() > (1 << 16) || i >= _h.OffsetToCapsuleBody)
|
if (s.Len() > (1 << 16) || i >= limit)
|
||||||
return;
|
return;
|
||||||
wchar_t c = Get16(buf + i);
|
wchar_t c = Get16(buf + i);
|
||||||
|
i += 2;
|
||||||
if (c == 0)
|
if (c == 0)
|
||||||
{
|
{
|
||||||
i += 2;
|
if (i >= limit)
|
||||||
if (i >= _h.OffsetToCapsuleBody)
|
|
||||||
return;
|
return;
|
||||||
c = Get16(buf + i);
|
c = Get16(buf + i);
|
||||||
|
i += 2;
|
||||||
if (c == 0)
|
if (c == 0)
|
||||||
break;
|
break;
|
||||||
s.Add_LF();
|
s.Add_LF();
|
||||||
|
|||||||
@@ -671,7 +671,7 @@ void CHeader::SetDefaultFields(bool useLZX)
|
|||||||
ChunkSize = kChunkSize;
|
ChunkSize = kChunkSize;
|
||||||
ChunkSizeBits = kChunkSizeBits;
|
ChunkSizeBits = kChunkSizeBits;
|
||||||
}
|
}
|
||||||
g_RandomGenerator.Generate(Guid, 16);
|
MY_RAND_GEN(Guid, 16);
|
||||||
PartNumber = 1;
|
PartNumber = 1;
|
||||||
NumParts = 1;
|
NumParts = 1;
|
||||||
NumImages = 1;
|
NumImages = 1;
|
||||||
|
|||||||
@@ -1,11 +1,4 @@
|
|||||||
PROG = 7za.exe
|
PROG = 7za.exe
|
||||||
MY_CONSOLE = 1
|
|
||||||
CFLAGS = $(CFLAGS)
|
|
||||||
|
|
||||||
!IFNDEF UNDER_CE
|
|
||||||
CFLAGS = $(CFLAGS) -DWIN_LONG_PATH -D_7ZIP_LARGE_PAGES -DSUPPORT_DEVICE_FILE
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
|
|
||||||
COMMON_OBJS = \
|
COMMON_OBJS = \
|
||||||
$O\CommandLineParser.obj \
|
$O\CommandLineParser.obj \
|
||||||
|
|||||||
@@ -1,10 +1,6 @@
|
|||||||
PROG = 7zr.exe
|
PROG = 7zr.exe
|
||||||
MY_CONSOLE = 1
|
CFLAGS = $(CFLAGS) \
|
||||||
CFLAGS = $(CFLAGS) -DPROG_VARIANT_R
|
-DPROG_VARIANT_R \
|
||||||
|
|
||||||
!IFNDEF UNDER_CE
|
|
||||||
CFLAGS = $(CFLAGS) -DWIN_LONG_PATH -D_7ZIP_LARGE_PAGES -DSUPPORT_DEVICE_FILE
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
COMMON_OBJS = \
|
COMMON_OBJS = \
|
||||||
$O\CommandLineParser.obj \
|
$O\CommandLineParser.obj \
|
||||||
|
|||||||
@@ -1,14 +1,4 @@
|
|||||||
PROG = 7zFM.exe
|
PROG = 7zFM.exe
|
||||||
CFLAGS = $(CFLAGS) \
|
|
||||||
-DLANG \
|
|
||||||
-DNEW_FOLDER_INTERFACE \
|
|
||||||
|
|
||||||
!IFDEF UNDER_CE
|
|
||||||
LIBS = $(LIBS) ceshell.lib Commctrl.lib
|
|
||||||
!ELSE
|
|
||||||
LIBS = $(LIBS) comctl32.lib htmlhelp.lib comdlg32.lib Mpr.lib Gdi32.lib
|
|
||||||
CFLAGS = $(CFLAGS) -DWIN_LONG_PATH -DSUPPORT_DEVICE_FILE
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
!include "../Format7zF/Arc.mak"
|
!include "../Format7zF/Arc.mak"
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
PROG = lzma.exe
|
PROG = lzma.exe
|
||||||
MY_CONSOLE = 1
|
MY_CONSOLE = 1
|
||||||
CFLAGS = $(CFLAGS)
|
|
||||||
|
|
||||||
CURRENT_OBJS = \
|
CURRENT_OBJS = \
|
||||||
$O\LzmaAlone.obj \
|
$O\LzmaAlone.obj \
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ CFLAGS = $(CFLAGS) \
|
|||||||
-DEXTRACT_ONLY \
|
-DEXTRACT_ONLY \
|
||||||
-DNO_READ_FROM_CODER \
|
-DNO_READ_FROM_CODER \
|
||||||
-D_SFX \
|
-D_SFX \
|
||||||
-D_CONSOLE \
|
|
||||||
|
|
||||||
CURRENT_OBJS = \
|
CURRENT_OBJS = \
|
||||||
$O\SfxCon.obj \
|
$O\SfxCon.obj \
|
||||||
|
|||||||
@@ -7,6 +7,23 @@
|
|||||||
#include "FilterCoder.h"
|
#include "FilterCoder.h"
|
||||||
#include "StreamUtils.h"
|
#include "StreamUtils.h"
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#define alignedMidBuffer_Alloc g_MidAlloc
|
||||||
|
#else
|
||||||
|
#define alignedMidBuffer_Alloc g_AlignedAlloc
|
||||||
|
#endif
|
||||||
|
|
||||||
|
CAlignedMidBuffer::~CAlignedMidBuffer()
|
||||||
|
{
|
||||||
|
ISzAlloc_Free(&alignedMidBuffer_Alloc, _buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CAlignedMidBuffer::AllocAligned(size_t size)
|
||||||
|
{
|
||||||
|
ISzAlloc_Free(&alignedMidBuffer_Alloc, _buf);
|
||||||
|
_buf = (Byte *)ISzAlloc_Alloc(&alignedMidBuffer_Alloc, size);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
AES filters need 16-bytes alignment for HARDWARE-AES instructions.
|
AES filters need 16-bytes alignment for HARDWARE-AES instructions.
|
||||||
So we call IFilter::Filter(, size), where (size != 16 * N) only for last data block.
|
So we call IFilter::Filter(, size), where (size != 16 * N) only for last data block.
|
||||||
@@ -36,7 +53,7 @@ HRESULT CFilterCoder::Alloc()
|
|||||||
size = kMinSize;
|
size = kMinSize;
|
||||||
if (!_buf || _bufSize != size)
|
if (!_buf || _bufSize != size)
|
||||||
{
|
{
|
||||||
AllocAlignedMask(size, 16 - 1);
|
AllocAligned(size);
|
||||||
if (!_buf)
|
if (!_buf)
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
_bufSize = size;
|
_bufSize = size;
|
||||||
|
|||||||
@@ -19,41 +19,11 @@
|
|||||||
|
|
||||||
struct CAlignedMidBuffer
|
struct CAlignedMidBuffer
|
||||||
{
|
{
|
||||||
#ifdef _WIN32
|
|
||||||
|
|
||||||
Byte *_buf;
|
Byte *_buf;
|
||||||
|
|
||||||
CAlignedMidBuffer(): _buf(NULL) {}
|
CAlignedMidBuffer(): _buf(NULL) {}
|
||||||
~CAlignedMidBuffer() { ::MidFree(_buf); }
|
~CAlignedMidBuffer();
|
||||||
|
void AllocAligned(size_t size);
|
||||||
void AllocAlignedMask(size_t size, size_t)
|
|
||||||
{
|
|
||||||
::MidFree(_buf);
|
|
||||||
_buf = (Byte *)::MidAlloc(size);
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
Byte *_bufBase;
|
|
||||||
Byte *_buf;
|
|
||||||
|
|
||||||
CAlignedMidBuffer(): _bufBase(NULL), _buf(NULL) {}
|
|
||||||
~CAlignedMidBuffer() { ::MidFree(_bufBase); }
|
|
||||||
|
|
||||||
void AllocAlignedMask(size_t size, size_t alignMask)
|
|
||||||
{
|
|
||||||
::MidFree(_bufBase);
|
|
||||||
_buf = NULL;
|
|
||||||
_bufBase = (Byte *)::MidAlloc(size + alignMask);
|
|
||||||
|
|
||||||
if (_bufBase)
|
|
||||||
{
|
|
||||||
// _buf = (Byte *)(((uintptr_t)_bufBase + alignMask) & ~(uintptr_t)alignMask);
|
|
||||||
_buf = (Byte *)(((ptrdiff_t)_bufBase + alignMask) & ~(ptrdiff_t)alignMask);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class CFilterCoder:
|
class CFilterCoder:
|
||||||
|
|||||||
@@ -164,8 +164,8 @@ STDMETHODIMP CEncoder::ResetInitVector()
|
|||||||
{
|
{
|
||||||
for (unsigned i = 0; i < sizeof(_iv); i++)
|
for (unsigned i = 0; i < sizeof(_iv); i++)
|
||||||
_iv[i] = 0;
|
_iv[i] = 0;
|
||||||
_ivSize = 8;
|
_ivSize = 16;
|
||||||
g_RandomGenerator.Generate(_iv, _ivSize);
|
MY_RAND_GEN(_iv, _ivSize);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,14 +2,44 @@
|
|||||||
|
|
||||||
#include "StdAfx.h"
|
#include "StdAfx.h"
|
||||||
|
|
||||||
|
#include "RandGen.h"
|
||||||
|
|
||||||
|
#ifndef USE_STATIC_SYSTEM_RAND
|
||||||
|
|
||||||
#ifndef _7ZIP_ST
|
#ifndef _7ZIP_ST
|
||||||
#include "../../Windows/Synchronization.h"
|
#include "../../Windows/Synchronization.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "RandGen.h"
|
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifdef _WIN32
|
||||||
|
|
||||||
|
#ifdef _WIN64
|
||||||
|
#define USE_STATIC_RtlGenRandom
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_STATIC_RtlGenRandom
|
||||||
|
|
||||||
|
#include <ntsecapi.h>
|
||||||
|
|
||||||
|
EXTERN_C_BEGIN
|
||||||
|
#ifndef RtlGenRandom
|
||||||
|
#define RtlGenRandom SystemFunction036
|
||||||
|
BOOLEAN WINAPI RtlGenRandom(PVOID RandomBuffer, ULONG RandomBufferLength);
|
||||||
|
#endif
|
||||||
|
EXTERN_C_END
|
||||||
|
|
||||||
|
#else
|
||||||
|
EXTERN_C_BEGIN
|
||||||
|
typedef BOOLEAN (WINAPI * Func_RtlGenRandom)(PVOID RandomBuffer, ULONG RandomBufferLength);
|
||||||
|
EXTERN_C_END
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#else
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
#define USE_POSIX_TIME
|
#define USE_POSIX_TIME
|
||||||
#define USE_POSIX_TIME2
|
#define USE_POSIX_TIME2
|
||||||
#endif
|
#endif
|
||||||
@@ -21,11 +51,9 @@
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// This is not very good random number generator.
|
// The seed and first generated data block depend from processID,
|
||||||
// Please use it only for salt.
|
// theadID, timer and system random generator, if available.
|
||||||
// First generated data block depends from timer and processID.
|
|
||||||
// Other generated data blocks depend from previous state
|
// Other generated data blocks depend from previous state
|
||||||
// Maybe it's possible to restore original timer value from generated value.
|
|
||||||
|
|
||||||
#define HASH_UPD(x) Sha256_Update(&hash, (const Byte *)&x, sizeof(x));
|
#define HASH_UPD(x) Sha256_Update(&hash, (const Byte *)&x, sizeof(x));
|
||||||
|
|
||||||
@@ -34,25 +62,102 @@ void CRandomGenerator::Init()
|
|||||||
CSha256 hash;
|
CSha256 hash;
|
||||||
Sha256_Init(&hash);
|
Sha256_Init(&hash);
|
||||||
|
|
||||||
|
unsigned numIterations = 1000;
|
||||||
|
|
||||||
|
{
|
||||||
|
#ifndef UNDER_CE
|
||||||
|
const unsigned kNumIterations_Small = 100;
|
||||||
|
const unsigned kBufSize = 32;
|
||||||
|
Byte buf[kBufSize];
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
|
||||||
DWORD w = ::GetCurrentProcessId();
|
DWORD w = ::GetCurrentProcessId();
|
||||||
HASH_UPD(w);
|
HASH_UPD(w);
|
||||||
w = ::GetCurrentThreadId();
|
w = ::GetCurrentThreadId();
|
||||||
HASH_UPD(w);
|
HASH_UPD(w);
|
||||||
|
|
||||||
|
#ifdef UNDER_CE
|
||||||
|
/*
|
||||||
|
if (CeGenRandom(kBufSize, buf))
|
||||||
|
{
|
||||||
|
numIterations = kNumIterations_Small;
|
||||||
|
Sha256_Update(&hash, buf, kBufSize);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
#elif defined(USE_STATIC_RtlGenRandom)
|
||||||
|
if (RtlGenRandom(buf, kBufSize))
|
||||||
|
{
|
||||||
|
numIterations = kNumIterations_Small;
|
||||||
|
Sha256_Update(&hash, buf, kBufSize);
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
|
{
|
||||||
|
HMODULE hModule = ::LoadLibrary(TEXT("Advapi32.dll"));
|
||||||
|
if (hModule)
|
||||||
|
{
|
||||||
|
// SystemFunction036() is real name of RtlGenRandom() function
|
||||||
|
Func_RtlGenRandom my_RtlGenRandom = (Func_RtlGenRandom)GetProcAddress(hModule, "SystemFunction036");
|
||||||
|
if (my_RtlGenRandom)
|
||||||
|
{
|
||||||
|
if (my_RtlGenRandom(buf, kBufSize))
|
||||||
|
{
|
||||||
|
numIterations = kNumIterations_Small;
|
||||||
|
Sha256_Update(&hash, buf, kBufSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
::FreeLibrary(hModule);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
pid_t pid = getpid();
|
pid_t pid = getpid();
|
||||||
HASH_UPD(pid);
|
HASH_UPD(pid);
|
||||||
pid = getppid();
|
pid = getppid();
|
||||||
HASH_UPD(pid);
|
HASH_UPD(pid);
|
||||||
|
|
||||||
|
{
|
||||||
|
int f = open("/dev/urandom", O_RDONLY);
|
||||||
|
unsigned numBytes = kBufSize;
|
||||||
|
if (f >= 0)
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
int n = read(f, buf, numBytes);
|
||||||
|
if (n <= 0)
|
||||||
|
break;
|
||||||
|
Sha256_Update(&hash, buf, n);
|
||||||
|
numBytes -= n;
|
||||||
|
}
|
||||||
|
while (numBytes);
|
||||||
|
close(f);
|
||||||
|
if (numBytes == 0)
|
||||||
|
numIterations = kNumIterations_Small;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
{
|
||||||
|
int n = getrandom(buf, kBufSize, 0);
|
||||||
|
if (n > 0)
|
||||||
|
{
|
||||||
|
Sha256_Update(&hash, buf, n);
|
||||||
|
if (n == kBufSize)
|
||||||
|
numIterations = kNumIterations_Small;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef _DEBUG
|
||||||
|
numIterations = 2;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (unsigned i = 0; i <
|
do
|
||||||
#ifdef _DEBUG
|
|
||||||
2;
|
|
||||||
#else
|
|
||||||
1000;
|
|
||||||
#endif
|
|
||||||
i++)
|
|
||||||
{
|
{
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
LARGE_INTEGER v;
|
LARGE_INTEGER v;
|
||||||
@@ -85,6 +190,8 @@ void CRandomGenerator::Init()
|
|||||||
Sha256_Update(&hash, _buff, SHA256_DIGEST_SIZE);
|
Sha256_Update(&hash, _buff, SHA256_DIGEST_SIZE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
while (--numIterations);
|
||||||
|
|
||||||
Sha256_Final(&hash, _buff);
|
Sha256_Final(&hash, _buff);
|
||||||
_needInit = false;
|
_needInit = false;
|
||||||
}
|
}
|
||||||
@@ -122,3 +229,5 @@ void CRandomGenerator::Generate(Byte *data, unsigned size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
CRandomGenerator g_RandomGenerator;
|
CRandomGenerator g_RandomGenerator;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|||||||
@@ -5,6 +5,21 @@
|
|||||||
|
|
||||||
#include "../../../C/Sha256.h"
|
#include "../../../C/Sha256.h"
|
||||||
|
|
||||||
|
#ifdef _WIN64
|
||||||
|
// #define USE_STATIC_SYSTEM_RAND
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_STATIC_SYSTEM_RAND
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#include <ntsecapi.h>
|
||||||
|
#define MY_RAND_GEN(data, size) RtlGenRandom(data, size)
|
||||||
|
#else
|
||||||
|
#define MY_RAND_GEN(data, size) getrandom(data, size, 0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
class CRandomGenerator
|
class CRandomGenerator
|
||||||
{
|
{
|
||||||
Byte _buff[SHA256_DIGEST_SIZE];
|
Byte _buff[SHA256_DIGEST_SIZE];
|
||||||
@@ -18,4 +33,8 @@ public:
|
|||||||
|
|
||||||
extern CRandomGenerator g_RandomGenerator;
|
extern CRandomGenerator g_RandomGenerator;
|
||||||
|
|
||||||
|
#define MY_RAND_GEN(data, size) g_RandomGenerator.Generate(data, size)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ STDMETHODIMP CBaseCoder::Init()
|
|||||||
HRESULT CEncoder::WriteHeader(ISequentialOutStream *outStream)
|
HRESULT CEncoder::WriteHeader(ISequentialOutStream *outStream)
|
||||||
{
|
{
|
||||||
unsigned saltSize = _key.GetSaltSize();
|
unsigned saltSize = _key.GetSaltSize();
|
||||||
g_RandomGenerator.Generate(_key.Salt, saltSize);
|
MY_RAND_GEN(_key.Salt, saltSize);
|
||||||
Init2();
|
Init2();
|
||||||
RINOK(WriteStream(outStream, _key.Salt, saltSize));
|
RINOK(WriteStream(outStream, _key.Salt, saltSize));
|
||||||
return WriteStream(outStream, _key.PwdVerifComputed, kPwdVerifSize);
|
return WriteStream(outStream, _key.PwdVerifComputed, kPwdVerifSize);
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ HRESULT CEncoder::WriteHeader_Check16(ISequentialOutStream *outStream, UInt16 cr
|
|||||||
PKZIP 2.0+ used 1 byte CRC check. It's more secure.
|
PKZIP 2.0+ used 1 byte CRC check. It's more secure.
|
||||||
We also use 1 byte CRC. */
|
We also use 1 byte CRC. */
|
||||||
|
|
||||||
g_RandomGenerator.Generate(h, kHeaderSize - 1);
|
MY_RAND_GEN(h, kHeaderSize - 1);
|
||||||
// h[kHeaderSize - 2] = (Byte)(crc);
|
// h[kHeaderSize - 2] = (Byte)(crc);
|
||||||
h[kHeaderSize - 1] = (Byte)(crc >> 8);
|
h[kHeaderSize - 1] = (Byte)(crc >> 8);
|
||||||
|
|
||||||
|
|||||||
@@ -85,13 +85,14 @@ HRESULT CDecoder::ReadHeader(ISequentialInStream *inStream, UInt32 crc, UInt64 u
|
|||||||
return E_NOTIMPL;
|
return E_NOTIMPL;
|
||||||
RINOK(ReadStream_FALSE(inStream, temp, 4));
|
RINOK(ReadStream_FALSE(inStream, temp, 4));
|
||||||
_remSize = GetUi32(temp);
|
_remSize = GetUi32(temp);
|
||||||
const UInt32 kAlign = 16;
|
// const UInt32 kAlign = 16;
|
||||||
if (_remSize < 16 || _remSize > (1 << 18))
|
if (_remSize < 16 || _remSize > (1 << 18))
|
||||||
return E_NOTIMPL;
|
return E_NOTIMPL;
|
||||||
if (_remSize + kAlign > _buf.Size())
|
if (_remSize > _bufAligned.Size())
|
||||||
{
|
{
|
||||||
_buf.Alloc(_remSize + kAlign);
|
_bufAligned.AllocAtLeast(_remSize);
|
||||||
_bufAligned = (Byte *)((ptrdiff_t)((Byte *)_buf + kAlign - 1) & ~(ptrdiff_t)(kAlign - 1));
|
if (!(Byte *)_bufAligned)
|
||||||
|
return E_OUTOFMEMORY;
|
||||||
}
|
}
|
||||||
return ReadStream_FALSE(inStream, _bufAligned, _remSize);
|
return ReadStream_FALSE(inStream, _bufAligned, _remSize);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
#ifndef __CRYPTO_ZIP_STRONG_H
|
#ifndef __CRYPTO_ZIP_STRONG_H
|
||||||
#define __CRYPTO_ZIP_STRONG_H
|
#define __CRYPTO_ZIP_STRONG_H
|
||||||
|
|
||||||
#include "../../Common/MyBuffer.h"
|
#include "../../Common/MyBuffer2.h"
|
||||||
|
|
||||||
#include "../IPassword.h"
|
#include "../IPassword.h"
|
||||||
|
|
||||||
@@ -35,8 +35,7 @@ class CBaseCoder:
|
|||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
CKeyInfo _key;
|
CKeyInfo _key;
|
||||||
CByteBuffer _buf;
|
CAlignedBuffer _bufAligned;
|
||||||
Byte *_bufAligned;
|
|
||||||
public:
|
public:
|
||||||
STDMETHOD(Init)();
|
STDMETHOD(Init)();
|
||||||
STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size);
|
STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size);
|
||||||
|
|||||||
@@ -99,6 +99,25 @@ UString CreateArchiveName(const UStringVector &paths, const NFind::CFileInfo *fi
|
|||||||
name = Get_Correct_FsFile_Name(fs2us(CreateArchiveName2(us2fs(paths.Front()), fromPrev, keepName)));
|
name = Get_Correct_FsFile_Name(fs2us(CreateArchiveName2(us2fs(paths.Front()), fromPrev, keepName)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UStringVector names;
|
||||||
|
|
||||||
|
{
|
||||||
|
FOR_VECTOR (i, paths)
|
||||||
|
{
|
||||||
|
NFind::CFileInfo fi2;
|
||||||
|
const NFind::CFileInfo *fp;
|
||||||
|
if (fi && paths.Size() == 1)
|
||||||
|
fp = fi;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!fi2.Find(us2fs(paths[i])))
|
||||||
|
continue;
|
||||||
|
fp = &fi2;
|
||||||
|
}
|
||||||
|
names.Add(fs2us(fp->Name));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
UString postfix;
|
UString postfix;
|
||||||
UInt32 index = 1;
|
UInt32 index = 1;
|
||||||
|
|
||||||
@@ -114,21 +133,9 @@ UString CreateArchiveName(const UStringVector &paths, const NFind::CFileInfo *fi
|
|||||||
|
|
||||||
unsigned i = 0;
|
unsigned i = 0;
|
||||||
|
|
||||||
for (i = 0; i < paths.Size(); i++)
|
for (i = 0; i < names.Size(); i++)
|
||||||
{
|
{
|
||||||
const UString &fn = paths[i];
|
const UString &fname = names[i];
|
||||||
NFind::CFileInfo fi2;
|
|
||||||
|
|
||||||
const NFind::CFileInfo *fp;
|
|
||||||
if (fi && paths.Size() == 1)
|
|
||||||
fp = fi;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!fi2.Find(us2fs(fn)))
|
|
||||||
continue;
|
|
||||||
fp = &fi2;
|
|
||||||
}
|
|
||||||
const UString fname = fs2us(fp->Name);
|
|
||||||
if ( 0 == CompareFileNames(fname, name2_zip)
|
if ( 0 == CompareFileNames(fname, name2_zip)
|
||||||
|| 0 == CompareFileNames(fname, name2_7z)
|
|| 0 == CompareFileNames(fname, name2_7z)
|
||||||
|| 0 == CompareFileNames(fname, name2_tar)
|
|| 0 == CompareFileNames(fname, name2_tar)
|
||||||
@@ -136,7 +143,7 @@ UString CreateArchiveName(const UStringVector &paths, const NFind::CFileInfo *fi
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i == paths.Size())
|
if (i == names.Size())
|
||||||
break;
|
break;
|
||||||
index++;
|
index++;
|
||||||
postfix = "_";
|
postfix = "_";
|
||||||
|
|||||||
@@ -103,6 +103,13 @@ STDMETHODIMP COpenCallbackImp::GetStream(const wchar_t *name, IInStream **inStre
|
|||||||
if (!IsSafePath(name2))
|
if (!IsSafePath(name2))
|
||||||
return S_FALSE;
|
return S_FALSE;
|
||||||
|
|
||||||
|
// #ifdef _WIN32
|
||||||
|
// we don't want to support wildcards in names here here
|
||||||
|
if (name2.Find(L'?') >= 0 ||
|
||||||
|
name2.Find(L'*') >= 0)
|
||||||
|
return S_FALSE;
|
||||||
|
// #endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -29,7 +29,6 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "../../../../C/7zCrc.h"
|
#include "../../../../C/7zCrc.h"
|
||||||
#include "../../../../C/Alloc.h"
|
|
||||||
#include "../../../../C/CpuArch.h"
|
#include "../../../../C/CpuArch.h"
|
||||||
|
|
||||||
#ifndef _7ZIP_ST
|
#ifndef _7ZIP_ST
|
||||||
@@ -47,6 +46,7 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "../../../Common/IntToString.h"
|
#include "../../../Common/IntToString.h"
|
||||||
|
#include "../../../Common/MyBuffer2.h"
|
||||||
#include "../../../Common/StringConvert.h"
|
#include "../../../Common/StringConvert.h"
|
||||||
#include "../../../Common/StringToInt.h"
|
#include "../../../Common/StringToInt.h"
|
||||||
|
|
||||||
@@ -94,80 +94,33 @@ static const UInt32 kAdditionalSize = (1 << 16);
|
|||||||
static const UInt32 kCompressedAdditionalSize = (1 << 10);
|
static const UInt32 kCompressedAdditionalSize = (1 << 10);
|
||||||
static const UInt32 kMaxLzmaPropSize = 5;
|
static const UInt32 kMaxLzmaPropSize = 5;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define ALLOC_WITH_HRESULT(_buffer_, _size_) \
|
||||||
|
(_buffer_)->Alloc(_size_); \
|
||||||
|
if (!(_buffer_)->IsAllocated()) return E_OUTOFMEMORY;
|
||||||
|
|
||||||
|
|
||||||
class CBaseRandomGenerator
|
class CBaseRandomGenerator
|
||||||
{
|
{
|
||||||
UInt32 A1;
|
UInt32 A1;
|
||||||
UInt32 A2;
|
UInt32 A2;
|
||||||
|
UInt32 Salt;
|
||||||
public:
|
public:
|
||||||
CBaseRandomGenerator() { Init(); }
|
CBaseRandomGenerator(UInt32 salt = 0): Salt(salt) { Init(); }
|
||||||
void Init() { A1 = 362436069; A2 = 521288629;}
|
void Init() { A1 = 362436069; A2 = 521288629;}
|
||||||
UInt32 GetRnd()
|
UInt32 GetRnd()
|
||||||
{
|
{
|
||||||
return
|
return Salt ^
|
||||||
|
(
|
||||||
((A1 = 36969 * (A1 & 0xffff) + (A1 >> 16)) << 16) +
|
((A1 = 36969 * (A1 & 0xffff) + (A1 >> 16)) << 16) +
|
||||||
((A2 = 18000 * (A2 & 0xffff) + (A2 >> 16)) );
|
((A2 = 18000 * (A2 & 0xffff) + (A2 >> 16)) )
|
||||||
|
);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static const unsigned kBufferAlignment = 1 << 4;
|
class CBenchRandomGenerator: public CAlignedBuffer
|
||||||
|
|
||||||
struct CBenchBuffer
|
|
||||||
{
|
|
||||||
size_t BufferSize;
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
|
|
||||||
Byte *Buffer;
|
|
||||||
|
|
||||||
CBenchBuffer(): BufferSize(0), Buffer(NULL) {}
|
|
||||||
~CBenchBuffer() { ::MidFree(Buffer); }
|
|
||||||
|
|
||||||
void AllocAlignedMask(size_t size, size_t)
|
|
||||||
{
|
|
||||||
::MidFree(Buffer);
|
|
||||||
BufferSize = 0;
|
|
||||||
Buffer = (Byte *)::MidAlloc(size);
|
|
||||||
if (Buffer)
|
|
||||||
BufferSize = size;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
Byte *Buffer;
|
|
||||||
Byte *_bufBase;
|
|
||||||
|
|
||||||
CBenchBuffer(): BufferSize(0), Buffer(NULL), _bufBase(NULL){}
|
|
||||||
~CBenchBuffer() { ::MidFree(_bufBase); }
|
|
||||||
|
|
||||||
void AllocAlignedMask(size_t size, size_t alignMask)
|
|
||||||
{
|
|
||||||
::MidFree(_bufBase);
|
|
||||||
Buffer = NULL;
|
|
||||||
BufferSize = 0;
|
|
||||||
_bufBase = (Byte *)::MidAlloc(size + alignMask);
|
|
||||||
|
|
||||||
if (_bufBase)
|
|
||||||
{
|
|
||||||
// Buffer = (Byte *)(((uintptr_t)_bufBase + alignMask) & ~(uintptr_t)alignMask);
|
|
||||||
Buffer = (Byte *)(((ptrdiff_t)_bufBase + alignMask) & ~(ptrdiff_t)alignMask);
|
|
||||||
BufferSize = size;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bool Alloc(size_t size)
|
|
||||||
{
|
|
||||||
if (Buffer && BufferSize == size)
|
|
||||||
return true;
|
|
||||||
AllocAlignedMask(size, kBufferAlignment - 1);
|
|
||||||
return (Buffer != NULL || size == 0);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
class CBenchRandomGenerator: public CBenchBuffer
|
|
||||||
{
|
{
|
||||||
static UInt32 GetVal(UInt32 &res, unsigned numBits)
|
static UInt32 GetVal(UInt32 &res, unsigned numBits)
|
||||||
{
|
{
|
||||||
@@ -184,23 +137,22 @@ class CBenchRandomGenerator: public CBenchBuffer
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
void GenerateSimpleRandom(CBaseRandomGenerator *_RG_)
|
void GenerateSimpleRandom(UInt32 salt)
|
||||||
{
|
{
|
||||||
CBaseRandomGenerator rg = *_RG_;
|
CBaseRandomGenerator rg(salt);
|
||||||
const size_t bufSize = BufferSize;
|
const size_t bufSize = Size();
|
||||||
Byte *buf = Buffer;
|
Byte *buf = (Byte *)*this;
|
||||||
for (size_t i = 0; i < bufSize; i++)
|
for (size_t i = 0; i < bufSize; i++)
|
||||||
buf[i] = (Byte)rg.GetRnd();
|
buf[i] = (Byte)rg.GetRnd();
|
||||||
*_RG_ = rg;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GenerateLz(unsigned dictBits, CBaseRandomGenerator *_RG_)
|
void GenerateLz(unsigned dictBits, UInt32 salt)
|
||||||
{
|
{
|
||||||
CBaseRandomGenerator rg = *_RG_;
|
CBaseRandomGenerator rg(salt);
|
||||||
UInt32 pos = 0;
|
UInt32 pos = 0;
|
||||||
UInt32 rep0 = 1;
|
UInt32 rep0 = 1;
|
||||||
const size_t bufSize = BufferSize;
|
const size_t bufSize = Size();
|
||||||
Byte *buf = Buffer;
|
Byte *buf = (Byte *)*this;
|
||||||
unsigned posBits = 1;
|
unsigned posBits = 1;
|
||||||
|
|
||||||
while (pos < bufSize)
|
while (pos < bufSize)
|
||||||
@@ -255,8 +207,6 @@ public:
|
|||||||
*dest++ = *src++;
|
*dest++ = *src++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*_RG_ = rg;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -297,7 +247,7 @@ STDMETHODIMP CBenchmarkInStream::Read(void *data, UInt32 size, UInt32 *processed
|
|||||||
|
|
||||||
class CBenchmarkOutStream:
|
class CBenchmarkOutStream:
|
||||||
public ISequentialOutStream,
|
public ISequentialOutStream,
|
||||||
public CBenchBuffer,
|
public CAlignedBuffer,
|
||||||
public CMyUnknownImp
|
public CMyUnknownImp
|
||||||
{
|
{
|
||||||
// bool _overflow;
|
// bool _overflow;
|
||||||
@@ -325,13 +275,13 @@ public:
|
|||||||
|
|
||||||
STDMETHODIMP CBenchmarkOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize)
|
STDMETHODIMP CBenchmarkOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize)
|
||||||
{
|
{
|
||||||
size_t curSize = BufferSize - Pos;
|
size_t curSize = Size() - Pos;
|
||||||
if (curSize > size)
|
if (curSize > size)
|
||||||
curSize = size;
|
curSize = size;
|
||||||
if (curSize != 0)
|
if (curSize != 0)
|
||||||
{
|
{
|
||||||
if (RealCopy)
|
if (RealCopy)
|
||||||
memcpy(Buffer + Pos, data, curSize);
|
memcpy(((Byte *)*this) + Pos, data, curSize);
|
||||||
if (CalcCrc)
|
if (CalcCrc)
|
||||||
Crc = CrcUpdate(Crc, data, curSize);
|
Crc = CrcUpdate(Crc, data, curSize);
|
||||||
Pos += curSize;
|
Pos += curSize;
|
||||||
@@ -686,20 +636,39 @@ UInt64 GetDecompressRating(UInt64 elapsedTime, UInt64 freq, UInt64 outSize, UInt
|
|||||||
return props.GetDecompressRating(elapsedTime, freq, outSize, inSize, numIterations);
|
return props.GetDecompressRating(elapsedTime, freq, outSize, inSize, numIterations);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _7ZIP_ST
|
||||||
|
struct CBenchSyncCommon
|
||||||
|
{
|
||||||
|
bool ExitMode;
|
||||||
|
NSynchronization::CManualResetEvent StartEvent;
|
||||||
|
|
||||||
|
CBenchSyncCommon(): ExitMode(false) {}
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
struct CEncoderInfo;
|
struct CEncoderInfo;
|
||||||
|
|
||||||
struct CEncoderInfo
|
struct CEncoderInfo
|
||||||
{
|
{
|
||||||
#ifndef _7ZIP_ST
|
#ifndef _7ZIP_ST
|
||||||
NWindows::CThread thread[2];
|
NWindows::CThread thread[2];
|
||||||
|
NSynchronization::CManualResetEvent ReadyEvent;
|
||||||
UInt32 NumDecoderSubThreads;
|
UInt32 NumDecoderSubThreads;
|
||||||
|
CBenchSyncCommon *Common;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
CMyComPtr<ICompressCoder> _encoder;
|
CMyComPtr<ICompressCoder> _encoder;
|
||||||
CMyComPtr<ICompressFilter> _encoderFilter;
|
CMyComPtr<ICompressFilter> _encoderFilter;
|
||||||
CBenchProgressInfo *progressInfoSpec[2];
|
CBenchProgressInfo *progressInfoSpec[2];
|
||||||
CMyComPtr<ICompressProgressInfo> progressInfo[2];
|
CMyComPtr<ICompressProgressInfo> progressInfo[2];
|
||||||
UInt64 NumIterations;
|
UInt64 NumIterations;
|
||||||
|
|
||||||
|
UInt32 Salt;
|
||||||
|
|
||||||
#ifdef USE_ALLOCA
|
#ifdef USE_ALLOCA
|
||||||
size_t AllocaSize;
|
size_t AllocaSize;
|
||||||
#endif
|
#endif
|
||||||
@@ -738,22 +707,25 @@ struct CEncoderInfo
|
|||||||
const Byte *fileData;
|
const Byte *fileData;
|
||||||
CBenchRandomGenerator rg;
|
CBenchRandomGenerator rg;
|
||||||
|
|
||||||
CBenchBuffer rgCopy; // it must be 16-byte aligned !!!
|
CAlignedBuffer rgCopy; // it must be 16-byte aligned !!!
|
||||||
CBenchmarkOutStream *propStreamSpec;
|
CBenchmarkOutStream *propStreamSpec;
|
||||||
CMyComPtr<ISequentialOutStream> propStream;
|
CMyComPtr<ISequentialOutStream> propStream;
|
||||||
|
|
||||||
// for decode
|
unsigned generateDictBits;
|
||||||
COneMethodInfo _method;
|
COneMethodInfo _method;
|
||||||
|
|
||||||
|
// for decode
|
||||||
size_t _uncompressedDataSize;
|
size_t _uncompressedDataSize;
|
||||||
|
|
||||||
HRESULT Init(
|
HRESULT Generate();
|
||||||
const COneMethodInfo &method,
|
|
||||||
unsigned generateDictBits,
|
|
||||||
CBaseRandomGenerator *rg);
|
|
||||||
HRESULT Encode();
|
HRESULT Encode();
|
||||||
HRESULT Decode(UInt32 decoderIndex);
|
HRESULT Decode(UInt32 decoderIndex);
|
||||||
|
|
||||||
CEncoderInfo():
|
CEncoderInfo():
|
||||||
|
#ifndef _7ZIP_ST
|
||||||
|
Common(NULL),
|
||||||
|
#endif
|
||||||
|
Salt(0),
|
||||||
fileData(NULL),
|
fileData(NULL),
|
||||||
CheckCrc_Enc(true),
|
CheckCrc_Enc(true),
|
||||||
CheckCrc_Dec(true),
|
CheckCrc_Dec(true),
|
||||||
@@ -772,14 +744,15 @@ struct CEncoderInfo
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
res = encoder->Encode();
|
res = encoder->Encode();
|
||||||
encoder->Results[0] = res;
|
|
||||||
}
|
}
|
||||||
catch(...)
|
catch(...)
|
||||||
{
|
{
|
||||||
res = E_FAIL;
|
res = E_FAIL;
|
||||||
}
|
}
|
||||||
|
encoder->Results[0] = res;
|
||||||
if (res != S_OK)
|
if (res != S_OK)
|
||||||
encoder->progressInfoSpec[0]->Status->SetResult(res);
|
encoder->progressInfoSpec[0]->Status->SetResult(res);
|
||||||
|
encoder->ReadyEvent.Set();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -798,7 +771,12 @@ struct CEncoderInfo
|
|||||||
|
|
||||||
HRESULT CreateEncoderThread()
|
HRESULT CreateEncoderThread()
|
||||||
{
|
{
|
||||||
return thread[0].Create(EncodeThreadFunction, this);
|
WRes res = 0;
|
||||||
|
if (!ReadyEvent.IsCreated())
|
||||||
|
res = ReadyEvent.Create();
|
||||||
|
if (res == 0)
|
||||||
|
res = thread[0].Create(EncodeThreadFunction, this);
|
||||||
|
return HRESULT_FROM_WIN32(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT CreateDecoderThread(unsigned index, bool callbackMode
|
HRESULT CreateDecoderThread(unsigned index, bool callbackMode
|
||||||
@@ -823,11 +801,10 @@ struct CEncoderInfo
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
HRESULT CEncoderInfo::Init(
|
HRESULT CEncoderInfo::Generate()
|
||||||
const COneMethodInfo &method,
|
|
||||||
unsigned generateDictBits,
|
|
||||||
CBaseRandomGenerator *rgLoc)
|
|
||||||
{
|
{
|
||||||
|
const COneMethodInfo &method = _method;
|
||||||
|
|
||||||
// we need extra space, if input data is already compressed
|
// we need extra space, if input data is already compressed
|
||||||
const size_t kCompressedBufferSize =
|
const size_t kCompressedBufferSize =
|
||||||
kCompressedAdditionalSize +
|
kCompressedAdditionalSize +
|
||||||
@@ -841,40 +818,39 @@ HRESULT CEncoderInfo::Init(
|
|||||||
|
|
||||||
if (!fileData)
|
if (!fileData)
|
||||||
{
|
{
|
||||||
if (!rg.Alloc(kBufferSize))
|
ALLOC_WITH_HRESULT(&rg, kBufferSize);
|
||||||
return E_OUTOFMEMORY;
|
|
||||||
|
|
||||||
// DWORD ttt = GetTickCount();
|
// DWORD ttt = GetTickCount();
|
||||||
if (generateDictBits == 0)
|
if (generateDictBits == 0)
|
||||||
rg.GenerateSimpleRandom(rgLoc);
|
rg.GenerateSimpleRandom(Salt);
|
||||||
else
|
else
|
||||||
rg.GenerateLz(generateDictBits, rgLoc);
|
rg.GenerateLz(generateDictBits, Salt);
|
||||||
// printf("\n%d\n ", GetTickCount() - ttt);
|
// printf("\n%d\n ", GetTickCount() - ttt);
|
||||||
|
|
||||||
crc = CrcCalc(rg.Buffer, rg.BufferSize);
|
crc = CrcCalc((const Byte *)rg, rg.Size());
|
||||||
uncompressedDataPtr = rg.Buffer;
|
uncompressedDataPtr = (const Byte *)rg;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_encoderFilter)
|
if (_encoderFilter)
|
||||||
{
|
{
|
||||||
if (!rgCopy.Alloc(kBufferSize))
|
ALLOC_WITH_HRESULT(&rgCopy, kBufferSize);
|
||||||
return E_OUTOFMEMORY;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (!outStream)
|
||||||
|
{
|
||||||
outStreamSpec = new CBenchmarkOutStream;
|
outStreamSpec = new CBenchmarkOutStream;
|
||||||
outStream = outStreamSpec;
|
outStream = outStreamSpec;
|
||||||
if (!outStreamSpec->Alloc(kCompressedBufferSize))
|
}
|
||||||
return E_OUTOFMEMORY;
|
|
||||||
|
ALLOC_WITH_HRESULT(outStreamSpec, kCompressedBufferSize)
|
||||||
|
|
||||||
propStreamSpec = 0;
|
|
||||||
if (!propStream)
|
if (!propStream)
|
||||||
{
|
{
|
||||||
propStreamSpec = new CBenchmarkOutStream;
|
propStreamSpec = new CBenchmarkOutStream;
|
||||||
propStream = propStreamSpec;
|
propStream = propStreamSpec;
|
||||||
}
|
}
|
||||||
if (!propStreamSpec->Alloc(kMaxLzmaPropSize))
|
ALLOC_WITH_HRESULT(propStreamSpec, kMaxLzmaPropSize);
|
||||||
return E_OUTOFMEMORY;
|
|
||||||
propStreamSpec->Init(true, false);
|
propStreamSpec->Init(true, false);
|
||||||
|
|
||||||
|
|
||||||
@@ -961,6 +937,28 @@ static void My_FilterBench(ICompressFilter *filter, Byte *data, size_t size)
|
|||||||
|
|
||||||
HRESULT CEncoderInfo::Encode()
|
HRESULT CEncoderInfo::Encode()
|
||||||
{
|
{
|
||||||
|
RINOK(Generate());
|
||||||
|
|
||||||
|
#ifndef _7ZIP_ST
|
||||||
|
if (Common)
|
||||||
|
{
|
||||||
|
Results[0] = S_OK;
|
||||||
|
WRes wres = ReadyEvent.Set();
|
||||||
|
if (wres == 0)
|
||||||
|
wres = Common->StartEvent.Lock();
|
||||||
|
if (wres != 0)
|
||||||
|
return HRESULT_FROM_WIN32(wres);
|
||||||
|
if (Common->ExitMode)
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
CBenchProgressInfo *bpi = progressInfoSpec[0];
|
||||||
|
bpi->SetStartTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
CBenchInfo &bi = progressInfoSpec[0]->BenchInfo;
|
CBenchInfo &bi = progressInfoSpec[0]->BenchInfo;
|
||||||
bi.UnpackSize = 0;
|
bi.UnpackSize = 0;
|
||||||
bi.PackSize = 0;
|
bi.PackSize = 0;
|
||||||
@@ -997,10 +995,10 @@ HRESULT CEncoderInfo::Encode()
|
|||||||
|
|
||||||
if (_encoderFilter)
|
if (_encoderFilter)
|
||||||
{
|
{
|
||||||
memcpy(rgCopy.Buffer, uncompressedDataPtr, kBufferSize);
|
memcpy((Byte *)rgCopy, uncompressedDataPtr, kBufferSize);
|
||||||
_encoderFilter->Init();
|
_encoderFilter->Init();
|
||||||
My_FilterBench(_encoderFilter, rgCopy.Buffer, kBufferSize);
|
My_FilterBench(_encoderFilter, (Byte *)rgCopy, kBufferSize);
|
||||||
RINOK(WriteStream(outStream, rgCopy.Buffer, kBufferSize));
|
RINOK(WriteStream(outStream, (const Byte *)rgCopy, kBufferSize));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1078,7 +1076,7 @@ HRESULT CEncoderInfo::Decode(UInt32 decoderIndex)
|
|||||||
|
|
||||||
if (setDecProps)
|
if (setDecProps)
|
||||||
{
|
{
|
||||||
RINOK(setDecProps->SetDecoderProperties2(propStreamSpec->Buffer, (UInt32)propStreamSpec->Pos));
|
RINOK(setDecProps->SetDecoderProperties2((const Byte *)*propStreamSpec, (UInt32)propStreamSpec->Pos));
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -1106,7 +1104,7 @@ HRESULT CEncoderInfo::Decode(UInt32 decoderIndex)
|
|||||||
prev = pi->BenchInfo.UnpackSize;
|
prev = pi->BenchInfo.UnpackSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
inStreamSpec->Init(outStreamSpec->Buffer, compressedSize);
|
inStreamSpec->Init((const Byte *)*outStreamSpec, compressedSize);
|
||||||
crcOutStreamSpec->Init();
|
crcOutStreamSpec->Init();
|
||||||
|
|
||||||
UInt64 outSize = kBufferSize;
|
UInt64 outSize = kBufferSize;
|
||||||
@@ -1114,12 +1112,12 @@ HRESULT CEncoderInfo::Decode(UInt32 decoderIndex)
|
|||||||
|
|
||||||
if (_decoderFilter)
|
if (_decoderFilter)
|
||||||
{
|
{
|
||||||
if (compressedSize > rgCopy.BufferSize)
|
if (compressedSize > rgCopy.Size())
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
memcpy(rgCopy.Buffer, outStreamSpec->Buffer, compressedSize);
|
memcpy((Byte *)rgCopy, (const Byte *)*outStreamSpec, compressedSize);
|
||||||
_decoderFilter->Init();
|
_decoderFilter->Init();
|
||||||
My_FilterBench(_decoderFilter, rgCopy.Buffer, compressedSize);
|
My_FilterBench(_decoderFilter, (Byte *)rgCopy, compressedSize);
|
||||||
RINOK(WriteStream(crcOutStream, rgCopy.Buffer, compressedSize));
|
RINOK(WriteStream(crcOutStream, (const Byte *)rgCopy, compressedSize));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1157,6 +1155,57 @@ static UInt64 GetNumIterations(UInt64 numCommands, UInt64 complexInCommands)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _7ZIP_ST
|
||||||
|
|
||||||
|
// ---------- CBenchThreadsFlusher ----------
|
||||||
|
|
||||||
|
struct CBenchThreadsFlusher
|
||||||
|
{
|
||||||
|
CBenchEncoders *EncodersSpec;
|
||||||
|
CBenchSyncCommon Common;
|
||||||
|
unsigned NumThreads;
|
||||||
|
bool NeedClose;
|
||||||
|
|
||||||
|
CBenchThreadsFlusher(): NumThreads(0), NeedClose(false) {}
|
||||||
|
|
||||||
|
~CBenchThreadsFlusher()
|
||||||
|
{
|
||||||
|
StartAndWait(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
WRes StartAndWait(bool exitMode = false);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
WRes CBenchThreadsFlusher::StartAndWait(bool exitMode)
|
||||||
|
{
|
||||||
|
if (!NeedClose)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
Common.ExitMode = exitMode;
|
||||||
|
WRes res = Common.StartEvent.Set();
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < NumThreads; i++)
|
||||||
|
{
|
||||||
|
NWindows::CThread &t = EncodersSpec->encoders[i].thread[0];
|
||||||
|
if (t.IsCreated())
|
||||||
|
{
|
||||||
|
WRes res2 = t.Wait();
|
||||||
|
if (res2 == 0)
|
||||||
|
res2 = t.Close();
|
||||||
|
if (res == S_OK)
|
||||||
|
res = res2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
NeedClose = false;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static HRESULT MethodBench(
|
static HRESULT MethodBench(
|
||||||
DECL_EXTERNAL_CODECS_LOC_VARS
|
DECL_EXTERNAL_CODECS_LOC_VARS
|
||||||
UInt64 complexInCommands,
|
UInt64 complexInCommands,
|
||||||
@@ -1208,6 +1257,8 @@ static HRESULT MethodBench(
|
|||||||
numSubDecoderThreads = 2;
|
numSubDecoderThreads = 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool mtEncMode = (numEncoderThreads > 1);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
CBenchEncoders encodersSpec(numEncoderThreads);
|
CBenchEncoders encodersSpec(numEncoderThreads);
|
||||||
@@ -1247,9 +1298,6 @@ static HRESULT MethodBench(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CBaseRandomGenerator rg;
|
|
||||||
rg.Init();
|
|
||||||
|
|
||||||
UInt32 crc = 0;
|
UInt32 crc = 0;
|
||||||
if (fileData)
|
if (fileData)
|
||||||
crc = CrcCalc(fileData, uncompressedDataSize);
|
crc = CrcCalc(fileData, uncompressedDataSize);
|
||||||
@@ -1258,22 +1306,38 @@ static HRESULT MethodBench(
|
|||||||
{
|
{
|
||||||
CEncoderInfo &encoder = encoders[i];
|
CEncoderInfo &encoder = encoders[i];
|
||||||
encoder._method = method;
|
encoder._method = method;
|
||||||
|
encoder.generateDictBits = generateDictBits;
|
||||||
encoder._uncompressedDataSize = uncompressedDataSize;
|
encoder._uncompressedDataSize = uncompressedDataSize;
|
||||||
encoder.kBufferSize = uncompressedDataSize;
|
encoder.kBufferSize = uncompressedDataSize;
|
||||||
encoder.fileData = fileData;
|
encoder.fileData = fileData;
|
||||||
encoder.crc = crc;
|
encoder.crc = crc;
|
||||||
|
|
||||||
RINOK(encoders[i].Init(method, generateDictBits, &rg));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CBenchProgressStatus status;
|
CBenchProgressStatus status;
|
||||||
status.Res = S_OK;
|
status.Res = S_OK;
|
||||||
status.EncodeMode = true;
|
status.EncodeMode = true;
|
||||||
|
|
||||||
|
#ifndef _7ZIP_ST
|
||||||
|
CBenchThreadsFlusher encoderFlusher;
|
||||||
|
if (mtEncMode)
|
||||||
|
{
|
||||||
|
WRes wres = encoderFlusher.Common.StartEvent.Create();
|
||||||
|
if (wres != 0)
|
||||||
|
return HRESULT_FROM_WIN32(wres);
|
||||||
|
encoderFlusher.NumThreads = numEncoderThreads;
|
||||||
|
encoderFlusher.EncodersSpec = &encodersSpec;
|
||||||
|
encoderFlusher.NeedClose = true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
for (i = 0; i < numEncoderThreads; i++)
|
for (i = 0; i < numEncoderThreads; i++)
|
||||||
{
|
{
|
||||||
CEncoderInfo &encoder = encoders[i];
|
CEncoderInfo &encoder = encoders[i];
|
||||||
encoder.NumIterations = GetNumIterations(benchProps->GeComprCommands(uncompressedDataSize), complexInCommands);
|
encoder.NumIterations = GetNumIterations(benchProps->GeComprCommands(uncompressedDataSize), complexInCommands);
|
||||||
|
encoder.Salt = g_CrcTable[i & 0xFF];
|
||||||
|
encoder.Salt ^= (g_CrcTable[(i >> 8) & 0xFF] << 3);
|
||||||
|
// (g_CrcTable[0] == 0), and (encoder.Salt == 0) for first thread
|
||||||
|
// printf(" %8x", encoder.Salt);
|
||||||
|
|
||||||
for (int j = 0; j < 2; j++)
|
for (int j = 0; j < 2; j++)
|
||||||
{
|
{
|
||||||
@@ -1288,30 +1352,50 @@ static HRESULT MethodBench(
|
|||||||
CBenchProgressInfo *bpi = encoder.progressInfoSpec[0];
|
CBenchProgressInfo *bpi = encoder.progressInfoSpec[0];
|
||||||
bpi->Callback = callback;
|
bpi->Callback = callback;
|
||||||
bpi->BenchInfo.NumIterations = numEncoderThreads;
|
bpi->BenchInfo.NumIterations = numEncoderThreads;
|
||||||
bpi->SetStartTime();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef _7ZIP_ST
|
#ifndef _7ZIP_ST
|
||||||
if (numEncoderThreads > 1)
|
if (mtEncMode)
|
||||||
{
|
{
|
||||||
#ifdef USE_ALLOCA
|
#ifdef USE_ALLOCA
|
||||||
encoder.AllocaSize = (i * 16 * 21) & 0x7FF;
|
encoder.AllocaSize = (i * 16 * 21) & 0x7FF;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
encoder.Common = &encoderFlusher.Common;
|
||||||
RINOK(encoder.CreateEncoderThread())
|
RINOK(encoder.CreateEncoderThread())
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
if (printCallback)
|
||||||
|
{
|
||||||
|
RINOK(printCallback->CheckBreak());
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef _7ZIP_ST
|
||||||
|
if (mtEncMode)
|
||||||
|
{
|
||||||
|
for (i = 0; i < numEncoderThreads; i++)
|
||||||
|
{
|
||||||
|
CEncoderInfo &encoder = encoders[i];
|
||||||
|
WRes wres = encoder.ReadyEvent.Lock();
|
||||||
|
if (wres != 0)
|
||||||
|
return HRESULT_FROM_WIN32(wres);
|
||||||
|
RINOK(encoder.Results[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
CBenchProgressInfo *bpi = encoders[0].progressInfoSpec[0];
|
||||||
|
bpi->SetStartTime();
|
||||||
|
|
||||||
|
WRes wres = encoderFlusher.StartAndWait();
|
||||||
|
if (status.Res == 0 && wres != 0)
|
||||||
|
return HRESULT_FROM_WIN32(wres);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
RINOK(encoder.Encode());
|
RINOK(encoders[0].Encode());
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef _7ZIP_ST
|
|
||||||
if (numEncoderThreads > 1)
|
|
||||||
for (i = 0; i < numEncoderThreads; i++)
|
|
||||||
encoders[i].thread[0].Wait();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
RINOK(status.Res);
|
RINOK(status.Res);
|
||||||
|
|
||||||
@@ -1327,11 +1411,16 @@ static HRESULT MethodBench(
|
|||||||
CEncoderInfo &encoder = encoders[i];
|
CEncoderInfo &encoder = encoders[i];
|
||||||
info.UnpackSize += encoder.kBufferSize;
|
info.UnpackSize += encoder.kBufferSize;
|
||||||
info.PackSize += encoder.compressedSize;
|
info.PackSize += encoder.compressedSize;
|
||||||
|
// printf("\n%7d\n", encoder.compressedSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
RINOK(callback->SetEncodeResult(info, true));
|
RINOK(callback->SetEncodeResult(info, true));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ---------- Decode ----------
|
||||||
|
|
||||||
status.Res = S_OK;
|
status.Res = S_OK;
|
||||||
status.EncodeMode = false;
|
status.EncodeMode = false;
|
||||||
|
|
||||||
@@ -1618,21 +1707,21 @@ struct CCrcThreads
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static UInt32 CrcCalc1(const Byte *buf, UInt32 size)
|
static UInt32 CrcCalc1(const Byte *buf, size_t size)
|
||||||
{
|
{
|
||||||
UInt32 crc = CRC_INIT_VAL;;
|
UInt32 crc = CRC_INIT_VAL;;
|
||||||
for (UInt32 i = 0; i < size; i++)
|
for (size_t i = 0; i < size; i++)
|
||||||
crc = CRC_UPDATE_BYTE(crc, buf[i]);
|
crc = CRC_UPDATE_BYTE(crc, buf[i]);
|
||||||
return CRC_GET_DIGEST(crc);
|
return CRC_GET_DIGEST(crc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void RandGen(Byte *buf, UInt32 size, CBaseRandomGenerator &RG)
|
static void RandGen(Byte *buf, size_t size, CBaseRandomGenerator &RG)
|
||||||
{
|
{
|
||||||
for (UInt32 i = 0; i < size; i++)
|
for (size_t i = 0; i < size; i++)
|
||||||
buf[i] = (Byte)RG.GetRnd();
|
buf[i] = (Byte)RG.GetRnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
static UInt32 RandGenCrc(Byte *buf, UInt32 size, CBaseRandomGenerator &RG)
|
static UInt32 RandGenCrc(Byte *buf, size_t size, CBaseRandomGenerator &RG)
|
||||||
{
|
{
|
||||||
RandGen(buf, size, RG);
|
RandGen(buf, size, RG);
|
||||||
return CrcCalc1(buf, size);
|
return CrcCalc1(buf, size);
|
||||||
@@ -1640,14 +1729,15 @@ static UInt32 RandGenCrc(Byte *buf, UInt32 size, CBaseRandomGenerator &RG)
|
|||||||
|
|
||||||
bool CrcInternalTest()
|
bool CrcInternalTest()
|
||||||
{
|
{
|
||||||
CBenchBuffer buffer;
|
CAlignedBuffer buffer;
|
||||||
const UInt32 kBufferSize0 = (1 << 8);
|
const size_t kBufferSize0 = (1 << 8);
|
||||||
const UInt32 kBufferSize1 = (1 << 10);
|
const size_t kBufferSize1 = (1 << 10);
|
||||||
const UInt32 kCheckSize = (1 << 5);
|
const unsigned kCheckSize = (1 << 5);
|
||||||
if (!buffer.Alloc(kBufferSize0 + kBufferSize1))
|
buffer.Alloc(kBufferSize0 + kBufferSize1);
|
||||||
|
if (!buffer.IsAllocated())
|
||||||
return false;
|
return false;
|
||||||
Byte *buf = buffer.Buffer;
|
Byte *buf = (Byte *)buffer;
|
||||||
UInt32 i;
|
size_t i;
|
||||||
for (i = 0; i < kBufferSize0; i++)
|
for (i = 0; i < kBufferSize0; i++)
|
||||||
buf[i] = (Byte)i;
|
buf[i] = (Byte)i;
|
||||||
UInt32 crc1 = CrcCalc1(buf, kBufferSize0);
|
UInt32 crc1 = CrcCalc1(buf, kBufferSize0);
|
||||||
@@ -1656,7 +1746,7 @@ bool CrcInternalTest()
|
|||||||
CBaseRandomGenerator RG;
|
CBaseRandomGenerator RG;
|
||||||
RandGen(buf + kBufferSize0, kBufferSize1, RG);
|
RandGen(buf + kBufferSize0, kBufferSize1, RG);
|
||||||
for (i = 0; i < kBufferSize0 + kBufferSize1 - kCheckSize; i++)
|
for (i = 0; i < kBufferSize0 + kBufferSize1 - kCheckSize; i++)
|
||||||
for (UInt32 j = 0; j < kCheckSize; j++)
|
for (unsigned j = 0; j < kCheckSize; j++)
|
||||||
if (CrcCalc1(buf + i, j) != CrcCalc(buf + i, j))
|
if (CrcCalc1(buf + i, j) != CrcCalc(buf + i, j))
|
||||||
return false;
|
return false;
|
||||||
return true;
|
return true;
|
||||||
@@ -1920,6 +2010,10 @@ void Add_LargePages_String(AString &s)
|
|||||||
{
|
{
|
||||||
s += " (LP-";
|
s += " (LP-";
|
||||||
PrintSize(s, g_LargePageSize);
|
PrintSize(s, g_LargePageSize);
|
||||||
|
#ifdef MY_CPU_X86_OR_AMD64
|
||||||
|
if (CPU_IsSupported_PageGB())
|
||||||
|
s += "-1G";
|
||||||
|
#endif
|
||||||
if (!g_LargePagesMode)
|
if (!g_LargePagesMode)
|
||||||
s += "-NA";
|
s += "-NA";
|
||||||
s += ")";
|
s += ")";
|
||||||
@@ -2238,14 +2332,13 @@ static HRESULT CrcBench(
|
|||||||
methodName, hashID))
|
methodName, hashID))
|
||||||
return E_NOTIMPL;
|
return E_NOTIMPL;
|
||||||
|
|
||||||
CBenchBuffer buffer;
|
CAlignedBuffer buffer;
|
||||||
size_t totalSize = (size_t)bufferSize * numThreads;
|
size_t totalSize = (size_t)bufferSize * numThreads;
|
||||||
if (totalSize / numThreads != bufferSize)
|
if (totalSize / numThreads != bufferSize)
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
if (!buffer.Alloc(totalSize))
|
ALLOC_WITH_HRESULT(&buffer, totalSize)
|
||||||
return E_OUTOFMEMORY;
|
|
||||||
|
|
||||||
Byte *buf = buffer.Buffer;
|
Byte *buf = (Byte *)buffer;
|
||||||
CBaseRandomGenerator RG;
|
CBaseRandomGenerator RG;
|
||||||
UInt32 bsize = (bufferSize == 0 ? 1 : bufferSize);
|
UInt32 bsize = (bufferSize == 0 ? 1 : bufferSize);
|
||||||
UInt64 numIterations = complexInCommands * 256 / complexity / bsize;
|
UInt64 numIterations = complexInCommands * 256 / complexity / bsize;
|
||||||
@@ -2793,7 +2886,7 @@ HRESULT Bench(
|
|||||||
bool multiDict)
|
bool multiDict)
|
||||||
{
|
{
|
||||||
if (!CrcInternalTest())
|
if (!CrcInternalTest())
|
||||||
return S_FALSE;
|
return E_FAIL;
|
||||||
|
|
||||||
UInt32 numCPUs = 1;
|
UInt32 numCPUs = 1;
|
||||||
UInt64 ramSize = (UInt64)(sizeof(size_t)) << 29;
|
UInt64 ramSize = (UInt64)(sizeof(size_t)) << 29;
|
||||||
@@ -2822,7 +2915,7 @@ HRESULT Bench(
|
|||||||
|
|
||||||
COneMethodInfo method;
|
COneMethodInfo method;
|
||||||
|
|
||||||
CBenchBuffer fileDataBuffer;
|
CAlignedBuffer fileDataBuffer;
|
||||||
|
|
||||||
{
|
{
|
||||||
unsigned i;
|
unsigned i;
|
||||||
@@ -2847,10 +2940,9 @@ HRESULT Bench(
|
|||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
if (len >= ((UInt32)1 << 31) || len == 0)
|
if (len >= ((UInt32)1 << 31) || len == 0)
|
||||||
return E_INVALIDARG;
|
return E_INVALIDARG;
|
||||||
if (!fileDataBuffer.Alloc((size_t)len))
|
ALLOC_WITH_HRESULT(&fileDataBuffer, (size_t)len);
|
||||||
return E_OUTOFMEMORY;
|
|
||||||
UInt32 processedSize;
|
UInt32 processedSize;
|
||||||
file.Read(fileDataBuffer.Buffer, (UInt32)len, processedSize);
|
file.Read((Byte *)fileDataBuffer, (UInt32)len, processedSize);
|
||||||
if (processedSize != len)
|
if (processedSize != len)
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
if (printCallback)
|
if (printCallback)
|
||||||
@@ -3066,7 +3158,7 @@ HRESULT Bench(
|
|||||||
complexInCommands,
|
complexInCommands,
|
||||||
true, numThreadsSpecified,
|
true, numThreadsSpecified,
|
||||||
method,
|
method,
|
||||||
uncompressedDataSize, fileDataBuffer.Buffer,
|
uncompressedDataSize, (const Byte *)fileDataBuffer,
|
||||||
kOldLzmaDictBits, printCallback, benchCallback, &benchProps);
|
kOldLzmaDictBits, printCallback, benchCallback, &benchProps);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3378,9 +3470,9 @@ HRESULT Bench(
|
|||||||
{
|
{
|
||||||
res = TotalBench(EXTERNAL_CODECS_LOC_VARS
|
res = TotalBench(EXTERNAL_CODECS_LOC_VARS
|
||||||
complexInCommands, numThreads,
|
complexInCommands, numThreads,
|
||||||
dictIsDefined || fileDataBuffer.Buffer, // forceUnpackSize
|
dictIsDefined || fileDataBuffer.IsAllocated(), // forceUnpackSize
|
||||||
fileDataBuffer.Buffer ? fileDataBuffer.BufferSize : dict,
|
fileDataBuffer.IsAllocated() ? fileDataBuffer.Size() : dict,
|
||||||
fileDataBuffer.Buffer,
|
(const Byte *)fileDataBuffer,
|
||||||
printCallback, &callback);
|
printCallback, &callback);
|
||||||
RINOK(res);
|
RINOK(res);
|
||||||
}
|
}
|
||||||
@@ -3470,9 +3562,9 @@ HRESULT Bench(
|
|||||||
}
|
}
|
||||||
|
|
||||||
size_t uncompressedDataSize;
|
size_t uncompressedDataSize;
|
||||||
if (fileDataBuffer.Buffer)
|
if (fileDataBuffer.IsAllocated())
|
||||||
{
|
{
|
||||||
uncompressedDataSize = fileDataBuffer.BufferSize;
|
uncompressedDataSize = fileDataBuffer.Size();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -3486,7 +3578,7 @@ HRESULT Bench(
|
|||||||
complexInCommands,
|
complexInCommands,
|
||||||
true, numThreads,
|
true, numThreads,
|
||||||
method2,
|
method2,
|
||||||
uncompressedDataSize, fileDataBuffer.Buffer,
|
uncompressedDataSize, (const Byte *)fileDataBuffer,
|
||||||
kOldLzmaDictBits, printCallback, &callback, &callback.BenchProps);
|
kOldLzmaDictBits, printCallback, &callback, &callback.BenchProps);
|
||||||
f.NewLine();
|
f.NewLine();
|
||||||
RINOK(res);
|
RINOK(res);
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
MY_CONSOLE = 1
|
||||||
|
|
||||||
|
!IFNDEF UNDER_CE
|
||||||
|
CFLAGS = $(CFLAGS) -DWIN_LONG_PATH -D_7ZIP_LARGE_PAGES -DSUPPORT_DEVICE_FILE
|
||||||
|
!ENDIF
|
||||||
|
|
||||||
CONSOLE_OBJS = \
|
CONSOLE_OBJS = \
|
||||||
$O\BenchCon.obj \
|
$O\BenchCon.obj \
|
||||||
$O\ConsoleClose.obj \
|
$O\ConsoleClose.obj \
|
||||||
@@ -33,4 +39,5 @@ UI_COMMON_OBJS = \
|
|||||||
$O\UpdatePair.obj \
|
$O\UpdatePair.obj \
|
||||||
$O\UpdateProduce.obj \
|
$O\UpdateProduce.obj \
|
||||||
|
|
||||||
#
|
C_OBJS = $(C_OBJS) \
|
||||||
|
$O\DllSecur.obj \
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ static const char * const kHelpString =
|
|||||||
"a"
|
"a"
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
" <command> [<switches>...] <archive_name> [<file_names>...]\n"
|
" <command> [<switches>...] <archive_name> [<file_names>...] [@listfile]\n"
|
||||||
"\n"
|
"\n"
|
||||||
"<Commands>\n"
|
"<Commands>\n"
|
||||||
" a : Add files to archive\n"
|
" a : Add files to archive\n"
|
||||||
@@ -103,8 +103,7 @@ static const char * const kHelpString =
|
|||||||
" x : eXtract files with full paths\n"
|
" x : eXtract files with full paths\n"
|
||||||
"\n"
|
"\n"
|
||||||
"<Switches>\n"
|
"<Switches>\n"
|
||||||
" -- : Stop switches parsing\n"
|
" -- : Stop switches and @listfile parsing\n"
|
||||||
" @listfile : set path to listfile that contains file names\n"
|
|
||||||
" -ai[r[-|0]]{@listfile|!wildcard} : Include archives\n"
|
" -ai[r[-|0]]{@listfile|!wildcard} : Include archives\n"
|
||||||
" -ax[r[-|0]]{@listfile|!wildcard} : eXclude archives\n"
|
" -ax[r[-|0]]{@listfile|!wildcard} : eXclude archives\n"
|
||||||
" -ao{a|s|t|u} : set Overwrite mode\n"
|
" -ao{a|s|t|u} : set Overwrite mode\n"
|
||||||
|
|||||||
@@ -2,6 +2,10 @@
|
|||||||
|
|
||||||
#include "StdAfx.h"
|
#include "StdAfx.h"
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#include "../../../../C/DllSecur.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "../../../Common/MyException.h"
|
#include "../../../Common/MyException.h"
|
||||||
#include "../../../Common/StdOutStream.h"
|
#include "../../../Common/StdOutStream.h"
|
||||||
|
|
||||||
@@ -63,6 +67,10 @@ int MY_CDECL main
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
My_SetDefaultDllDirectories();
|
||||||
|
#endif
|
||||||
|
|
||||||
res = Main2(
|
res = Main2(
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
numArgs, args
|
numArgs, args
|
||||||
|
|||||||
@@ -1,12 +1,7 @@
|
|||||||
PROG = 7z.exe
|
PROG = 7z.exe
|
||||||
MY_CONSOLE = 1
|
|
||||||
CFLAGS = $(CFLAGS) \
|
CFLAGS = $(CFLAGS) \
|
||||||
-DEXTERNAL_CODECS \
|
-DEXTERNAL_CODECS \
|
||||||
|
|
||||||
!IFNDEF UNDER_CE
|
|
||||||
CFLAGS = $(CFLAGS) -DWIN_LONG_PATH -D_7ZIP_LARGE_PAGES -DSUPPORT_DEVICE_FILE
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
COMMON_OBJS = \
|
COMMON_OBJS = \
|
||||||
$O\CommandLineParser.obj \
|
$O\CommandLineParser.obj \
|
||||||
$O\CRC.obj \
|
$O\CRC.obj \
|
||||||
@@ -21,8 +16,6 @@ COMMON_OBJS = \
|
|||||||
$O\UTFConvert.obj \
|
$O\UTFConvert.obj \
|
||||||
$O\MyVector.obj \
|
$O\MyVector.obj \
|
||||||
$O\Wildcard.obj \
|
$O\Wildcard.obj \
|
||||||
$O\ResourceString.obj \
|
|
||||||
|
|
||||||
|
|
||||||
WIN_OBJS = \
|
WIN_OBJS = \
|
||||||
$O\DLL.obj \
|
$O\DLL.obj \
|
||||||
@@ -39,7 +32,6 @@ WIN_OBJS = \
|
|||||||
$O\Registry.obj \
|
$O\Registry.obj \
|
||||||
$O\System.obj \
|
$O\System.obj \
|
||||||
$O\TimeUtils.obj \
|
$O\TimeUtils.obj \
|
||||||
$O\LoadCodecs.obj \
|
|
||||||
|
|
||||||
7ZIP_COMMON_OBJS = \
|
7ZIP_COMMON_OBJS = \
|
||||||
$O\CreateCoder.obj \
|
$O\CreateCoder.obj \
|
||||||
@@ -60,7 +52,7 @@ AR_COMMON_OBJS = \
|
|||||||
COMPRESS_OBJS = \
|
COMPRESS_OBJS = \
|
||||||
$O\CopyCoder.obj \
|
$O\CopyCoder.obj \
|
||||||
|
|
||||||
C_OBJS = \
|
C_OBJS = $(C_OBJS) \
|
||||||
$O\Alloc.obj \
|
$O\Alloc.obj \
|
||||||
$O\CpuArch.obj \
|
$O\CpuArch.obj \
|
||||||
$O\Sort.obj \
|
$O\Sort.obj \
|
||||||
|
|||||||
@@ -120,7 +120,11 @@ HRESULT CZipContextMenu::InitContextMenu(const wchar_t * /* folder */, const wch
|
|||||||
_isMenuForFM = true;
|
_isMenuForFM = true;
|
||||||
_fileNames.Clear();
|
_fileNames.Clear();
|
||||||
for (UInt32 i = 0; i < numFiles; i++)
|
for (UInt32 i = 0; i < numFiles; i++)
|
||||||
|
{
|
||||||
|
// MessageBoxW(0, names[i], NULL, 0);
|
||||||
|
// OutputDebugStringW(names[i]);
|
||||||
_fileNames.Add(names[i]);
|
_fileNames.Add(names[i]);
|
||||||
|
}
|
||||||
_dropMode = false;
|
_dropMode = false;
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
@@ -423,6 +427,13 @@ STDMETHODIMP CZipContextMenu::QueryContextMenu(HMENU hMenu, UINT indexMenu,
|
|||||||
{
|
{
|
||||||
// OutputDebugStringA("QueryContextMenu");
|
// OutputDebugStringA("QueryContextMenu");
|
||||||
|
|
||||||
|
/*
|
||||||
|
for (UInt32 i = 0; i < _fileNames.Size(); i++)
|
||||||
|
{
|
||||||
|
OutputDebugStringW(_fileNames[i]);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
LoadLangOneTime();
|
LoadLangOneTime();
|
||||||
if (_fileNames.Size() == 0)
|
if (_fileNames.Size() == 0)
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
|
|||||||
@@ -68,6 +68,7 @@ FM_OBJS = \
|
|||||||
$O\RegistryUtils.obj \
|
$O\RegistryUtils.obj \
|
||||||
|
|
||||||
C_OBJS = \
|
C_OBJS = \
|
||||||
|
$O\CpuArch.obj \
|
||||||
$O\Threads.obj \
|
$O\Threads.obj \
|
||||||
|
|
||||||
!include "../../7zip.mak"
|
!include "../../7zip.mak"
|
||||||
|
|||||||
@@ -7,6 +7,9 @@
|
|||||||
#include <shlwapi.h>
|
#include <shlwapi.h>
|
||||||
|
|
||||||
#include "../../../../C/Alloc.h"
|
#include "../../../../C/Alloc.h"
|
||||||
|
#ifdef _WIN32
|
||||||
|
#include "../../../../C/DllSecur.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "../../../Common/StringConvert.h"
|
#include "../../../Common/StringConvert.h"
|
||||||
#include "../../../Common/StringToInt.h"
|
#include "../../../Common/StringToInt.h"
|
||||||
@@ -660,6 +663,9 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE /* hPrevInstance */,
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
My_SetDefaultDllDirectories();
|
||||||
|
#endif
|
||||||
return WinMain2(nCmdShow);
|
return WinMain2(nCmdShow);
|
||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
|
|||||||
@@ -1,3 +1,16 @@
|
|||||||
|
CFLAGS = $(CFLAGS) \
|
||||||
|
-DLANG \
|
||||||
|
-DNEW_FOLDER_INTERFACE \
|
||||||
|
|
||||||
|
!IFDEF UNDER_CE
|
||||||
|
LIBS = $(LIBS) ceshell.lib Commctrl.lib
|
||||||
|
!ELSE
|
||||||
|
LIBS = $(LIBS) comctl32.lib htmlhelp.lib comdlg32.lib Mpr.lib Gdi32.lib
|
||||||
|
CFLAGS = $(CFLAGS) -DWIN_LONG_PATH -DSUPPORT_DEVICE_FILE
|
||||||
|
LFLAGS = $(LFLAGS) /DELAYLOAD:mpr.dll
|
||||||
|
LIBS = $(LIBS) delayimp.lib
|
||||||
|
!ENDIF
|
||||||
|
|
||||||
FM_OBJS = \
|
FM_OBJS = \
|
||||||
$O\App.obj \
|
$O\App.obj \
|
||||||
$O\BrowseDialog.obj \
|
$O\BrowseDialog.obj \
|
||||||
@@ -73,6 +86,9 @@ WIN_OBJS = $(WIN_OBJS) \
|
|||||||
|
|
||||||
!ENDIF
|
!ENDIF
|
||||||
|
|
||||||
|
C_OBJS = $(C_OBJS) \
|
||||||
|
$O\DllSecur.obj \
|
||||||
|
|
||||||
AGENT_OBJS = \
|
AGENT_OBJS = \
|
||||||
$O\Agent.obj \
|
$O\Agent.obj \
|
||||||
$O\AgentOut.obj \
|
$O\AgentOut.obj \
|
||||||
|
|||||||
@@ -532,9 +532,8 @@ STDMETHODIMP CFSFolder::GetNumRawProps(UInt32 *numProps)
|
|||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
STDMETHODIMP CFSFolder::GetRawPropInfo(UInt32 index, BSTR *name, PROPID *propID)
|
STDMETHODIMP CFSFolder::GetRawPropInfo(UInt32 /* index */, BSTR *name, PROPID *propID)
|
||||||
{
|
{
|
||||||
index = index;
|
|
||||||
*name = NULL;
|
*name = NULL;
|
||||||
*propID = kpidNtReparse;
|
*propID = kpidNtReparse;
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
|||||||
@@ -161,8 +161,6 @@ static DWORD CALLBACK CopyProgressRoutine(
|
|||||||
LPVOID lpData // from CopyFileEx
|
LPVOID lpData // from CopyFileEx
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
TotalFileSize = TotalFileSize;
|
|
||||||
// TotalBytesTransferred = TotalBytesTransferred;
|
|
||||||
// StreamSize = StreamSize;
|
// StreamSize = StreamSize;
|
||||||
// StreamBytesTransferred = StreamBytesTransferred;
|
// StreamBytesTransferred = StreamBytesTransferred;
|
||||||
// dwStreamNumber = dwStreamNumber;
|
// dwStreamNumber = dwStreamNumber;
|
||||||
|
|||||||
@@ -1,16 +1,7 @@
|
|||||||
PROG = 7zFM.exe
|
PROG = 7zFM.exe
|
||||||
CFLAGS = $(CFLAGS) \
|
CFLAGS = $(CFLAGS) \
|
||||||
-DLANG \
|
|
||||||
-DNEW_FOLDER_INTERFACE \
|
|
||||||
-DEXTERNAL_CODECS \
|
-DEXTERNAL_CODECS \
|
||||||
|
|
||||||
!IFDEF UNDER_CE
|
|
||||||
LIBS = $(LIBS) ceshell.lib Commctrl.lib
|
|
||||||
!ELSE
|
|
||||||
LIBS = $(LIBS) comctl32.lib htmlhelp.lib comdlg32.lib Mpr.lib Gdi32.lib
|
|
||||||
CFLAGS = $(CFLAGS) -DWIN_LONG_PATH -DSUPPORT_DEVICE_FILE
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
!include "FM.mak"
|
!include "FM.mak"
|
||||||
|
|
||||||
COMMON_OBJS = \
|
COMMON_OBJS = \
|
||||||
@@ -23,7 +14,7 @@ COMMON_OBJS = \
|
|||||||
$O\StringConvert.obj \
|
$O\StringConvert.obj \
|
||||||
$O\StringToInt.obj \
|
$O\StringToInt.obj \
|
||||||
$O\UTFConvert.obj \
|
$O\UTFConvert.obj \
|
||||||
$O\Wildcard.obj
|
$O\Wildcard.obj \
|
||||||
|
|
||||||
WIN_OBJS = $(WIN_OBJS) \
|
WIN_OBJS = $(WIN_OBJS) \
|
||||||
$O\Clipboard.obj \
|
$O\Clipboard.obj \
|
||||||
@@ -102,8 +93,9 @@ GUI_OBJS = \
|
|||||||
COMPRESS_OBJS = \
|
COMPRESS_OBJS = \
|
||||||
$O\CopyCoder.obj \
|
$O\CopyCoder.obj \
|
||||||
|
|
||||||
C_OBJS = \
|
C_OBJS = $(C_OBJS) \
|
||||||
$O\Alloc.obj \
|
$O\Alloc.obj \
|
||||||
|
$O\CpuArch.obj \
|
||||||
$O\Sort.obj \
|
$O\Sort.obj \
|
||||||
$O\Threads.obj \
|
$O\Threads.obj \
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,10 @@
|
|||||||
|
|
||||||
#include "StdAfx.h"
|
#include "StdAfx.h"
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#include "../../../../C/DllSecur.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "../../../Common/MyWindows.h"
|
#include "../../../Common/MyWindows.h"
|
||||||
|
|
||||||
#include <shlwapi.h>
|
#include <shlwapi.h>
|
||||||
@@ -372,6 +376,10 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE /* hPrevInstance */,
|
|||||||
// setlocale(LC_COLLATE, ".ACP");
|
// setlocale(LC_COLLATE, ".ACP");
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
My_SetDefaultDllDirectories();
|
||||||
|
#endif
|
||||||
|
|
||||||
return Main2();
|
return Main2();
|
||||||
}
|
}
|
||||||
catch(const CNewException &)
|
catch(const CNewException &)
|
||||||
|
|||||||
@@ -20,9 +20,7 @@
|
|||||||
|
|
||||||
using namespace NWindows;
|
using namespace NWindows;
|
||||||
|
|
||||||
|
class CHashCallbackGUI : public CProgressThreadVirt, public IHashCallbackUI
|
||||||
|
|
||||||
class CHashCallbackGUI: public CProgressThreadVirt, public IHashCallbackUI
|
|
||||||
{
|
{
|
||||||
UInt64 NumFiles;
|
UInt64 NumFiles;
|
||||||
bool _curIsFolder;
|
bool _curIsFolder;
|
||||||
@@ -34,14 +32,14 @@ class CHashCallbackGUI: public CProgressThreadVirt, public IHashCallbackUI
|
|||||||
HRESULT ProcessVirt();
|
HRESULT ProcessVirt();
|
||||||
virtual void ProcessWasFinished_GuiVirt();
|
virtual void ProcessWasFinished_GuiVirt();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
const NWildcard::CCensor *censor;
|
const NWildcard::CCensor *censor;
|
||||||
const CHashOptions *options;
|
const CHashOptions *options;
|
||||||
|
|
||||||
DECL_EXTERNAL_CODECS_LOC_VARS2;
|
DECL_EXTERNAL_CODECS_LOC_VARS2;
|
||||||
|
|
||||||
CHashCallbackGUI() {}
|
CHashCallbackGUI() {}
|
||||||
~CHashCallbackGUI() { }
|
~CHashCallbackGUI() {}
|
||||||
|
|
||||||
INTERFACE_IHashCallbackUI(;)
|
INTERFACE_IHashCallbackUI(;)
|
||||||
|
|
||||||
@@ -51,7 +49,6 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
void AddValuePair(CPropNameValPairs &pairs, UINT resourceID, UInt64 value)
|
void AddValuePair(CPropNameValPairs &pairs, UINT resourceID, UInt64 value)
|
||||||
{
|
{
|
||||||
CProperty &pair = pairs.AddNew();
|
CProperty &pair = pairs.AddNew();
|
||||||
@@ -61,7 +58,6 @@ void AddValuePair(CPropNameValPairs &pairs, UINT resourceID, UInt64 value)
|
|||||||
pair.Value = sz;
|
pair.Value = sz;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void AddSizeValue(UString &s, UInt64 value)
|
void AddSizeValue(UString &s, UInt64 value)
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
@@ -72,9 +68,21 @@ void AddSizeValue(UString &s, UInt64 value)
|
|||||||
if (value >= (1 << 10))
|
if (value >= (1 << 10))
|
||||||
{
|
{
|
||||||
char c;
|
char c;
|
||||||
if (value >= ((UInt64)10 << 30)) { value >>= 30; c = 'G'; }
|
if (value >= ((UInt64)10 << 30))
|
||||||
else if (value >= (10 << 20)) { value >>= 20; c = 'M'; }
|
{
|
||||||
else { value >>= 10; c = 'K'; }
|
value >>= 30;
|
||||||
|
c = 'G';
|
||||||
|
}
|
||||||
|
else if (value >= (10 << 20))
|
||||||
|
{
|
||||||
|
value >>= 20;
|
||||||
|
c = 'M';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
value >>= 10;
|
||||||
|
c = 'K';
|
||||||
|
}
|
||||||
char sz[32];
|
char sz[32];
|
||||||
ConvertUInt64ToString(value, sz);
|
ConvertUInt64ToString(value, sz);
|
||||||
s += " (";
|
s += " (";
|
||||||
@@ -92,7 +100,6 @@ void AddSizeValuePair(CPropNameValPairs &pairs, UINT resourceID, UInt64 value)
|
|||||||
AddSizeValue(pair.Value, value);
|
AddSizeValue(pair.Value, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
HRESULT CHashCallbackGUI::StartScanning()
|
HRESULT CHashCallbackGUI::StartScanning()
|
||||||
{
|
{
|
||||||
CProgressSync &sync = Sync;
|
CProgressSync &sync = Sync;
|
||||||
@@ -186,13 +193,12 @@ static void AddHashResString(CPropNameValPairs &s, const CHasherState &h, unsign
|
|||||||
CProperty &pair = s.AddNew();
|
CProperty &pair = s.AddNew();
|
||||||
UString &s2 = pair.Name;
|
UString &s2 = pair.Name;
|
||||||
LangString(resID, s2);
|
LangString(resID, s2);
|
||||||
UString name (h.Name);
|
UString name(h.Name);
|
||||||
s2.Replace(L"CRC", name);
|
s2.Replace(L"CRC", name);
|
||||||
s2.Replace(L":", L"");
|
s2.Replace(L":", L"");
|
||||||
AddHashString(pair, h, digestIndex);
|
AddHashString(pair, h, digestIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void AddHashBundleRes(CPropNameValPairs &s, const CHashBundle &hb)
|
void AddHashBundleRes(CPropNameValPairs &s, const CHashBundle &hb)
|
||||||
{
|
{
|
||||||
if (hb.NumErrors != 0)
|
if (hb.NumErrors != 0)
|
||||||
@@ -225,7 +231,7 @@ void AddHashBundleRes(CPropNameValPairs &s, const CHashBundle &hb)
|
|||||||
AddSizeValuePair(s, IDS_PROP_ALT_STREAMS_SIZE, hb.AltStreamsSize);
|
AddSizeValuePair(s, IDS_PROP_ALT_STREAMS_SIZE, hb.AltStreamsSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
FOR_VECTOR (i, hb.Hashers)
|
FOR_VECTOR(i, hb.Hashers)
|
||||||
{
|
{
|
||||||
const CHasherState &h = hb.Hashers[i];
|
const CHasherState &h = hb.Hashers[i];
|
||||||
if (hb.NumFiles == 1 && hb.NumDirs == 0)
|
if (hb.NumFiles == 1 && hb.NumDirs == 0)
|
||||||
@@ -246,13 +252,12 @@ void AddHashBundleRes(CPropNameValPairs &s, const CHashBundle &hb)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void AddHashBundleRes(UString &s, const CHashBundle &hb)
|
void AddHashBundleRes(UString &s, const CHashBundle &hb)
|
||||||
{
|
{
|
||||||
CPropNameValPairs pairs;
|
CPropNameValPairs pairs;
|
||||||
AddHashBundleRes(pairs, hb);
|
AddHashBundleRes(pairs, hb);
|
||||||
|
|
||||||
FOR_VECTOR (i, pairs)
|
FOR_VECTOR(i, pairs)
|
||||||
{
|
{
|
||||||
const CProperty &pair = pairs[i];
|
const CProperty &pair = pairs[i];
|
||||||
s += pair.Name;
|
s += pair.Name;
|
||||||
@@ -269,10 +274,9 @@ void AddHashBundleRes(UString &s, const CHashBundle &hb)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
HRESULT CHashCallbackGUI::AfterLastFile(CHashBundle &hb)
|
HRESULT CHashCallbackGUI::AfterLastFile(CHashBundle &hb)
|
||||||
{
|
{
|
||||||
AddHashBundleRes(PropNameValPairs, hb, FirstFileName);
|
AddHashBundleRes(PropNameValPairs, hb);
|
||||||
hb.FirstFileName = FirstFileName;
|
hb.FirstFileName = FirstFileName;
|
||||||
CProgressSync &sync = Sync;
|
CProgressSync &sync = Sync;
|
||||||
sync.Set_NumFilesCur(hb.NumFiles);
|
sync.Set_NumFilesCur(hb.NumFiles);
|
||||||
@@ -284,27 +288,23 @@ HRESULT CHashCallbackGUI::AfterLastFile(CHashBundle &hb)
|
|||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
HRESULT CHashCallbackGUI::ProcessVirt()
|
HRESULT CHashCallbackGUI::ProcessVirt()
|
||||||
{
|
{
|
||||||
NumFiles = 0;
|
NumFiles = 0;
|
||||||
AString errorInfo;
|
AString errorInfo;
|
||||||
HRESULT res = HashCalc(EXTERNAL_CODECS_LOC_VARS
|
HRESULT res = HashCalc(EXTERNAL_CODECS_LOC_VARS * censor, *options, errorInfo, this);
|
||||||
*censor, *options, errorInfo, this);
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
HRESULT HashCalcGUI(
|
HRESULT HashCalcGUI(
|
||||||
DECL_EXTERNAL_CODECS_LOC_VARS
|
DECL_EXTERNAL_CODECS_LOC_VARS const NWildcard::CCensor &censor,
|
||||||
const NWildcard::CCensor &censor,
|
|
||||||
const CHashOptions &options,
|
const CHashOptions &options,
|
||||||
bool &messageWasDisplayed)
|
bool &messageWasDisplayed)
|
||||||
{
|
{
|
||||||
CHashCallbackGUI t;
|
CHashCallbackGUI t;
|
||||||
#ifdef EXTERNAL_CODECS
|
#ifdef EXTERNAL_CODECS
|
||||||
t.__externalCodecs = __externalCodecs;
|
t.__externalCodecs = __externalCodecs;
|
||||||
#endif
|
#endif
|
||||||
t.censor = &censor;
|
t.censor = &censor;
|
||||||
t.options = &options;
|
t.options = &options;
|
||||||
|
|
||||||
@@ -321,12 +321,11 @@ HRESULT HashCalcGUI(
|
|||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ShowHashResults(const CPropNameValPairs &propPairs, HWND hwnd)
|
void ShowHashResults(const CPropNameValPairs &propPairs, HWND hwnd)
|
||||||
{
|
{
|
||||||
CListViewDialog lv;
|
CListViewDialog lv;
|
||||||
|
|
||||||
FOR_VECTOR (i, propPairs)
|
FOR_VECTOR(i, propPairs)
|
||||||
{
|
{
|
||||||
const CProperty &pair = propPairs[i];
|
const CProperty &pair = propPairs[i];
|
||||||
lv.Strings.Add(pair.Name);
|
lv.Strings.Add(pair.Name);
|
||||||
@@ -341,7 +340,6 @@ void ShowHashResults(const CPropNameValPairs &propPairs, HWND hwnd)
|
|||||||
lv.Create(hwnd);
|
lv.Create(hwnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ShowHashResults(const CHashBundle &hb, HWND hwnd)
|
void ShowHashResults(const CHashBundle &hb, HWND hwnd)
|
||||||
{
|
{
|
||||||
CPropNameValPairs propPairs;
|
CPropNameValPairs propPairs;
|
||||||
@@ -349,7 +347,6 @@ void ShowHashResults(const CHashBundle &hb, HWND hwnd)
|
|||||||
ShowHashResults(propPairs, hwnd);
|
ShowHashResults(propPairs, hwnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CHashCallbackGUI::ProcessWasFinished_GuiVirt()
|
void CHashCallbackGUI::ProcessWasFinished_GuiVirt()
|
||||||
{
|
{
|
||||||
ShowHashResults(PropNameValPairs, *this);
|
ShowHashResults(PropNameValPairs, *this);
|
||||||
|
|||||||
@@ -67,6 +67,10 @@ CFLAGS = $(CFLAGS) -MP2
|
|||||||
CFLAGS = $(CFLAGS)
|
CFLAGS = $(CFLAGS)
|
||||||
!ENDIF
|
!ENDIF
|
||||||
|
|
||||||
|
!IFDEF MY_CONSOLE
|
||||||
|
CFLAGS = $(CFLAGS) -D_CONSOLE
|
||||||
|
!ENDIF
|
||||||
|
|
||||||
!IFNDEF UNDER_CE
|
!IFNDEF UNDER_CE
|
||||||
!IF "$(PLATFORM)" == "arm"
|
!IF "$(PLATFORM)" == "arm"
|
||||||
CFLAGS = $(CFLAGS) -D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE
|
CFLAGS = $(CFLAGS) -D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ bool ReadNamesFromListFile2(CFSTR fileName, UStringVector &strings, UINT codePag
|
|||||||
}
|
}
|
||||||
|
|
||||||
const wchar_t kGoodBOM = 0xFEFF;
|
const wchar_t kGoodBOM = 0xFEFF;
|
||||||
const wchar_t kBadBOM = 0xFFFE;
|
// const wchar_t kBadBOM = 0xFFFE;
|
||||||
|
|
||||||
UString s;
|
UString s;
|
||||||
unsigned i = 0;
|
unsigned i = 0;
|
||||||
@@ -115,8 +115,10 @@ bool ReadNamesFromListFile2(CFSTR fileName, UStringVector &strings, UINT codePag
|
|||||||
for (; i < u.Len(); i++)
|
for (; i < u.Len(); i++)
|
||||||
{
|
{
|
||||||
wchar_t c = u[i];
|
wchar_t c = u[i];
|
||||||
|
/*
|
||||||
if (c == kGoodBOM || c == kBadBOM)
|
if (c == kGoodBOM || c == kBadBOM)
|
||||||
return false;
|
return false;
|
||||||
|
*/
|
||||||
if (c == '\n' || c == 0xD)
|
if (c == '\n' || c == 0xD)
|
||||||
{
|
{
|
||||||
AddName(strings, s);
|
AddName(strings, s);
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
#include "../../C/Alloc.h"
|
#include "../../C/Alloc.h"
|
||||||
|
|
||||||
#include "Defs.h"
|
#include "MyTypes.h"
|
||||||
|
|
||||||
class CMidBuffer
|
class CMidBuffer
|
||||||
{
|
{
|
||||||
@@ -15,7 +15,7 @@ class CMidBuffer
|
|||||||
CLASS_NO_COPY(CMidBuffer)
|
CLASS_NO_COPY(CMidBuffer)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CMidBuffer(): _data(NULL), _size(0) {};
|
CMidBuffer(): _data(NULL), _size(0) {}
|
||||||
~CMidBuffer() { ::MidFree(_data); }
|
~CMidBuffer() { ::MidFree(_data); }
|
||||||
|
|
||||||
void Free() { ::MidFree(_data); _data = NULL; _size = 0; }
|
void Free() { ::MidFree(_data); _data = NULL; _size = 0; }
|
||||||
@@ -29,12 +29,12 @@ public:
|
|||||||
{
|
{
|
||||||
if (!_data || size > _size)
|
if (!_data || size > _size)
|
||||||
{
|
{
|
||||||
|
::MidFree(_data);
|
||||||
const size_t kMinSize = (size_t)1 << 16;
|
const size_t kMinSize = (size_t)1 << 16;
|
||||||
if (size < kMinSize)
|
if (size < kMinSize)
|
||||||
size = kMinSize;
|
size = kMinSize;
|
||||||
::MidFree(_data);
|
|
||||||
_size = 0;
|
_size = 0;
|
||||||
_data = 0;
|
_data = NULL;
|
||||||
_data = (Byte *)::MidAlloc(size);
|
_data = (Byte *)::MidAlloc(size);
|
||||||
if (_data)
|
if (_data)
|
||||||
_size = size;
|
_size = size;
|
||||||
@@ -42,4 +42,59 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class CAlignedBuffer
|
||||||
|
{
|
||||||
|
Byte *_data;
|
||||||
|
size_t _size;
|
||||||
|
|
||||||
|
CLASS_NO_COPY(CAlignedBuffer)
|
||||||
|
|
||||||
|
public:
|
||||||
|
CAlignedBuffer(): _data(NULL), _size(0) {}
|
||||||
|
~CAlignedBuffer()
|
||||||
|
{
|
||||||
|
ISzAlloc_Free(&g_AlignedAlloc, _data);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Free()
|
||||||
|
{
|
||||||
|
ISzAlloc_Free(&g_AlignedAlloc, _data);
|
||||||
|
_data = NULL;
|
||||||
|
_size = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsAllocated() const { return _data != NULL; }
|
||||||
|
operator Byte *() { return _data; }
|
||||||
|
operator const Byte *() const { return _data; }
|
||||||
|
size_t Size() const { return _size; }
|
||||||
|
|
||||||
|
void Alloc(size_t size)
|
||||||
|
{
|
||||||
|
if (!_data || size != _size)
|
||||||
|
{
|
||||||
|
ISzAlloc_Free(&g_AlignedAlloc, _data);
|
||||||
|
_size = 0;
|
||||||
|
_data = NULL;
|
||||||
|
_data = (Byte *)ISzAlloc_Alloc(&g_AlignedAlloc, size);
|
||||||
|
if (_data)
|
||||||
|
_size = size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AllocAtLeast(size_t size)
|
||||||
|
{
|
||||||
|
if (!_data || size > _size)
|
||||||
|
{
|
||||||
|
ISzAlloc_Free(&g_AlignedAlloc, _data);
|
||||||
|
_size = 0;
|
||||||
|
_data = NULL;
|
||||||
|
_data = (Byte *)ISzAlloc_Alloc(&g_AlignedAlloc, size);
|
||||||
|
if (_data)
|
||||||
|
_size = size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
#include "StdAfx.h"
|
#include "StdAfx.h"
|
||||||
|
|
||||||
|
#include "../../C/CpuArch.h"
|
||||||
|
|
||||||
#include "MemoryLock.h"
|
#include "MemoryLock.h"
|
||||||
|
|
||||||
namespace NWindows {
|
namespace NWindows {
|
||||||
@@ -75,6 +77,9 @@ typedef void (WINAPI * Func_RtlGetVersion) (OSVERSIONINFOEXW *);
|
|||||||
We suppose that Window 10 works incorrectly with "Large Pages" at:
|
We suppose that Window 10 works incorrectly with "Large Pages" at:
|
||||||
- Windows 10 1703 (15063)
|
- Windows 10 1703 (15063)
|
||||||
- Windows 10 1709 (16299)
|
- Windows 10 1709 (16299)
|
||||||
|
|
||||||
|
- Windows 10 1809 (17763) on some CPUs that have no 1 GB page support.
|
||||||
|
We need more information about that new BUG in Windows.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
unsigned Get_LargePages_RiskLevel()
|
unsigned Get_LargePages_RiskLevel()
|
||||||
@@ -87,9 +92,19 @@ unsigned Get_LargePages_RiskLevel()
|
|||||||
if (!func)
|
if (!func)
|
||||||
return 0;
|
return 0;
|
||||||
func(&vi);
|
func(&vi);
|
||||||
return (vi.dwPlatformId == VER_PLATFORM_WIN32_NT
|
if (vi.dwPlatformId != VER_PLATFORM_WIN32_NT)
|
||||||
&& vi.dwMajorVersion + vi.dwMinorVersion == 10
|
return 0;
|
||||||
&& vi.dwBuildNumber <= 16299) ? 1 : 0;
|
if (vi.dwMajorVersion + vi.dwMinorVersion != 10)
|
||||||
|
return 0;
|
||||||
|
if (vi.dwBuildNumber <= 16299)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
#ifdef MY_CPU_X86_OR_AMD64
|
||||||
|
if (!CPU_IsSupported_PageGB())
|
||||||
|
return 1;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -2,6 +2,11 @@
|
|||||||
|
|
||||||
#include "StdAfx.h"
|
#include "StdAfx.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
*/
|
||||||
|
|
||||||
#include "../Common/MyCom.h"
|
#include "../Common/MyCom.h"
|
||||||
#ifndef _UNICODE
|
#ifndef _UNICODE
|
||||||
#include "../Common/StringConvert.h"
|
#include "../Common/StringConvert.h"
|
||||||
@@ -114,9 +119,22 @@ UString CDrop::QueryFileName(UINT fileIndex)
|
|||||||
void CDrop::QueryFileNames(UStringVector &fileNames)
|
void CDrop::QueryFileNames(UStringVector &fileNames)
|
||||||
{
|
{
|
||||||
UINT numFiles = QueryCountOfFiles();
|
UINT numFiles = QueryCountOfFiles();
|
||||||
|
/*
|
||||||
|
char s[100];
|
||||||
|
sprintf(s, "QueryFileNames: %d files", numFiles);
|
||||||
|
OutputDebugStringA(s);
|
||||||
|
*/
|
||||||
fileNames.ClearAndReserve(numFiles);
|
fileNames.ClearAndReserve(numFiles);
|
||||||
for (UINT i = 0; i < numFiles; i++)
|
for (UINT i = 0; i < numFiles; i++)
|
||||||
fileNames.AddInReserved(QueryFileName(i));
|
{
|
||||||
|
const UString s2 = QueryFileName(i);
|
||||||
|
if (!s2.IsEmpty())
|
||||||
|
fileNames.AddInReserved(s2);
|
||||||
|
/*
|
||||||
|
OutputDebugStringW(L"file ---");
|
||||||
|
OutputDebugStringW(s2);
|
||||||
|
*/
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -10,8 +10,8 @@ AppName = "7-Zip"
|
|||||||
InstallDir = %CE1%\%AppName%
|
InstallDir = %CE1%\%AppName%
|
||||||
|
|
||||||
[Strings]
|
[Strings]
|
||||||
AppVer = "18.06"
|
AppVer = "19.00"
|
||||||
AppDate = "2018-12-30"
|
AppDate = "2019-01-21"
|
||||||
|
|
||||||
[CEDevice]
|
[CEDevice]
|
||||||
; ProcessorType = 2577 ; ARM
|
; ProcessorType = 2577 ; ARM
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
;--------------------------------
|
;--------------------------------
|
||||||
;Defines
|
;Defines
|
||||||
|
|
||||||
!define VERSION_MAJOR 18
|
!define VERSION_MAJOR 19
|
||||||
!define VERSION_MINOR 06
|
!define VERSION_MINOR 00
|
||||||
!define VERSION_POSTFIX_FULL ""
|
!define VERSION_POSTFIX_FULL ""
|
||||||
!ifdef WIN64
|
!ifdef WIN64
|
||||||
!ifdef IA64
|
!ifdef IA64
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0"?>
|
<?xml version="1.0"?>
|
||||||
|
|
||||||
<?define VerMajor = "18" ?>
|
<?define VerMajor = "19" ?>
|
||||||
<?define VerMinor = "06" ?>
|
<?define VerMinor = "00" ?>
|
||||||
<?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)" ?>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
License for use and distribution
|
License for use and distribution
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
7-Zip Copyright (C) 1999-2018 Igor Pavlov.
|
7-Zip Copyright (C) 1999-2019 Igor Pavlov.
|
||||||
|
|
||||||
The licenses for files are:
|
The licenses for files are:
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
7-Zip 18.06 Sources
|
7-Zip 19.00 Sources
|
||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
7-Zip is a file archiver for Windows.
|
7-Zip is a file archiver for Windows.
|
||||||
|
|
||||||
7-Zip Copyright (C) 1999-2018 Igor Pavlov.
|
7-Zip Copyright (C) 1999-2019 Igor Pavlov.
|
||||||
|
|
||||||
|
|
||||||
License Info
|
License Info
|
||||||
|
|||||||
@@ -1,6 +1,14 @@
|
|||||||
HISTORY of the 7-Zip source code
|
HISTORY of the 7-Zip source code
|
||||||
--------------------------------
|
--------------------------------
|
||||||
|
|
||||||
|
19.00 2019-02-21
|
||||||
|
-------------------------
|
||||||
|
- Encryption strength for 7z archives was increased:
|
||||||
|
the size of random initialization vector was increased from 64-bit to 128-bit,
|
||||||
|
and the pseudo-random number generator was improved.
|
||||||
|
- Some bugs were fixed.
|
||||||
|
|
||||||
|
|
||||||
18.06 2018-12-30
|
18.06 2018-12-30
|
||||||
-------------------------
|
-------------------------
|
||||||
- The speed for LZMA/LZMA2 compressing was increased by 3-10%,
|
- The speed for LZMA/LZMA2 compressing was increased by 3-10%,
|
||||||
|
|||||||
14
README.md
14
README.md
@@ -1,13 +1,5 @@
|
|||||||
# Jame's Easy-Zip *almost* (continued)
|
# Git archive of 7-zip releases
|
||||||
|
|
||||||
I really like James Hoo's branch of the 7-zip utility. It has features that have repeatedly been begged for, but haven't been implemented by Igor Pavlov. The man is nothing but dedicated towards making things smaller, but he has no interest in UI.
|
Because 7-zip [doesn't](https://github.com/7z) have a public repository, and their code is released only as archives on SourceForge, I maintain a git-ified copy here.
|
||||||
|
|
||||||
This branch implements:
|
|
||||||
|
|
||||||
- Deleting archives after extraction.
|
|
||||||
- Recalling/Storing output history
|
|
||||||
- Icons in the context menu
|
|
||||||
- Opening the output folder after extraction.
|
|
||||||
|
|
||||||
There are some missing features from [Jame's 16.05 version](http://www.e7z.org/), namely the second about Easy-7zip dialog.
|
|
||||||
|
|
||||||
|
The [tagged releases](https://github.com/pornel/7z/releases) and the [original branch](https://github.com/pornel/7z/tree/original) contain pure 7-zip releases, without any modifications like this readme.
|
||||||
|
|||||||
Reference in New Issue
Block a user