?? nsisin.cpp
字號:
{
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)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -