예제 #1
0
        public override ArcFile TryOpen(ArcView file)
        {
            int count = file.View.ReadInt32(4);

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

            var  base_name = Path.GetFileNameWithoutExtension(file.Name);
            long offset    = 8;
            var  dir       = new List <Entry>();
            int  i         = 0;

            while (offset < file.MaxOffset)
            {
                uint size = file.View.ReadUInt32(offset);
                offset += 4;
                var entry = new Entry {
                    Name   = string.Format("{0}#{1:D4}", base_name, i++),
                    Offset = offset,
                    Size   = size
                };
                if (!entry.CheckPlacement(file.MaxOffset))
                {
                    return(null);
                }
                uint signature = file.View.ReadUInt32(offset);
                var  res       = AutoEntry.DetectFileType(signature);
                entry.ChangeType(res);
                offset += size;
                dir.Add(entry);
            }
            return(new ArcFile(file, this, dir));
        }
예제 #2
0
 void DetectFileTypes(ArcView file, List <Entry> dir)
 {
     foreach (var entry in dir)
     {
         var offset    = entry.Offset;
         var signature = file.View.ReadUInt32(offset);
         if (entry.Size > 0x10 && 0x4C495243 == signature) // 'CRIL'
         {
             uint packed_size = file.View.ReadUInt32(offset + 12);
             if (packed_size < entry.Size - 0x10)
             {
                 signature = file.View.ReadUInt32(offset + 0x10 + packed_size);
                 if (0x10 == signature)
                 {
                     signature = file.View.ReadUInt32(offset + 0x10 + packed_size + signature);
                 }
             }
         }
         var res = AutoEntry.DetectFileType(signature);
         if (null != res)
         {
             entry.Type = res.Type;
             entry.Name = Path.ChangeExtension(entry.Name, res.Extensions.FirstOrDefault());
         }
     }
 }
예제 #3
0
        public override ArcFile TryOpen(ArcView file)
        {
            if (!file.View.AsciiEqual(4, "FILELINK"))
            {
                return(null);
            }
            int count = file.View.ReadInt32(0x10);

            if (!IsSaneCount(count))
            {
                return(null);
            }
            uint index_offset = file.View.ReadUInt32(0x18);
            var  dir          = new List <Entry> (count);

            for (int i = 0; i < count; ++i)
            {
                var  name   = file.View.ReadString(index_offset, 0x28);
                uint offset = file.View.ReadUInt32(index_offset + 0x2C);
                var  entry  = AutoEntry.Create(file, offset, name);
                entry.Size = file.View.ReadUInt32(index_offset + 0x30);
                if (!entry.CheckPlacement(file.MaxOffset))
                {
                    return(null);
                }
                dir.Add(entry);
                index_offset += 0x40;
            }
            return(new ArcFile(file, this, dir));
        }
예제 #4
0
        public override ArcFile TryOpen(ArcView file)
        {
            int count = file.View.ReadInt32(4);

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

            var  base_name    = Path.GetFileNameWithoutExtension(file.Name);
            uint index_offset = 8;
            long base_offset  = index_offset + count * 4;
            var  dir          = new List <Entry> (count);

            for (int i = 0; i < count; ++i)
            {
                uint offset = file.View.ReadUInt32(index_offset);
                index_offset += 4;
                var name  = string.Format("{0}#{1:D4}", base_name, i);
                var entry = AutoEntry.Create(file, base_offset + offset, name);
                if (entry.Offset >= file.MaxOffset)
                {
                    return(null);
                }
                dir.Add(entry);
            }
            for (int i = 1; i < dir.Count; ++i)
            {
                dir[i - 1].Size = (uint)(dir[i].Offset - dir[i - 1].Offset);
            }
            var last_entry = dir[dir.Count - 1];

            last_entry.Size = (uint)(file.MaxOffset - last_entry.Offset);
            return(new ArcFile(file, this, dir));
        }
예제 #5
0
        public override ArcFile TryOpen(ArcView file)
        {
            if (!file.Name.HasExtension(".paq"))
            {
                return(null);
            }
            int count = file.View.ReadInt32(0);

            if (!IsSaneCount(count))
            {
                return(null);
            }
            var  base_name    = Path.GetFileNameWithoutExtension(file.Name);
            uint index_offset = 8;
            uint data_offset  = 4 + (uint)count * 8;
            var  dir          = new List <Entry> (count);

            for (int i = 0; i < count; ++i)
            {
                var name  = string.Format("{0}#{1:D4}", base_name, i);
                var entry = AutoEntry.Create(file, data_offset, name);
                entry.Size = file.View.ReadUInt32(index_offset);
                if (!entry.CheckPlacement(file.MaxOffset))
                {
                    return(null);
                }
                dir.Add(entry);
                index_offset += 8;
                data_offset  += entry.Size;
            }
            return(new ArcFile(file, this, dir));
        }
예제 #6
0
 public void DetectTypes(IEnumerable <Entry> dir, Func <Entry, uint> get_signature)
 {
     foreach (var entry in dir.Where(e => string.IsNullOrEmpty(e.Type)))
     {
         if (entry.Name.HasAnyOfExtensions("txt", "nut"))
         {
             entry.Type = "script";
             continue;
         }
         uint signature = get_signature(entry);
         var  res       = AutoEntry.DetectFileType(signature);
         if (res != null)
         {
             entry.ChangeType(res);
         }
         else if (0x474E4D8A == signature)
         {
             entry.Name = Path.ChangeExtension(entry.Name, "mng");
         }
         else if (entry.Name.StartsWith("script/"))
         {
             entry.Type = "script";
         }
     }
 }
