?? nsisin.cpp
字號:
{
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 && (IsSolid || sameName))
Items.Delete(i + 1);
else
i++;
}
for (i = 0; i + 1 < Items.Size(); i++)
{
CItem &item = Items[i];
item.EstimatedSizeIsDefined = true;
item.EstimatedSize = Items[i + 1].Pos - item.Pos - 4;
}
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;
}
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;
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;
Method = NMethodType::kDeflate;
}
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();
}
}}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -