Пример #1
0
        public override void Write(Stream output, IDirectory inputDirectory)
        {
            BinaryWriter writer = new BinaryWriter(output, Encoding.ASCII, true);

            const int sbpHeaderSize = 8;
            int entityHeaderSize = Entries.Count * SbpEntry.HeaderSize;
            int headerSize = sbpHeaderSize + entityHeaderSize;

            long headerPosition = output.Position;
            output.Position += headerSize;
            output.AlignWrite(16, 0x00);

            foreach (var entry in Entries)
            {
                entry.WriteData(output, inputDirectory);
                output.AlignWrite(16, 0x00);
            }

            long endPosition = output.Position;

            output.Position = headerPosition;
            writer.Write(0x4C504253); // SBPL
            writer.Write(Convert.ToByte(Entries.Count));
            writer.Write(Convert.ToUInt16(headerSize));
            writer.Write((byte)0x00);

            foreach (var entry in Entries)
            {
                entry.Write(output);
            }

            output.Position = endPosition;
        }
Пример #2
0
        public override void Write(Stream output, IDirectory inputDirectory)
        {
            BinaryWriter writer = new BinaryWriter(output, Encoding.ASCII, true);

            const int sbpHeaderSize    = 8;
            int       entityHeaderSize = Entries.Count * SbpEntry.HeaderSize;
            int       headerSize       = sbpHeaderSize + entityHeaderSize;

            long headerPosition = output.Position;

            output.Position += headerSize;
            output.AlignWrite(16, 0x00);

            foreach (var entry in Entries)
            {
                entry.WriteData(output, inputDirectory);
                output.AlignWrite(16, 0x00);
            }

            long endPosition = output.Position;

            output.Position = headerPosition;
            writer.Write(0x4C504253); // SBPL
            writer.Write(Convert.ToByte(Entries.Count));
            writer.Write(Convert.ToUInt16(headerSize));
            writer.Write((byte)0x00);

            foreach (var entry in Entries)
            {
                entry.Write(output);
            }

            output.Position = endPosition;
        }
Пример #3
0
        public override void Write(Stream output, IDirectory inputDirectory)
        {
            BinaryWriter writer = new BinaryWriter(output, Encoding.Default, true);

            foreach (var gzsEntry in Entries)
            {
                // TODO: Write the key magic number, the key and increase the entry size by 8 bytes.
                gzsEntry.WriteData(output, inputDirectory);
                output.AlignWrite(16, 0x00);
            }

            var entryBlockOffset = (int)(output.Position / 16);

            foreach (var gzsEntry in Entries)
            {
                gzsEntry.CalculateHash();
                gzsEntry.Write(output);
            }

            uint sizeSum = (uint)Entries.Sum(e => e.Size);

            writer.Write(sizeSum);
            output.AlignWrite(16, 0x00);

            GzsArchiveFooter footer = new GzsArchiveFooter
            {
                ArchiveEntryCount = Entries.Count,
                EntryBlockOffset  = entryBlockOffset
            };

            footer.Write(output);
        }
