public override ArcFile TryOpen(ArcView file) { int count = file.View.ReadInt32(0); if (!IsSaneCount(count) || 4 + count * 0x1C >= file.MaxOffset) { return(null); } var index_reader = new ArcIndexReader(file, count, true); // var scheme = new EncryptionScheme ("haku", 0x10); var scheme = index_reader.GuessScheme(4, new int[] { 0x10 }); if (null == scheme) { return(null); } var dir = index_reader.ReadIndex(4, scheme); if (null == dir) { return(null); } return(new ArcFile(file, this, dir)); }
public override ArcFile TryOpen(ArcView file) { int count = file.View.ReadInt32(0); if (!IsSaneCount(count) || 8 + count * MinEntryLength >= file.MaxOffset) { return(null); } uint is_compressed = file.View.ReadUInt32(4); if (is_compressed > 1) // should be either 0 or 1 { return(null); } var index_reader = new ArcIndexReader(file, count, is_compressed != 0); var scheme = index_reader.GuessScheme(8, new int[] { 0x20, 0x18 }); // additional checks to avoid dialog popup on false positives if (null == scheme && KnownSchemes.Count > 0 && file.Name.HasExtension(".arc")) { var first_entry = file.View.ReadBytes(8, 0x20); if (-1 == Array.FindIndex(first_entry, x => x != 0)) { return(null); } scheme = QueryScheme(); } if (null == scheme) { return(null); } // special case for "instdata.arc" archives if (scheme.Keyword != "inst" && VFS.IsPathEqualsToFileName(file.Name, "instdata.arc")) { scheme = new EncryptionScheme("inst", scheme.NameLength); } var dir = index_reader.ReadIndex(8, scheme); if (null == dir) { return(null); } return(new ArcFile(file, this, dir)); }