Esempio n. 1
0
 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);
     }
 }
Esempio n. 2
0
        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();
        }
Esempio n. 3
0
 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();
     }
 }
Esempio n. 4
0
        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();
        }
Esempio n. 5
0
        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();
        }