private void button4_Click(object sender, EventArgs e) { if (openFileDialog1.ShowDialog() == DialogResult.OK) { if (radioButton1.Checked) { endianness = EndiannessAwareBinaryReader.Endianness.Little; } else if (radioButton2.Checked) { endianness = EndiannessAwareBinaryReader.Endianness.Big; } iga = new IGA(openFileDialog1.FileName, endianness); buildTree(false); } }
public void extract(Int32 index, String path, EndiannessAwareBinaryReader.Endianness endianness) { FileStream file = new FileStream(this.file[index].getSource(), FileMode.Open, FileAccess.Read); EndiannessAwareBinaryReader reader = new EndiannessAwareBinaryReader(file, endianness); FileStream ext = new FileStream(path, FileMode.Create, FileAccess.Write); BinaryWriter writer = new BinaryWriter(ext); reader.BaseStream.Position = this.file[index].getSourceOffset(); if (this.file[index].getCompression() != Compression.NONE) { uncomress(reader, writer, this.file[index].getSize()); // , (int)((uint)this.file[index].getCompressionInt() & (0x1FFFFFFF)) } else { writer.Write(reader.ReadBytes(this.file[index].getSize())); } writer.Close(); }
private void Import_Load(object sender, EventArgs e) { if (openFileDialog1.ShowDialog() == DialogResult.OK) { if (radioButton1.Checked) { endianness = EndiannessAwareBinaryReader.Endianness.Little; } else if (radioButton2.Checked) { endianness = EndiannessAwareBinaryReader.Endianness.Big; } iga = new IGA(openFileDialog1.FileName, endianness); files1 = iga.file; buildTree(treeView1, files1); buildTree(treeView2, files2); } else { this.Close(); } }
public IGA(String path, EndiannessAwareBinaryReader.Endianness endianness) { FileStream iga_file = new FileStream(path, FileMode.Open, FileAccess.Read); EndiannessAwareBinaryReader reader = new EndiannessAwareBinaryReader(iga_file, endianness); signature = reader.ReadInt32(); version = reader.ReadInt32(); info_size = reader.ReadInt32(); files_count = reader.ReadInt32(); chunk_size = reader.ReadInt32(); magic_number1 = reader.ReadInt32(); magic_number2 = reader.ReadInt32(); zero1 = reader.ReadInt32(); table1_size = reader.ReadInt32(); table2_size = reader.ReadInt32(); if (version == 11 || version == 10) //Skylanders SuperChargers WiiU Big Endian { zero2 = reader.ReadInt32(); names_offset = reader.ReadUInt32(); } else { names_offset = reader.ReadUInt32(); zero2 = reader.ReadInt32(); } names_size = reader.ReadInt32(); one = reader.ReadInt32(); for (int i = 0; i < files_count; ++i) { file.Add(new File()); file[i].setID(reader.ReadInt32()); file[i].setSource(path); } for (int i = 0; i < files_count; ++i) { if (version == 11 || version == 10) { file[i].setOrdinal(reader.ReadInt32()); file[i].setOffset(reader.ReadUInt32()); } else { file[i].setOffset(reader.ReadUInt32()); file[i].setOrdinal(reader.ReadInt32()); } file[i].setSize(reader.ReadInt32()); file[i].setCompression(reader.ReadInt32()); file[i].setSourceOffset(file[i].getOffset()); } for (int i = 0; i < table1_size; ++i) { mc_table.Add(reader.ReadUInt16()); } for (int i = 0; i < table2_size / 2; ++i) { sc_table.Add(reader.ReadUInt16()); } //Size: 920944 //Ordinal: 606208 // max: 33 499 reader.BaseStream.Position = names_offset; Int32[] name_offsets = new Int32[files_count]; for (int i = 0; i < files_count; ++i) { name_offsets[i] = reader.ReadInt32(); } for (int i = 0; i < files_count; ++i) { reader.BaseStream.Position = names_offset + name_offsets[i]; if (version == 10) { String rel_name = ""; rel_name = readString(reader); file[i].setFullName(rel_name); file[i].setRelName(rel_name); } else { String full_name = ""; String rel_name = ""; full_name = readString(reader); rel_name = readString(reader); file[i].setFullName(full_name); file[i].setRelName(rel_name); } } reader.Close(); }
public void repack(String path, System.Windows.Forms.ProgressBar bar, EndiannessAwareBinaryReader.Endianness endianness) { for (int i = 0; i < files_count; ++i) { if (path == file[i].getSource()) { throw new Exception("Can't overwrite source!"); } } FileStream repacked_file = new FileStream(path, FileMode.Create, FileAccess.Write); BinaryWriter writer = new BinaryWriter(repacked_file); recalculate(); writer.Write(signature); writer.Write(version); writer.Write(info_size); writer.Write(files_count); writer.Write(chunk_size); writer.Write(magic_number1); writer.Write(magic_number2); writer.Write(zero1); writer.Write(table1_size); writer.Write(table2_size); writer.Write(names_offset); writer.Write(zero2); writer.Write(names_size); writer.Write(one); for (int i = 0; i < files_count; ++i) { writer.Write(file[i].getID()); } for (int i = 0; i < files_count; ++i) { writer.Write(file[i].getOffset()); writer.Write(file[i].getOrdinal()); writer.Write(file[i].getSize()); writer.Write(0xFFFFFFFF); } if (bar != null) { bar.Maximum = files_count; } for (int i = 0; i < files_count; ++i) { if (bar != null) { bar.Value = i; } System.Windows.Forms.Application.DoEvents(); FileStream source = new FileStream(file[i].getSource(), FileMode.Open, FileAccess.Read); EndiannessAwareBinaryReader reader = new EndiannessAwareBinaryReader(source, endianness); reader.BaseStream.Position = file[i].getSourceOffset(); writer.BaseStream.Position = file[i].getOffset(); if (file[i].getCompression() == Compression.NONE) { writer.Write(reader.ReadBytes(file[i].getSize())); } else { uncomress(reader, writer, file[i].getSize()); file[i].setCompression(Compression.NONE); } reader.Close(); } writer.BaseStream.Position = names_offset; int cur_offset = files_count * 4; for (int i = 0; i < files_count; ++i) { writer.Write(cur_offset); cur_offset += file[i].getFullName().Length + file[i].getRelName().Length + 6; } for (int i = 0; i < files_count; ++i) { String full_name = file[i].getFullName(); String rel_name = file[i].getRelName(); foreach (Char c in full_name) { writer.Write(c); } writer.Write('\0'); foreach (Char c in rel_name) { writer.Write(c); } writer.Write('\0'); writer.Write((int)0); } writer.Close(); }