1*f6dc9357SAndroid Build Coastguard Worker // NsisIn.h 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_ARCHIVE_NSIS_IN_H 4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_ARCHIVE_NSIS_IN_H 5*f6dc9357SAndroid Build Coastguard Worker 6*f6dc9357SAndroid Build Coastguard Worker #include "../../../../C/CpuArch.h" 7*f6dc9357SAndroid Build Coastguard Worker 8*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/DynLimBuf.h" 9*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyBuffer.h" 10*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyCom.h" 11*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringConvert.h" 12*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/UTFConvert.h" 13*f6dc9357SAndroid Build Coastguard Worker 14*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/StreamUtils.h" 15*f6dc9357SAndroid Build Coastguard Worker 16*f6dc9357SAndroid Build Coastguard Worker #include "NsisDecode.h" 17*f6dc9357SAndroid Build Coastguard Worker 18*f6dc9357SAndroid Build Coastguard Worker /* If NSIS_SCRIPT is defined, it will decompile NSIS script to [NSIS].nsi file. 19*f6dc9357SAndroid Build Coastguard Worker The code is much larger in that case. */ 20*f6dc9357SAndroid Build Coastguard Worker 21*f6dc9357SAndroid Build Coastguard Worker // #define NSIS_SCRIPT 22*f6dc9357SAndroid Build Coastguard Worker 23*f6dc9357SAndroid Build Coastguard Worker namespace NArchive { 24*f6dc9357SAndroid Build Coastguard Worker namespace NNsis { 25*f6dc9357SAndroid Build Coastguard Worker 26*f6dc9357SAndroid Build Coastguard Worker const size_t kScriptSizeLimit = 1 << 27; 27*f6dc9357SAndroid Build Coastguard Worker 28*f6dc9357SAndroid Build Coastguard Worker const unsigned kSignatureSize = 16; 29*f6dc9357SAndroid Build Coastguard Worker extern const Byte kSignature[kSignatureSize]; 30*f6dc9357SAndroid Build Coastguard Worker #define NSIS_SIGNATURE { 0xEF, 0xBE, 0xAD, 0xDE, 'N', 'u', 'l', 'l', 's', 'o', 'f', 't', 'I', 'n', 's', 't' } 31*f6dc9357SAndroid Build Coastguard Worker 32*f6dc9357SAndroid Build Coastguard Worker const UInt32 kFlagsMask = 0xF; 33*f6dc9357SAndroid Build Coastguard Worker namespace NFlags 34*f6dc9357SAndroid Build Coastguard Worker { 35*f6dc9357SAndroid Build Coastguard Worker const UInt32 kUninstall = 1; 36*f6dc9357SAndroid Build Coastguard Worker const UInt32 kSilent = 2; 37*f6dc9357SAndroid Build Coastguard Worker const UInt32 kNoCrc = 4; 38*f6dc9357SAndroid Build Coastguard Worker const UInt32 kForceCrc = 8; 39*f6dc9357SAndroid Build Coastguard Worker // NSISBI fork flags: 40*f6dc9357SAndroid Build Coastguard Worker const UInt32 k_BI_LongOffset = 16; 41*f6dc9357SAndroid Build Coastguard Worker const UInt32 k_BI_ExternalFileSupport = 32; 42*f6dc9357SAndroid Build Coastguard Worker const UInt32 k_BI_ExternalFile = 64; 43*f6dc9357SAndroid Build Coastguard Worker const UInt32 k_BI_IsStubInstaller = 128; 44*f6dc9357SAndroid Build Coastguard Worker } 45*f6dc9357SAndroid Build Coastguard Worker 46*f6dc9357SAndroid Build Coastguard Worker struct CFirstHeader 47*f6dc9357SAndroid Build Coastguard Worker { 48*f6dc9357SAndroid Build Coastguard Worker UInt32 Flags; 49*f6dc9357SAndroid Build Coastguard Worker UInt32 HeaderSize; 50*f6dc9357SAndroid Build Coastguard Worker UInt32 ArcSize; 51*f6dc9357SAndroid Build Coastguard Worker ThereIsCrcCFirstHeader52*f6dc9357SAndroid Build Coastguard Worker bool ThereIsCrc() const 53*f6dc9357SAndroid Build Coastguard Worker { 54*f6dc9357SAndroid Build Coastguard Worker return 55*f6dc9357SAndroid Build Coastguard Worker (Flags & NFlags::kForceCrc) != 0 || 56*f6dc9357SAndroid Build Coastguard Worker (Flags & NFlags::kNoCrc) == 0; 57*f6dc9357SAndroid Build Coastguard Worker } 58*f6dc9357SAndroid Build Coastguard Worker GetDataSizeCFirstHeader59*f6dc9357SAndroid Build Coastguard Worker UInt32 GetDataSize() const { return ArcSize - (ThereIsCrc() ? 4 : 0); } 60*f6dc9357SAndroid Build Coastguard Worker }; 61*f6dc9357SAndroid Build Coastguard Worker 62*f6dc9357SAndroid Build Coastguard Worker 63*f6dc9357SAndroid Build Coastguard Worker struct CBlockHeader 64*f6dc9357SAndroid Build Coastguard Worker { 65*f6dc9357SAndroid Build Coastguard Worker UInt32 Offset; 66*f6dc9357SAndroid Build Coastguard Worker UInt32 Num; 67*f6dc9357SAndroid Build Coastguard Worker 68*f6dc9357SAndroid Build Coastguard Worker void Parse(const Byte *p, unsigned bhoSize); 69*f6dc9357SAndroid Build Coastguard Worker }; 70*f6dc9357SAndroid Build Coastguard Worker 71*f6dc9357SAndroid Build Coastguard Worker struct CItem 72*f6dc9357SAndroid Build Coastguard Worker { 73*f6dc9357SAndroid Build Coastguard Worker bool IsEmptyFile; 74*f6dc9357SAndroid Build Coastguard Worker bool IsCompressed; 75*f6dc9357SAndroid Build Coastguard Worker bool Size_Defined; 76*f6dc9357SAndroid Build Coastguard Worker bool CompressedSize_Defined; 77*f6dc9357SAndroid Build Coastguard Worker bool EstimatedSize_Defined; 78*f6dc9357SAndroid Build Coastguard Worker bool Attrib_Defined; 79*f6dc9357SAndroid Build Coastguard Worker bool IsUninstaller; 80*f6dc9357SAndroid Build Coastguard Worker // bool UseFilter; 81*f6dc9357SAndroid Build Coastguard Worker 82*f6dc9357SAndroid Build Coastguard Worker UInt32 Attrib; 83*f6dc9357SAndroid Build Coastguard Worker UInt32 Pos; // = 0, if (IsEmptyFile == true) 84*f6dc9357SAndroid Build Coastguard Worker UInt32 Size; 85*f6dc9357SAndroid Build Coastguard Worker UInt32 CompressedSize; 86*f6dc9357SAndroid Build Coastguard Worker UInt32 EstimatedSize; 87*f6dc9357SAndroid Build Coastguard Worker UInt32 DictionarySize; 88*f6dc9357SAndroid Build Coastguard Worker UInt32 PatchSize; // for Uninstaller.exe 89*f6dc9357SAndroid Build Coastguard Worker int Prefix; // - 1 means no prefix 90*f6dc9357SAndroid Build Coastguard Worker 91*f6dc9357SAndroid Build Coastguard Worker FILETIME MTime; 92*f6dc9357SAndroid Build Coastguard Worker AString NameA; 93*f6dc9357SAndroid Build Coastguard Worker UString NameU; 94*f6dc9357SAndroid Build Coastguard Worker Is_PatchedUninstallerCItem95*f6dc9357SAndroid Build Coastguard Worker bool Is_PatchedUninstaller() const { return PatchSize != 0; } 96*f6dc9357SAndroid Build Coastguard Worker CItemCItem97*f6dc9357SAndroid Build Coastguard Worker CItem(): 98*f6dc9357SAndroid Build Coastguard Worker IsEmptyFile(false), 99*f6dc9357SAndroid Build Coastguard Worker IsCompressed(true), 100*f6dc9357SAndroid Build Coastguard Worker Size_Defined(false), 101*f6dc9357SAndroid Build Coastguard Worker CompressedSize_Defined(false), 102*f6dc9357SAndroid Build Coastguard Worker EstimatedSize_Defined(false), 103*f6dc9357SAndroid Build Coastguard Worker Attrib_Defined(false), 104*f6dc9357SAndroid Build Coastguard Worker IsUninstaller(false), 105*f6dc9357SAndroid Build Coastguard Worker // UseFilter(false), 106*f6dc9357SAndroid Build Coastguard Worker Attrib(0), 107*f6dc9357SAndroid Build Coastguard Worker Pos(0), 108*f6dc9357SAndroid Build Coastguard Worker Size(0), 109*f6dc9357SAndroid Build Coastguard Worker CompressedSize(0), 110*f6dc9357SAndroid Build Coastguard Worker EstimatedSize(0), 111*f6dc9357SAndroid Build Coastguard Worker DictionarySize(1), 112*f6dc9357SAndroid Build Coastguard Worker PatchSize(0), 113*f6dc9357SAndroid Build Coastguard Worker Prefix(-1) 114*f6dc9357SAndroid Build Coastguard Worker { 115*f6dc9357SAndroid Build Coastguard Worker MTime.dwLowDateTime = 0; 116*f6dc9357SAndroid Build Coastguard Worker MTime.dwHighDateTime = 0; 117*f6dc9357SAndroid Build Coastguard Worker } 118*f6dc9357SAndroid Build Coastguard Worker 119*f6dc9357SAndroid Build Coastguard Worker /* 120*f6dc9357SAndroid Build Coastguard Worker bool IsINSTDIR() const 121*f6dc9357SAndroid Build Coastguard Worker { 122*f6dc9357SAndroid Build Coastguard Worker return (PrefixA.Len() >= 3 || PrefixU.Len() >= 3); 123*f6dc9357SAndroid Build Coastguard Worker } 124*f6dc9357SAndroid Build Coastguard Worker */ 125*f6dc9357SAndroid Build Coastguard Worker }; 126*f6dc9357SAndroid Build Coastguard Worker 127*f6dc9357SAndroid Build Coastguard Worker enum ENsisType 128*f6dc9357SAndroid Build Coastguard Worker { 129*f6dc9357SAndroid Build Coastguard Worker k_NsisType_Nsis2, 130*f6dc9357SAndroid Build Coastguard Worker k_NsisType_Nsis3, 131*f6dc9357SAndroid Build Coastguard Worker k_NsisType_Park1, // Park 2.46.1- 132*f6dc9357SAndroid Build Coastguard Worker k_NsisType_Park2, // Park 2.46.2 : GetFontVersion 133*f6dc9357SAndroid Build Coastguard Worker k_NsisType_Park3 // Park 2.46.3+ : GetFontName 134*f6dc9357SAndroid Build Coastguard Worker }; 135*f6dc9357SAndroid Build Coastguard Worker 136*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT 137*f6dc9357SAndroid Build Coastguard Worker 138*f6dc9357SAndroid Build Coastguard Worker struct CSection 139*f6dc9357SAndroid Build Coastguard Worker { 140*f6dc9357SAndroid Build Coastguard Worker UInt32 InstallTypes; // bits set for each of the different install_types, if any. 141*f6dc9357SAndroid Build Coastguard Worker UInt32 Flags; // SF_* - defined above 142*f6dc9357SAndroid Build Coastguard Worker UInt32 StartCmdIndex; // code; 143*f6dc9357SAndroid Build Coastguard Worker UInt32 NumCommands; // code_size; 144*f6dc9357SAndroid Build Coastguard Worker UInt32 SizeKB; 145*f6dc9357SAndroid Build Coastguard Worker UInt32 Name; 146*f6dc9357SAndroid Build Coastguard Worker 147*f6dc9357SAndroid Build Coastguard Worker void Parse(const Byte *data); 148*f6dc9357SAndroid Build Coastguard Worker }; 149*f6dc9357SAndroid Build Coastguard Worker 150*f6dc9357SAndroid Build Coastguard Worker struct CLicenseFile 151*f6dc9357SAndroid Build Coastguard Worker { 152*f6dc9357SAndroid Build Coastguard Worker UInt32 Offset; 153*f6dc9357SAndroid Build Coastguard Worker UInt32 Size; 154*f6dc9357SAndroid Build Coastguard Worker AString Name; 155*f6dc9357SAndroid Build Coastguard Worker CByteBuffer Text; 156*f6dc9357SAndroid Build Coastguard Worker }; 157*f6dc9357SAndroid Build Coastguard Worker 158*f6dc9357SAndroid Build Coastguard Worker #endif 159*f6dc9357SAndroid Build Coastguard Worker 160*f6dc9357SAndroid Build Coastguard Worker class CInArchive 161*f6dc9357SAndroid Build Coastguard Worker { 162*f6dc9357SAndroid Build Coastguard Worker public: 163*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT 164*f6dc9357SAndroid Build Coastguard Worker CDynLimBuf Script; 165*f6dc9357SAndroid Build Coastguard Worker #endif 166*f6dc9357SAndroid Build Coastguard Worker CByteBuffer _data; 167*f6dc9357SAndroid Build Coastguard Worker CObjectVector<CItem> Items; 168*f6dc9357SAndroid Build Coastguard Worker bool IsUnicode; 169*f6dc9357SAndroid Build Coastguard Worker bool Is64Bit; 170*f6dc9357SAndroid Build Coastguard Worker private: 171*f6dc9357SAndroid Build Coastguard Worker UInt32 _stringsPos; // relative to _data 172*f6dc9357SAndroid Build Coastguard Worker UInt32 NumStringChars; 173*f6dc9357SAndroid Build Coastguard Worker size_t _size; // it's Header Size 174*f6dc9357SAndroid Build Coastguard Worker 175*f6dc9357SAndroid Build Coastguard Worker AString Raw_AString; 176*f6dc9357SAndroid Build Coastguard Worker UString Raw_UString; 177*f6dc9357SAndroid Build Coastguard Worker 178*f6dc9357SAndroid Build Coastguard Worker ENsisType NsisType; 179*f6dc9357SAndroid Build Coastguard Worker bool IsNsis200; // NSIS 2.03 and before 180*f6dc9357SAndroid Build Coastguard Worker bool IsNsis225; // NSIS 2.25 and before 181*f6dc9357SAndroid Build Coastguard Worker bool LogCmdIsEnabled; 182*f6dc9357SAndroid Build Coastguard Worker int BadCmd; // -1: no bad command; in another cases lowest bad command id 183*f6dc9357SAndroid Build Coastguard Worker IsPark()184*f6dc9357SAndroid Build Coastguard Worker bool IsPark() const { return NsisType >= k_NsisType_Park1; } IsNsis3_OrHigher()185*f6dc9357SAndroid Build Coastguard Worker bool IsNsis3_OrHigher() const { return NsisType == k_NsisType_Nsis3; } 186*f6dc9357SAndroid Build Coastguard Worker 187*f6dc9357SAndroid Build Coastguard Worker UInt64 _fileSize; 188*f6dc9357SAndroid Build Coastguard Worker 189*f6dc9357SAndroid Build Coastguard Worker bool _headerIsCompressed; 190*f6dc9357SAndroid Build Coastguard Worker UInt32 _nonSolidStartOffset; 191*f6dc9357SAndroid Build Coastguard Worker 192*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT 193*f6dc9357SAndroid Build Coastguard Worker 194*f6dc9357SAndroid Build Coastguard Worker CByteBuffer strUsed; 195*f6dc9357SAndroid Build Coastguard Worker 196*f6dc9357SAndroid Build Coastguard Worker CBlockHeader bhPages; 197*f6dc9357SAndroid Build Coastguard Worker CBlockHeader bhSections; 198*f6dc9357SAndroid Build Coastguard Worker CBlockHeader bhCtlColors; 199*f6dc9357SAndroid Build Coastguard Worker CBlockHeader bhData; 200*f6dc9357SAndroid Build Coastguard Worker UInt32 AfterHeaderSize; 201*f6dc9357SAndroid Build Coastguard Worker CByteBuffer _afterHeader; 202*f6dc9357SAndroid Build Coastguard Worker 203*f6dc9357SAndroid Build Coastguard Worker UInt32 SectionSize; 204*f6dc9357SAndroid Build Coastguard Worker const Byte *_mainLang; 205*f6dc9357SAndroid Build Coastguard Worker UInt32 _numLangStrings; 206*f6dc9357SAndroid Build Coastguard Worker AString LangComment; 207*f6dc9357SAndroid Build Coastguard Worker CRecordVector<UInt32> langStrIDs; 208*f6dc9357SAndroid Build Coastguard Worker UInt32 numOnFunc; 209*f6dc9357SAndroid Build Coastguard Worker UInt32 onFuncOffset; 210*f6dc9357SAndroid Build Coastguard Worker // CRecordVector<UInt32> OnFuncs; 211*f6dc9357SAndroid Build Coastguard Worker unsigned _numRootLicenses; 212*f6dc9357SAndroid Build Coastguard Worker CRecordVector<UInt32> noParseStringIndexes; 213*f6dc9357SAndroid Build Coastguard Worker AString _tempString_for_GetVar; 214*f6dc9357SAndroid Build Coastguard Worker AString _tempString_for_AddFuncName; 215*f6dc9357SAndroid Build Coastguard Worker AString _tempString; 216*f6dc9357SAndroid Build Coastguard Worker 217*f6dc9357SAndroid Build Coastguard Worker #endif 218*f6dc9357SAndroid Build Coastguard Worker 219*f6dc9357SAndroid Build Coastguard Worker 220*f6dc9357SAndroid Build Coastguard Worker public: 221*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IInStream> _stream; // it's limited stream that contains only NSIS archive 222*f6dc9357SAndroid Build Coastguard Worker UInt64 StartOffset; // offset in original stream. 223*f6dc9357SAndroid Build Coastguard Worker UInt64 DataStreamOffset; // = sizeof(FirstHeader) = offset of Header in _stream 224*f6dc9357SAndroid Build Coastguard Worker 225*f6dc9357SAndroid Build Coastguard Worker bool IsArc; 226*f6dc9357SAndroid Build Coastguard Worker 227*f6dc9357SAndroid Build Coastguard Worker CDecoder Decoder; 228*f6dc9357SAndroid Build Coastguard Worker CByteBuffer ExeStub; 229*f6dc9357SAndroid Build Coastguard Worker CFirstHeader FirstHeader; 230*f6dc9357SAndroid Build Coastguard Worker NMethodType::EEnum Method; 231*f6dc9357SAndroid Build Coastguard Worker UInt32 DictionarySize; 232*f6dc9357SAndroid Build Coastguard Worker bool IsSolid; 233*f6dc9357SAndroid Build Coastguard Worker bool UseFilter; 234*f6dc9357SAndroid Build Coastguard Worker bool FilterFlag; 235*f6dc9357SAndroid Build Coastguard Worker 236*f6dc9357SAndroid Build Coastguard Worker bool IsInstaller; 237*f6dc9357SAndroid Build Coastguard Worker AString Name; 238*f6dc9357SAndroid Build Coastguard Worker AString BrandingText; 239*f6dc9357SAndroid Build Coastguard Worker UStringVector UPrefixes; 240*f6dc9357SAndroid Build Coastguard Worker AStringVector APrefixes; 241*f6dc9357SAndroid Build Coastguard Worker 242*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT 243*f6dc9357SAndroid Build Coastguard Worker CObjectVector<CLicenseFile> LicenseFiles; 244*f6dc9357SAndroid Build Coastguard Worker #endif 245*f6dc9357SAndroid Build Coastguard Worker 246*f6dc9357SAndroid Build Coastguard Worker private: 247*f6dc9357SAndroid Build Coastguard Worker void GetShellString(AString &s, unsigned index1, unsigned index2); 248*f6dc9357SAndroid Build Coastguard Worker void GetNsisString_Raw(const Byte *s); 249*f6dc9357SAndroid Build Coastguard Worker void GetNsisString_Unicode_Raw(const Byte *s); 250*f6dc9357SAndroid Build Coastguard Worker void ReadString2_Raw(UInt32 pos); 251*f6dc9357SAndroid Build Coastguard Worker bool IsGoodString(UInt32 param) const; 252*f6dc9357SAndroid Build Coastguard Worker bool AreTwoParamStringsEqual(UInt32 param1, UInt32 param2) const; 253*f6dc9357SAndroid Build Coastguard Worker 254*f6dc9357SAndroid Build Coastguard Worker void Add_LangStr(AString &res, UInt32 id); 255*f6dc9357SAndroid Build Coastguard Worker 256*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT 257*f6dc9357SAndroid Build Coastguard Worker 258*f6dc9357SAndroid Build Coastguard Worker void Add_UInt(UInt32 v); 259*f6dc9357SAndroid Build Coastguard Worker void AddLicense(UInt32 param, Int32 langID); 260*f6dc9357SAndroid Build Coastguard Worker 261*f6dc9357SAndroid Build Coastguard Worker void Add_LangStr_Simple(UInt32 id); 262*f6dc9357SAndroid Build Coastguard Worker void Add_FuncName(const UInt32 *labels, UInt32 index); 263*f6dc9357SAndroid Build Coastguard Worker void AddParam_Func(const UInt32 *labels, UInt32 index); 264*f6dc9357SAndroid Build Coastguard Worker void Add_LabelName(UInt32 index); 265*f6dc9357SAndroid Build Coastguard Worker 266*f6dc9357SAndroid Build Coastguard Worker void Add_Color2(UInt32 v); 267*f6dc9357SAndroid Build Coastguard Worker void Add_ColorParam(UInt32 v); 268*f6dc9357SAndroid Build Coastguard Worker void Add_Color(UInt32 index); 269*f6dc9357SAndroid Build Coastguard Worker 270*f6dc9357SAndroid Build Coastguard Worker void Add_ButtonID(UInt32 buttonID); 271*f6dc9357SAndroid Build Coastguard Worker 272*f6dc9357SAndroid Build Coastguard Worker void Add_ShowWindow_Cmd(UInt32 cmd); 273*f6dc9357SAndroid Build Coastguard Worker void Add_TypeFromList(const char * const *table, unsigned tableSize, UInt32 type); 274*f6dc9357SAndroid Build Coastguard Worker void Add_ExecFlags(UInt32 flagsType); 275*f6dc9357SAndroid Build Coastguard Worker void Add_SectOp(UInt32 opType); 276*f6dc9357SAndroid Build Coastguard Worker 277*f6dc9357SAndroid Build Coastguard Worker void Add_Var(UInt32 index); 278*f6dc9357SAndroid Build Coastguard Worker void AddParam_Var(UInt32 value); 279*f6dc9357SAndroid Build Coastguard Worker void AddParam_UInt(UInt32 value); 280*f6dc9357SAndroid Build Coastguard Worker 281*f6dc9357SAndroid Build Coastguard Worker void Add_GotoVar(UInt32 param); 282*f6dc9357SAndroid Build Coastguard Worker void Add_GotoVar1(UInt32 param); 283*f6dc9357SAndroid Build Coastguard Worker void Add_GotoVars2(const UInt32 *params); 284*f6dc9357SAndroid Build Coastguard Worker 285*f6dc9357SAndroid Build Coastguard Worker 286*f6dc9357SAndroid Build Coastguard Worker 287*f6dc9357SAndroid Build Coastguard Worker bool PrintSectionBegin(const CSection §, unsigned index); 288*f6dc9357SAndroid Build Coastguard Worker void PrintSectionEnd(); 289*f6dc9357SAndroid Build Coastguard Worker 290*f6dc9357SAndroid Build Coastguard Worker void GetNsisString(AString &res, const Byte *s); 291*f6dc9357SAndroid Build Coastguard Worker void GetNsisString_Unicode(AString &res, const Byte *s); 292*f6dc9357SAndroid Build Coastguard Worker UInt32 GetNumUsedVars() const; 293*f6dc9357SAndroid Build Coastguard Worker void ReadString2(AString &s, UInt32 pos); 294*f6dc9357SAndroid Build Coastguard Worker 295*f6dc9357SAndroid Build Coastguard Worker void MessageBox_MB_Part(UInt32 param); 296*f6dc9357SAndroid Build Coastguard Worker void AddParam(UInt32 pos); 297*f6dc9357SAndroid Build Coastguard Worker void AddOptionalParam(UInt32 pos); 298*f6dc9357SAndroid Build Coastguard Worker void AddParams(const UInt32 *params, unsigned num); 299*f6dc9357SAndroid Build Coastguard Worker void AddPageOption1(UInt32 param, const char *name); 300*f6dc9357SAndroid Build Coastguard Worker void AddPageOption(const UInt32 *params, unsigned num, const char *name); 301*f6dc9357SAndroid Build Coastguard Worker void AddOptionalParams(const UInt32 *params, unsigned num); 302*f6dc9357SAndroid Build Coastguard Worker void AddRegRoot(UInt32 value); 303*f6dc9357SAndroid Build Coastguard Worker 304*f6dc9357SAndroid Build Coastguard Worker 305*f6dc9357SAndroid Build Coastguard Worker void ClearLangComment(); 306*f6dc9357SAndroid Build Coastguard Worker void Separator(); 307*f6dc9357SAndroid Build Coastguard Worker void Space(); 308*f6dc9357SAndroid Build Coastguard Worker void Tab(); 309*f6dc9357SAndroid Build Coastguard Worker void Tab(bool commented); 310*f6dc9357SAndroid Build Coastguard Worker void BigSpaceComment(); 311*f6dc9357SAndroid Build Coastguard Worker void SmallSpaceComment(); 312*f6dc9357SAndroid Build Coastguard Worker void AddCommentAndString(const char *s); 313*f6dc9357SAndroid Build Coastguard Worker void AddError(const char *s); 314*f6dc9357SAndroid Build Coastguard Worker void AddErrorLF(const char *s); 315*f6dc9357SAndroid Build Coastguard Worker void CommentOpen(); 316*f6dc9357SAndroid Build Coastguard Worker void CommentClose(); 317*f6dc9357SAndroid Build Coastguard Worker void AddLF(); 318*f6dc9357SAndroid Build Coastguard Worker void AddQuotes(); 319*f6dc9357SAndroid Build Coastguard Worker void TabString(const char *s); 320*f6dc9357SAndroid Build Coastguard Worker void AddStringLF(const char *s); 321*f6dc9357SAndroid Build Coastguard Worker void NewLine(); 322*f6dc9357SAndroid Build Coastguard Worker void PrintNumComment(const char *name, UInt32 value); 323*f6dc9357SAndroid Build Coastguard Worker void Add_QuStr(const AString &s); 324*f6dc9357SAndroid Build Coastguard Worker void SpaceQuStr(const AString &s); 325*f6dc9357SAndroid Build Coastguard Worker bool CompareCommands(const Byte *rawCmds, const Byte *sequence, size_t numCommands); 326*f6dc9357SAndroid Build Coastguard Worker 327*f6dc9357SAndroid Build Coastguard Worker #endif 328*f6dc9357SAndroid Build Coastguard Worker 329*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT 330*f6dc9357SAndroid Build Coastguard Worker unsigned GetNumSupportedCommands() const; 331*f6dc9357SAndroid Build Coastguard Worker #endif 332*f6dc9357SAndroid Build Coastguard Worker 333*f6dc9357SAndroid Build Coastguard Worker UInt32 GetCmd(UInt32 a); 334*f6dc9357SAndroid Build Coastguard Worker void FindBadCmd(const CBlockHeader &bh, const Byte *); 335*f6dc9357SAndroid Build Coastguard Worker void DetectNsisType(const CBlockHeader &bh, const Byte *); 336*f6dc9357SAndroid Build Coastguard Worker 337*f6dc9357SAndroid Build Coastguard Worker HRESULT ReadEntries(const CBlockHeader &bh); 338*f6dc9357SAndroid Build Coastguard Worker HRESULT SortItems(); 339*f6dc9357SAndroid Build Coastguard Worker HRESULT Parse(); 340*f6dc9357SAndroid Build Coastguard Worker HRESULT Open2(const Byte *data, size_t size); 341*f6dc9357SAndroid Build Coastguard Worker void Clear2(); 342*f6dc9357SAndroid Build Coastguard Worker 343*f6dc9357SAndroid Build Coastguard Worker void GetVar2(AString &res, UInt32 index); 344*f6dc9357SAndroid Build Coastguard Worker void GetVar(AString &res, UInt32 index); 345*f6dc9357SAndroid Build Coastguard Worker Int32 GetVarIndex(UInt32 strPos) const; 346*f6dc9357SAndroid Build Coastguard Worker Int32 GetVarIndex(UInt32 strPos, UInt32 &resOffset) const; 347*f6dc9357SAndroid Build Coastguard Worker Int32 GetVarIndexFinished(UInt32 strPos, Byte endChar, UInt32 &resOffset) const; 348*f6dc9357SAndroid Build Coastguard Worker bool IsVarStr(UInt32 strPos, UInt32 varIndex) const; 349*f6dc9357SAndroid Build Coastguard Worker bool IsAbsolutePathVar(UInt32 strPos) const; 350*f6dc9357SAndroid Build Coastguard Worker void SetItemName(CItem &item, UInt32 strPos); 351*f6dc9357SAndroid Build Coastguard Worker 352*f6dc9357SAndroid Build Coastguard Worker public: 353*f6dc9357SAndroid Build Coastguard Worker HRESULT Open(IInStream *inStream, const UInt64 *maxCheckStartPosition); 354*f6dc9357SAndroid Build Coastguard Worker AString GetFormatDescription() const; InitDecoder()355*f6dc9357SAndroid Build Coastguard Worker HRESULT InitDecoder() 356*f6dc9357SAndroid Build Coastguard Worker { 357*f6dc9357SAndroid Build Coastguard Worker bool useFilter; 358*f6dc9357SAndroid Build Coastguard Worker return Decoder.Init(_stream, useFilter); 359*f6dc9357SAndroid Build Coastguard Worker } 360*f6dc9357SAndroid Build Coastguard Worker SeekTo(UInt64 pos)361*f6dc9357SAndroid Build Coastguard Worker HRESULT SeekTo(UInt64 pos) 362*f6dc9357SAndroid Build Coastguard Worker { 363*f6dc9357SAndroid Build Coastguard Worker return InStream_SeekSet(_stream, pos); 364*f6dc9357SAndroid Build Coastguard Worker } 365*f6dc9357SAndroid Build Coastguard Worker SeekTo_DataStreamOffset()366*f6dc9357SAndroid Build Coastguard Worker HRESULT SeekTo_DataStreamOffset() 367*f6dc9357SAndroid Build Coastguard Worker { 368*f6dc9357SAndroid Build Coastguard Worker return SeekTo(DataStreamOffset); 369*f6dc9357SAndroid Build Coastguard Worker } 370*f6dc9357SAndroid Build Coastguard Worker SeekToNonSolidItem(unsigned index)371*f6dc9357SAndroid Build Coastguard Worker HRESULT SeekToNonSolidItem(unsigned index) 372*f6dc9357SAndroid Build Coastguard Worker { 373*f6dc9357SAndroid Build Coastguard Worker return SeekTo(GetPosOfNonSolidItem(index)); 374*f6dc9357SAndroid Build Coastguard Worker } 375*f6dc9357SAndroid Build Coastguard Worker 376*f6dc9357SAndroid Build Coastguard Worker void Clear(); 377*f6dc9357SAndroid Build Coastguard Worker 378*f6dc9357SAndroid Build Coastguard Worker bool IsDirectString_Equal(UInt32 offset, const char *s) const; 379*f6dc9357SAndroid Build Coastguard Worker /* 380*f6dc9357SAndroid Build Coastguard Worker UInt64 GetDataPos(unsigned index) 381*f6dc9357SAndroid Build Coastguard Worker { 382*f6dc9357SAndroid Build Coastguard Worker const CItem &item = Items[index]; 383*f6dc9357SAndroid Build Coastguard Worker return GetOffset() + FirstHeader.HeaderSize + item.Pos; 384*f6dc9357SAndroid Build Coastguard Worker } 385*f6dc9357SAndroid Build Coastguard Worker */ 386*f6dc9357SAndroid Build Coastguard Worker GetPosOfSolidItem(unsigned index)387*f6dc9357SAndroid Build Coastguard Worker UInt64 GetPosOfSolidItem(unsigned index) const 388*f6dc9357SAndroid Build Coastguard Worker { 389*f6dc9357SAndroid Build Coastguard Worker const CItem &item = Items[index]; 390*f6dc9357SAndroid Build Coastguard Worker return 4 + (UInt64)FirstHeader.HeaderSize + item.Pos; 391*f6dc9357SAndroid Build Coastguard Worker } 392*f6dc9357SAndroid Build Coastguard Worker GetPosOfNonSolidItem(unsigned index)393*f6dc9357SAndroid Build Coastguard Worker UInt64 GetPosOfNonSolidItem(unsigned index) const 394*f6dc9357SAndroid Build Coastguard Worker { 395*f6dc9357SAndroid Build Coastguard Worker const CItem &item = Items[index]; 396*f6dc9357SAndroid Build Coastguard Worker return DataStreamOffset + _nonSolidStartOffset + 4 + item.Pos; 397*f6dc9357SAndroid Build Coastguard Worker } 398*f6dc9357SAndroid Build Coastguard Worker Release()399*f6dc9357SAndroid Build Coastguard Worker void Release() 400*f6dc9357SAndroid Build Coastguard Worker { 401*f6dc9357SAndroid Build Coastguard Worker Decoder.Release(); 402*f6dc9357SAndroid Build Coastguard Worker } 403*f6dc9357SAndroid Build Coastguard Worker IsTruncated()404*f6dc9357SAndroid Build Coastguard Worker bool IsTruncated() const { return (_fileSize - StartOffset < FirstHeader.ArcSize); } 405*f6dc9357SAndroid Build Coastguard Worker GetReducedName(unsigned index)406*f6dc9357SAndroid Build Coastguard Worker UString GetReducedName(unsigned index) const 407*f6dc9357SAndroid Build Coastguard Worker { 408*f6dc9357SAndroid Build Coastguard Worker const CItem &item = Items[index]; 409*f6dc9357SAndroid Build Coastguard Worker 410*f6dc9357SAndroid Build Coastguard Worker UString s; 411*f6dc9357SAndroid Build Coastguard Worker if (item.Prefix >= 0) 412*f6dc9357SAndroid Build Coastguard Worker { 413*f6dc9357SAndroid Build Coastguard Worker if (IsUnicode) 414*f6dc9357SAndroid Build Coastguard Worker s = UPrefixes[item.Prefix]; 415*f6dc9357SAndroid Build Coastguard Worker else 416*f6dc9357SAndroid Build Coastguard Worker s = MultiByteToUnicodeString(APrefixes[item.Prefix]); 417*f6dc9357SAndroid Build Coastguard Worker if (s.Len() > 0) 418*f6dc9357SAndroid Build Coastguard Worker if (s.Back() != L'\\') 419*f6dc9357SAndroid Build Coastguard Worker s.Add_Char('\\'); 420*f6dc9357SAndroid Build Coastguard Worker } 421*f6dc9357SAndroid Build Coastguard Worker 422*f6dc9357SAndroid Build Coastguard Worker if (IsUnicode) 423*f6dc9357SAndroid Build Coastguard Worker { 424*f6dc9357SAndroid Build Coastguard Worker s += item.NameU; 425*f6dc9357SAndroid Build Coastguard Worker if (item.NameU.IsEmpty()) 426*f6dc9357SAndroid Build Coastguard Worker s += "file"; 427*f6dc9357SAndroid Build Coastguard Worker } 428*f6dc9357SAndroid Build Coastguard Worker else 429*f6dc9357SAndroid Build Coastguard Worker { 430*f6dc9357SAndroid Build Coastguard Worker s += MultiByteToUnicodeString(item.NameA); 431*f6dc9357SAndroid Build Coastguard Worker if (item.NameA.IsEmpty()) 432*f6dc9357SAndroid Build Coastguard Worker s += "file"; 433*f6dc9357SAndroid Build Coastguard Worker } 434*f6dc9357SAndroid Build Coastguard Worker 435*f6dc9357SAndroid Build Coastguard Worker const char * const kRemoveStr = "$INSTDIR\\"; 436*f6dc9357SAndroid Build Coastguard Worker if (s.IsPrefixedBy_Ascii_NoCase(kRemoveStr)) 437*f6dc9357SAndroid Build Coastguard Worker { 438*f6dc9357SAndroid Build Coastguard Worker s.Delete(0, MyStringLen(kRemoveStr)); 439*f6dc9357SAndroid Build Coastguard Worker if (s[0] == L'\\') 440*f6dc9357SAndroid Build Coastguard Worker s.DeleteFrontal(1); 441*f6dc9357SAndroid Build Coastguard Worker } 442*f6dc9357SAndroid Build Coastguard Worker if (item.Is_PatchedUninstaller() && ExeStub.Size() == 0) 443*f6dc9357SAndroid Build Coastguard Worker s += ".nsis"; 444*f6dc9357SAndroid Build Coastguard Worker return s; 445*f6dc9357SAndroid Build Coastguard Worker } 446*f6dc9357SAndroid Build Coastguard Worker 447*f6dc9357SAndroid Build Coastguard Worker UString ConvertToUnicode(const AString &s) const; 448*f6dc9357SAndroid Build Coastguard Worker CInArchive()449*f6dc9357SAndroid Build Coastguard Worker CInArchive() 450*f6dc9357SAndroid Build Coastguard Worker #ifdef NSIS_SCRIPT 451*f6dc9357SAndroid Build Coastguard Worker : Script(kScriptSizeLimit) 452*f6dc9357SAndroid Build Coastguard Worker #endif 453*f6dc9357SAndroid Build Coastguard Worker {} 454*f6dc9357SAndroid Build Coastguard Worker }; 455*f6dc9357SAndroid Build Coastguard Worker 456*f6dc9357SAndroid Build Coastguard Worker }} 457*f6dc9357SAndroid Build Coastguard Worker 458*f6dc9357SAndroid Build Coastguard Worker #endif 459