예제 #1
0
파일: ArcWAG.cs 프로젝트: Casidi/GARbro
        public override ArcFile TryOpen(ArcView file)
        {
            int type = file.View.ReadUInt16 (4);
            int count = file.View.ReadInt32 (6);
            if (!IsSaneCount (count))
                return null;

            using (var enc = file.CreateStream())
            using (var dec = new EncryptedStream (enc))
            using (var index = new BinaryReader (dec))
            {
                dec.Position = 0x4A;
                var offsets = new uint[count];
                for (int i = 0; i < count; ++i)
                {
                    offsets[i] = index.ReadUInt32();
                }
                var name_buffer = new byte[0x100];
                var dir = new List<Entry> (count);
                for (int i = 0; i < count; ++i)
                {
                    index.BaseStream.Position = offsets[i];
                    uint signature = index.ReadUInt32();
                    if (signature != 0x41544144) // 'DATA'
                        continue;
                    int section_count = index.ReadInt32();
                    index.ReadInt16();
                    var entry = new Entry { Offset = offsets[i] };
                    for (int s = 0; s < section_count; ++s)
                    {
                        signature = index.ReadUInt32();
                        if (0x44474D49 == signature) // 'IMGD'
                        {
                            entry.Offset = index.BaseStream.Position - 4;
                            uint imgd_size = index.ReadUInt32();
                            entry.Size = imgd_size + 0x10;
                            index.BaseStream.Seek (imgd_size + 2, SeekOrigin.Current);
                        }
                        else if (0x454E4E46 == signature) // 'FNNE'
                        {
                            int name_length = index.ReadInt32()-2;
                            index.ReadInt16();
                            if (name_length > name_buffer.Length)
                                name_buffer = new byte[name_length];
                            index.Read (name_buffer, 0, name_length);
                            entry.Name = Encodings.cp932.GetString (name_buffer, 0, name_length);
                            entry.Type = FormatCatalog.Instance.GetTypeFromName (entry.Name);
                            index.ReadInt16();
                        }
                        else
                        {
                            var section_size = index.ReadUInt32();
                            // section not supported, skip
                            index.BaseStream.Seek (section_size+2, SeekOrigin.Current);
                            if (0x415A4F4D != signature) // 'MOZA'
                                Trace.WriteLine (string.Format ("Unknown section 0x{0:X8}", signature), "[WAG/IAF]");
                        }
                    }
                    if (entry.Size > 0 && !string.IsNullOrEmpty (entry.Name))
                        dir.Add (entry);
                }
                if (0 == dir.Count)
                    return null;
                return new ArcFile (file, this, dir);
            }
        }
예제 #2
0
파일: ArcWAG.cs 프로젝트: tenyuhuang/GARbro
        public override ArcFile TryOpen(ArcView file)
        {
            int type  = file.View.ReadUInt16(4);
            int count = file.View.ReadInt32(6);

            if (!IsSaneCount(count))
            {
                return(null);
            }

            using (var enc = file.CreateStream())
                using (var dec = new EncryptedStream(enc))
                    using (var index = new BinaryReader(dec))
                    {
                        dec.Position = 0x4A;
                        var offsets = new uint[count];
                        for (int i = 0; i < count; ++i)
                        {
                            offsets[i] = index.ReadUInt32();
                        }
                        var name_buffer = new byte[0x100];
                        var dir         = new List <Entry> (count);
                        for (int i = 0; i < count; ++i)
                        {
                            index.BaseStream.Position = offsets[i];
                            uint signature = index.ReadUInt32();
                            if (signature != 0x41544144) // 'DATA'
                            {
                                continue;
                            }
                            int section_count = index.ReadInt32();
                            index.ReadInt16();
                            var entry = new Entry {
                                Offset = offsets[i]
                            };
                            for (int s = 0; s < section_count; ++s)
                            {
                                signature = index.ReadUInt32();
                                if (0x44474D49 == signature) // 'IMGD'
                                {
                                    entry.Offset = index.BaseStream.Position - 4;
                                    uint imgd_size = index.ReadUInt32();
                                    entry.Size = imgd_size + 0x10;
                                    index.BaseStream.Seek(imgd_size + 2, SeekOrigin.Current);
                                }
                                else if (0x454E4E46 == signature) // 'FNNE'
                                {
                                    int name_length = index.ReadInt32() - 2;
                                    index.ReadInt16();
                                    if (name_length > name_buffer.Length)
                                    {
                                        name_buffer = new byte[name_length];
                                    }
                                    index.Read(name_buffer, 0, name_length);
                                    entry.Name = Encodings.cp932.GetString(name_buffer, 0, name_length);
                                    entry.Type = FormatCatalog.Instance.GetTypeFromName(entry.Name);
                                    index.ReadInt16();
                                }
                                else
                                {
                                    var section_size = index.ReadUInt32();
                                    // section not supported, skip
                                    index.BaseStream.Seek(section_size + 2, SeekOrigin.Current);
                                    if (0x415A4F4D != signature) // 'MOZA'
                                    {
                                        Trace.WriteLine(string.Format("Unknown section 0x{0:X8}", signature), "[WAG/IAF]");
                                    }
                                }
                            }
                            if (entry.Size > 0 && !string.IsNullOrEmpty(entry.Name))
                            {
                                dir.Add(entry);
                            }
                        }
                        if (0 == dir.Count)
                        {
                            return(null);
                        }
                        return(new ArcFile(file, this, dir));
                    }
        }