Пример #4
0
        public override void Write(Stream output, IDirectory inputDirectory)
        {
            const uint xorMask1   = 0x41441043;
            const uint xorMask2   = 0x11C22050;
            const uint xorMask3   = 0xD05608C3;
            const uint xorMask4   = 0x532C7319;
            const int  headerSize = 32;
            int        shift      = (Flags & 0x800) > 0 ? 12 : 10;
            int        alignment  = 1 << shift;

            BinaryWriter writer         = new BinaryWriter(output, Encoding.Default, true);
            long         headerPosition = output.Position;

            output.Skip(headerSize);
            long tableOffset = output.Position;

            output.Skip(8 * Entries.Count);
            //long unknownTableOffset = output.Position;
            //output.Skip(16 * UnknownEntries.Count);

            output.AlignWrite(alignment, 0x00);
            long dataOffset = output.Position;

            ulong[] sections = new ulong[Entries.Count];
            for (int i = 0; i < Entries.Count; i++)
            {
                QarEntry entry = Entries[i];
                entry.CalculateHash();
                ulong section = (ulong)(output.Position >> shift) << 40
                                | (entry.Hash & 0xFF) << 32
                                | entry.Hash >> 32 & 0xFFFFFFFFFF;
                sections[i] = section;
                entry.Write(output, inputDirectory);
                output.AlignWrite(alignment, 0x00);
            }
            long endPosition     = output.Position;
            uint endPositionHead = (uint)(endPosition >> shift);

            output.Position = headerPosition;
            writer.Write(QarMagicNumber); // SQAR
            writer.Write(Flags ^ xorMask1);
            writer.Write((uint)Entries.Count ^ xorMask2);
            writer.Write(xorMask3); // unknown count (not saved in the xml and output directory)
            writer.Write(endPositionHead ^ xorMask4);
            writer.Write((uint)dataOffset ^ xorMask1);
            writer.Write(1 ^ xorMask1);
            writer.Write(0 ^ xorMask2);

            output.Position = tableOffset;
            byte[] encryptedSectionsData = EncryptSections(sections);
            writer.Write(encryptedSectionsData);

            output.Position = endPosition;
        }
Пример #5
0
        public override void Write(Stream output, IDirectory inputDirectory)
        {
            BinaryWriter writer        = new BinaryWriter(output, Encoding.Default, true);
            const int    headerSize    = 48;
            int          indicesSize   = 48 * Entries.Count;
            int          referenceSize = 16 * References.Count;

            long startPosition = output.Position;

            output.Position += headerSize + indicesSize + referenceSize;

            foreach (var fpkEntry in Entries)
            {
                fpkEntry.WriteFilePath(output);
            }
            foreach (var fpkReference in References)
            {
                fpkReference.WriteFilePath(output);
            }
            output.AlignWrite(16, 0x00);

            foreach (var fpkEntry in Entries)
            {
                fpkEntry.WriteData(output, inputDirectory);
                output.AlignWrite(16, 0x00);
            }

            uint fileSize = (uint)output.Position;

            output.Position = startPosition;

            writer.Write(0x66786f66);     // foxf
            writer.Write((ushort)0x6B70); //pk
            writer.Write((byte)FpkType);
            writer.Write((byte)0x77);     // w
            writer.Write((ushort)0x6E69); // in
            writer.Write(fileSize);
            writer.WriteZeros(18);
            writer.Write(0x00000002);
            writer.Write(Entries.Count);
            writer.Write(References.Count);
            writer.WriteZeros(4);

            foreach (var fpkEntry in Entries)
            {
                fpkEntry.Write(output);
            }
            foreach (var fpkReference in References)
            {
                fpkReference.Write(output);
            }
        }
Пример #6
0
 public void Write(Stream output)
 {
     foreach (var pair in _map)
     {
         pair.Key.Hash.Write(output);
         pair.Value.Write(output);
         output.AlignWrite(16, 0x00);
     }
 }
Пример #7
0
        public void Write(Stream output)
        {
            BinaryWriter writer         = new BinaryWriter(output, Encoding.Default, true);
            long         headerPosition = output.Position;

            output.Position += HeaderSize;
            foreach (var foxEntity in Entities)
            {
                foxEntity.Write(output);
            }
            int offsetHashMap = (int)output.Position;

            foreach (var foxStringLookupLiteral in StringLookupLiterals)
            {
                // TODO: Write the encrypted file name.
                if (string.IsNullOrEmpty(foxStringLookupLiteral.Literal) == false)
                {
                    foxStringLookupLiteral.Write(output);
                }
            }

            writer.Write((long)0);
            output.AlignWrite(16, 0x00);
            writer.Write(new byte[] { 0x00, 0x00, 0x65, 0x6E, 0x64 });
            output.AlignWrite(16, 0x00);

            long endPosition = output.Position;

            output.Position = headerPosition;
            int entityCount = Entities.Count();

            writer.Write(MagicNumber1);
            writer.Write(MagicNumber2);
            writer.Write(entityCount);
            writer.Write(offsetHashMap);
            writer.Write(HeaderSize);
            writer.WriteZeros(12);
            output.Position = endPosition;
        }
