using NetMFAPatcher.Utils; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection.Emit; using System.Security.Cryptography.X509Certificates; using System.Text; using System.Threading.Tasks; namespace NetMFAPatcher.mmfparser { public class PackData { public PackFile[] items; public PackData() { } public void Read(ByteIO exeReader) { long start = exeReader.Tell(); byte[] header = exeReader.ReadBytes(8); exeReader.Skip(8); uint header_size = exeReader.ReadUInt32(); uint data_size = exeReader.ReadUInt32(); exeReader.Seek((int)(start + data_size - 32)); exeReader.Skip(4); exeReader.Seek(start + 16); uint format_version = exeReader.ReadUInt32(); exeReader.Skip(8); uint count = exeReader.ReadUInt32(); Logger.Log($"Found {count.ToString()} Pack Files:", true, ConsoleColor.Blue); long offset = exeReader.Tell(); for (int i = 0; i < count; i++) { if (!exeReader.Check(2)) break; UInt16 value = exeReader.ReadUInt16(); if (!exeReader.Check(value)) break; exeReader.ReadBytes(value); exeReader.Skip(value); if (!exeReader.Check(value)) break; } exeReader.BaseStream.Position -= 5;//wtf lol header = exeReader.ReadFourCC(); exeReader.Seek(offset); for (int i = 0; i < count; i++) new PackFile().Read(exeReader); Logger.Log("\nPackdata Done\n", true, ConsoleColor.Blue); } } public class PackFile { string PackFilename = "ERROR"; int bingo = 0; byte[] data; public void Read(ByteIO exeReader) { UInt16 len = exeReader.ReadUInt16(); PackFilename = exeReader.ReadWideString(len); bingo = exeReader.ReadInt32(); data = exeReader.ReadBytes(exeReader.ReadInt32()); Dump(); } public void Dump() { Logger.Log($"Dumping {PackFilename}", true, ConsoleColor.DarkBlue); string path = $"{Program.DumpPath}\\extensions\\" + PackFilename; File.WriteAllBytes(path, data); } } }