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)); }
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()); } } }
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)); }
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)); }
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)); }
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"; } } }
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)); }
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; } } }
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); }
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)); }
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)); } }
static void SetEntryType(Entry entry, uint signature) { var res = AutoEntry.DetectFileType(signature); if (null != res) { entry.ChangeType(res); } }
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)); }
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)); }
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)); }
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); } } } } }
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); } }
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)); }
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)); }
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)); }
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)); }
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)); }
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); } }
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)); }
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)); } }
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); } } } }
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)); }
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); }
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); } } }
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; }
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); }
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); }