diff options
Diffstat (limited to 'src/libs/7zip/win/CPP/7zip/Archive/Nsis')
-rw-r--r-- | src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisDecode.cpp | 130 | ||||
-rw-r--r-- | src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisDecode.h | 47 | ||||
-rw-r--r-- | src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisHandler.cpp | 510 | ||||
-rw-r--r-- | src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisHandler.h | 43 | ||||
-rw-r--r-- | src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisIn.cpp | 1461 | ||||
-rw-r--r-- | src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisIn.h | 181 | ||||
-rw-r--r-- | src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisRegister.cpp | 13 | ||||
-rw-r--r-- | src/libs/7zip/win/CPP/7zip/Archive/Nsis/StdAfx.h | 9 |
8 files changed, 0 insertions, 2394 deletions
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisDecode.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisDecode.cpp deleted file mode 100644 index 0845f965d..000000000 --- a/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisDecode.cpp +++ /dev/null @@ -1,130 +0,0 @@ -// NsisDecode.cpp - -#include "StdAfx.h" - -#include "NsisDecode.h" - -#include "../../Common/StreamUtils.h" - -#include "../../Common/MethodId.h" - -#include "../../Compress/BZip2Decoder.h" -#include "../../Compress/DeflateDecoder.h" -#include "../../Compress/LzmaDecoder.h" - -namespace NArchive { -namespace NNsis { - -static const CMethodId k_BCJ_X86 = 0x03030103; - -HRESULT CDecoder::Init( - DECL_EXTERNAL_CODECS_LOC_VARS - IInStream *inStream, NMethodType::EEnum method, bool thereIsFilterFlag, bool &useFilter) -{ - useFilter = false; - CObjectVector< CMyComPtr<ISequentialInStream> > inStreams; - - if (_decoderInStream) - if (method != _method) - Release(); - _method = method; - if (!_codecInStream) - { - switch (method) - { - // case NMethodType::kCopy: return E_NOTIMPL; - case NMethodType::kDeflate: _codecInStream = new NCompress::NDeflate::NDecoder::CNsisCOMCoder(); break; - case NMethodType::kBZip2: _codecInStream = new NCompress::NBZip2::CNsisDecoder(); break; - case NMethodType::kLZMA: _codecInStream = new NCompress::NLzma::CDecoder(); break; - default: return E_NOTIMPL; - } - } - - if (thereIsFilterFlag) - { - UInt32 processedSize; - BYTE flag; - RINOK(inStream->Read(&flag, 1, &processedSize)); - if (processedSize != 1) - return E_FAIL; - if (flag > 1) - return E_NOTIMPL; - useFilter = (flag != 0); - } - - if (useFilter) - { - if (!_filterInStream) - { - CMyComPtr<ICompressCoder> coder; - RINOK(CreateCoder( - EXTERNAL_CODECS_LOC_VARS - k_BCJ_X86, coder, false)); - if (!coder) - return E_NOTIMPL; - coder.QueryInterface(IID_ISequentialInStream, &_filterInStream); - if (!_filterInStream) - return E_NOTIMPL; - } - CMyComPtr<ICompressSetInStream> setInStream; - _filterInStream.QueryInterface(IID_ICompressSetInStream, &setInStream); - if (!setInStream) - return E_NOTIMPL; - RINOK(setInStream->SetInStream(_codecInStream)); - _decoderInStream = _filterInStream; - } - else - _decoderInStream = _codecInStream; - - if (method == NMethodType::kLZMA) - { - CMyComPtr<ICompressSetDecoderProperties2> setDecoderProperties; - _codecInStream.QueryInterface(IID_ICompressSetDecoderProperties2, &setDecoderProperties); - if (setDecoderProperties) - { - static const UInt32 kPropertiesSize = 5; - BYTE properties[kPropertiesSize]; - UInt32 processedSize; - RINOK(inStream->Read(properties, kPropertiesSize, &processedSize)); - if (processedSize != kPropertiesSize) - return E_FAIL; - RINOK(setDecoderProperties->SetDecoderProperties2((const Byte *)properties, kPropertiesSize)); - } - } - - { - CMyComPtr<ICompressSetInStream> setInStream; - _codecInStream.QueryInterface(IID_ICompressSetInStream, &setInStream); - if (!setInStream) - return E_NOTIMPL; - RINOK(setInStream->SetInStream(inStream)); - } - - { - CMyComPtr<ICompressSetOutStreamSize> setOutStreamSize; - _codecInStream.QueryInterface(IID_ICompressSetOutStreamSize, &setOutStreamSize); - if (!setOutStreamSize) - return E_NOTIMPL; - RINOK(setOutStreamSize->SetOutStreamSize(NULL)); - } - - if (useFilter) - { - /* - CMyComPtr<ICompressSetOutStreamSize> setOutStreamSize; - _filterInStream.QueryInterface(IID_ICompressSetOutStreamSize, &setOutStreamSize); - if (!setOutStreamSize) - return E_NOTIMPL; - RINOK(setOutStreamSize->SetOutStreamSize(NULL)); - */ - } - - return S_OK; -} - -HRESULT CDecoder::Read(void *data, size_t *processedSize) -{ - return ReadStream(_decoderInStream, data, processedSize);; -} - -}} diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisDecode.h b/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisDecode.h deleted file mode 100644 index 36aeb2b14..000000000 --- a/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisDecode.h +++ /dev/null @@ -1,47 +0,0 @@ -// NsisDecode.h - -#ifndef __NSIS_DECODE_H -#define __NSIS_DECODE_H - -#include "../../IStream.h" - -#include "../../Common/CreateCoder.h" - -namespace NArchive { -namespace NNsis { - -namespace NMethodType -{ - enum EEnum - { - kCopy, - kDeflate, - kBZip2, - kLZMA - }; -} - -class CDecoder -{ - NMethodType::EEnum _method; - - CMyComPtr<ISequentialInStream> _filterInStream; - CMyComPtr<ISequentialInStream> _codecInStream; - CMyComPtr<ISequentialInStream> _decoderInStream; - -public: - void Release() - { - _filterInStream.Release(); - _codecInStream.Release(); - _decoderInStream.Release(); - } - HRESULT Init( - DECL_EXTERNAL_CODECS_LOC_VARS - IInStream *inStream, NMethodType::EEnum method, bool thereIsFilterFlag, bool &useFilter); - HRESULT Read(void *data, size_t *processedSize); -}; - -}} - -#endif diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisHandler.cpp deleted file mode 100644 index 4058bd2af..000000000 --- a/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisHandler.cpp +++ /dev/null @@ -1,510 +0,0 @@ -// NSisHandler.cpp - -#include "StdAfx.h" - -#include "../../../../C/CpuArch.h" - -#include "Common/ComTry.h" -#include "Common/IntToString.h" - -#include "Windows/PropVariant.h" - -#include "../../Common/StreamUtils.h" - -#include "../Common/ItemNameUtils.h" - -#include "NsisHandler.h" - -#define Get32(p) GetUi32(p) - -using namespace NWindows; - -namespace NArchive { -namespace NNsis { - -static const char *kBcjMethod = "BCJ"; -static const char *kUnknownMethod = "Unknown"; - -static const char *kMethods[] = -{ - "Copy", - "Deflate", - "BZip2", - "LZMA" -}; - -static const int kNumMethods = sizeof(kMethods) / sizeof(kMethods[0]); - -static STATPROPSTG kProps[] = -{ - { NULL, kpidPath, VT_BSTR}, - { NULL, kpidSize, VT_UI8}, - { NULL, kpidPackSize, VT_UI8}, - { NULL, kpidMTime, VT_FILETIME}, - { NULL, kpidMethod, VT_BSTR}, - { NULL, kpidSolid, VT_BOOL} -}; - -static STATPROPSTG kArcProps[] = -{ - { NULL, kpidMethod, VT_BSTR}, - { NULL, kpidSolid, VT_BOOL} -}; - -IMP_IInArchive_Props -IMP_IInArchive_ArcProps - -STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value) -{ - COM_TRY_BEGIN - NWindows::NCOM::CPropVariant prop; - switch(propID) - { - case kpidMethod: - { - UInt32 dict = 1; - bool filter = false; - for (int i = 0; i < _archive.Items.Size(); i++) - { - const CItem &item = _archive.Items[i]; - filter |= item.UseFilter; - if (item.DictionarySize > dict) - dict = item.DictionarySize; - } - prop = GetMethod(filter, dict); - break; - } - case kpidSolid: prop = _archive.IsSolid; break; - } - prop.Detach(value); - return S_OK; - COM_TRY_END -} - - -STDMETHODIMP CHandler::Open(IInStream *stream, const UInt64 * maxCheckStartPosition, IArchiveOpenCallback * /* openArchiveCallback */) -{ - COM_TRY_BEGIN - Close(); - { - if (_archive.Open( - EXTERNAL_CODECS_VARS - stream, maxCheckStartPosition) != S_OK) - return S_FALSE; - _inStream = stream; - } - return S_OK; - COM_TRY_END -} - -STDMETHODIMP CHandler::Close() -{ - _archive.Clear(); - _archive.Release(); - _inStream.Release(); - return S_OK; -} - -STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems) -{ - *numItems = _archive.Items.Size() - #ifdef NSIS_SCRIPT - + 1 - #endif - ; - return S_OK; -} - -static AString UInt32ToString(UInt32 value) -{ - char buffer[16]; - ConvertUInt32ToString(value, buffer); - return buffer; -} - -static AString GetStringForSizeValue(UInt32 value) -{ - for (int i = 31; i >= 0; i--) - if (((UInt32)1 << i) == value) - return UInt32ToString(i); - char c = 'b'; - if (value % (1 << 20) == 0) - { - value >>= 20; - c = 'm'; - } - else if (value % (1 << 10) == 0) - { - value >>= 10; - c = 'k'; - } - return UInt32ToString(value) + c; -} - -AString CHandler::GetMethod(bool useItemFilter, UInt32 dictionary) const -{ - NMethodType::EEnum methodIndex = _archive.Method; - AString method; - if (_archive.IsSolid && _archive.UseFilter || !_archive.IsSolid && useItemFilter) - { - method += kBcjMethod; - method += ' '; - } - method += (methodIndex < kNumMethods) ? kMethods[methodIndex] : kUnknownMethod; - if (methodIndex == NMethodType::kLZMA) - { - method += ':'; - method += GetStringForSizeValue(_archive.IsSolid ? _archive.DictionarySize: dictionary); - } - return method; -} - -bool CHandler::GetUncompressedSize(int index, UInt32 &size) -{ - size = 0; - const CItem &item = _archive.Items[index]; - if (item.SizeIsDefined) - size = item.Size; - else if (_archive.IsSolid && item.EstimatedSizeIsDefined) - size = item.EstimatedSize; - else - return false; - return true; -} - -bool CHandler::GetCompressedSize(int index, UInt32 &size) -{ - size = 0; - const CItem &item = _archive.Items[index]; - if (item.CompressedSizeIsDefined) - size = item.CompressedSize; - else - { - if (_archive.IsSolid) - { - if (index == 0) - size = _archive.FirstHeader.GetDataSize(); - else - return false; - } - else - { - if (!item.IsCompressed) - size = item.Size; - else - return false; - } - } - return true; -} - - -STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value) -{ - COM_TRY_BEGIN - NWindows::NCOM::CPropVariant prop; - #ifdef NSIS_SCRIPT - if (index >= (UInt32)_archive.Items.Size()) - { - switch(propID) - { - case kpidPath: prop = L"[NSIS].nsi"; break; - case kpidSize: - case kpidPackSize: prop = (UInt64)_archive.Script.Length(); break; - case kpidSolid: prop = false; break; - } - } - else - #endif - { - const CItem &item = _archive.Items[index]; - switch(propID) - { - case kpidPath: - { - UString s = NItemName::WinNameToOSName(item.GetReducedName(_archive.IsUnicode)); - if (!s.IsEmpty()) - prop = (const wchar_t *)s; - break; - } - case kpidSize: - { - UInt32 size; - if (GetUncompressedSize(index, size)) - prop = (UInt64)size; - break; - } - case kpidPackSize: - { - UInt32 size; - if (GetCompressedSize(index, size)) - prop = (UInt64)size; - break; - } - case kpidMTime: - { - if (item.MTime.dwHighDateTime > 0x01000000 && - item.MTime.dwHighDateTime < 0xFF000000) - prop = item.MTime; - break; - } - case kpidMethod: prop = GetMethod(item.UseFilter, item.DictionarySize); break; - case kpidSolid: prop = _archive.IsSolid; break; - } - } - prop.Detach(value); - return S_OK; - COM_TRY_END -} - -STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, - Int32 testMode, IArchiveExtractCallback *extractCallback) -{ - COM_TRY_BEGIN - bool allFilesMode = (numItems == (UInt32)-1); - if (allFilesMode) - GetNumberOfItems(&numItems); - if (numItems == 0) - return S_OK; - UInt64 totalSize = 0; - - UInt32 i; - for (i = 0; i < numItems; i++) - { - UInt32 index = (allFilesMode ? i : indices[i]); - #ifdef NSIS_SCRIPT - if (index >= (UInt32)_archive.Items.Size()) - totalSize += _archive.Script.Length(); - else - #endif - { - UInt32 size; - if (_archive.IsSolid) - { - GetUncompressedSize(index, size); - UInt64 pos = _archive.GetPosOfSolidItem(index); - if (pos > totalSize) - totalSize = pos + size; - } - else - { - GetCompressedSize(index, size); - totalSize += size; - } - } - } - extractCallback->SetTotal(totalSize); - - UInt64 currentTotalSize = 0; - UInt32 currentItemSize = 0; - - UInt64 streamPos = 0; - if (_archive.IsSolid) - { - RINOK(_inStream->Seek(_archive.StreamOffset, STREAM_SEEK_SET, NULL)); - bool useFilter; - RINOK(_archive.Decoder.Init( - EXTERNAL_CODECS_VARS - _inStream, _archive.Method, _archive.FilterFlag, useFilter)); - } - - CByteBuffer byteBuf; - const UInt32 kBufferLength = 1 << 16; - byteBuf.SetCapacity(kBufferLength); - Byte *buffer = byteBuf; - - CByteBuffer tempBuf; - - bool dataError = false; - for (i = 0; i < numItems; i++, currentTotalSize += currentItemSize) - { - currentItemSize = 0; - RINOK(extractCallback->SetCompleted(¤tTotalSize)); - CMyComPtr<ISequentialOutStream> realOutStream; - Int32 askMode = testMode ? - NExtract::NAskMode::kTest : - NExtract::NAskMode::kExtract; - UInt32 index = allFilesMode ? i : indices[i]; - - RINOK(extractCallback->GetStream(index, &realOutStream, askMode)); - - #ifdef NSIS_SCRIPT - if (index >= (UInt32)_archive.Items.Size()) - { - currentItemSize = _archive.Script.Length(); - if (!testMode && !realOutStream) - continue; - RINOK(extractCallback->PrepareOperation(askMode)); - if (!testMode) - RINOK(WriteStream(realOutStream, (const char *)_archive.Script, (UInt32)_archive.Script.Length())); - } - else - #endif - { - const CItem &item = _archive.Items[index]; - - if (_archive.IsSolid) - GetUncompressedSize(index, currentItemSize); - else - GetCompressedSize(index, currentItemSize); - - if (!testMode && !realOutStream) - continue; - - RINOK(extractCallback->PrepareOperation(askMode)); - - if (!dataError) - { - bool needDecompress = false; - bool sizeIsKnown = false; - UInt32 fullSize = 0; - - bool writeToTemp = false; - bool readFromTemp = false; - - if (_archive.IsSolid) - { - UInt64 pos = _archive.GetPosOfSolidItem(index); - while (streamPos < pos) - { - size_t processedSize = (UInt32)MyMin(pos - streamPos, (UInt64)kBufferLength); - HRESULT res = _archive.Decoder.Read(buffer, &processedSize); - if (res != S_OK) - { - if (res != S_FALSE) - return res; - dataError = true; - break; - } - if (processedSize == 0) - { - dataError = true; - break; - } - streamPos += processedSize; - } - if (streamPos == pos) - { - Byte buffer2[4]; - size_t processedSize = 4; - RINOK(_archive.Decoder.Read(buffer2, &processedSize)); - if (processedSize != 4) - return E_FAIL; - streamPos += processedSize; - fullSize = Get32(buffer2); - sizeIsKnown = true; - needDecompress = true; - - if (!testMode && i + 1 < numItems) - { - UInt64 nextPos = _archive.GetPosOfSolidItem(allFilesMode ? i : indices[i + 1]); - if (nextPos < streamPos + fullSize) - { - tempBuf.Free(); - tempBuf.SetCapacity(fullSize); - writeToTemp = true; - } - } - } - else - readFromTemp = true; - } - else - { - RINOK(_inStream->Seek(_archive.GetPosOfNonSolidItem(index) + 4, STREAM_SEEK_SET, NULL)); - if (item.IsCompressed) - { - needDecompress = true; - bool useFilter; - RINOK(_archive.Decoder.Init( - EXTERNAL_CODECS_VARS - _inStream, _archive.Method, _archive.FilterFlag, useFilter)); - // fullSize = Get32(buffer); // It's bug !!! - // Test it: what is exact fullSize? - fullSize = 0xFFFFFFFF; - } - else - fullSize = item.Size; - } - if (!dataError) - { - if (needDecompress) - { - UInt64 offset = 0; - while (!sizeIsKnown || fullSize > 0) - { - UInt32 curSize = kBufferLength; - if (sizeIsKnown && curSize > fullSize) - curSize = fullSize; - size_t processedSize = curSize; - HRESULT res = _archive.Decoder.Read(buffer, &processedSize); - if (res != S_OK) - { - if (res != S_FALSE) - return res; - dataError = true; - break; - } - if (processedSize == 0) - { - if (sizeIsKnown) - dataError = true; - break; - } - - if (writeToTemp) - memcpy((Byte *)tempBuf + (size_t)offset, buffer, processedSize); - - fullSize -= (UInt32)processedSize; - streamPos += processedSize; - offset += processedSize; - - UInt64 completed; - if (_archive.IsSolid) - completed = currentTotalSize + offset; - else - completed = streamPos; - RINOK(extractCallback->SetCompleted(&completed)); - if (!testMode) - RINOK(WriteStream(realOutStream, buffer, processedSize)); - } - } - else - { - if (readFromTemp) - { - if (!testMode) - RINOK(WriteStream(realOutStream, tempBuf, tempBuf.GetCapacity())); - } - else - while (fullSize > 0) - { - UInt32 curSize = MyMin(fullSize, kBufferLength); - UInt32 processedSize; - RINOK(_inStream->Read(buffer, curSize, &processedSize)); - if (processedSize == 0) - { - dataError = true; - break; - } - fullSize -= processedSize; - streamPos += processedSize; - if (!testMode) - RINOK(WriteStream(realOutStream, buffer, processedSize)); - } - } - } - } - } - realOutStream.Release(); - RINOK(extractCallback->SetOperationResult(dataError ? - NExtract::NOperationResult::kDataError : - NExtract::NOperationResult::kOK)); - } - return S_OK; - COM_TRY_END -} - -IMPL_ISetCompressCodecsInfo - -}} diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisHandler.h b/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisHandler.h deleted file mode 100644 index 6de493df8..000000000 --- a/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisHandler.h +++ /dev/null @@ -1,43 +0,0 @@ -// NSisHandler.h - -#ifndef __NSIS_HANDLER_H -#define __NSIS_HANDLER_H - -#include "Common/MyCom.h" -#include "../IArchive.h" - -#include "NsisIn.h" - -#include "../../Common/CreateCoder.h" - -namespace NArchive { -namespace NNsis { - -class CHandler: - public IInArchive, - PUBLIC_ISetCompressCodecsInfo - public CMyUnknownImp -{ - CMyComPtr<IInStream> _inStream; - CInArchive _archive; - - DECL_EXTERNAL_CODECS_VARS - - bool GetUncompressedSize(int index, UInt32 &size); - bool GetCompressedSize(int index, UInt32 &size); - - AString GetMethod(bool useItemFilter, UInt32 dictionary) const; -public: - MY_QUERYINTERFACE_BEGIN2(IInArchive) - QUERY_ENTRY_ISetCompressCodecsInfo - MY_QUERYINTERFACE_END - MY_ADDREF_RELEASE - - INTERFACE_IInArchive(;) - - DECL_ISetCompressCodecsInfo -}; - -}} - -#endif diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisIn.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisIn.cpp deleted file mode 100644 index 407560085..000000000 --- a/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisIn.cpp +++ /dev/null @@ -1,1461 +0,0 @@ -// NsisIn.cpp - -#include "StdAfx.h" - -#include "../../../../C/CpuArch.h" - -#include "Common/IntToString.h" - -#include "../../Common/StreamUtils.h" - -#include "NsisIn.h" - -#define Get32(p) GetUi32(p) - -namespace NArchive { -namespace NNsis { - -Byte kSignature[kSignatureSize] = NSIS_SIGNATURE; - -#ifdef NSIS_SCRIPT -static const char *kCrLf = "\x0D\x0A"; -#endif - -#define NS_UN_SKIP_CODE 0xE000 -#define NS_UN_VAR_CODE 0xE001 -#define NS_UN_SHELL_CODE 0xE002 -#define NS_UN_LANG_CODE 0xE003 -#define NS_UN_CODES_START NS_UN_SKIP_CODE -#define NS_UN_CODES_END NS_UN_LANG_CODE - -Byte CInArchive::ReadByte() -{ - if (_posInData >= _size) - throw 1; - return _data[_posInData++]; -} - -UInt32 CInArchive::ReadUInt32() -{ - UInt32 value = 0; - for (int i = 0; i < 4; i++) - value |= ((UInt32)(ReadByte()) << (8 * i)); - return value; -} - -void CInArchive::ReadBlockHeader(CBlockHeader &bh) -{ - bh.Offset = ReadUInt32(); - bh.Num = ReadUInt32(); -} - -#define RINOZ(x) { int __tt = (x); if (__tt != 0) return __tt; } - -static int CompareItems(void *const *p1, void *const *p2, void * /* param */) -{ - const CItem &i1 = **(CItem **)p1; - const CItem &i2 = **(CItem **)p2; - RINOZ(MyCompare(i1.Pos, i2.Pos)); - if (i1.IsUnicode) - { - RINOZ(i1.PrefixU.Compare(i2.PrefixU)); - RINOZ(i1.NameU.Compare(i2.NameU)); - } - else - { - RINOZ(i1.PrefixA.Compare(i2.PrefixA)); - RINOZ(i1.NameA.Compare(i2.NameA)); - } - return 0; -} - -static AString UIntToString(UInt32 v) -{ - char sz[32]; - ConvertUInt64ToString(v, sz); - return sz; -} - -static AString IntToString(Int32 v) -{ - char sz[32]; - ConvertInt64ToString(v, sz); - return sz; -} - -AString CInArchive::ReadStringA(UInt32 pos) const -{ - AString s; - if (pos >= _size) - return IntToString((Int32)pos); - UInt32 offset = GetOffset() + _stringsPos + pos; - for (;;) - { - if (offset >= _size) - break; // throw 1; - char c = _data[offset++]; - if (c == 0) - break; - s += c; - } - return s; -} - -UString CInArchive::ReadStringU(UInt32 pos) const -{ - UString s; - UInt32 offset = GetOffset() + _stringsPos + (pos * 2); - for (;;) - { - if (offset >= _size || offset + 1 >= _size) - return s; // throw 1; - char c0 = _data[offset++]; - char c1 = _data[offset++]; - wchar_t c = (c0 | ((wchar_t)c1 << 8)); - if (c == 0) - break; - s += c; - } - return s; -} - -/* -static AString ParsePrefix(const AString &prefix) -{ - AString res = prefix; - if (prefix.Length() >= 3) - { - if ((Byte)prefix[0] == 0xFD && (Byte)prefix[1] == 0x95 && (Byte)prefix[2] == 0x80) - res = "$INSTDIR" + prefix.Mid(3); - else if ((Byte)prefix[0] == 0xFD && (Byte)prefix[1] == 0x96 && (Byte)prefix[2] == 0x80) - res = "$OUTDIR" + prefix.Mid(3); - } - return res; -} -*/ - -#define SYSREGKEY "Software\\Microsoft\\Windows\\CurrentVersion" - -/* -# define CSIDL_PROGRAMS 0x2 -# define CSIDL_PRINTERS 0x4 -# define CSIDL_PERSONAL 0x5 -# define CSIDL_FAVORITES 0x6 -# define CSIDL_STARTUP 0x7 -# define CSIDL_RECENT 0x8 -# define CSIDL_SENDTO 0x9 -# define CSIDL_STARTMENU 0xB -# define CSIDL_MYMUSIC 0xD -# define CSIDL_MYVIDEO 0xE - -# define CSIDL_DESKTOPDIRECTORY 0x10 -# define CSIDL_NETHOOD 0x13 -# define CSIDL_FONTS 0x14 -# define CSIDL_TEMPLATES 0x15 -# define CSIDL_COMMON_STARTMENU 0x16 -# define CSIDL_COMMON_PROGRAMS 0x17 -# define CSIDL_COMMON_STARTUP 0x18 -# define CSIDL_COMMON_DESKTOPDIRECTORY 0x19 -# define CSIDL_APPDATA 0x1A -# define CSIDL_PRINTHOOD 0x1B -# define CSIDL_LOCAL_APPDATA 0x1C -# define CSIDL_ALTSTARTUP 0x1D -# define CSIDL_COMMON_ALTSTARTUP 0x1E -# define CSIDL_COMMON_FAVORITES 0x1F - -# define CSIDL_INTERNET_CACHE 0x20 -# define CSIDL_COOKIES 0x21 -# define CSIDL_HISTORY 0x22 -# define CSIDL_COMMON_APPDATA 0x23 -# define CSIDL_WINDOWS 0x24 -# define CSIDL_SYSTEM 0x25 -# define CSIDL_PROGRAM_FILES 0x26 -# define CSIDL_MYPICTURES 0x27 -# define CSIDL_PROFILE 0x28 -# define CSIDL_PROGRAM_FILES_COMMON 0x2B -# define CSIDL_COMMON_TEMPLATES 0x2D -# define CSIDL_COMMON_DOCUMENTS 0x2E -# define CSIDL_COMMON_ADMINTOOLS 0x2F - -# define CSIDL_ADMINTOOLS 0x30 -# define CSIDL_COMMON_MUSIC 0x35 -# define CSIDL_COMMON_PICTURES 0x36 -# define CSIDL_COMMON_VIDEO 0x37 -# define CSIDL_RESOURCES 0x38 -# define CSIDL_RESOURCES_LOCALIZED 0x39 -# define CSIDL_CDBURN_AREA 0x3B -*/ - -struct CCommandPair -{ - int NumParams; - const char *Name; -}; - -enum -{ - // 0 - EW_INVALID_OPCODE, // zero is invalid. useful for catching errors. (otherwise an all zeroes instruction - // does nothing, which is easily ignored but means something is wrong. - EW_RET, // return from function call - EW_NOP, // Nop/Jump, do nothing: 1, [?new address+1:advance one] - EW_ABORT, // Abort: 1 [status] - EW_QUIT, // Quit: 0 - EW_CALL, // Call: 1 [new address+1] - EW_UPDATETEXT, // Update status text: 2 [update str, ui_st_updateflag=?ui_st_updateflag:this] - EW_SLEEP, // Sleep: 1 [sleep time in milliseconds] - EW_BRINGTOFRONT, // BringToFront: 0 - EW_CHDETAILSVIEW, // SetDetailsView: 2 [listaction,buttonaction] - - // 10 - EW_SETFILEATTRIBUTES, // SetFileAttributes: 2 [filename, attributes] - EW_CREATEDIR, // Create directory: 2, [path, ?update$INSTDIR] - EW_IFFILEEXISTS, // IfFileExists: 3, [file name, jump amount if exists, jump amount if not exists] - EW_SETFLAG, // Sets a flag: 2 [id, data] - EW_IFFLAG, // If a flag: 4 [on, off, id, new value mask] - EW_GETFLAG, // Gets a flag: 2 [output, id] - EW_RENAME, // Rename: 3 [old, new, rebootok] - EW_GETFULLPATHNAME, // GetFullPathName: 2 [output, input, ?lfn:sfn] - EW_SEARCHPATH, // SearchPath: 2 [output, filename] - EW_GETTEMPFILENAME, // GetTempFileName: 2 [output, base_dir] - - // 20 - EW_EXTRACTFILE, // File to extract: 6 [overwriteflag, output filename, compressed filedata, filedatetimelow, filedatetimehigh, allow ignore] - // overwriteflag: 0x1 = no. 0x0=force, 0x2=try, 0x3=if date is newer - EW_DELETEFILE, // Delete File: 2, [filename, rebootok] - EW_MESSAGEBOX, // MessageBox: 5,[MB_flags,text,retv1:retv2,moveonretv1:moveonretv2] - EW_RMDIR, // RMDir: 2 [path, recursiveflag] - EW_STRLEN, // StrLen: 2 [output, input] - EW_ASSIGNVAR, // Assign: 4 [variable (0-9) to assign, string to assign, maxlen, startpos] - EW_STRCMP, // StrCmp: 5 [str1, str2, jump_if_equal, jump_if_not_equal, case-sensitive?] - EW_READENVSTR, // ReadEnvStr/ExpandEnvStrings: 3 [output, string_with_env_variables, IsRead] - EW_INTCMP, // IntCmp: 6 [val1, val2, equal, val1<val2, val1>val2, unsigned?] - EW_INTOP, // IntOp: 4 [output, input1, input2, op] where op: 0=add, 1=sub, 2=mul, 3=div, 4=bor, 5=band, 6=bxor, 7=bnot input1, 8=lnot input1, 9=lor, 10=land], 11=1%2 - - // 30 - EW_INTFMT, // IntFmt: [output, format, input] - EW_PUSHPOP, // Push/Pop/Exchange: 3 [variable/string, ?pop:push, ?exch] - EW_FINDWINDOW, // FindWindow: 5, [outputvar, window class,window name, window_parent, window_after] - EW_SENDMESSAGE, // SendMessage: 6 [output, hwnd, msg, wparam, lparam, [wparamstring?1:0 | lparamstring?2:0 | timeout<<2] - EW_ISWINDOW, // IsWindow: 3 [hwnd, jump_if_window, jump_if_notwindow] - EW_GETDLGITEM, // GetDlgItem: 3: [outputvar, dialog, item_id] - EW_SETCTLCOLORS, // SerCtlColors: 3: [hwnd, pointer to struct colors] - EW_SETBRANDINGIMAGE, // SetBrandingImage: 1: [Bitmap file] - EW_CREATEFONT, // CreateFont: 5: [handle output, face name, height, weight, flags] - EW_SHOWWINDOW, // ShowWindow: 2: [hwnd, show state] - - // 40 - EW_SHELLEXEC, // ShellExecute program: 4, [shell action, complete commandline, parameters, showwindow] - EW_EXECUTE, // Execute program: 3,[complete command line,waitflag,>=0?output errorcode] - EW_GETFILETIME, // GetFileTime; 3 [file highout lowout] - EW_GETDLLVERSION, // GetDLLVersion: 3 [file highout lowout] - EW_REGISTERDLL, // Register DLL: 3,[DLL file name, string ptr of function to call, text to put in display (<0 if none/pass parms), 1 - no unload, 0 - unload] - EW_CREATESHORTCUT, // Make Shortcut: 5, [link file, target file, parameters, icon file, iconindex|show mode<<8|hotkey<<16] - EW_COPYFILES, // CopyFiles: 3 [source mask, destination location, flags] - EW_REBOOT, // Reboot: 0 - EW_WRITEINI, // Write INI String: 4, [Section, Name, Value, INI File] - EW_READINISTR, // ReadINIStr: 4 [output, section, name, ini_file] - - // 50 - EW_DELREG, // DeleteRegValue/DeleteRegKey: 4, [root key(int), KeyName, ValueName, delkeyonlyifempty]. ValueName is -1 if delete key - EW_WRITEREG, // Write Registry value: 5, [RootKey(int),KeyName,ItemName,ItemData,typelen] - // typelen=1 for str, 2 for dword, 3 for binary, 0 for expanded str - EW_READREGSTR, // ReadRegStr: 5 [output, rootkey(int), keyname, itemname, ==1?int::str] - EW_REGENUM, // RegEnum: 5 [output, rootkey, keyname, index, ?key:value] - EW_FCLOSE, // FileClose: 1 [handle] - EW_FOPEN, // FileOpen: 4 [name, openmode, createmode, outputhandle] - EW_FPUTS, // FileWrite: 3 [handle, string, ?int:string] - EW_FGETS, // FileRead: 4 [handle, output, maxlen, ?getchar:gets] - EW_FSEEK, // FileSeek: 4 [handle, offset, mode, >=0?positionoutput] - EW_FINDCLOSE, // FindClose: 1 [handle] - - // 60 - EW_FINDNEXT, // FindNext: 2 [output, handle] - EW_FINDFIRST, // FindFirst: 2 [filespec, output, handleoutput] - EW_WRITEUNINSTALLER, // WriteUninstaller: 3 [name, offset, icon_size] - EW_LOG, // LogText: 2 [0, text] / LogSet: [1, logstate] - EW_SECTIONSET, // SectionSetText: 3: [idx, 0, text] - // SectionGetText: 3: [idx, 1, output] - // SectionSetFlags: 3: [idx, 2, flags] - // SectionGetFlags: 3: [idx, 3, output] - EW_INSTTYPESET, // InstTypeSetFlags: 3: [idx, 0, flags] - // InstTypeGetFlags: 3: [idx, 1, output] - // instructions not actually implemented in exehead, but used in compiler. - EW_GETLABELADDR, // both of these get converted to EW_ASSIGNVAR - EW_GETFUNCTIONADDR, - - EW_LOCKWINDOW -}; - -#ifdef NSIS_SCRIPT -static CCommandPair kCommandPairs[] = -{ - { 0, "Invalid" }, - { 0, "Return" }, - { 1, "Goto" }, - { 0, "Abort" }, - { 0, "Quit" }, - { 1, "Call" }, - { 2, "UpdateSatusText" }, - { 1, "Sleep" }, - { 0, "BringToFront" }, - { 2, "SetDetailsView" }, - - { 2, "SetFileAttributes" }, - { 2, "SetOutPath" }, - { 3, "IfFileExists" }, - { 2, "SetFlag" }, - { 4, "IfFlag" }, - { 2, "GetFlag" }, - { 3, "Rename" }, - { 2, "GetFullPathName" }, - { 2, "SearchPath" }, - { 2, "GetTempFileName" }, - - { 6, "File" }, - { 2, "Delete" }, - { 5, "MessageBox" }, - { 2, "RMDir" }, - { 2, "StrLen" }, - { 4, "StrCpy" }, - { 5, "StrCmp" }, - { 3, "ReadEnvStr" }, - { 6, "IntCmp" }, - { 4, "IntOp" }, - - { 3, "IntFmt" }, - { 3, "PushPop" }, - { 5, "FindWindow" }, - { 6, "SendMessage" }, - { 3, "IsWindow" }, - { 3, "GetDlgItem" }, - { 3, "SerCtlColors" }, - { 1, "SetBrandingImage" }, - { 5, "CreateFont" }, - { 2, "ShowWindow" }, - - { 4, "ShellExecute" }, - { 3, "Execute" }, - { 3, "GetFileTime" }, - { 3, "GetDLLVersion" }, - { 3, "RegisterDLL" }, - { 5, "CreateShortCut" }, - { 3, "CopyFiles" }, - { 0, "Reboot" }, - { 4, "WriteINIStr" }, - { 4, "ReadINIStr" }, - - { 4, "DelReg" }, - { 5, "WriteReg" }, - { 5, "ReadRegStr" }, - { 5, "RegEnum" }, - { 1, "FileClose" }, - { 4, "FileOpen" }, - { 3, "FileWrite" }, - { 4, "FileRead" }, - { 4, "FileSeek" }, - { 1, "FindClose" }, - - { 2, "FindNext" }, - { 2, "FindFirst" }, - { 3, "WriteUninstaller" }, - { 2, "LogText" }, - { 3, "Section?etText" }, - { 3, "InstType?etFlags" }, - { 6, "GetLabelAddr" }, - { 2, "GetFunctionAddress" }, - { 6, "LockWindow" } -}; - -#endif - -static const char *kShellStrings[] = -{ - "", - "", - - "SMPROGRAMS", - "", - "PRINTERS", - "DOCUMENTS", - "FAVORITES", - "SMSTARTUP", - "RECENT", - "SENDTO", - "", - "STARTMENU", - "", - "MUSIC", - "VIDEO", - "", - - "DESKTOP", - "", - "", - "NETHOOD", - "FONTS", - "TEMPLATES", - "COMMONSTARTMENU", - "COMMONFILES", - "COMMON_STARTUP", - "COMMON_DESKTOPDIRECTORY", - "QUICKLAUNCH", - "PRINTHOOD", - "LOCALAPPDATA", - "ALTSTARTUP", - "ALTSTARTUP", - "FAVORITES", - - "INTERNET_CACHE", - "COOKIES", - "HISTORY", - "APPDATA", - "WINDIR", - "SYSDIR", - "PROGRAMFILES", - "PICTURES", - "PROFILE", - "", - "", - "COMMONFILES", - "", - "TEMPLATES", - "DOCUMENTS", - "ADMINTOOLS", - - "ADMINTOOLS", - "", - "", - "", - "", - "MUSIC", - "PICTURES", - "VIDEO", - "RESOURCES", - "RESOURCES_LOCALIZED", - "", - "CDBURN_AREA" -}; - -static const int kNumShellStrings = sizeof(kShellStrings) / sizeof(kShellStrings[0]); - -/* -# define CMDLINE 20 // everything before here doesn't have trailing slash removal -# define INSTDIR 21 -# define OUTDIR 22 -# define EXEDIR 23 -# define LANGUAGE 24 -# define TEMP 25 -# define PLUGINSDIR 26 -# define HWNDPARENT 27 -# define _CLICK 28 -# define _OUTDIR 29 -*/ - -static const char *kVarStrings[] = -{ - "CMDLINE", - "INSTDIR", - "OUTDIR", - "EXEDIR", - "LANGUAGE", - "TEMP", - "PLUGINSDIR", - "EXEPATH", // test it - "EXEFILE", // test it - "HWNDPARENT", - "_CLICK", - "_OUTDIR" -}; - -static const int kNumVarStrings = sizeof(kVarStrings) / sizeof(kVarStrings[0]); - - -static AString GetVar(UInt32 index) -{ - AString res = "$"; - if (index < 10) - res += UIntToString(index); - else if (index < 20) - { - res += "R"; - res += UIntToString(index - 10); - } - else if (index < 20 + kNumVarStrings) - res += kVarStrings[index - 20]; - else - { - res += "["; - res += UIntToString(index); - res += "]"; - } - return res; -} - -#define NS_SKIP_CODE 252 -#define NS_VAR_CODE 253 -#define NS_SHELL_CODE 254 -#define NS_LANG_CODE 255 -#define NS_CODES_START NS_SKIP_CODE - -static AString GetShellString(int index) -{ - AString res = "$"; - if (index < kNumShellStrings) - { - const char *sz = kShellStrings[index]; - if (sz[0] != 0) - return res + sz; - } - res += "SHELL["; - res += UIntToString(index); - res += "]"; - return res; -} - -// Based on Dave Laundon's simplified process_string -AString GetNsisString(const AString &s) -{ - AString res; - for (int i = 0; i < s.Length();) - { - unsigned char nVarIdx = s[i++]; - if (nVarIdx > NS_CODES_START && i + 2 <= s.Length()) - { - int nData = s[i++] & 0x7F; - unsigned char c1 = s[i++]; - nData |= (((int)(c1 & 0x7F)) << 7); - - if (nVarIdx == NS_SHELL_CODE) - res += GetShellString(c1); - else if (nVarIdx == NS_VAR_CODE) - res += GetVar(nData); - else if (nVarIdx == NS_LANG_CODE) - res += "NS_LANG_CODE"; - } - else if (nVarIdx == NS_SKIP_CODE) - { - if (i < s.Length()) - res += s[i++]; - } - else // Normal char - res += (char)nVarIdx; - } - return res; -} - -UString GetNsisString(const UString &s) -{ - UString res; - for (int i = 0; i < s.Length();) - { - wchar_t nVarIdx = s[i++]; - if (nVarIdx > NS_UN_CODES_START && nVarIdx <= NS_UN_CODES_END) - { - if (i == s.Length()) - break; - int nData = s[i++] & 0x7FFF; - - if (nVarIdx == NS_UN_SHELL_CODE) - res += GetUnicodeString(GetShellString(nData >> 8)); - else if (nVarIdx == NS_UN_VAR_CODE) - res += GetUnicodeString(GetVar(nData)); - else if (nVarIdx == NS_UN_LANG_CODE) - res += L"NS_LANG_CODE"; - } - else if (nVarIdx == NS_UN_SKIP_CODE) - { - if (i == s.Length()) - break; - res += s[i++]; - } - else // Normal char - res += (char)nVarIdx; - } - return res; -} - -AString CInArchive::ReadString2A(UInt32 pos) const -{ - return GetNsisString(ReadStringA(pos)); -} - -UString CInArchive::ReadString2U(UInt32 pos) const -{ - return GetNsisString(ReadStringU(pos)); -} - -AString CInArchive::ReadString2(UInt32 pos) const -{ - if (IsUnicode) - return UnicodeStringToMultiByte(ReadString2U(pos)); - else - return ReadString2A(pos); -} - -AString CInArchive::ReadString2Qw(UInt32 pos) const -{ - return "\"" + ReadString2(pos) + "\""; -} - -#define DEL_DIR 1 -#define DEL_RECURSE 2 -#define DEL_REBOOT 4 -// #define DEL_SIMPLE 8 - -static const int kNumEntryParams = 6; - -struct CEntry -{ - UInt32 Which; - UInt32 Params[kNumEntryParams]; - AString GetParamsString(int numParams); - CEntry() - { - Which = 0; - for (UInt32 j = 0; j < kNumEntryParams; j++) - Params[j] = 0; - } -}; - -AString CEntry::GetParamsString(int numParams) -{ - AString s; - for (int i = 0; i < numParams; i++) - { - s += " "; - UInt32 v = Params[i]; - if (v > 0xFFF00000) - s += IntToString((Int32)Params[i]); - else - s += UIntToString(Params[i]); - } - return s; -} - -#ifdef NSIS_SCRIPT - -static AString GetRegRootID(UInt32 val) -{ - const char *s; - switch(val) - { - case 0: s = "SHCTX"; break; - case 0x80000000: s = "HKCR"; break; - case 0x80000001: s = "HKCU"; break; - case 0x80000002: s = "HKLM"; break; - case 0x80000003: s = "HKU"; break; - case 0x80000004: s = "HKPD"; break; - case 0x80000005: s = "HKCC"; break; - case 0x80000006: s = "HKDD"; break; - case 0x80000050: s = "HKPT"; break; - case 0x80000060: s = "HKPN"; break; - default: - return UIntToString(val); break; - } - return s; -} - -#endif - -HRESULT CInArchive::ReadEntries(const CBlockHeader &bh) -{ - _posInData = bh.Offset + GetOffset(); - AString prefixA; - UString prefixU; - for (UInt32 i = 0; i < bh.Num; i++) - { - CEntry e; - e.Which = ReadUInt32(); - for (UInt32 j = 0; j < kNumEntryParams; j++) - e.Params[j] = ReadUInt32(); - #ifdef NSIS_SCRIPT - if (e.Which != EW_PUSHPOP && e.Which < sizeof(kCommandPairs) / sizeof(kCommandPairs[0])) - { - const CCommandPair &pair = kCommandPairs[e.Which]; - Script += pair.Name; - } - #endif - - switch (e.Which) - { - case EW_CREATEDIR: - { - if (IsUnicode) - { - prefixU.Empty(); - prefixU = ReadString2U(e.Params[0]); - } - else - { - prefixA.Empty(); - prefixA = ReadString2A(e.Params[0]); - } - #ifdef NSIS_SCRIPT - Script += " "; - if (IsUnicode) - Script += UnicodeStringToMultiByte(prefixU); - else - Script += prefixA; - #endif - break; - } - - case EW_EXTRACTFILE: - { - CItem item; - item.IsUnicode = IsUnicode; - if (IsUnicode) - { - item.PrefixU = prefixU; - item.NameU = ReadString2U(e.Params[1]); - } - else - { - item.PrefixA = prefixA; - item.NameA = ReadString2A(e.Params[1]); - } - /* UInt32 overwriteFlag = e.Params[0]; */ - item.Pos = e.Params[2]; - item.MTime.dwLowDateTime = e.Params[3]; - item.MTime.dwHighDateTime = e.Params[4]; - /* UInt32 allowIgnore = e.Params[5]; */ - if (Items.Size() > 0) - { - /* - if (item.Pos == Items.Back().Pos) - continue; - */ - } - Items.Add(item); - #ifdef NSIS_SCRIPT - Script += " "; - - if (IsUnicode) - Script += UnicodeStringToMultiByte(item.NameU); - else - Script += item.NameA; - #endif - break; - } - - - #ifdef NSIS_SCRIPT - case EW_UPDATETEXT: - { - Script += " "; - Script += ReadString2(e.Params[0]); - Script += " "; - Script += UIntToString(e.Params[1]); - break; - } - case EW_SETFILEATTRIBUTES: - { - Script += " "; - Script += ReadString2(e.Params[0]); - Script += " "; - Script += UIntToString(e.Params[1]); - break; - } - case EW_IFFILEEXISTS: - { - Script += " "; - Script += ReadString2(e.Params[0]); - Script += " "; - Script += UIntToString(e.Params[1]); - Script += " "; - Script += UIntToString(e.Params[2]); - break; - } - case EW_RENAME: - { - Script += " "; - Script += ReadString2(e.Params[0]); - Script += " "; - Script += ReadString2(e.Params[1]); - Script += " "; - Script += UIntToString(e.Params[2]); - break; - } - case EW_GETFULLPATHNAME: - { - Script += " "; - Script += ReadString2(e.Params[0]); - Script += " "; - Script += ReadString2(e.Params[1]); - Script += " "; - Script += UIntToString(e.Params[2]); - break; - } - case EW_SEARCHPATH: - { - Script += " "; - Script += ReadString2(e.Params[0]); - Script += " "; - Script += ReadString2(e.Params[1]); - break; - } - case EW_GETTEMPFILENAME: - { - AString s; - Script += " "; - Script += ReadString2(e.Params[0]); - Script += " "; - Script += ReadString2(e.Params[1]); - break; - } - - case EW_DELETEFILE: - { - UInt64 flag = e.Params[1]; - if (flag != 0) - { - Script += " "; - if (flag == DEL_REBOOT) - Script += "/REBOOTOK"; - else - Script += UIntToString(e.Params[1]); - } - Script += " "; - Script += ReadString2(e.Params[0]); - break; - } - case EW_RMDIR: - { - UInt64 flag = e.Params[1]; - if (flag != 0) - { - if ((flag & DEL_REBOOT) != 0) - Script += " /REBOOTOK"; - if ((flag & DEL_RECURSE) != 0) - Script += " /r"; - } - Script += " "; - Script += ReadString2(e.Params[0]); - break; - } - case EW_STRLEN: - { - Script += " "; - Script += GetVar(e.Params[0]);; - Script += " "; - Script += ReadString2Qw(e.Params[1]); - break; - } - case EW_ASSIGNVAR: - { - Script += " "; - Script += GetVar(e.Params[0]);; - Script += " "; - Script += ReadString2Qw(e.Params[1]); - AString maxLen, startOffset; - if (e.Params[2] != 0) - maxLen = ReadString2(e.Params[2]); - if (e.Params[3] != 0) - startOffset = ReadString2(e.Params[3]); - if (!maxLen.IsEmpty() || !startOffset.IsEmpty()) - { - Script += " "; - if (maxLen.IsEmpty()) - Script += "\"\""; - else - Script += maxLen; - if (!startOffset.IsEmpty()) - { - Script += " "; - Script += startOffset; - } - } - break; - } - case EW_STRCMP: - { - Script += " "; - - Script += " "; - Script += ReadString2Qw(e.Params[0]); - - Script += " "; - Script += ReadString2Qw(e.Params[1]); - - for (int j = 2; j < 5; j++) - { - Script += " "; - Script += UIntToString(e.Params[j]); - } - break; - } - case EW_INTCMP: - { - if (e.Params[5] != 0) - Script += "U"; - - Script += " "; - Script += ReadString2(e.Params[0]); - Script += " "; - Script += ReadString2(e.Params[1]); - - for (int i = 2; i < 5; i++) - { - Script += " "; - Script += UIntToString(e.Params[i]); - } - break; - } - case EW_INTOP: - { - Script += " "; - Script += GetVar(e.Params[0]); - Script += " "; - int numOps = 2; - AString op; - switch (e.Params[3]) - { - case 0: op = '+'; break; - case 1: op = '-'; break; - case 2: op = '*'; break; - case 3: op = '/'; break; - case 4: op = '|'; break; - case 5: op = '&'; break; - case 6: op = '^'; break; - case 7: op = '~'; numOps = 1; break; - case 8: op = '!'; numOps = 1; break; - case 9: op = "||"; break; - case 10: op = "&&"; break; - case 11: op = '%'; break; - default: op = UIntToString(e.Params[3]); - } - AString p1 = ReadString2(e.Params[1]); - if (numOps == 1) - { - Script += op; - Script += p1; - } - else - { - Script += p1; - Script += " "; - Script += op; - Script += " "; - Script += ReadString2(e.Params[2]); - } - break; - } - - case EW_PUSHPOP: - { - int isPop = (e.Params[1] != 0); - if (isPop) - { - Script += "Pop"; - Script += " "; - Script += GetVar(e.Params[0]);; - } - else - { - int isExch = (e.Params[2] != 0); - if (isExch) - { - Script += "Exch"; - } - else - { - Script += "Push"; - Script += " "; - Script += ReadString2(e.Params[0]); - } - } - break; - } - - case EW_SENDMESSAGE: - { - // SendMessage: 6 [output, hwnd, msg, wparam, lparam, [wparamstring?1:0 | lparamstring?2:0 | timeout<<2] - Script += " "; - // Script += ReadString2(e.Params[0]); - // Script += " "; - Script += ReadString2(e.Params[1]); - Script += " "; - Script += ReadString2(e.Params[2]); - - Script += " "; - UInt32 spec = e.Params[5]; - // if (spec & 1) - Script += IntToString(e.Params[3]); - // else - // Script += ReadString2(e.Params[3]); - - Script += " "; - // if (spec & 2) - Script += IntToString(e.Params[4]); - // else - // Script += ReadString2(e.Params[4]); - - if ((Int32)e.Params[0] >= 0) - { - Script += " "; - Script += GetVar(e.Params[1]); - } - - spec >>= 2; - if (spec != 0) - { - Script += " /TIMEOUT="; - Script += IntToString(spec); - } - break; - } - - case EW_GETDLGITEM: - { - Script += " "; - Script += GetVar(e.Params[0]);; - Script += " "; - Script += ReadString2(e.Params[1]); - Script += " "; - Script += ReadString2(e.Params[2]); - break; - } - - - case EW_REGISTERDLL: - { - Script += " "; - Script += ReadString2(e.Params[0]); - Script += " "; - Script += ReadString2(e.Params[1]); - Script += " "; - Script += UIntToString(e.Params[2]); - break; - } - - case EW_CREATESHORTCUT: - { - AString s; - - Script += " "; - Script += ReadString2Qw(e.Params[0]); - - Script += " "; - Script += ReadString2Qw(e.Params[1]); - - for (int j = 2; j < 5; j++) - { - Script += " "; - Script += UIntToString(e.Params[j]); - } - break; - } - - /* - case EW_DELREG: - { - AString keyName, valueName; - keyName = ReadString2(e.Params[1]); - bool isValue = (e.Params[2] != -1); - if (isValue) - { - valueName = ReadString2(e.Params[2]); - Script += "Key"; - } - else - Script += "Value"; - Script += " "; - Script += UIntToString(e.Params[0]); - Script += " "; - Script += keyName; - if (isValue) - { - Script += " "; - Script += valueName; - } - Script += " "; - Script += UIntToString(e.Params[3]); - break; - } - */ - - case EW_WRITEREG: - { - AString s; - switch(e.Params[4]) - { - case 1: s = "Str"; break; - case 2: s = "ExpandStr"; break; - case 3: s = "Bin"; break; - case 4: s = "DWORD"; break; - default: s = "?" + UIntToString(e.Params[4]); break; - } - Script += s; - Script += " "; - Script += GetRegRootID(e.Params[0]); - Script += " "; - - AString keyName, valueName; - keyName = ReadString2Qw(e.Params[1]); - Script += keyName; - Script += " "; - - valueName = ReadString2Qw(e.Params[2]); - Script += valueName; - Script += " "; - - valueName = ReadString2Qw(e.Params[3]); - Script += valueName; - Script += " "; - - break; - } - - case EW_WRITEUNINSTALLER: - { - Script += " "; - Script += ReadString2(e.Params[0]); - for (int j = 1; j < 3; j++) - { - Script += " "; - Script += UIntToString(e.Params[j]); - } - break; - } - - default: - { - int numParams = kNumEntryParams; - if (e.Which < sizeof(kCommandPairs) / sizeof(kCommandPairs[0])) - { - const CCommandPair &pair = kCommandPairs[e.Which]; - // Script += pair.Name; - numParams = pair.NumParams; - } - else - { - Script += "Unknown"; - Script += UIntToString(e.Which); - } - Script += e.GetParamsString(numParams); - } - #endif - } - #ifdef NSIS_SCRIPT - Script += kCrLf; - #endif - } - - { - Items.Sort(CompareItems, 0); - int i; - // if (IsSolid) - for (i = 0; i + 1 < Items.Size();) - { - bool sameName = IsUnicode ? - (Items[i].NameU == Items[i + 1].NameU) : - (Items[i].NameA == Items[i + 1].NameA); - if (Items[i].Pos == Items[i + 1].Pos && sameName) - Items.Delete(i + 1); - else - i++; - } - for (i = 0; i < Items.Size(); i++) - { - CItem &item = Items[i]; - UInt32 curPos = item.Pos + 4; - for (int nextIndex = i + 1; nextIndex < Items.Size(); nextIndex++) - { - UInt32 nextPos = Items[nextIndex].Pos; - if (curPos <= nextPos) - { - item.EstimatedSizeIsDefined = true; - item.EstimatedSize = nextPos - curPos; - break; - } - } - } - if (!IsSolid) - { - for (i = 0; i < Items.Size(); i++) - { - CItem &item = Items[i]; - RINOK(_stream->Seek(GetPosOfNonSolidItem(i), STREAM_SEEK_SET, NULL)); - const UInt32 kSigSize = 4 + 1 + 5; - BYTE sig[kSigSize]; - size_t processedSize = kSigSize; - RINOK(ReadStream(_stream, sig, &processedSize)); - if (processedSize < 4) - return S_FALSE; - UInt32 size = Get32(sig); - if ((size & 0x80000000) != 0) - { - item.IsCompressed = true; - // is compressed; - size &= ~0x80000000; - if (Method == NMethodType::kLZMA) - { - if (processedSize < 9) - return S_FALSE; - if (FilterFlag) - item.UseFilter = (sig[4] != 0); - item.DictionarySize = Get32(sig + 5 + (FilterFlag ? 1 : 0)); - } - } - else - { - item.IsCompressed = false; - item.Size = size; - item.SizeIsDefined = true; - } - item.CompressedSize = size; - item.CompressedSizeIsDefined = true; - } - } - } - return S_OK; -} - -HRESULT CInArchive::Parse() -{ - // UInt32 offset = ReadUInt32(); - // ???? offset == FirstHeader.HeaderLength - /* UInt32 ehFlags = */ ReadUInt32(); - CBlockHeader bhPages, bhSections, bhEntries, bhStrings, bhLangTables, bhCtlColors, bhData; - // CBlockHeader bgFont; - ReadBlockHeader(bhPages); - ReadBlockHeader(bhSections); - ReadBlockHeader(bhEntries); - ReadBlockHeader(bhStrings); - ReadBlockHeader(bhLangTables); - ReadBlockHeader(bhCtlColors); - // ReadBlockHeader(bgFont); - ReadBlockHeader(bhData); - - _stringsPos = bhStrings.Offset; - UInt32 pos = GetOffset() + _stringsPos; - int numZeros0 = 0; - int numZeros1 = 0; - int i; - const int kBlockSize = 256; - for (i = 0; i < kBlockSize; i++) - { - if (pos >= _size || pos + 1 >= _size) - break; - char c0 = _data[pos++]; - char c1 = _data[pos++]; - wchar_t c = (c0 | ((wchar_t)c1 << 8)); - - if (c >= NS_UN_CODES_START && c < NS_UN_CODES_END) - { - if (pos >= _size || pos + 1 >= _size) - break; - pos += 2; - numZeros1++; - } - else - { - if (c0 == 0 && c1 != 0) - numZeros0++; - if (c1 == 0) - numZeros1++; - } - // printf("\nnumZeros0 = %2x %2x", _data[pos + 0], _data[pos + 1]); - } - IsUnicode = (numZeros1 > numZeros0 * 3 + kBlockSize / 16); - // printf("\nnumZeros0 = %3d numZeros1 = %3d", numZeros0, numZeros1); - return ReadEntries(bhEntries); -} - -static bool IsLZMA(const Byte *p, UInt32 &dictionary) -{ - dictionary = Get32(p + 1); - return (p[0] == 0x5D && p[1] == 0x00 && p[2] == 0x00 && p[5] == 0x00); -} - -static bool IsLZMA(const Byte *p, UInt32 &dictionary, bool &thereIsFlag) -{ - if (IsLZMA(p, dictionary)) - { - thereIsFlag = false; - return true; - } - if (IsLZMA(p + 1, dictionary)) - { - thereIsFlag = true; - return true; - } - return false; -} - -static bool IsBZip2(const Byte *p) -{ - return (p[0] == 0x31 && p[1] < 14); -} - -HRESULT CInArchive::Open2( - DECL_EXTERNAL_CODECS_LOC_VARS2 - ) -{ - RINOK(_stream->Seek(0, STREAM_SEEK_CUR, &StreamOffset)); - - const UInt32 kSigSize = 4 + 1 + 5 + 1; // size, flag, lzma props, lzma first byte - BYTE sig[kSigSize]; - RINOK(ReadStream_FALSE(_stream, sig, kSigSize)); - UInt64 position; - RINOK(_stream->Seek(StreamOffset, STREAM_SEEK_SET, &position)); - - _headerIsCompressed = true; - IsSolid = true; - FilterFlag = false; - DictionarySize = 1; - - UInt32 compressedHeaderSize = Get32(sig); - - if (compressedHeaderSize == FirstHeader.HeaderLength) - { - _headerIsCompressed = false; - IsSolid = false; - Method = NMethodType::kCopy; - } - else if (IsLZMA(sig, DictionarySize, FilterFlag)) - { - Method = NMethodType::kLZMA; - } - else if (IsLZMA(sig + 4, DictionarySize, FilterFlag)) - { - IsSolid = false; - Method = NMethodType::kLZMA; - } - else if (sig[3] == 0x80) - { - IsSolid = false; - if (IsBZip2(sig + 4)) - Method = NMethodType::kBZip2; - else - Method = NMethodType::kDeflate; - } - else if (IsBZip2(sig)) - { - Method = NMethodType::kBZip2; - } - else - { - Method = NMethodType::kDeflate; - } - - _posInData = 0; - if (!IsSolid) - { - _headerIsCompressed = ((compressedHeaderSize & 0x80000000) != 0); - if (_headerIsCompressed) - compressedHeaderSize &= ~0x80000000; - _nonSolidStartOffset = compressedHeaderSize; - RINOK(_stream->Seek(StreamOffset + 4, STREAM_SEEK_SET, NULL)); - } - UInt32 unpackSize = FirstHeader.HeaderLength; - if (_headerIsCompressed) - { - // unpackSize = (1 << 23); - _data.SetCapacity(unpackSize); - RINOK(Decoder.Init( - EXTERNAL_CODECS_LOC_VARS - _stream, Method, FilterFlag, UseFilter)); - size_t processedSize = unpackSize; - RINOK(Decoder.Read(_data, &processedSize)); - if (processedSize != unpackSize) - return S_FALSE; - _size = processedSize; - if (IsSolid) - { - UInt32 size2 = ReadUInt32(); - if (size2 < _size) - _size = size2; - } - } - else - { - _data.SetCapacity(unpackSize); - _size = (size_t)unpackSize; - RINOK(ReadStream_FALSE(_stream, (Byte *)_data, unpackSize)); - } - return Parse(); -} - -/* -NsisExe = -{ - ExeStub - Archive // must start from 512 * N - #ifndef NSIS_CONFIG_CRC_ANAL - { - Some additional data - } -} - -Archive -{ - FirstHeader - Data - #ifdef NSIS_CONFIG_CRC_SUPPORT && FirstHeader.ThereIsCrc() - { - CRC - } -} - -FirstHeader -{ - UInt32 Flags; - Byte Signature[16]; - // points to the header+sections+entries+stringtable in the datablock - UInt32 HeaderLength; - UInt32 ArchiveSize; -} -*/ - -HRESULT CInArchive::Open( - DECL_EXTERNAL_CODECS_LOC_VARS - IInStream *inStream, const UInt64 *maxCheckStartPosition) -{ - Clear(); - RINOK(inStream->Seek(0, STREAM_SEEK_SET, NULL)); - UInt64 maxSize = ((maxCheckStartPosition != 0) ? *maxCheckStartPosition : 0); - const UInt32 kStep = 512; - Byte buffer[kStep]; - - UInt64 position = 0; - for (; position <= maxSize; position += kStep) - { - RINOK(ReadStream_FALSE(inStream, buffer, kStep)); - if (memcmp(buffer + 4, kSignature, kSignatureSize) == 0) - break; - } - if (position > maxSize) - return S_FALSE; - const UInt32 kStartHeaderSize = 4 * 7; - RINOK(inStream->Seek(0, STREAM_SEEK_END, &_archiveSize)); - RINOK(inStream->Seek(position + kStartHeaderSize, STREAM_SEEK_SET, 0)); - FirstHeader.Flags = Get32(buffer); - FirstHeader.HeaderLength = Get32(buffer + kSignatureSize + 4); - FirstHeader.ArchiveSize = Get32(buffer + kSignatureSize + 8); - if (_archiveSize - position < FirstHeader.ArchiveSize) - return S_FALSE; - - try - { - _stream = inStream; - HRESULT res = Open2(EXTERNAL_CODECS_LOC_VARS2); - if (res != S_OK) - Clear(); - _stream.Release(); - return res; - } - catch(...) { Clear(); return S_FALSE; } -} - -void CInArchive::Clear() -{ - #ifdef NSIS_SCRIPT - Script.Empty(); - #endif - Items.Clear(); - _stream.Release(); -} - -}} diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisIn.h b/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisIn.h deleted file mode 100644 index 87ae3f1ca..000000000 --- a/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisIn.h +++ /dev/null @@ -1,181 +0,0 @@ -// NsisIn.h - -#ifndef __ARCHIVE_NSIS_IN_H -#define __ARCHIVE_NSIS_IN_H - -#include "Common/Buffer.h" -#include "Common/MyCom.h" -#include "Common/StringConvert.h" - -#include "NsisDecode.h" - -// #define NSIS_SCRIPT - -namespace NArchive { -namespace NNsis { - -const int kSignatureSize = 16; -#define NSIS_SIGNATURE { 0xEF, 0xBE, 0xAD, 0xDE, 0x4E, 0x75, 0x6C, 0x6C, 0x73, 0x6F, 0x66, 0x74, 0x49, 0x6E, 0x73, 0x74} - -extern Byte kSignature[kSignatureSize]; - -const UInt32 kFlagsMask = 0xF; -namespace NFlags -{ - const UInt32 kUninstall = 1; - const UInt32 kSilent = 2; - const UInt32 kNoCrc = 4; - const UInt32 kForceCrc = 8; -} - -struct CFirstHeader -{ - UInt32 Flags; - UInt32 HeaderLength; - - UInt32 ArchiveSize; - - bool ThereIsCrc() const - { - if ((Flags & NFlags::kForceCrc ) != 0) - return true; - return ((Flags & NFlags::kNoCrc) == 0); - } - - UInt32 GetDataSize() const { return ArchiveSize - (ThereIsCrc() ? 4 : 0); } -}; - - -struct CBlockHeader -{ - UInt32 Offset; - UInt32 Num; -}; - -struct CItem -{ - AString PrefixA; - UString PrefixU; - AString NameA; - UString NameU; - FILETIME MTime; - bool IsUnicode; - bool UseFilter; - bool IsCompressed; - bool SizeIsDefined; - bool CompressedSizeIsDefined; - bool EstimatedSizeIsDefined; - UInt32 Pos; - UInt32 Size; - UInt32 CompressedSize; - UInt32 EstimatedSize; - UInt32 DictionarySize; - - CItem(): IsUnicode(false), UseFilter(false), IsCompressed(true), SizeIsDefined(false), - CompressedSizeIsDefined(false), EstimatedSizeIsDefined(false), Size(0), DictionarySize(1) {} - - bool IsINSTDIR() const - { - return (PrefixA.Length() >= 3 || PrefixU.Length() >= 3); - } - - UString GetReducedName(bool unicode) const - { - UString s; - if (unicode) - s = PrefixU; - else - s = MultiByteToUnicodeString(PrefixA); - if (s.Length() > 0) - if (s[s.Length() - 1] != L'\\') - s += L'\\'; - if (unicode) - s += NameU; - else - s += MultiByteToUnicodeString(NameA); - const int len = 9; - if (s.Left(len).CompareNoCase(L"$INSTDIR\\") == 0) - s = s.Mid(len); - return s; - } -}; - -class CInArchive -{ - UInt64 _archiveSize; - CMyComPtr<IInStream> _stream; - - Byte ReadByte(); - UInt32 ReadUInt32(); - HRESULT Open2( - DECL_EXTERNAL_CODECS_LOC_VARS2 - ); - void ReadBlockHeader(CBlockHeader &bh); - AString ReadStringA(UInt32 pos) const; - UString ReadStringU(UInt32 pos) const; - AString ReadString2A(UInt32 pos) const; - UString ReadString2U(UInt32 pos) const; - AString ReadString2(UInt32 pos) const; - AString ReadString2Qw(UInt32 pos) const; - HRESULT ReadEntries(const CBlockHeader &bh); - HRESULT Parse(); - - CByteBuffer _data; - UInt64 _size; - - size_t _posInData; - - UInt32 _stringsPos; - - - bool _headerIsCompressed; - UInt32 _nonSolidStartOffset; -public: - HRESULT Open( - DECL_EXTERNAL_CODECS_LOC_VARS - IInStream *inStream, const UInt64 *maxCheckStartPosition); - void Clear(); - - UInt64 StreamOffset; - CDecoder Decoder; - CObjectVector<CItem> Items; - CFirstHeader FirstHeader; - NMethodType::EEnum Method; - UInt32 DictionarySize; - bool IsSolid; - bool UseFilter; - bool FilterFlag; - bool IsUnicode; - - #ifdef NSIS_SCRIPT - AString Script; - #endif - UInt32 GetOffset() const { return IsSolid ? 4 : 0; } - UInt64 GetDataPos(int index) - { - const CItem &item = Items[index]; - return GetOffset() + FirstHeader.HeaderLength + item.Pos; - } - - UInt64 GetPosOfSolidItem(int index) const - { - const CItem &item = Items[index]; - return 4 + FirstHeader.HeaderLength + item.Pos; - } - - UInt64 GetPosOfNonSolidItem(int index) const - { - const CItem &item = Items[index]; - return StreamOffset + _nonSolidStartOffset + 4 + item.Pos; - } - - void Release() - { - Decoder.Release(); - } - -}; - -}} - -#endif diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisRegister.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisRegister.cpp deleted file mode 100644 index 41dedb0d3..000000000 --- a/src/libs/7zip/win/CPP/7zip/Archive/Nsis/NsisRegister.cpp +++ /dev/null @@ -1,13 +0,0 @@ -// NsisRegister.cpp - -#include "StdAfx.h" - -#include "../../Common/RegisterArc.h" - -#include "NsisHandler.h" -static IInArchive *CreateArc() { return new NArchive::NNsis::CHandler; } - -static CArcInfo g_ArcInfo = - { L"Nsis", L"", 0, 0x9, NSIS_SIGNATURE, NArchive::NNsis::kSignatureSize, false, CreateArc, 0 }; - -REGISTER_ARC(Nsis) diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Nsis/StdAfx.h b/src/libs/7zip/win/CPP/7zip/Archive/Nsis/StdAfx.h deleted file mode 100644 index 2e4be10b2..000000000 --- a/src/libs/7zip/win/CPP/7zip/Archive/Nsis/StdAfx.h +++ /dev/null @@ -1,9 +0,0 @@ -// StdAfx.h - -#ifndef __STDAFX_H -#define __STDAFX_H - -#include "../../../Common/MyWindows.h" -#include "../../../Common/NewHandler.h" - -#endif |