Пример #8
0
        public void Write(Stream output)
        {
            BinaryWriter writer         = new BinaryWriter(output, Encoding.Default, true);
            long         headerPosition = output.Position;

            output.Position += HeaderSize;
            Container.Write(output);
            output.AlignWrite(16, 0x00);
            long   endPosition = output.Position;
            ushort size        = (ushort)(endPosition - headerPosition);

            output.Position = headerPosition;
            writer.Write(NameHash);
            writer.Write((byte)DataType);
            writer.Write((byte)ContainerType);
            writer.Write((ushort)Container.Count());
            writer.Write((ushort)HeaderSize);
            writer.Write(size);
            writer.WriteZeros(16);
            output.Position = endPosition;
        }
Пример #9
0
        }     //method Export ends

        public override void Import(Stream output, string path)
        {
            string inputPath = Path.GetDirectoryName(path) + @"\" + Path.GetFileNameWithoutExtension(path);

            uint         offset = (uint)output.Position;
            BinaryWriter writer = new BinaryWriter(output, Encoding.Default, true);

            fileCount = (uint)files.Count;

            writer.Write(signature);
            writer.Write(fileCount);
            writer.Write(boneGroups);
            writer.Write(boneGroups2);
            writer.WriteZeros(8);

            for (int i = 0; i < files.Count; i++)
            {
                files[i].hash = NameResolver.GetHashFromName(files[i].name);
            } //for ends

            files.Sort((x, y) => x.hash.CompareTo(y.hash));

            for (int i = 0; i < files.Count; i++)
            {
                files[i].Write(output);
            } //for ends

            for (int i = 0; i < files.Count; i++)
            {
                byte[] file = File.ReadAllBytes(inputPath + @"_mtar\" + files[i].name);
                offset = (uint)writer.BaseStream.Position;
                writer.BaseStream.Position = (0x20 + ((0x10 * i) + 0x8));
                writer.Write(offset);
                writer.Write(file.Length);
                writer.BaseStream.Position = offset;
                writer.Write(file);
                output.AlignWrite(16, 0x00);
            } //for ends
        }     //method Import ends
Пример #10
0
        public void Write(Stream output)
        {
            BinaryWriter writer         = new BinaryWriter(output, Encoding.Default, true);
            long         headerPosition = output.Position;

            output.Position += HeaderSize;
            foreach (var staticProperty in StaticProperties)
            {
                staticProperty.Write(output);
            }
            uint staticDataSize = (uint)(output.Position - headerPosition);

            foreach (var dynamicProperty in DynamicProperties)
            {
                dynamicProperty.Write(output);
            }
            long endPosition = output.Position;
            uint dataSize    = (uint)(endPosition - headerPosition);

            output.Position = headerPosition;
            writer.Write(HeaderSize);
            writer.Write(Unknown1);
            writer.WriteZeros(2); // padding1
            writer.Write(MagicNumber);
            writer.Write(Address);
            writer.WriteZeros(4); // padding2
            writer.Write(Unknown2);
            writer.WriteZeros(4);
            writer.Write(Version);
            writer.Write(ClassNameHash);
            writer.Write(Convert.ToUInt16(StaticProperties.Count()));
            writer.Write(Convert.ToUInt16(DynamicProperties.Count()));
            writer.Write((int)HeaderSize);
            writer.Write(staticDataSize);
            writer.Write(dataSize);
            output.AlignWrite(16, 0x00);
            //writer.WriteZeros(12);
            output.Position = endPosition;
        }
Пример #11
0
 public void Write(Stream output)
 {
     BinaryWriter writer = new BinaryWriter(output, Encoding.Default, true);
     long headerPosition = output.Position;
     output.Position += HeaderSize;
     foreach (var staticProperty in StaticProperties)
     {
         staticProperty.Write(output);
     }
     uint staticDataSize = (uint) (output.Position - headerPosition);
     foreach (var dynamicProperty in DynamicProperties)
     {
         dynamicProperty.Write(output);
     }
     long endPosition = output.Position;
     uint dataSize = (uint) (endPosition - headerPosition);
     output.Position = headerPosition;
     writer.Write(HeaderSize);
     writer.Write(Unknown1);
     writer.WriteZeros(2); // padding1
     writer.Write(MagicNumber);
     writer.Write(Address);
     writer.WriteZeros(4); // padding2
     writer.Write(Unknown2);
     writer.WriteZeros(4);
     writer.Write(Version);
     writer.Write(ClassNameHash);
     writer.Write(Convert.ToUInt16(StaticProperties.Count()));
     writer.Write(Convert.ToUInt16(DynamicProperties.Count()));
     writer.Write((int) HeaderSize);
     writer.Write(staticDataSize);
     writer.Write(dataSize);
     output.AlignWrite(16, 0x00);
     //writer.WriteZeros(12);
     output.Position = endPosition;
 }
Пример #12
0
        public override void Write(Stream output, IDirectory inputDirectory)
        {
            const uint xorMask1 = 0x41441043;
            const uint xorMask2 = 0x11C22050;
            const uint xorMask3 = 0xD05608C3;
            const uint xorMask4 = 0x532C7319;
            const int headerSize = 32;
            int shift = (Flags & 0x800) > 0 ? 12 : 10;
            int alignment = 1 << shift;

            BinaryWriter writer = new BinaryWriter(output, Encoding.Default, true);
            long headerPosition = output.Position;
            output.Skip(headerSize);
            long tableOffset = output.Position;
            output.Skip(8 * Entries.Count);
            //long unknownTableOffset = output.Position;
            //output.Skip(16 * UnknownEntries.Count);

            output.AlignWrite(alignment, 0x00);
            long dataOffset = output.Position;
            ulong[] sections = new ulong[Entries.Count];
            for (int i = 0; i < Entries.Count; i++)
            {
                QarEntry entry = Entries[i];
                entry.CalculateHash();
                ulong section = (ulong) (output.Position >> shift) << 40
                                | (entry.Hash & 0xFF) << 32
                                | entry.Hash >> 32 & 0xFFFFFFFFFF;
                sections[i] = section;
                entry.Write(output, inputDirectory);
                output.AlignWrite(alignment, 0x00);
            }
            long endPosition = output.Position;
            uint endPositionHead = (uint) (endPosition >> shift);

            output.Position = headerPosition;
            writer.Write(QarMagicNumber); // SQAR
            writer.Write(Flags ^ xorMask1);
            writer.Write((uint)Entries.Count ^ xorMask2);
            writer.Write(xorMask3); // unknown count (not saved in the xml and output directory)
            writer.Write(endPositionHead ^ xorMask4);
            writer.Write((uint)dataOffset ^ xorMask1);
            writer.Write(1 ^ xorMask1);
            writer.Write(0 ^ xorMask2);

            output.Position = tableOffset;
            byte[] encryptedSectionsData = EncryptSections(sections);
            writer.Write(encryptedSectionsData);

            output.Position = endPosition;
        }
Пример #13
0
        public void Write(Stream output)
        {
            BinaryWriter writer = new BinaryWriter(output, Encoding.Default, true);
            long headerPosition = output.Position;
            output.Position += HeaderSize;
            foreach (var foxEntity in Entities)
            {
                foxEntity.Write(output);
            }
            int offsetHashMap = (int) output.Position;
            foreach (var foxStringLookupLiteral in StringLookupLiterals)
            {
                // TODO: Write the encrypted file name.
                if (string.IsNullOrEmpty(foxStringLookupLiteral.Literal) == false)
                    foxStringLookupLiteral.Write(output);
            }

            output.AlignWrite(16, 0x00);
            writer.Write(new byte[] {0x00, 0x00, 0x65, 0x6E, 0x64});
            output.AlignWrite(16, 0x00);

            long endPosition = output.Position;
            output.Position = headerPosition;
            int entityCount = Entities.Count();
            writer.Write(MagicNumber1);
            writer.Write(MagicNumber2);
            writer.Write(entityCount);
            writer.Write(offsetHashMap);
            writer.Write(HeaderSize);
            writer.WriteZeros(12);
            output.Position = endPosition;
        }