예제 #7
0
파일: ArcIFX.cs 프로젝트: uboaa/GARbro
        public override ArcFile TryOpen(ArcView file)
        {
            if (!file.Name.HasExtension(".ifx") || file.MaxOffset <= 0x10000)
            {
                return(null);
            }
            var base_name = Path.GetFileNameWithoutExtension(file.Name);
            var dir       = new List <Entry>();

            for (uint index_offset = 0x20; index_offset < 0x10000; index_offset += 0x10)
            {
                if (file.View.ReadUInt16(index_offset) == 0)
                {
                    continue;
                }
                var  name   = string.Format("{0}#{1:D5}", base_name, dir.Count);
                uint offset = file.View.ReadUInt32(index_offset + 4);
                var  entry  = AutoEntry.Create(file, offset, name);
                entry.Size = file.View.ReadUInt32(index_offset + 8);
                if (!entry.CheckPlacement(file.MaxOffset))
                {
                    return(null);
                }
                dir.Add(entry);
                index_offset += 0x10;
            }
            if (0 == dir.Count)
            {
                return(null);
            }
            return(new ArcFile(file, this, dir));
        }
예제 #8
0
파일: ArcYOX.cs 프로젝트: zxc120/GARbro
 void DetectFileTypes(Stream file, IList <Entry> dir)
 {
     foreach (PackedEntry entry in dir)
     {
         file.Position = entry.Offset;
         uint      signature = ReadUInt32(file);
         IResource res       = null;
         if (0x584F59 == signature) // 'YOX'
         {
             if (0 != (2 & ReadUInt32(file)))
             {
                 entry.IsPacked     = true;
                 entry.UnpackedSize = ReadUInt32(file);
                 entry.Offset      += 0x10;
                 entry.Size        -= 0x10;
                 file.Position      = entry.Offset;
                 using (var input = new ZLibStream(file, CompressionMode.Decompress, true))
                     signature = ReadUInt32(input);
                 res = AutoEntry.DetectFileType(signature);
             }
         }
         else
         {
             res = AutoEntry.DetectFileType(signature);
         }
         if (res != null)
         {
             entry.Name = Path.ChangeExtension(entry.Name, res.Extensions.FirstOrDefault());
             entry.Type = res.Type;
         }
     }
 }
예제 #9
0
        public override ArcFile TryOpen(ArcView file)
        {
            int count = file.View.ReadInt32(0);

            if (!IsSaneCount(count))
            {
                return(null);
            }
            List <Entry> dir = null;

            foreach (var name_size in NameSizes)
            {
                uint index_size   = (uint)((name_size + 8) * count);
                uint first_offset = file.View.ReadUInt32(4 + name_size + 4);
                if (first_offset == (4 + index_size) && first_offset < file.MaxOffset)
                {
                    if (null == dir)
                    {
                        dir = new List <Entry> (count);
                    }
                    else
                    {
                        dir.Clear();
                    }
                    long index_offset = 4;
                    for (int i = 0; i < count; ++i)
                    {
                        string name = file.View.ReadString(index_offset, name_size);
                        if (string.IsNullOrWhiteSpace(name))
                        {
                            goto CheckNextLength;
                        }
                        index_offset += name_size;
                        uint offset = file.View.ReadUInt32(index_offset + 4);
                        var  entry  = new AutoEntry(name, () => {
                            uint signature = file.View.ReadUInt32(offset);
                            if (1 == signature)
                            {
                                return(s_GraFormat.Value);
                            }
                            return(AutoEntry.DetectFileType(signature));
                        });
                        entry.Offset = offset;
                        entry.Size   = file.View.ReadUInt32(index_offset);
                        if (offset <= index_size || !entry.CheckPlacement(file.MaxOffset))
                        {
                            goto CheckNextLength;
                        }
                        dir.Add(entry);
                        index_offset += 8;
                    }
                    return(new ArcFile(file, this, dir));
                }
CheckNextLength:
                ;
            }
            return(null);
        }
예제 #10
0
파일: ArcAdvSys3.cs 프로젝트: zxc120/GARbro
        public override ArcFile TryOpen(ArcView file)
        {
            if (!file.Name.HasExtension(".dat") ||
                !Path.GetFileName(file.Name).StartsWith("arc", StringComparison.InvariantCultureIgnoreCase))
            {
                return(null);
            }
            long current_offset = 0;
            var  dir            = new List <Entry>();

            while (current_offset < file.MaxOffset)
            {
                uint size = file.View.ReadUInt32(current_offset);
                if (0 == size)
                {
                    break;
                }
                uint name_length = file.View.ReadUInt16(current_offset + 8);
                if (0 == name_length || name_length > 0x100)
                {
                    return(null);
                }
                var name = file.View.ReadString(current_offset + 10, name_length);
                if (0 == name.Length)
                {
                    return(null);
                }
                current_offset += 10 + name_length;
                if (current_offset + size > file.MaxOffset)
                {
                    return(null);
                }
                var entry = new Entry {
                    Name   = name,
                    Offset = current_offset,
                    Size   = size,
                };
                uint signature = file.View.ReadUInt32(current_offset);
                if (file.View.AsciiEqual(current_offset + 4, "GWD"))
                {
                    entry.Type = "image";
                    entry.Name = Path.ChangeExtension(entry.Name, "gwd");
                }
                else
                {
                    var res = AutoEntry.DetectFileType(signature);
                    entry.ChangeType(res);
                }
                dir.Add(entry);
                current_offset += size;
            }
            if (0 == dir.Count)
            {
                return(null);
            }
            return(new ArcFile(file, this, dir));
        }
