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; }
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); }
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; }
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); } }
public void Write(Stream output) { foreach (var pair in _map) { pair.Key.Hash.Write(output); pair.Value.Write(output); output.AlignWrite(16, 0x00); } }
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; }
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; }
} //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
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; }
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; }
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; }
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; }