📄 nsisin.cpp
字号:
"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",
"HWNDPARENT",
"_CLICK",
"_OUTDIR"
};
static const int kNumVarStrings = sizeof(kVarStrings) / sizeof(kVarStrings[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;
}
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;
}
// $0..$9, $INSTDIR, etc are encoded as ASCII bytes starting from this value.
#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
// 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)
{
UInt32 index = c1;
bool needPrint = true;
res += "$";
if (index < kNumShellStrings)
{
const char *sz = kShellStrings[index];
if (sz[0] != 0)
{
res += sz;
needPrint = false;
}
}
if (needPrint)
{
res += "SHELL[";
res += UIntToString(index);
res += "]";
}
}
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;
}
AString CInArchive::ReadString2(UInt32 pos)
{
return GetNsisString(ReadString(pos));
}
#define DEL_DIR 1
#define DEL_RECURSE 2
#define DEL_REBOOT 4
// #define DEL_SIMPLE 8
const int kNumEntryParams = 6;
struct CEntry
{
UInt32 Which;
UInt32 Params[kNumEntryParams];
AString GetParamsString(int numParams);
};
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;
}
HRESULT CInArchive::ReadEntries(const CBlockHeader &bh)
{
_posInData = bh.Offset + GetOffset();
AString prefix;
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:
{
prefix.Empty();
prefix = ReadString2(e.Params[0]);
#ifdef NSIS_SCRIPT
Script += " ";
Script += prefix;
#endif
break;
}
case EW_EXTRACTFILE:
{
CItem item;
item.Prefix = prefix;
UInt32 overwriteFlag = e.Params[0];
item.Name = ReadString2(e.Params[1]);
item.Pos = e.Params[2];
item.DateTime.dwLowDateTime = e.Params[3];
item.DateTime.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 += " ";
Script += item.Name;
#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_ASSIGNVAR:
{
Script += " ";
Script += GetVar(e.Params[0]);;
Script += " \"";
AString maxLen, startOffset;
Script += ReadString2(e.Params[1]);
Script += "\"";
if (e.Params[2] != 0)
maxLen = ReadString(e.Params[2]);
if (e.Params[3] != 0)
startOffset = ReadString(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 += ReadString2(e.Params[0]);
Script += "\"";
Script += " \"";
Script += ReadString2(e.Params[1]);
Script += "\"";
for (int j = 2; j < 5; j++)
{
Script += " ";
Script += UIntToString(e.Params[j]);
}
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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -