This commit is contained in:
Igor Pavlov
2019-03-04 01:27:14 +00:00
committed by Kornel
parent 5b2a99c548
commit 4a960640a3
74 changed files with 906 additions and 415 deletions

View File

@@ -1,5 +1,5 @@
/* 7zArcIn.c -- 7z Input functions /* 7zArcIn.c -- 7z Input functions
2018-07-04 : Igor Pavlov : Public domain */ 2018-12-31 : Igor Pavlov : Public domain */
#include "Precomp.h" #include "Precomp.h"
@@ -19,7 +19,7 @@
{ MY_ALLOC(Byte, to, size, alloc); memcpy(to, from, size); } { MY_ALLOC(Byte, to, size, alloc); memcpy(to, from, size); }
#define MY_ALLOC_ZE_AND_CPY(to, size, from, alloc) \ #define MY_ALLOC_ZE_AND_CPY(to, size, from, alloc) \
{ if ((size) == 0) p = NULL; else { MY_ALLOC_AND_CPY(to, size, from, alloc) } } { if ((size) == 0) to = NULL; else { MY_ALLOC_AND_CPY(to, size, from, alloc) } }
#define k7zMajorVersion 0 #define k7zMajorVersion 0
@@ -666,7 +666,7 @@ static SRes ReadUnpackInfo(CSzAr *p,
MY_ALLOC(size_t, p->FoCodersOffsets, (size_t)numFolders + 1, alloc); MY_ALLOC(size_t, p->FoCodersOffsets, (size_t)numFolders + 1, alloc);
MY_ALLOC(UInt32, p->FoStartPackStreamIndex, (size_t)numFolders + 1, alloc); MY_ALLOC(UInt32, p->FoStartPackStreamIndex, (size_t)numFolders + 1, alloc);
MY_ALLOC(UInt32, p->FoToCoderUnpackSizes, (size_t)numFolders + 1, alloc); MY_ALLOC(UInt32, p->FoToCoderUnpackSizes, (size_t)numFolders + 1, alloc);
MY_ALLOC(Byte, p->FoToMainUnpackSizeIndex, (size_t)numFolders, alloc); MY_ALLOC_ZE(Byte, p->FoToMainUnpackSizeIndex, (size_t)numFolders, alloc);
startBufPtr = sd.Data; startBufPtr = sd.Data;

View File

@@ -1,5 +1,5 @@
/* 7zDec.c -- Decoding from 7z folder /* 7zDec.c -- Decoding from 7z folder
2018-07-04 : Igor Pavlov : Public domain */ 2019-02-02 : Igor Pavlov : Public domain */
#include "Precomp.h" #include "Precomp.h"
@@ -156,7 +156,7 @@ static SRes SzDecodeLzma(const Byte *props, unsigned propsSize, UInt64 inSize, I
{ {
SizeT inProcessed = (SizeT)lookahead, dicPos = state.dicPos; SizeT inProcessed = (SizeT)lookahead, dicPos = state.dicPos;
ELzmaStatus status; ELzmaStatus status;
res = LzmaDec_DecodeToDic(&state, outSize, inBuf, &inProcessed, LZMA_FINISH_END, &status); res = LzmaDec_DecodeToDic(&state, outSize, (const Byte *)inBuf, &inProcessed, LZMA_FINISH_END, &status);
lookahead -= inProcessed; lookahead -= inProcessed;
inSize -= inProcessed; inSize -= inProcessed;
if (res != SZ_OK) if (res != SZ_OK)
@@ -218,7 +218,7 @@ static SRes SzDecodeLzma2(const Byte *props, unsigned propsSize, UInt64 inSize,
{ {
SizeT inProcessed = (SizeT)lookahead, dicPos = state.decoder.dicPos; SizeT inProcessed = (SizeT)lookahead, dicPos = state.decoder.dicPos;
ELzmaStatus status; ELzmaStatus status;
res = Lzma2Dec_DecodeToDic(&state, outSize, inBuf, &inProcessed, LZMA_FINISH_END, &status); res = Lzma2Dec_DecodeToDic(&state, outSize, (const Byte *)inBuf, &inProcessed, LZMA_FINISH_END, &status);
lookahead -= inProcessed; lookahead -= inProcessed;
inSize -= inProcessed; inSize -= inProcessed;
if (res != SZ_OK) if (res != SZ_OK)

View File

@@ -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"

View File

@@ -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;

View File

@@ -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

View File

@@ -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

View File

@@ -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;

View File

@@ -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

View File

@@ -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;
} }

View File

@@ -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;

View File

@@ -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;

View File

@@ -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)

View File

@@ -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
} }

View File

@@ -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;
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 = GetFileVersionInfoSizeW(s, NULL); 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);

View File

@@ -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

View File

@@ -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

View File

@@ -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;

View File

@@ -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;
} }

View File

@@ -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);

View File

@@ -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++)
{ {

View File

@@ -733,7 +733,13 @@ HRESULT CDatabase::Open()
RINOK(OpenProgressFat()); RINOK(OpenProgressFat());
if ((Fat[0] & 0xFF) != Header.MediaType) if ((Fat[0] & 0xFF) != Header.MediaType)
return S_FALSE; {
// 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;
}
RINOK(ReadDir(-1, Header.RootCluster, 0)); RINOK(ReadDir(-1, Header.RootCluster, 0));

View File

@@ -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;

View File

@@ -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)

View File

@@ -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;

View File

@@ -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();

View File

@@ -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;

View File

@@ -2496,6 +2496,15 @@ SOURCE=..\..\..\..\C\Delta.h
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\..\..\..\C\DllSecur.c
# SUBTRACT CPP /YX /Yc /Yu
# End Source File
# Begin Source File
SOURCE=..\..\..\..\C\DllSecur.h
# End Source File
# Begin Source File
SOURCE=..\..\..\..\C\HuffEnc.c SOURCE=..\..\..\..\C\HuffEnc.c
!IF "$(CFG)" == "Alone - Win32 Release" !IF "$(CFG)" == "Alone - Win32 Release"

View File

@@ -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 \

View File

@@ -1646,6 +1646,15 @@ SOURCE=..\..\..\..\C\Delta.h
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\..\..\..\C\DllSecur.c
# SUBTRACT CPP /YX /Yc /Yu
# End Source File
# Begin Source File
SOURCE=..\..\..\..\C\DllSecur.h
# End Source File
# Begin Source File
SOURCE=..\..\..\..\C\IStream.h SOURCE=..\..\..\..\C\IStream.h
# End Source File # End Source File
# Begin Source File # Begin Source File

View File

@@ -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 \

View File

@@ -985,6 +985,15 @@ SOURCE=..\..\..\..\C\CpuArch.h
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\..\..\..\C\DllSecur.c
# SUBTRACT CPP /YX /Yc /Yu
# End Source File
# Begin Source File
SOURCE=..\..\..\..\C\DllSecur.h
# End Source File
# Begin Source File
SOURCE=..\..\..\..\C\LzFind.c SOURCE=..\..\..\..\C\LzFind.c
# SUBTRACT CPP /YX /Yc /Yu # SUBTRACT CPP /YX /Yc /Yu
# End Source File # End Source File

View File

@@ -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"

View File

@@ -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 \

View File

@@ -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 \

View File

@@ -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;

View File

@@ -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:

View File

@@ -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;
} }

View File

@@ -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

View File

@@ -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

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);
} }

View File

@@ -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);

View File

