Ejemplo n.º 1
0
        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));
        }
Ejemplo n.º 2
0
        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));
        }