예제 #11
0
        public override ArcFile TryOpen(ArcView file)
        {
            if (!(file.View.AsciiEqual(0, "DataPack5") ||
                  file.View.AsciiEqual(0, "GsPack5") ||
                  file.View.AsciiEqual(0, "GsPack4")))
            {
                return(null);
            }
            int  version_minor = file.View.ReadUInt16(0x30);
            int  version_major = file.View.ReadUInt16(0x32);
            uint index_size    = file.View.ReadUInt32(0x34);
            int  count         = file.View.ReadInt32(0x3c);

            if (!IsSaneCount(count) || index_size > 0xffffff)
            {
                return(null);
            }
            uint crypt_key     = file.View.ReadUInt32(0x38);
            long data_offset   = file.View.ReadUInt32(0x40);
            int  index_offset  = file.View.ReadInt32(0x44);
            int  entry_size    = version_major < 5 ? 0x48 : 0x68;
            int  unpacked_size = count * entry_size;

            byte[] packed_index = file.View.ReadBytes(index_offset, index_size);
            if (index_size != packed_index.Length)
            {
                return(null);
            }
            if (0 != crypt_key)
            {
                for (int i = 0; i != packed_index.Length; ++i)
                {
                    packed_index[i] ^= (byte)(i & crypt_key);
                }
            }
            using (var stream = new MemoryStream(packed_index))
                using (var reader = new LzssReader(stream, packed_index.Length, unpacked_size))
                {
                    reader.Unpack();
                    var index = reader.Data;
                    index_offset = 0;
                    var dir = new List <Entry> (count);
                    for (int i = 0; i < count; ++i)
                    {
                        string name = Binary.GetCString(index, index_offset, 0x40);
                        if (0 != name.Length)
                        {
                            long offset = data_offset + LittleEndian.ToUInt32(index, index_offset + 0x40);
                            var  entry  = AutoEntry.Create(file, offset, name);
                            entry.Size = LittleEndian.ToUInt32(index, index_offset + 0x44);
                            dir.Add(entry);
                        }
                        index_offset += entry_size;
                    }
                    return(new ArcFile(file, this, dir));
                }
        }
예제 #12
0
        static void SetEntryType(Entry entry, uint signature)
        {
            var res = AutoEntry.DetectFileType(signature);

            if (null != res)
            {
                entry.ChangeType(res);
            }
        }
예제 #13
0
        public override ArcFile TryOpen(ArcView file)
        {
            var first_offset = file.View.ReadUInt32(8);

            if (first_offset <= 0x14 || first_offset >= file.MaxOffset || first_offset > int.MaxValue)
            {
                return(null);
            }
            int index_size = (int)(first_offset - 4);
            var count      = index_size / 0x10;

            if (count * 0x10 != index_size)
            {
                return(null);
            }

            string base_name    = Path.GetFileNameWithoutExtension(file.Name);
            uint   index_offset = 4;
            uint   last_offset  = 0;
            var    dir          = new List <Entry> (count);

            for (int i = 0; i < count; ++i)
            {
                var offset = file.View.ReadUInt32(index_offset + 4);
                if (0 == offset)
                {
                    break;
                }
                if (offset <= last_offset)
                {
                    return(null);
                }
                string name  = string.Format("{0}#{1:D4}", base_name, i);
                var    entry = new AutoEntry(name, () => {
                    uint signature = file.View.ReadUInt32(offset);
                    if (0 == signature)
                    {
                        return(null);
                    }
                    return(FormatCatalog.Instance.LookupSignature(signature).FirstOrDefault());
                });
                entry.Offset = offset;
                entry.Size   = file.View.ReadUInt32(index_offset);
                if (!entry.CheckPlacement(file.MaxOffset))
                {
                    return(null);
                }
                dir.Add(entry);
                last_offset   = offset;
                index_offset += 0x10;
            }
            if (0 == dir.Count)
            {
                return(null);
            }
            return(new ArcFile(file, this, dir));
        }
예제 #14
0
        public override ArcFile TryOpen(ArcView file)
        {
            if (!file.View.AsciiEqual(4, "KO ARC20"))
            {
                return(null);
            }
            int count = file.View.ReadInt32(12);

            if (!IsSaneCount(count))
            {
                return(null);
            }
            uint index_size = 0x80 * (uint)count;

            if (index_size > file.View.Reserve(0x10, index_size))
            {
                return(null);
            }
            var  dir          = new List <Entry> (count);
            long index_offset = 0x10;
            long base_offset  = index_offset + index_size;

            for (uint i = 0; i < count; ++i)
            {
                string name   = file.View.ReadString(index_offset, 0x60);
                var    offset = base_offset + file.View.ReadUInt32(index_offset + 0x60);
                var    entry  = new PackedEntry {
                    Name = name, Offset = offset
                };
                entry.Size = file.View.ReadUInt32(index_offset + 0x64);
                if (!entry.CheckPlacement(file.MaxOffset))
                {
                    return(null);
                }
                dir.Add(entry);
                index_offset += 0x80;
            }
            foreach (var entry in dir)
            {
                uint signature = file.View.ReadUInt32(entry.Offset);
                var  res       = AutoEntry.DetectFileType(signature);
                if (res != null)
                {
                    entry.Type = res.Type;
                }
                else if (file.View.AsciiEqual(entry.Offset, "BSE 1."))
                {
                    entry.Type = "image";
                }
                else if (file.View.AsciiEqual(entry.Offset + 4, "bw  "))
                {
                    entry.Type = "audio";
                }
            }
            return(new ArcFile(file, this, dir));
        }
예제 #15
0
        public override ArcFile TryOpen(ArcView file)
        {
            if (file.View.ReadUInt32(4) != 0)
            {
                return(null);
            }
            int count = file.View.ReadInt32(0xC);

            if (!IsSaneCount(count))
            {
                return(null);
            }
            uint index_offset = file.View.ReadUInt32(8);

            if (index_offset >= file.MaxOffset || index_offset + count * 4 > file.MaxOffset)
            {
                return(null);
            }
            var base_name = Path.GetFileNameWithoutExtension(file.Name);
            var dir       = new List <Entry> (count);

            for (int i = 0; i < count; ++i)
            {
                var entry = new Entry {
                    Name   = string.Format("{0}#{1:D5}", base_name, i),
                    Offset = file.View.ReadUInt32(index_offset) + 0x20,
                };
                if (entry.Offset > index_offset)
                {
                    return(null);
                }
                dir.Add(entry);
                index_offset += 4;
            }
            for (int i = 1; i < count; ++i)
            {
                dir[i - 1].Size = (uint)(dir[i].Offset - dir[i - 1].Offset);
            }
            dir[count - 1].Size = (uint)(index_offset - dir[count - 1].Offset);
            foreach (var entry in dir)
            {
                uint signature = file.View.ReadUInt32(entry.Offset);
                if (0x544F48 == signature) // 'HOT'
                {
                    if (0x21 == (file.View.ReadByte(entry.Offset + 7) & 0x21))
                    {
                        entry.Type = "image";
                    }
                }
                else
                {
                    entry.ChangeType(AutoEntry.DetectFileType(signature));
                }
            }
            return(new ArcFile(file, this, dir));
        }
예제 #16
0
파일: ArcGPC.cs 프로젝트: tenyuhuang/GARbro
 void DetectFileTypes(ArcView file, List <Entry> dir)
 {
     using (var input = file.CreateStream())
         using (var reader = new ArcView.Reader(input))
         {
             var buffer = new byte[0x10];
             foreach (PackedEntry entry in dir)
             {
                 input.Position = entry.Offset;
                 uint packed_size = reader.ReadUInt32();
                 entry.UnpackedSize = reader.ReadUInt32();
                 entry.Offset      += 8;
                 if (0 == packed_size)
                 {
                     entry.Size = entry.UnpackedSize;
                 }
                 else
                 {
                     entry.IsPacked = true;
                     entry.Size     = packed_size;
                 }
                 if (entry.Size < 0x10)
                 {
                     continue;
                 }
                 uint signature;
                 if (entry.IsPacked)
                 {
                     UnpackEntry(input, buffer);
                     signature = LittleEndian.ToUInt32(buffer, 0);
                 }
                 else
                 {
                     signature = reader.ReadUInt32();
                 }
                 IResource res;
                 if (0x020000 == signature || 0x0A0000 == signature)
                 {
                     res = ImageFormat.Tga;
                 }
                 else
                 {
                     res = AutoEntry.DetectFileType(signature);
                 }
                 if (null != res)
                 {
                     entry.Type = res.Type;
                     var ext = res.Extensions.FirstOrDefault();
                     if (!string.IsNullOrEmpty(ext))
                     {
                         entry.Name = Path.ChangeExtension(entry.Name, ext);
                     }
                 }
             }
         }
 }
예제 #17
0
파일: ArcABMP.cs 프로젝트: zxc120/GARbro
        static internal void DetectFileType(ArcView file, Entry entry)
        {
            uint signature = file.View.ReadUInt32(entry.Offset);
            var  res       = AutoEntry.DetectFileType(signature);

            if (null != res)
            {
                entry.ChangeType(res);
            }
        }
예제 #18
0
파일: ArcVOL.cs 프로젝트: zxc120/GARbro
        public override ArcFile TryOpen(ArcView file)
        {
            if (!file.Name.HasExtension(".vol"))
            {
                return(null);
            }
            uint first_offset = file.View.ReadUInt32(0);

            if (first_offset < 0x10 || 0 != (first_offset & 0xF) || first_offset >= file.MaxOffset)
            {
                return(null);
            }
            int count = (int)(first_offset / 4);

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

            var offset_table = new List <uint> (count);

            offset_table.Add(first_offset);
            uint index_offset = 4;

            for (int i = 1; i < count; ++i)
            {
                uint offset = file.View.ReadUInt32(index_offset);
                if (offset < offset_table[i - 1] || offset > file.MaxOffset)
                {
                    return(null);
                }
                offset_table.Add(offset);
                if (offset == file.MaxOffset)
                {
                    break;
                }
                index_offset += 4;
            }
            var base_name = Path.GetFileNameWithoutExtension(file.Name);
            var dir       = new List <Entry> (offset_table.Count - 1);

            for (int i = 0; i < offset_table.Count - 1; ++i)
            {
                uint size = offset_table[i + 1] - offset_table[i];
                if (0 == size)
                {
                    continue;
                }
                var name  = string.Format("{0}#{1:D4}", base_name, i);
                var entry = AutoEntry.Create(file, offset_table[i], name);
                entry.Size = size;
                dir.Add(entry);
            }
            return(new ArcFile(file, this, dir));
        }
