private void WriteHeader(BinaryWriter writer, GpkPackage package) { writer.Write(package.Header.Tag); writer.Write(package.Header.FileVersion); writer.Write(package.Header.LicenseVersion); writer.Write(package.Header.PackageFlags); writer.Write(package.Header.PackageName.Length + 1); WriteString(writer, package.Header.PackageName); writer.Write(package.Header.Unk1); writer.Write(package.Header.Unk2); writer.Write(package.Header.NameCount + package.Header.NameOffset); //tera thing offsetNamePos = writer.BaseStream.Position; writer.Write(package.Header.NameOffset); writer.Write(package.Header.ExportCount); offsetExportPos = writer.BaseStream.Position; writer.Write(package.Header.ExportOffset); writer.Write(package.Header.ImportCount); offsetImportPos = writer.BaseStream.Position; writer.Write(package.Header.ImportOffset); writer.Write(package.Header.DependsOffset); writer.Write(package.Header.FGUID); writer.Write(package.Header.Generations.Count); for (int i = 0; i < package.Header.Generations.Count; i++) { GpkGeneration tmpgen = package.Header.Generations[i]; writer.Write(tmpgen.ExportCount); writer.Write(tmpgen.NameCount); writer.Write(tmpgen.NetObjectCount); } writer.Write(package.Header.Unk3); writer.Write(package.Header.Unk4); writer.Write(package.Header.Unk5); writer.Write(package.Header.Unk6); //writer.Write(package.Header.EngineVersion); writer.Write(0xC0FFEEAA); //my signature ^^ writer.Write(package.Header.CookerVersion); logger.Debug("Wrote header pos " + writer.BaseStream.Position); }
private void WriteHeader(BinaryWriter writer, GpkPackage package) { writer.Write(package.Header.Tag); writer.Write(package.Header.FileVersion); writer.Write(package.Header.LicenseVersion); writer.Write(package.Header.PackageFlags); WriteString(writer, package.Header.PackageName, true); writer.Write(package.Header.Unk1); writer.Write(package.Header.Unk2); if (package.x64) { writer.Write(package.Header.NameCount); } else { writer.Write(package.Header.NameCount + package.Header.NameOffset); //tera thing } offsetNamePos = writer.BaseStream.Position; writer.Write(package.Header.NameOffset); writer.Write(package.Header.ExportCount); offsetExportPos = writer.BaseStream.Position; writer.Write(package.Header.ExportOffset); writer.Write(package.Header.ImportCount); offsetImportPos = writer.BaseStream.Position; writer.Write(package.Header.ImportOffset); writer.Write(package.Header.DependsOffset); if (package.x64) { writer.Write(package.Header.Unk3); } writer.Write(package.Header.FGUID); writer.Write(package.Header.Generations.Count); for (int i = 0; i < package.Header.Generations.Count; i++) { GpkGeneration tmpgen = package.Header.Generations[i]; writer.Write(tmpgen.ExportCount); writer.Write(tmpgen.NameCount); writer.Write(tmpgen.NetObjectCount); } //24 //writer.Write(package.Header.EngineVersion); writer.Write(0xC0FFEEAA); //my signature writer.Write(package.Header.CookerVersion); writer.Write((int)0); //compressionFlags, we dont apply this writer.Write((long)0); //unk writer.Write((int)0); logger.Debug("Wrote header pos " + writer.BaseStream.Position); }
private void ReadHeader(BinaryReader reader, GpkPackage package) { logger.Trace("Header start"); package.Header.Tag = reader.ReadInt32(); CheckSignature(package.Header.Tag); package.Header.FileVersion = reader.ReadInt16(); package.Header.LicenseVersion = reader.ReadInt16(); package.x64 = package.Header.FileVersion >= 0x381; package.Header.PackageFlags = reader.ReadInt32(); int len = reader.ReadInt32(); package.Header.PackageName = ReadString(reader, len); package.Header.Unk1 = reader.ReadInt16(); package.Header.Unk2 = reader.ReadInt16(); package.Header.NameCount = reader.ReadInt32(); package.Header.NameOffset = reader.ReadInt32(); if (!package.x64) { FixNameCount(package); } package.Header.ExportCount = reader.ReadInt32(); package.Header.ExportOffset = reader.ReadInt32(); package.Header.ImportCount = reader.ReadInt32(); package.Header.ImportOffset = reader.ReadInt32(); package.Header.DependsOffset = reader.ReadInt32(); logger.Debug("NameCount " + package.Header.NameCount); logger.Debug("NameOffset " + package.Header.NameOffset); logger.Debug("ExportCount " + package.Header.ExportCount); logger.Debug("ExportOffset " + package.Header.ExportOffset); logger.Debug("ImportCount " + package.Header.ImportCount); logger.Debug("ImportOffset " + package.Header.ImportOffset); logger.Debug("DependsOffset " + package.Header.DependsOffset); if (package.x64) { package.Header.Unk3 = reader.ReadBytes(16); } stat.totalobjects = package.Header.NameCount + package.Header.ImportCount + package.Header.ExportCount * 3; //Export, Export Linking, ExportData = *3 logger.Info("File Info: NameCount {0}, ImportCount {1}, ExportCount {2}", package.Header.NameCount, package.Header.ImportCount, package.Header.ExportCount); package.Header.FGUID = reader.ReadBytes(16); //logger.Info("FGUID " + package.Header.FGUID); int generation_count = reader.ReadInt32(); for (int i = 0; i < generation_count; i++) { GpkGeneration tmpgen = new GpkGeneration(); tmpgen.ExportCount = reader.ReadInt32(); tmpgen.NameCount = reader.ReadInt32(); tmpgen.NetObjectCount = reader.ReadInt32(); logger.Debug("Generation {0}, ExportCount {1}, NameCount {2}, NetObjectCount {3}", i, tmpgen.ExportCount, tmpgen.NameCount, tmpgen.NetObjectCount); package.Header.Generations.Add(tmpgen); } package.Header.EngineVersion = reader.ReadInt32(); package.Header.CookerVersion = reader.ReadInt32(); package.Header.CompressionFlags = reader.ReadInt32(); int chunkCount = reader.ReadInt32(); for (int i = 0; i < chunkCount; i++) { var chunk = new GpkCompressedChunkHeader(); chunk.UncompressedOffset = reader.ReadInt32(); chunk.UncompressedSize = reader.ReadInt32(); chunk.CompressedOffset = reader.ReadInt32(); chunk.CompressedSize = reader.ReadInt32(); package.Header.ChunkHeaders.Add(chunk); if (i == 0) { package.UncompressedSize = chunk.CompressedOffset + chunk.UncompressedSize; //header + chunk 1, assumption is that chunk 1 lays behind header } else { package.UncompressedSize += chunk.UncompressedSize; } } if (package.Header.EngineVersion == 0xC0FFEE) { logger.Info("Found a old brother ;)"); } logger.Debug("EngineVersion {0}, CookerVersion {1}, compressionFlags {2}, chunkCount {3}", package.Header.EngineVersion, package.Header.CookerVersion, package.Header.CompressionFlags, package.Header.ChunkHeaders.Count); logger.Debug("Compressed: {0}, FullyCompressed {1}, PackageFlags {2:X}", ((GpkPackageFlags)package.Header.PackageFlags & GpkPackageFlags.Compressed), ((GpkPackageFlags)package.Header.PackageFlags & GpkPackageFlags.FullyCompressed), package.Header.PackageFlags ); }
private void ReadHeader(BinaryReader reader, GpkPackage package) { logger.Trace("Header start"); package.Header.Tag = reader.ReadInt32(); CheckSignature(package.Header.Tag); package.Header.FileVersion = reader.ReadInt16(); package.Header.LicenseVersion = reader.ReadInt16(); package.Header.PackageFlags = reader.ReadInt32(); int len = reader.ReadInt32(); package.Header.PackageName = ReadString(reader, len); package.Header.Unk1 = reader.ReadInt16(); package.Header.Unk2 = reader.ReadInt16(); package.Header.NameCount = reader.ReadInt32(); package.Header.NameOffset = reader.ReadInt32(); FixNameCount(package); package.Header.ExportCount = reader.ReadInt32(); package.Header.ExportOffset = reader.ReadInt32(); package.Header.ImportCount = reader.ReadInt32(); package.Header.ImportOffset = reader.ReadInt32(); package.Header.DependsOffset = reader.ReadInt32(); logger.Debug("NameCount " + package.Header.NameCount); logger.Debug("NameOffset " + package.Header.NameOffset); logger.Debug("ExportCount " + package.Header.ExportCount); logger.Debug("ExportOffset " + package.Header.ExportOffset); logger.Debug("ImportCount " + package.Header.ImportCount); logger.Debug("ImportOffset " + package.Header.ImportOffset); logger.Debug("DependsOffset " + package.Header.DependsOffset); stat.totalobjects = package.Header.NameCount + package.Header.ImportCount + package.Header.ExportCount * 3; //Export, Export Linking, ExportData = *3 logger.Info("File Info: NameCount {0}, ImportCount {1}, ExportCount {2}", package.Header.NameCount, package.Header.ImportCount, package.Header.ExportCount); package.Header.FGUID = reader.ReadBytes(16); //logger.Info("FGUID " + package.Header.FGUID); int generation_count = reader.ReadInt32(); for (int i = 0; i < generation_count; i++) { GpkGeneration tmpgen = new GpkGeneration(); tmpgen.ExportCount = reader.ReadInt32(); tmpgen.NameCount = reader.ReadInt32(); tmpgen.NetObjectCount = reader.ReadInt32(); logger.Debug("Generation {0}, ExportCount {1}, NameCount {2}, NetObjectCount {3}", i, tmpgen.ExportCount, tmpgen.NameCount, tmpgen.NetObjectCount); package.Header.Generations.Add(tmpgen); } package.Header.Unk3 = reader.ReadInt32(); package.Header.Unk4 = reader.ReadInt32(); package.Header.Unk5 = reader.ReadInt32(); package.Header.Unk6 = reader.ReadInt32(); package.Header.EngineVersion = reader.ReadInt32(); package.Header.CookerVersion = reader.ReadInt32(); if (package.Header.EngineVersion == 0xC0FFEE) { logger.Info("Found a old brother ;)"); } logger.Debug("Unk3 {0}, Unk4 {1}, Unk5 {2}, Unk6 {3}, EngineVersion {4}, CookerVersion {5}", package.Header.Unk3, package.Header.Unk4, package.Header.Unk5, package.Header.Unk6, package.Header.EngineVersion, package.Header.CookerVersion); }
private void WriteHeader(BinaryWriter writer, GpkPackage package, bool reserveChunkheaderSize) { writer.Write(package.Header.Tag); writer.Write(package.Header.FileVersion); writer.Write(package.Header.LicenseVersion); writer.Write(package.Header.HeaderSize); WriteString(writer, package.Header.PackageName, true); writer.Write(package.Header.PackageFlags); if (package.x64) { writer.Write(package.Header.NameCount); } else { writer.Write(package.Header.NameCount + package.Header.NameOffset); //tera thing } offsetNamePos = writer.BaseStream.Position; writer.Write(package.Header.NameOffset); writer.Write(package.Header.ExportCount); offsetExportPos = writer.BaseStream.Position; writer.Write(package.Header.ExportOffset); writer.Write(package.Header.ImportCount); offsetImportPos = writer.BaseStream.Position; writer.Write(package.Header.ImportOffset); offsetDependsPos = writer.BaseStream.Position; writer.Write(package.Header.DependsOffset); headerSizeOffset = writer.BaseStream.Position; if (package.x64) { writer.Write(package.Header.HeaderSize); } if (package.x64) { writer.Write(package.Header.Unk1); } writer.Write(package.Header.FGUID); writer.Write(package.Header.Generations.Count); for (int i = 0; i < package.Header.Generations.Count; i++) { GpkGeneration tmpgen = package.Header.Generations[i]; writer.Write(tmpgen.ExportCount); writer.Write(tmpgen.NameCount); writer.Write(tmpgen.NetObjectCount); } //24 writer.Write(package.Header.EngineVersion); writer.Write(package.Header.CookerVersion); if (CoreSettings.Default.EnableCompression) { writer.Write(package.Header.CompressionFlags); //compressionFlags if (reserveChunkheaderSize) { int headerCount = package.EstimateChunkHeaderCount(); //16 bytes per chunkheader writer.Write((int)0); //chunkcount; //writer.Write(new byte[16 * headerCount]); } else { writer.Write(package.Header.ChunkHeaders.Count); //chunkcount; foreach (var chunk in package.Header.ChunkHeaders) { writer.Write(chunk.UncompressedOffset); writer.Write(chunk.UncompressedSize); writer.Write(chunk.CompressedOffset); writer.Write(chunk.CompressedSize); } } } else { writer.Write((int)0); //compressionFlags writer.Write((int)0); //chunkheadercount } writer.Write(package.Header.HeaderPadding); //unk stuff logger.Debug("Wrote header pos " + writer.BaseStream.Position); }
private void ReadHeader(BinaryReader reader, GpkPackage package) { logger.Trace("Header start"); if (reader.BaseStream.Length == 0) { throw new Exception("Not a valid GPK File."); } package.Header.Tag = reader.ReadInt32(); CheckSignature(package.Header.Tag); package.Header.FileVersion = reader.ReadInt16(); package.Header.LicenseVersion = reader.ReadInt16(); package.x64 = package.Header.FileVersion >= 0x381; package.Header.HeaderSize = reader.ReadInt32(); int len = reader.ReadInt32(); package.Header.PackageName = ReadString(reader, len); package.Header.PackageFlags = reader.ReadInt32(); package.Header.NameCount = reader.ReadInt32(); package.Header.NameOffset = reader.ReadInt32(); if (!package.x64) { FixNameCount(package); } package.Header.ExportCount = reader.ReadInt32(); package.Header.ExportOffset = reader.ReadInt32(); package.Header.ImportCount = reader.ReadInt32(); package.Header.ImportOffset = reader.ReadInt32(); package.Header.DependsOffset = reader.ReadInt32(); if (package.x64) { package.Header.HeaderSize = reader.ReadInt32(); //seralizedoffset } if (package.x64) { package.Header.Unk1 = reader.ReadBytes(12); } logger.Debug("NameCount " + package.Header.NameCount); logger.Debug("NameOffset " + package.Header.NameOffset); logger.Debug("ExportCount " + package.Header.ExportCount); logger.Debug("ExportOffset " + package.Header.ExportOffset); logger.Debug("ImportCount " + package.Header.ImportCount); logger.Debug("ImportOffset " + package.Header.ImportOffset); logger.Debug("DependsOffset " + package.Header.DependsOffset); logger.Debug("HeaderSize " + package.Header.HeaderSize); stat.totalobjects = package.Header.NameCount + package.Header.ImportCount + package.Header.ExportCount * 3; //Export, Export Linking, ExportData = *3 logger.Debug("File Info: NameCount {0}, ImportCount {1}, ExportCount {2}", package.Header.NameCount, package.Header.ImportCount, package.Header.ExportCount); package.Header.FGUID = reader.ReadBytes(16); int generation_count = reader.ReadInt32(); package.Header.Generations.Clear(); for (int i = 0; i < generation_count; i++) { GpkGeneration tmpgen = new GpkGeneration(); tmpgen.ExportCount = reader.ReadInt32(); tmpgen.NameCount = reader.ReadInt32(); tmpgen.NetObjectCount = reader.ReadInt32(); logger.Debug("Generation {0}, ExportCount {1}, NameCount {2}, NetObjectCount {3}", i, tmpgen.ExportCount, tmpgen.NameCount, tmpgen.NetObjectCount); package.Header.Generations.Add(tmpgen); } package.Header.EngineVersion = reader.ReadInt32(); package.Header.CookerVersion = reader.ReadInt32(); package.Header.CompressionFlags = reader.ReadInt32(); int chunkCount = reader.ReadInt32(); package.Header.ChunkHeaders.Clear(); for (int i = 0; i < chunkCount; i++) { var chunk = new GpkCompressedChunkHeader(); chunk.UncompressedOffset = reader.ReadInt32(); chunk.UncompressedSize = reader.ReadInt32(); chunk.CompressedOffset = reader.ReadInt32(); chunk.CompressedSize = reader.ReadInt32(); package.Header.ChunkHeaders.Add(chunk); if (i == 0) { package.UncompressedSize = chunk.CompressedOffset + chunk.UncompressedSize; //header + chunk 1, assumption is that chunk 1 lays behind header } else { package.UncompressedSize += chunk.UncompressedSize; } int endOfChunk = chunk.CompressedOffset + chunk.CompressedSize; if (endOfChunk > package.CompressedEndOffset) { package.CompressedEndOffset = endOfChunk; } logger.Debug("Chunk {0}: UncompressedOffset {1}, UncompressedSize {2}, CompressedOffset {3}, CompressedSize {4}, CompressedEnd {5}", i, chunk.UncompressedOffset, chunk.UncompressedSize, chunk.CompressedOffset, chunk.CompressedSize, endOfChunk); } logger.Debug("EngineVersion {0}, CookerVersion {1}, compressionFlags {2}, chunkCount {3}, PkgUncompressedSize {4}", package.Header.EngineVersion, package.Header.CookerVersion, package.Header.CompressionFlags, package.Header.ChunkHeaders.Count, package.UncompressedSize); logger.Debug("Compressed: {0}, FullyCompressed {1}, PackageFlags {2:X}", ((GpkPackageFlags)package.Header.PackageFlags & GpkPackageFlags.Compressed), ((GpkPackageFlags)package.Header.PackageFlags & GpkPackageFlags.FullyCompressed), package.Header.PackageFlags ); int paddingSize; if (chunkCount > 0) { // for compressed packages we can calcualte how much extra data there is paddingSize = package.Header.ChunkHeaders[0].CompressedOffset - (int)(reader.BaseStream.Position); } else { //uncompressed, save everythign to the namelist paddingSize = package.Header.NameOffset - (int)(reader.BaseStream.Position); } if (paddingSize > 0 && paddingSize < 1024) { //sanity check package.Header.HeaderPadding = reader.ReadBytes(paddingSize); } logger.Debug("End of Header at {0}, paddingSize {1}", reader.BaseStream.Position, package.Header.HeaderPadding.Length); }