Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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
                         );
        }
Пример #4
0
        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);
        }
Пример #5
0
        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);
        }
Пример #6
0
        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);
        }