diff --git a/README.md b/README.md index 3a5e826..9558a12 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # innoextract - A tool to unpack installers created by Inno Setup -[Inno Setup](https://jrsoftware.org/isinfo.php) is a tool to create installers for Microsoft Windows applications. innoextract allows to extract such installers under non-Windows systems without running the actual installer using wine. innoextract currently supports installers created by Inno Setup 1.2.10 to 6.3.3. +[Inno Setup](https://jrsoftware.org/isinfo.php) is a tool to create installers for Microsoft Windows applications. innoextract allows to extract such installers under non-Windows systems without running the actual installer using wine. innoextract currently supports installers created by Inno Setup 1.2.10 to 6.4.3. In addition to standard Inno Setup installers, innoextract also supports some modified Inno Setup variants including Martijn Laan's My Inno Setup Extensions 1.3.10 to 3.0.6.1 as well as GOG.com's Inno Setup-based game installers. innoextract is able to unpack Wadjet Eye Games installers (to play with AGS), Arx Fatalis patches (for use with Arx Libertatis) as well as various other Inno Setup executables. diff --git a/VERSION b/VERSION index e2b4fe9..cf6688b 100644 --- a/VERSION +++ b/VERSION @@ -1,7 +1,7 @@ innoextract 1.10-dev Known working Inno Setup versions: -Inno Setup 1.2.10 to 6.3.3 +Inno Setup 1.2.10 to 6.4.3 Bug tracker: https://innoextract.constexpr.org/issues diff --git a/src/setup/data.cpp b/src/setup/data.cpp index 4444ce2..b4ff446 100644 --- a/src/setup/data.cpp +++ b/src/setup/data.cpp @@ -136,20 +136,22 @@ void data_entry::load(std::istream & is, const info & i) { stored_flag_reader flagreader(is, i.version.bits()); flagreader.add(VersionInfoValid); - flagreader.add(VersionInfoNotValid); + if(i.version < INNO_VERSION(6, 4, 3)) { + flagreader.add(VersionInfoNotValid); + } if(i.version >= INNO_VERSION(2, 0, 17) && i.version < INNO_VERSION(4, 0, 1)) { flagreader.add(BZipped); } if(i.version >= INNO_VERSION(4, 0, 10)) { flagreader.add(TimeStampInUTC); } - if(i.version >= INNO_VERSION(4, 1, 0)) { + if(i.version >= INNO_VERSION(4, 1, 0) && i.version < INNO_VERSION(6, 4, 3)) { flagreader.add(IsUninstallerExe); } if(i.version >= INNO_VERSION(4, 1, 8)) { flagreader.add(CallInstructionOptimized); } - if(i.version >= INNO_VERSION(4, 2, 0)) { + if(i.version >= INNO_VERSION(4, 2, 0) && i.version < INNO_VERSION(6, 4, 3)) { flagreader.add(Touch); } if(i.version >= INNO_VERSION(4, 2, 2)) { @@ -160,7 +162,7 @@ void data_entry::load(std::istream & is, const info & i) { } else { options |= ChunkCompressed; } - if(i.version >= INNO_VERSION(5, 1, 13)) { + if(i.version >= INNO_VERSION(5, 1, 13) && i.version < INNO_VERSION(6, 4, 3)) { flagreader.add(SolidBreak); } if(i.version >= INNO_VERSION(5, 5, 7) && i.version < INNO_VERSION(6, 3, 0)) { @@ -171,7 +173,7 @@ void data_entry::load(std::istream & is, const info & i) { options |= flagreader.finalize(); - if(i.version >= INNO_VERSION(6, 3, 0)) { + if(i.version >= INNO_VERSION(6, 3, 0) && i.version < INNO_VERSION(6, 4, 3)) { sign = stored_enum(is).get(); } else if(options & SignOnce) { sign = Once; diff --git a/src/setup/header.cpp b/src/setup/header.cpp index bbe9df9..d226448 100644 --- a/src/setup/header.cpp +++ b/src/setup/header.cpp @@ -266,6 +266,11 @@ void header::load(std::istream & is, const version & version) { is >> util::binary_string(architectures_allowed_expr); is >> util::binary_string(architectures_installed_in_64bit_mode_expr); } + if(version >= INNO_VERSION(6, 4, 2)) { + is >> util::binary_string(close_applications_filter_excludes); + } else { + close_applications_filter_excludes.clear(); + } if(version >= INNO_VERSION(5, 2, 5)) { is >> util::ansi_string(license_text); is >> util::ansi_string(info_before); @@ -765,6 +770,7 @@ void header::decode(util::codepage_id codepage) { util::to_utf8(setup_mutex, codepage, &lead_bytes); util::to_utf8(changes_environment, codepage); util::to_utf8(changes_associations, codepage); + util::to_utf8(close_applications_filter_excludes, codepage); } diff --git a/src/setup/header.hpp b/src/setup/header.hpp index 78e5b64..08d492c 100644 --- a/src/setup/header.hpp +++ b/src/setup/header.hpp @@ -167,6 +167,7 @@ struct header { std::string changes_associations; std::string architectures_allowed_expr; std::string architectures_installed_in_64bit_mode_expr; + std::string close_applications_filter_excludes; std::string license_text; std::string info_before; std::string info_after; diff --git a/src/setup/version.cpp b/src/setup/version.cpp index 7f68af2..be6682b 100644 --- a/src/setup/version.cpp +++ b/src/setup/version.cpp @@ -186,6 +186,8 @@ const known_version versions[] = { { "Inno Setup Setup Data (6.3.0)", INNO_VERSION_EXT(6, 3, 0, 0), version::Unicode }, { "Inno Setup Setup Data (6.4.0)", /* prerelease */ INNO_VERSION_EXT(6, 4, 0, 0), version::Unicode }, { "Inno Setup Setup Data (6.4.0.1)", /* 6.4.0 */ INNO_VERSION_EXT(6, 4, 0, 1), version::Unicode }, + { "Inno Setup Setup Data (6.4.2)", INNO_VERSION_EXT(6, 4, 2, 0), version::Unicode }, + { "Inno Setup Setup Data (6.4.3)", INNO_VERSION_EXT(6, 4, 3, 0), version::Unicode }, }; } // anonymous namespace