예제 #19
0
파일: ArcBIN.cs 프로젝트: zxc120/GARbro
        public override ArcFile TryOpen(ArcView file)
        {
            int count = file.View.ReadInt32(0);

            if ((count & 0xFFFF) != 0)
            {
                return(null);
            }
            count = (count >> 16) - 1;
            if (!IsSaneCount(count))
            {
                return(null);
            }

            uint index_offset = 0xC;
            var  dir          = new List <Entry> (count);

            for (int i = 0; i < count; ++i)
            {
                var name  = file.View.ReadUInt32(index_offset).ToString("D5");
                var entry = new PackedEntry {
                    Name     = name,
                    Offset   = file.View.ReadUInt32(index_offset + 4) << 11,
                        Size = file.View.ReadUInt32(index_offset + 8),
                };
                if (!entry.CheckPlacement(file.MaxOffset))
                {
                    return(null);
                }
                dir.Add(entry);
                index_offset += 12;
            }
            foreach (PackedEntry entry in dir)
            {
                uint signature;
                if (entry.Size > 13 && file.View.AsciiEqual(entry.Offset + 2, "ike"))
                {
                    int unpacked_size = IkeReader.DecodeSize(file.View.ReadByte(entry.Offset + 10),
                                                             file.View.ReadByte(entry.Offset + 11),
                                                             file.View.ReadByte(entry.Offset + 12));
                    entry.IsPacked     = true;
                    entry.UnpackedSize = (uint)unpacked_size;
                    signature          = file.View.ReadUInt32(entry.Offset + 0xF);
                    entry.Offset      += 13;
                    entry.Size        -= 13;
                }
                else
                {
                    signature = file.View.ReadUInt32(entry.Offset);
                }
                entry.ChangeType(AutoEntry.DetectFileType(signature));
            }
            return(new ArcFile(file, this, dir));
        }
예제 #20
0
        public override ArcFile TryOpen(ArcView file)
        {
            if (!file.View.AsciiEqual(0, "MD"))
            {
                return(null);
            }
            uint entry_length = file.View.ReadUInt16(4);
            int  count        = file.View.ReadUInt16(6);

            if (entry_length <= 8 || !IsSaneCount(count))
            {
                return(null);
            }

            uint name_length  = entry_length - 8;
            uint index_offset = 0x10;
            var  dir          = new List <Entry> (count);

            for (int i = 0; i < count; ++i)
            {
                var name = file.View.ReadString(index_offset, name_length);
                index_offset += name_length;
                uint offset = file.View.ReadUInt32(index_offset + 4);

                var entry = new AutoEntry(name, () => {
                    uint signature = file.View.ReadUInt32(offset);
                    if (0x4259 == (signature & 0xFFFF)) // 'YB'
                    {
                        return(PrsFormat.Value);
                    }
                    return(AutoEntry.DetectFileType(signature));
                });
                entry.Size   = file.View.ReadUInt32(index_offset);
                entry.Offset = offset;
                if (!entry.CheckPlacement(file.MaxOffset))
                {
                    return(null);
                }
                dir.Add(entry);
                index_offset += 8;
            }
            var base_name = Path.GetFileNameWithoutExtension(file.Name);

            if (base_name.EndsWith("_scr", StringComparison.OrdinalIgnoreCase) &&
                KnownSchemes.Count > 0)
            {
                var encryption = QueryEncryption(file.Name);
                if (encryption != null)
                {
                    return(new ScrMedArchive(file, this, dir, encryption));
                }
            }
            return(new ArcFile(file, this, dir));
        }
예제 #21
0
파일: ArcBIN.cs 프로젝트: zxc120/GARbro
        public override ArcFile TryOpen(ArcView file)
        {
            int count = file.View.ReadInt32(0);

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

            var base_name    = Path.GetFileNameWithoutExtension(file.Name);
            int index_offset = 4;
            int index_end    = 4 + 8 * count;
            var dir          = new List <Entry> (count);

            for (int i = 0; i < count; ++i)
            {
                var entry = new PackedEntry
                {
                    Offset = file.View.ReadUInt32(index_offset),
                    Size   = file.View.ReadUInt32(index_offset + 4),
                };
                if (entry.Offset < index_end || !entry.CheckPlacement(file.MaxOffset))
                {
                    return(null);
                }
                entry.Name = string.Format("{0}#{1:D5}", base_name, i);
                dir.Add(entry);
                index_offset += 8;
            }
            foreach (PackedEntry entry in dir)
            {
                var n = file.View.ReadInt32(entry.Offset);
                if (n <= 0)
                {
                    return(null);
                }
                var offset = file.View.ReadUInt32(entry.Offset + 4);
                var size   = file.View.ReadUInt32(entry.Offset + 8);
                entry.Offset  += offset;
                entry.Size     = size & 0x3FFFFFFF;
                entry.IsPacked = 2 != (size >> 30);
                if (!entry.CheckPlacement(file.MaxOffset))
                {
                    return(null);
                }
                var res = AutoEntry.DetectFileType(file.View.ReadUInt32(entry.Offset));
                if (res != null)
                {
                    entry.ChangeType(res);
                }
            }
            return(new ArcFile(file, this, dir));
        }