@@ -99,9 +99,28 @@ 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;
for (;;) for (;;)
{ {
// we don't want cases when we include archive to itself. // we don't want cases when we include archive to itself.
@@ -113,22 +132,10 @@ UString CreateArchiveName(const UStringVector &paths, const NFind::CFileInfo *fi
const UString name2_wim = name2 + L".wim"; const UString name2_wim = name2 + L".wim";
unsigned i = 0; unsigned i = 0;
for (i = 0; i < paths.Size(); i++)
{
const UString &fn = paths[i];
NFind::CFileInfo fi2;
const NFind::CFileInfo *fp; for (i = 0; i < names.Size(); i++)
if (fi && paths.Size() == 1) {
fp = fi; const UString &fname = names[i];
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 = "_";

View File

@@ -102,7 +102,14 @@ STDMETHODIMP COpenCallbackImp::GetStream(const wchar_t *name, IInStream **inStre
// if (!allowAbsVolPaths) // if (!allowAbsVolPaths)
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

View File

@@ -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;
} }
outStreamSpec = new CBenchmarkOutStream; if (!outStream)
outStream = outStreamSpec; {
if (!outStreamSpec->Alloc(kCompressedBufferSize)) outStreamSpec = new CBenchmarkOutStream;
return E_OUTOFMEMORY; outStream = outStreamSpec;
}
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())
} }
else
#endif #endif
{
RINOK(encoder.Encode());
}
} }
if (printCallback)
{
RINOK(printCallback->CheckBreak());
}
#ifndef _7ZIP_ST #ifndef _7ZIP_ST
if (numEncoderThreads > 1) if (mtEncMode)
{
for (i = 0; i < numEncoderThreads; i++) for (i = 0; i < numEncoderThreads; i++)
encoders[i].thread[0].Wait(); {
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
#endif #endif
{
RINOK(encoders[0].Encode());
}
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);

View File

@@ -417,6 +417,10 @@ SOURCE=..\..\..\Common\MyBuffer.h
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\..\..\Common\MyBuffer2.h
# End Source File
# Begin Source File
SOURCE=..\..\..\Common\MyCom.h SOURCE=..\..\..\Common\MyCom.h
# End Source File # End Source File
# Begin Source File # Begin Source File
@@ -843,6 +847,15 @@ SOURCE=..\..\..\..\C\CpuArch.h
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\..\..\..\C\DllSecur.c
# SUBTRACT CPP /YX /Yc /Yu
# End Source File
# Begin Source File
SOURCE=..\..\..\..\C\DllSecur.h
# End Source File
# Begin Source File
SOURCE=..\..\..\..\C\Sort.c SOURCE=..\..\..\..\C\Sort.c
# SUBTRACT CPP /YX /Yc /Yu # SUBTRACT CPP /YX /Yc /Yu
# End Source File # End Source File

View File

@@ -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 \

View File

@@ -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"

View File

@@ -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

View File

@@ -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 \
@@ -57,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 \

View File

@@ -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;

View File

@@ -286,6 +286,15 @@ SOURCE=..\FileManager\RegistryUtils.h
# PROP Default_Filter "" # PROP Default_Filter ""
# Begin Source File # Begin Source File
SOURCE=..\..\..\..\C\CpuArch.c
# SUBTRACT CPP /YX /Yc /Yu
# End Source File
# Begin Source File
SOURCE=..\..\..\..\C\CpuArch.h
# End Source File
# Begin Source File
SOURCE=..\..\..\..\C\Threads.c SOURCE=..\..\..\..\C\Threads.c
# SUBTRACT CPP /YX /Yc /Yu # SUBTRACT CPP /YX /Yc /Yu
# End Source File # End Source File

View File

@@ -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"

View File

@@ -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 (...)

View File

@@ -712,10 +712,24 @@ SOURCE=..\..\..\..\C\Alloc.h
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\..\..\..\C\CpuArch.c
# SUBTRACT CPP /YX /Yc /Yu
# End Source File
# Begin Source File
SOURCE=..\..\..\..\C\CpuArch.h SOURCE=..\..\..\..\C\CpuArch.h
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\..\..\..\C\DllSecur.c
# SUBTRACT CPP /YX /Yc /Yu
# End Source File
# Begin Source File
SOURCE=..\..\..\..\C\DllSecur.h
# End Source File
# Begin Source File
SOURCE=..\..\..\..\C\Sort.c SOURCE=..\..\..\..\C\Sort.c
# SUBTRACT CPP /YX /Yc /Yu # SUBTRACT CPP /YX /Yc /Yu
# End Source File # End Source File

View File

@@ -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 \

View File

@@ -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;

View File

@@ -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;

View File

@@ -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 = \
@@ -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 \

View File

@@ -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 &)

View File

@@ -810,6 +810,15 @@ SOURCE=..\..\..\..\C\CpuArch.h
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\..\..\..\C\DllSecur.c
# SUBTRACT CPP /YX /Yc /Yu
# End Source File
# Begin Source File
SOURCE=..\..\..\..\C\DllSecur.h
# End Source File
# Begin Source File
SOURCE=..\..\..\..\C\Sort.c SOURCE=..\..\..\..\C\Sort.c
!IF "$(CFG)" == "GUI - Win32 Release" !IF "$(CFG)" == "GUI - Win32 Release"

View File

@@ -134,6 +134,7 @@ COMPRESS_OBJS = \
C_OBJS = \ C_OBJS = \
$O\Alloc.obj \ $O\Alloc.obj \
$O\CpuArch.obj \ $O\CpuArch.obj \
$O\DllSecur.obj \
$O\Sort.obj \ $O\Sort.obj \
$O\Threads.obj \ $O\Threads.obj \

View File

@@ -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

View File

@@ -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);

View File

@@ -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

View File

@@ -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

View File

@@ -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);
*/
}
} }

View File

@@ -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

View File

@@ -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

View File

@@ -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)" ?>

View File

@@ -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:

View File

@@ -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

View File

@@ -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%,