diff --git a/BurnOutSharp/PackerType/WinZipSFX.cs b/BurnOutSharp/PackerType/WinZipSFX.cs index c44f1583..01e66b02 100644 --- a/BurnOutSharp/PackerType/WinZipSFX.cs +++ b/BurnOutSharp/PackerType/WinZipSFX.cs @@ -100,311 +100,272 @@ namespace BurnOutSharp.PackerType return GetV3PlusVersion(version); // Assume an earlier version - return GetV2Version(fileContent); + return GetV2Version(file, fileContent); } - private static string GetV2Version(byte[] fileContent) + private static string GetV2Version(string file, byte[] fileContent) { - #region 16-bit NE Header Checks + var matchers = new List + { + #region 16-bit NE Header Checks - byte?[] check = new byte?[] - { - 0x4E, 0x45, 0x11, 0x20, 0x86, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0A, 0x03, 0x03, 0x00, - 0x00, 0x20, 0x00, 0x40, 0xE6, 0x2B, 0x01, 0x00, - 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, - 0x4B, 0x00, 0x40, 0x00, 0x58, 0x00, 0x58, 0x00, - 0x64, 0x00, 0x6C, 0x00, 0xB8, 0x44, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, - }; - if (fileContent.FirstPosition(check, out _)) - return "2.0 (MS-DOS/16-bit)"; + new Matcher(new byte?[] + { + 0x4E, 0x45, 0x11, 0x20, 0x86, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0A, 0x03, 0x03, 0x00, + 0x00, 0x20, 0x00, 0x40, 0xE6, 0x2B, 0x01, 0x00, + 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, + 0x4B, 0x00, 0x40, 0x00, 0x58, 0x00, 0x58, 0x00, + 0x64, 0x00, 0x6C, 0x00, 0xB8, 0x44, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + }, "2.0 (MS-DOS/16-bit)"), - check = new byte?[] - { - 0x4E, 0x45, 0x11, 0x20, 0x86, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0A, 0x03, 0x03, 0x00, - 0x00, 0x20, 0x00, 0x40, 0x74, 0x31, 0x01, 0x00, - 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, - 0x4B, 0x00, 0x40, 0x00, 0x58, 0x00, 0x58, 0x00, - 0x64, 0x00, 0x6C, 0x00, 0x98, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, - }; - if (fileContent.FirstPosition(check, out _)) - return "2.0 (16-bit)"; - - check = new byte?[] - { - 0x4E, 0x45, 0x11, 0x20, 0x80, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0A, 0x03, 0x03, 0x00, - 0x00, 0x20, 0x00, 0x40, 0xA0, 0x24, 0x01, 0x00, - 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x4B, 0x00, 0x40, 0x00, 0x58, 0x00, 0x58, 0x00, - 0x64, 0x00, 0x6A, 0x00, 0x92, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, - }; - if (fileContent.FirstPosition(check, out _)) - return "Compact 2.0 (16-bit)"; - - check = new byte?[] - { - 0x4E, 0x45, 0x11, 0x20, 0xCD, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x03, 0x00, - 0x00, 0x20, 0x00, 0x40, 0xFA, 0x36, 0x01, 0x00, - 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x05, 0x00, - 0x4B, 0x00, 0x40, 0x00, 0x58, 0x00, 0x97, 0x00, - 0xA3, 0x00, 0xAD, 0x00, 0xDF, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, - }; - if (fileContent.FirstPosition(check, out _)) - return "Software Installation 2.0 (16-bit)"; + new Matcher(new byte?[] + { + 0x4E, 0x45, 0x11, 0x20, 0x86, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0A, 0x03, 0x03, 0x00, + 0x00, 0x20, 0x00, 0x40, 0x74, 0x31, 0x01, 0x00, + 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, + 0x4B, 0x00, 0x40, 0x00, 0x58, 0x00, 0x58, 0x00, + 0x64, 0x00, 0x6C, 0x00, 0x98, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + }, "2.0 (16-bit)"), - check = new byte?[] - { - 0x4E, 0x45, 0x11, 0x20, 0x86, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0A, 0x03, 0x03, 0x00, - 0x00, 0x20, 0x00, 0x40, 0x86, 0x33, 0x01, 0x00, - 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, - 0x4B, 0x00, 0x40, 0x00, 0x58, 0x00, 0x58, 0x00, - 0x64, 0x00, 0x6C, 0x00, 0xC8, 0x43, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, - }; - if (fileContent.FirstPosition(check, out _)) - return "2.1 RC2 (MS-DOS/16-bit)"; + new Matcher(new byte?[] + { + 0x4E, 0x45, 0x11, 0x20, 0x80, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0A, 0x03, 0x03, 0x00, + 0x00, 0x20, 0x00, 0x40, 0xA0, 0x24, 0x01, 0x00, + 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, + 0x4B, 0x00, 0x40, 0x00, 0x58, 0x00, 0x58, 0x00, + 0x64, 0x00, 0x6A, 0x00, 0x92, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + }, "Compact 2.0 (16-bit)"), - check = new byte?[] - { - 0x4E, 0x45, 0x11, 0x20, 0xBE, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x03, 0x00, - 0x00, 0x20, 0x00, 0x40, 0x56, 0x3E, 0x01, 0x00, - 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, - 0x4B, 0x00, 0x40, 0x00, 0x58, 0x00, 0x90, 0x00, - 0x9C, 0x00, 0xA4, 0x00, 0xD0, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, - }; - if (fileContent.FirstPosition(check, out _)) - return "2.1 RC2 (16-bit)"; + new Matcher(new byte?[] + { + 0x4E, 0x45, 0x11, 0x20, 0xCD, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x03, 0x00, + 0x00, 0x20, 0x00, 0x40, 0xFA, 0x36, 0x01, 0x00, + 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x05, 0x00, + 0x4B, 0x00, 0x40, 0x00, 0x58, 0x00, 0x97, 0x00, + 0xA3, 0x00, 0xAD, 0x00, 0xDF, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + }, "Software Installation 2.0 (16-bit)"), - check = new byte?[] - { - 0x4E, 0x45, 0x11, 0x20, 0x80, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0A, 0x03, 0x03, 0x00, - 0x00, 0x20, 0x00, 0x40, 0x84, 0x2B, 0x01, 0x00, - 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x4B, 0x00, 0x40, 0x00, 0x58, 0x00, 0x58, 0x00, - 0x64, 0x00, 0x6A, 0x00, 0x92, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, - }; - if (fileContent.FirstPosition(check, out _)) - return "Compact 2.1 RC2 (16-bit)"; + new Matcher(new byte?[] + { + 0x4E, 0x45, 0x11, 0x20, 0x86, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0A, 0x03, 0x03, 0x00, + 0x00, 0x20, 0x00, 0x40, 0x86, 0x33, 0x01, 0x00, + 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, + 0x4B, 0x00, 0x40, 0x00, 0x58, 0x00, 0x58, 0x00, + 0x64, 0x00, 0x6C, 0x00, 0xC8, 0x43, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + }, "2.1 RC2 (MS-DOS/16-bit)"), - check = new byte?[] - { - 0x4E, 0x45, 0x11, 0x20, 0xBE, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x03, 0x00, - 0x00, 0x20, 0x00, 0x40, 0xAC, 0x43, 0x01, 0x00, - 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, - 0x4B, 0x00, 0x40, 0x00, 0x58, 0x00, 0x90, 0x00, - 0x9C, 0x00, 0xA4, 0x00, 0xD0, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, - }; - if (fileContent.FirstPosition(check, out _)) - return "Software Installation 2.1 RC2 (16-bit)"; + new Matcher(new byte?[] + { + 0x4E, 0x45, 0x11, 0x20, 0xBE, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x03, 0x00, + 0x00, 0x20, 0x00, 0x40, 0x56, 0x3E, 0x01, 0x00, + 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, + 0x4B, 0x00, 0x40, 0x00, 0x58, 0x00, 0x90, 0x00, + 0x9C, 0x00, 0xA4, 0x00, 0xD0, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + }, "2.1 RC2 (16-bit)"), - check = new byte?[] - { - 0x4E, 0x45, 0x11, 0x20, 0x86, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0A, 0x03, 0x03, 0x00, - 0x00, 0x20, 0x00, 0x3A, 0x96, 0x33, 0x01, 0x00, - 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, - 0x4B, 0x00, 0x40, 0x00, 0x58, 0x00, 0x58, 0x00, - 0x64, 0x00, 0x6C, 0x00, 0xC8, 0x43, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, - }; - if (fileContent.FirstPosition(check, out _)) - return "2.1 (MS-DOS/16-bit)"; + new Matcher(new byte?[] + { + 0x4E, 0x45, 0x11, 0x20, 0x80, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0A, 0x03, 0x03, 0x00, + 0x00, 0x20, 0x00, 0x40, 0x84, 0x2B, 0x01, 0x00, + 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, + 0x4B, 0x00, 0x40, 0x00, 0x58, 0x00, 0x58, 0x00, + 0x64, 0x00, 0x6A, 0x00, 0x92, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + }, "Compact 2.1 RC2 (16-bit)"), - check = new byte?[] - { - 0x4E, 0x45, 0x11, 0x20, 0xBE, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x03, 0x00, - 0x00, 0x20, 0x00, 0x3A, 0x7E, 0x3E, 0x01, 0x00, - 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, - 0x4B, 0x00, 0x40, 0x00, 0x58, 0x00, 0x90, 0x00, - 0x9C, 0x00, 0xA4, 0x00, 0xD0, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, - }; - if (fileContent.FirstPosition(check, out _)) - return "2.1 (16-bit)"; + new Matcher(new byte?[] + { + 0x4E, 0x45, 0x11, 0x20, 0xBE, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x03, 0x00, + 0x00, 0x20, 0x00, 0x40, 0xAC, 0x43, 0x01, 0x00, + 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, + 0x4B, 0x00, 0x40, 0x00, 0x58, 0x00, 0x90, 0x00, + 0x9C, 0x00, 0xA4, 0x00, 0xD0, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + }, "Software Installation 2.1 RC2 (16-bit)"), - check = new byte?[] - { - 0x4E, 0x45, 0x11, 0x20, 0x80, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0A, 0x03, 0x03, 0x00, - 0x00, 0x20, 0x00, 0x3A, 0x90, 0x2B, 0x01, 0x00, - 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x4B, 0x00, 0x40, 0x00, 0x58, 0x00, 0x58, 0x00, - 0x64, 0x00, 0x6A, 0x00, 0x92, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, - }; - if (fileContent.FirstPosition(check, out _)) - return "Compact 2.1 (16-bit)"; + new Matcher(new byte?[] + { + 0x4E, 0x45, 0x11, 0x20, 0x86, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0A, 0x03, 0x03, 0x00, + 0x00, 0x20, 0x00, 0x3A, 0x96, 0x33, 0x01, 0x00, + 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, + 0x4B, 0x00, 0x40, 0x00, 0x58, 0x00, 0x58, 0x00, + 0x64, 0x00, 0x6C, 0x00, 0xC8, 0x43, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + }, "2.1 (MS-DOS/16-bit)"), - check = new byte?[] - { - 0x4E, 0x45, 0x11, 0x20, 0xBE, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x03, 0x00, - 0x00, 0x20, 0x00, 0x3A, 0x08, 0x44, 0x01, 0x00, - 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, - 0x4B, 0x00, 0x40, 0x00, 0x58, 0x00, 0x90, 0x00, - 0x9C, 0x00, 0xA4, 0x00, 0xD0, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + new Matcher(new byte?[] + { + 0x4E, 0x45, 0x11, 0x20, 0xBE, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x03, 0x00, + 0x00, 0x20, 0x00, 0x3A, 0x7E, 0x3E, 0x01, 0x00, + 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, + 0x4B, 0x00, 0x40, 0x00, 0x58, 0x00, 0x90, 0x00, + 0x9C, 0x00, 0xA4, 0x00, 0xD0, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + }, "2.1 (16-bit)"), + + new Matcher(new byte?[] + { + 0x4E, 0x45, 0x11, 0x20, 0x80, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0A, 0x03, 0x03, 0x00, + 0x00, 0x20, 0x00, 0x3A, 0x90, 0x2B, 0x01, 0x00, + 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, + 0x4B, 0x00, 0x40, 0x00, 0x58, 0x00, 0x58, 0x00, + 0x64, 0x00, 0x6A, 0x00, 0x92, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + }, "Compact 2.1 (16-bit)"), + + new Matcher(new byte?[] + { + 0x4E, 0x45, 0x11, 0x20, 0xBE, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x03, 0x00, + 0x00, 0x20, 0x00, 0x3A, 0x08, 0x44, 0x01, 0x00, + 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, + 0x4B, 0x00, 0x40, 0x00, 0x58, 0x00, 0x90, 0x00, + 0x9C, 0x00, 0xA4, 0x00, 0xD0, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + }, "Software Installation 2.1 (16-bit)"), + + #endregion + + #region 32-bit SFX Header Checks + + // .............8�92....�P..............�P..�P..�P..VW95SE.SFX + new Matcher(new byte?[] + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x9C, 0x39, + 0x32, 0x00, 0x00, 0x00, 0x00, 0x88, 0x50, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x50, 0x00, + 0x00, 0x88, 0x50, 0x00, 0x00, 0x88, 0x50, 0x00, + 0x00, 0x56, 0x57, 0x39, 0x35, 0x53, 0x45, 0x2E, + 0x53, 0x46, 0x58, + }, "2.0 (32-bit)"), + + // .............]�92....�P..............�P..�P..�P..VW95SRE.SFX + new Matcher(new byte?[] + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x9C, 0x39, + 0x32, 0x00, 0x00, 0x00, 0x00, 0x88, 0x50, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x50, 0x00, + 0x00, 0x88, 0x50, 0x00, 0x00, 0x88, 0x50, 0x00, + 0x00, 0x56, 0x57, 0x39, 0x35, 0x53, 0x52, 0x45, + 0x2E, 0x53, 0x46, 0x58, + }, "Software Installation 2.0 (32-bit)"), + + // .............���3....�P..............�P..�P..�P..VW95SE.SFX + new Matcher(new byte?[] + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x82, 0x94, + 0x33, 0x00, 0x00, 0x00, 0x00, 0x88, 0x50, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x50, 0x00, + 0x00, 0x88, 0x50, 0x00, 0x00, 0x88, 0x50, 0x00, + 0x00, 0x56, 0x57, 0x39, 0x35, 0x53, 0x45, 0x2E, + 0x53, 0x46, 0x58, + }, "2.1 RC2 (32-bit)"), + + // .............���3....�P..............�P..�P..�P..VW95SRE.SFX + new Matcher(new byte?[] + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0x82, 0x94, + 0x33, 0x00, 0x00, 0x00, 0x00, 0x88, 0x50, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x50, 0x00, + 0x00, 0x88, 0x50, 0x00, 0x00, 0x88, 0x50, 0x00, + 0x00, 0x56, 0x57, 0x39, 0x35, 0x53, 0x52, 0x45, + 0x2E, 0x53, 0x46, 0x58, + }, "Software Installation 2.1 RC2 (32-bit)"), + + // .............U��3....�P..............�P..�P..�P..VW95SE.SFX + new Matcher(new byte?[] + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xCD, 0xCC, + 0x33, 0x00, 0x00, 0x00, 0x00, 0x88, 0x50, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x50, 0x00, + 0x00, 0x88, 0x50, 0x00, 0x00, 0x88, 0x50, 0x00, + 0x00, 0x56, 0x57, 0x39, 0x35, 0x53, 0x45, 0x2E, + 0x53, 0x46, 0x58, + }, "2.1 (32-bit)"), + + // .............{��3....�P..............�P..�P..�P..VW95SRE.SFX + new Matcher(new byte?[] + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xCD, 0xCC, + 0x33, 0x00, 0x00, 0x00, 0x00, 0x88, 0x50, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x50, 0x00, + 0x00, 0x88, 0x50, 0x00, 0x00, 0x88, 0x50, 0x00, + 0x00, 0x56, 0x57, 0x39, 0x35, 0x53, 0x52, 0x45, + 0x2E, 0x53, 0x46, 0x58, + }, "Software Installation 2.1 (32-bit)"), + + #endregion + + #region 32-bit PE Header Checks + + new Matcher(new byte?[] + { + 0x50, 0x45, 0x00, 0x00, 0x4C, 0x01, 0x05, 0x00, + 0x69, 0x1B, 0x5B, 0x3A, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x01, + 0x0B, 0x01, 0x05, 0x0A, 0x00, 0x4A, 0x00, 0x00, + 0x00, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xD8, 0x39, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, + }, "2.2.4003"), + + new Matcher(new byte?[] + { + 0x50, 0x45, 0x00, 0x00, 0x4C, 0x01, 0x05, 0x00, + 0x81, 0x1B, 0x5B, 0x3A, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x01, + 0x0B, 0x01, 0x05, 0x0A, 0x00, 0x56, 0x00, 0x00, + 0x00, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8F, 0x3F, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, + }, "Software Installation 2.2.4003"), + + #endregion }; - if (fileContent.FirstPosition(check, out _)) - return "Software Installation 2.1 (16-bit)"; - - #endregion - - #region 32-bit SFX Header Checks - - // .............8�92....�P..............�P..�P..�P..VW95SE.SFX - check = new byte?[] - { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x9C, 0x39, - 0x32, 0x00, 0x00, 0x00, 0x00, 0x88, 0x50, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x50, 0x00, - 0x00, 0x88, 0x50, 0x00, 0x00, 0x88, 0x50, 0x00, - 0x00, 0x56, 0x57, 0x39, 0x35, 0x53, 0x45, 0x2E, - 0x53, 0x46, 0x58, - }; - if (fileContent.FirstPosition(check, out _)) - return "2.0 (32-bit)"; - - // .............]�92....�P..............�P..�P..�P..VW95SRE.SFX - check = new byte?[] - { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x9C, 0x39, - 0x32, 0x00, 0x00, 0x00, 0x00, 0x88, 0x50, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x50, 0x00, - 0x00, 0x88, 0x50, 0x00, 0x00, 0x88, 0x50, 0x00, - 0x00, 0x56, 0x57, 0x39, 0x35, 0x53, 0x52, 0x45, - 0x2E, 0x53, 0x46, 0x58, - }; - if (fileContent.FirstPosition(check, out _)) - return "Software Installation 2.0 (32-bit)"; - - // .............���3....�P..............�P..�P..�P..VW95SE.SFX - check = new byte?[] - { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x82, 0x94, - 0x33, 0x00, 0x00, 0x00, 0x00, 0x88, 0x50, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x50, 0x00, - 0x00, 0x88, 0x50, 0x00, 0x00, 0x88, 0x50, 0x00, - 0x00, 0x56, 0x57, 0x39, 0x35, 0x53, 0x45, 0x2E, - 0x53, 0x46, 0x58, - }; - if (fileContent.FirstPosition(check, out _)) - return "2.1 RC2 (32-bit)"; - - // .............���3....�P..............�P..�P..�P..VW95SRE.SFX - check = new byte?[] - { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0x82, 0x94, - 0x33, 0x00, 0x00, 0x00, 0x00, 0x88, 0x50, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x50, 0x00, - 0x00, 0x88, 0x50, 0x00, 0x00, 0x88, 0x50, 0x00, - 0x00, 0x56, 0x57, 0x39, 0x35, 0x53, 0x52, 0x45, - 0x2E, 0x53, 0x46, 0x58, - }; - if (fileContent.FirstPosition(check, out _)) - return "Software Installation 2.1 RC2 (32-bit)"; - - // .............U��3....�P..............�P..�P..�P..VW95SE.SFX - check = new byte?[] - { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xCD, 0xCC, - 0x33, 0x00, 0x00, 0x00, 0x00, 0x88, 0x50, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x50, 0x00, - 0x00, 0x88, 0x50, 0x00, 0x00, 0x88, 0x50, 0x00, - 0x00, 0x56, 0x57, 0x39, 0x35, 0x53, 0x45, 0x2E, - 0x53, 0x46, 0x58, - }; - if (fileContent.FirstPosition(check, out _)) - return "2.1 (32-bit)"; - - // .............{��3....�P..............�P..�P..�P..VW95SRE.SFX - check = new byte?[] - { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xCD, 0xCC, - 0x33, 0x00, 0x00, 0x00, 0x00, 0x88, 0x50, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x50, 0x00, - 0x00, 0x88, 0x50, 0x00, 0x00, 0x88, 0x50, 0x00, - 0x00, 0x56, 0x57, 0x39, 0x35, 0x53, 0x52, 0x45, - 0x2E, 0x53, 0x46, 0x58, - }; - if (fileContent.FirstPosition(check, out _)) - return "Software Installation 2.1 (32-bit)"; - - #endregion - - #region 32-bit PE Header Checks - - // PE..L...i.[:........�........J...*......�9.......`....@. - check = new byte?[] - { - 0x50, 0x45, 0x00, 0x00, 0x4C, 0x01, 0x05, 0x00, - 0x69, 0x1B, 0x5B, 0x3A, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x01, - 0x0B, 0x01, 0x05, 0x0A, 0x00, 0x4A, 0x00, 0x00, - 0x00, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xD8, 0x39, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, - }; - if (fileContent.FirstPosition(check, out _)) - return "2.2.4003"; - - // PE..L.....[:........�........V...*.......?.......p....@. - check = new byte?[] - { - 0x50, 0x45, 0x00, 0x00, 0x4C, 0x01, 0x05, 0x00, - 0x81, 0x1B, 0x5B, 0x3A, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x01, - 0x0B, 0x01, 0x05, 0x0A, 0x00, 0x56, 0x00, 0x00, - 0x00, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x8F, 0x3F, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, - }; - if (fileContent.FirstPosition(check, out _)) - return "Software Installation 2.2.4003"; - - #endregion - - return "Unknown 2.X"; + string match = MatchUtil.GetFirstContentMatch(file, fileContent, matchers, false); + return match ?? "Unknown 2.x"; } private static string GetV3PlusVersion(string version)