예제 #22
0
파일: ArcBMX.cs 프로젝트: zxc120/GARbro
        public override ArcFile TryOpen(ArcView file)
        {
            int count = file.View.ReadInt32(0);

            if (!IsSaneCount(count))
            {
                return(null);
            }
            uint index_size = (uint)count * 4 + 8;

            if (index_size > file.View.Reserve(0, index_size))
            {
                return(null);
            }
            uint index_offset = 4;
            uint offset       = file.View.ReadUInt32(index_offset);

            if (offset != index_size)
            {
                return(null);
            }
            uint last_offset = file.View.ReadUInt32(index_size - 4);

            if (last_offset != file.MaxOffset)
            {
                return(null);
            }
            var base_name = Path.GetFileNameWithoutExtension(file.Name);
            var dir       = new List <Entry> (count);

            for (int i = 0; i < count; ++i)
            {
                index_offset += 4;
                var entry = new Entry {
                    Name   = string.Format("{0}#{1:D4}", base_name, i),
                    Offset = offset,
                };
                offset     = file.View.ReadUInt32(index_offset);
                entry.Size = (uint)(offset - entry.Offset);
                if (!entry.CheckPlacement(file.MaxOffset))
                {
                    return(null);
                }
                dir.Add(entry);
            }
            foreach (var entry in dir)
            {
                uint signature = file.View.ReadUInt32(entry.Offset);
                entry.ChangeType(AutoEntry.DetectFileType(signature));
            }
            return(new ArcFile(file, this, dir));
        }
예제 #23
0
        internal void DetectFileTypes(ArcView file, IEnumerable <Entry> dir)
        {
            var buffer = new byte[4];

            foreach (var entry in dir.Where(e => e.Size > 4))
            {
                file.View.Read(entry.Offset, buffer, 0, 4);
                Decrypt(buffer);
                uint signature = buffer.ToUInt32(0);
                var  res       = AutoEntry.DetectFileType(signature);
                entry.ChangeType(res);
            }
        }
예제 #24
0
        public override ArcFile TryOpen(ArcView file)
        {
            int count = file.View.ReadInt16(0);

            if (!IsSaneCount(count))
            {
                return(null);
            }
            uint index_offset = 2;
            uint next_offset  = file.View.ReadUInt32(index_offset);

            if (next_offset != count * 4 + 6)
            {
                return(null);
            }
            var base_name = Path.GetFileNameWithoutExtension(file.Name);
            var dir       = new List <Entry> (count);

            for (int i = 0; i < count; ++i)
            {
                index_offset += 4;
                var entry = new Entry {
                    Name   = string.Format("{0}#{1:D4}", base_name, i),
                    Offset = next_offset,
                };
                next_offset = file.View.ReadUInt32(index_offset);
                if (next_offset < entry.Offset)
                {
                    return(null);
                }
                entry.Size = (uint)(next_offset - entry.Offset);
                if (!entry.CheckPlacement(file.MaxOffset))
                {
                    return(null);
                }
                dir.Add(entry);
            }
            foreach (var entry in dir)
            {
                uint signature = file.View.ReadUInt32(entry.Offset);
                if ((signature & 0xFFFF) == 0x4246) // 'FB'
                {
                    entry.Type = "image";
                }
                else
                {
                    entry.ChangeType(AutoEntry.DetectFileType(signature));
                }
            }
            return(new ArcFile(file, this, dir));
        }
예제 #25
0
파일: ArcGD.cs 프로젝트: zxc120/GARbro
        public override ArcFile TryOpen(ArcView file)
        {
            string index_name = Path.ChangeExtension(file.Name, ".dll");

            if (index_name == file.Name || !VFS.FileExists(index_name))
            {
                return(null);
            }
            var index_entry = VFS.FindFile(index_name);

            if (index_entry.Size < 12)
            {
                return(null);
            }
            int count = file.View.ReadInt32(0);

            if (!IsSaneCount(count) || (count & 0xFFFF) == 0x5A4D)  // 'MZ'
            {
                return(null);
            }

            var base_name = Path.GetFileNameWithoutExtension(file.Name);

            using (var idx = VFS.OpenView(index_entry))
            {
                var  dir          = new List <Entry> (count);
                uint index_offset = 4;
                int  i            = 0;
                uint last_offset  = 3;
                while (index_offset + 8 <= idx.MaxOffset)
                {
                    uint offset = idx.View.ReadUInt32(index_offset);
                    if (offset <= last_offset)
                    {
                        return(null);
                    }
                    var name  = string.Format("{0}#{1:D5}", base_name, i++);
                    var entry = AutoEntry.Create(file, offset, name);
                    entry.Size = idx.View.ReadUInt32(index_offset + 4);
                    if (!entry.CheckPlacement(file.MaxOffset))
                    {
                        return(null);
                    }
                    dir.Add(entry);
                    last_offset   = offset;
                    index_offset += 8;
                }
                return(new ArcFile(file, this, dir));
            }
        }
예제 #26
0
파일: ArcGPC.cs 프로젝트: zxc120/GARbro
 void DetectFileTypes(ArcView file, List <Entry> dir)
 {
     using (var input = file.CreateStream())
     {
         var buffer = new byte[0x10];
         foreach (PackedEntry entry in dir)
         {
             input.Position = entry.Offset;
             uint packed_size = input.ReadUInt32();
             entry.UnpackedSize = input.ReadUInt32();
             entry.Offset      += 8;
             if (0 == packed_size)
             {
                 entry.Size = entry.UnpackedSize;
             }
             else
             {
                 entry.IsPacked = true;
                 entry.Size     = packed_size;
             }
             if (entry.Size < 0x10)
             {
                 continue;
             }
             uint signature;
             if (entry.IsPacked)
             {
                 UnpackEntry(input, buffer);
                 signature = LittleEndian.ToUInt32(buffer, 0);
             }
             else
             {
                 signature = input.ReadUInt32();
             }
             IResource res;
             if (0x020000 == signature || 0x0A0000 == signature)
             {
                 res = ImageFormat.Tga;
             }
             else
             {
                 res = AutoEntry.DetectFileType(signature);
             }
             if (null != res)
             {
                 entry.ChangeType(res);
             }
         }
     }
 }
예제 #27
0
        public override ArcFile TryOpen(ArcView file)
        {
            uint signature = file.View.ReadUInt32(0);

            if (0x44474d != (signature & 0xffffff)) // 'MGD'
            {
                return(null);
            }
            int count = file.View.ReadInt16(0x20);

            if (count <= 0)
            {
                return(null);
            }
            int flag         = file.View.ReadUInt16(3);
            var dir          = new List <Entry> (count);
            int index_offset = 0x22;

            byte[] name_buf = new byte[16];
            for (uint i = 0; i < count; ++i)
            {
                int name_size = file.View.ReadByte(index_offset + 1);
                if (0 == name_size)
                {
                    return(null);
                }
                if (name_size > name_buf.Length)
                {
                    Array.Resize(ref name_buf, name_size);
                }
                file.View.Read(index_offset + 2, name_buf, 0, (uint)name_size);
                if (100 == flag)
                {
                    Decrypt(name_buf, 0, name_size);
                }
                string name = Encodings.cp932.GetString(name_buf, 0, name_size);
                index_offset += 2 + name_size;

                uint offset = file.View.ReadUInt32(index_offset + 4);
                var  entry  = AutoEntry.Create(file, offset, name);
                entry.Size = file.View.ReadUInt32(index_offset);
                if (!entry.CheckPlacement(file.MaxOffset))
                {
                    return(null);
                }
                dir.Add(entry);
                index_offset += 8;
            }
            return(new ArcFile(file, this, dir));
        }
예제 #28
0
파일: ArcODN.cs 프로젝트: zxc120/GARbro
        void FixupDir()
        {
            for (int i = 0; i < m_dir.Count; ++i)
            {
                var entry = (OdnEntry)m_dir[i];

                long next_offset = i + 1 < m_dir.Count ? m_dir[i + 1].Offset : m_file.MaxOffset;
                entry.Size = (uint)(next_offset - entry.Offset);

                if (OdnOpener.Image24NameRe.IsMatch(entry.Name))
                {
                    entry.Type = "image";
                }
                else if (OdnOpener.ScriptNameRe.IsMatch(entry.Name))
                {
                    entry.Type        = "script";
                    entry.IsEncrypted = m_scripts_encrypted;
                }
                else if (OdnOpener.AudioNameRe.IsMatch(entry.Name))
                {
                    entry.Type = "audio";
                }
                else if (entry.Size > 4)
                {
                    var       signature = m_file.View.ReadUInt32(entry.Offset);
                    IResource res       = null;
                    if (0x5E6A6A42 == signature)
                    {
                        res = OggAudio.Instance;
                    }
                    else if (AudioFormat.Wav.Signature == signature)
                    {
                        res = AudioFormat.Wav;
                    }
                    else
                    {
                        res = AutoEntry.DetectFileType(signature);
                    }
                    if (res != null)
                    {
                        entry.ChangeType(res);
                    }
                    else if (OdnOpener.Image32NameRe.IsMatch(entry.Name))
                    {
                        entry.Type = "image";
                    }
                }
            }
        }
        public static List <AutoEntry> GetAutoEntries(int opexid, int subsidiaryid, int supplementaryid)
        {
            var dbUtil      = new DatabaseManager();
            var autoentries = new List <AutoEntry>();

            using (var conn = new SqlConnection(dbUtil.getSQLConnectionString("MainDB")))
            {
                conn.Open();
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandType    = CommandType.StoredProcedure;
                    cmd.CommandText    = "spAccRFGetAutoEntries";
                    cmd.CommandTimeout = 180;
                    cmd.Parameters.Clear();
                    if (opexid > 0)
                    {
                        cmd.Parameters.AddWithValue("@intOpexID", opexid);
                    }
                    cmd.Parameters.AddWithValue("@intSubsidaryID", subsidiaryid);
                    if (supplementaryid > 0)
                    {
                        cmd.Parameters.AddWithValue("@intSupplementaryID", supplementaryid);
                    }

                    using (SqlDataReader reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            var autoentry = new AutoEntry
                            {
                                COAID           = ReferenceEquals(reader["intCOAID"], DBNull.Value) ? 0 : Convert.ToInt32(reader["intCOAID"]),
                                COACode         = ReferenceEquals(reader["strCOACode"], DBNull.Value) ? string.Empty : Convert.ToString(reader["strCOACode"]),
                                COAName         = ReferenceEquals(reader["strCOAName"], DBNull.Value) ? string.Empty : Convert.ToString(reader["strCOAName"]),
                                COAAccountSide  = ReferenceEquals(reader["strCOAAccountSide"], DBNull.Value) ? string.Empty : Convert.ToString(reader["strCOAAccountSide"]),
                                SubsidiaryID    = ReferenceEquals(reader["intSubsidiaryID"], DBNull.Value) ? 0 : Convert.ToInt32(reader["intSubsidiaryID"]),
                                SubsidiaryCode  = ReferenceEquals(reader["strSubsidiaryCode"], DBNull.Value) ? string.Empty : Convert.ToString(reader["strSubsidiaryCode"]),
                                SubsidiaryName  = ReferenceEquals(reader["strSubdisiary"], DBNull.Value) ? string.Empty : Convert.ToString(reader["strSubdisiary"]),
                                SupplementaryID = ReferenceEquals(reader["intSupplementaryID"], DBNull.Value) ? 0 : Convert.ToInt32(reader["intSupplementaryID"]),
                                Supplementary   = ReferenceEquals(reader["strSupplementary"], DBNull.Value) ? string.Empty : Convert.ToString(reader["strSupplementary"])
                            };

                            autoentries.Add(autoentry);
                        }
                    }
                }
            }

            return(autoentries);
        }
예제 #30
0
파일: ArcAil.cs 프로젝트: zxc120/GARbro
 static void SetEntryType(Entry entry, uint signature)
 {
     if (0xBA010000 == signature)
     {
         entry.Type = "video";
         entry.Name = Path.ChangeExtension(entry.Name, "mpg");
     }
     else
     {
         var res = AutoEntry.DetectFileType(signature);
         if (null != res)
         {
             entry.ChangeType(res);
         }
     }
 }
예제 #31
0
 public override ArcFile TryOpen(ArcView file)
 {
     int count = file.View.ReadInt32 (0);
     if (!IsSaneCount (count))
         return null;
     List<Entry> dir = null;
     foreach (var name_size in NameSizes)
     {
         uint index_size = (uint)((name_size+8) * count);
         uint first_offset = file.View.ReadUInt32 (4+name_size+4);
         if (first_offset == (4 + index_size) && first_offset < file.MaxOffset)
         {
             if (null == dir)
                 dir = new List<Entry> (count);
             long index_offset = 4;
             for (int i = 0; i < count; ++i)
             {
                 string name = file.View.ReadString (index_offset, name_size);
                 if (string.IsNullOrWhiteSpace (name))
                     goto CheckNextLength;
                 index_offset += name_size;
                 uint offset = file.View.ReadUInt32 (index_offset+4);
                 var entry = new AutoEntry (name, () => {
                     uint signature = file.View.ReadUInt32 (offset);
                     if (1 == signature)
                         return s_GraFormat.Value;
                     return AutoEntry.DetectFileType (signature);
                 });
                 entry.Offset = offset;
                 entry.Size   = file.View.ReadUInt32 (index_offset);
                 if (offset <= index_size || !entry.CheckPlacement (file.MaxOffset))
                     goto CheckNextLength;
                 dir.Add (entry);
                 index_offset += 8;
             }
             return new ArcFile (file, this, dir);
         }
     CheckNextLength:
         ;
     }
     return null;
 }
예제 #32
0
파일: ArcMED.cs 프로젝트: Casidi/GARbro
        public override ArcFile TryOpen(ArcView file)
        {
            if (!file.View.AsciiEqual (0, "MD"))
                return null;
            uint entry_length = file.View.ReadUInt16 (4);
            int count = file.View.ReadUInt16 (6);
            if (entry_length <= 8 || !IsSaneCount (count))
                return null;

            uint name_length = entry_length - 8;
            uint index_offset = 0x10;
            var dir = new List<Entry> (count);
            for (int i = 0; i < count; ++i)
            {
                var name = file.View.ReadString (index_offset, name_length);
                index_offset += name_length;
                uint offset = file.View.ReadUInt32 (index_offset+4);

                var entry = new AutoEntry (name, () => {
                    uint signature = file.View.ReadUInt32 (offset);
                    if (0x4259 == (signature & 0xFFFF)) // 'YB'
                        return PrsFormat.Value;
                    return AutoEntry.DetectFileType (signature);
                });
                entry.Size   = file.View.ReadUInt32 (index_offset);
                entry.Offset = offset;
                if (!entry.CheckPlacement (file.MaxOffset))
                    return null;
                dir.Add (entry);
                index_offset += 8;
            }
            var base_name = Path.GetFileNameWithoutExtension (file.Name);
            if (base_name.EndsWith ("_scr", StringComparison.InvariantCultureIgnoreCase)
                && KnownSchemes.Count > 0)
            {
                var options = Query<MedOptions> (arcStrings.ArcEncryptedNotice);
                if (options.Encryption != null)
                    return new ScrMedArchive (file, this, dir, options.Encryption);
            }
            return new ArcFile (file, this, dir);
        }
예제 #33
0
파일: ArcBIN.cs 프로젝트: Casidi/GARbro
        public override ArcFile TryOpen(ArcView file)
        {
            var first_offset = file.View.ReadUInt32 (8);
            if (first_offset <= 0x14 || first_offset >= file.MaxOffset || first_offset > int.MaxValue)
                return null;
            int index_size = (int)(first_offset - 4);
            var count = index_size / 0x10;
            if (count * 0x10 != index_size)
                return null;

            string base_name = Path.GetFileNameWithoutExtension (file.Name);
            uint index_offset = 4;
            uint last_offset = 0;
            var dir = new List<Entry> (count);
            for (int i = 0; i < count; ++i)
            {
                var offset = file.View.ReadUInt32 (index_offset+4);
                if (0 == offset)
                    break;
                if (offset <= last_offset)
                    return null;
                string name = string.Format ("{0}#{1:D4}", base_name, i);
                var entry = new AutoEntry (name, () => {
                    uint signature = file.View.ReadUInt32 (offset);
                    if (0 == signature) return null;
                    return FormatCatalog.Instance.LookupSignature (signature).FirstOrDefault();
                });
                entry.Offset = offset;
                entry.Size = file.View.ReadUInt32 (index_offset);
                if (!entry.CheckPlacement (file.MaxOffset))
                    return null;
                dir.Add (entry);
                last_offset = offset;
                index_offset += 0x10;
            }
            if (0 == dir.Count)
                return null;
            return new ArcFile (file, this, dir);
        }