protected override void PackageData(WritingContext SW) { // Write the segment load command SW.WriteFixedASCII(SegmentName, 16); SW.WriteUInt(VirtualAddress, AddressSize); SW.WriteUInt(VirtualSize, AddressSize); // Offset to first segment //@TODO: These file offsets and file lengths aren't correct (compared to the original MachO's) OffsetFieldU32or64 FileOffset = SW.WriteDeferredOffsetFrom(0, AddressSize); LengthFieldU32or64 FileLength = SW.WriteDeferredLength(0, AddressSize); SW.Write(MaxProt); SW.Write(InitProt); SW.Write(Sections.Count); SW.Write(Flags); // Enqueue a job to commit the file offset to the first section SW.CurrentPhase.PendingWrites.Enqueue(delegate(WritingContext Context) { FileLength.Rebase(Context.Position); FileOffset.Commit(Context); }); // Write the sections belonging to the segment foreach (MachSection Section in Sections) { Section.Write(SW); } // Enqueue a job to commit the length of data in all the sections SW.CurrentPhase.PendingWrites.Enqueue(delegate(WritingContext Context) { FileLength.Commit(Context); }); }
public void Write(WritingContext SW) { SW.Write(MyMagic); LengthFieldU32or64 Length = SW.WriteDeferredLength(4, Bits.Num._32); PackageData(SW); SW.CommitDeferredField(Length); }
public void Write(WritingContext SW) { long StartingPosition = SW.Position; // Write the command and length SW.Write(Command); LengthFieldU32or64 Length = SW.WriteDeferredLength(4, Bits.Num._32); // Write the data PackageData(SW); // Write any pad bytes and commit the length SW.WriteZeros((SW.Position - StartingPosition) % 4); SW.CommitDeferredField(Length); }
public void Write(WritingContext Context) { // Write the header Context.Write(Magic); Context.Write(CpuType); Context.Write(CpuSubType); Context.Write(FileType); Context.Write((UInt32)Commands.Count); LengthFieldU32or64 SizeOfCommands = Context.WriteDeferredLength(-2 * sizeof(UInt32), Bits.Num._32); // Size of commands, after this field and the flags field Context.Write(Flags); if (Magic == MH_MAGIC_64) { Context.Write(Reserved64); } // Write each command (which may enqueue deferred work) foreach (MachLoadCommand Command in Commands) { Command.Write(Context); } Context.CommitDeferredField(SizeOfCommands); //@TODO: Figure out where this offsetting comes from long MainStartPosition = MachHeaderPad; Context.WriteZeros(MainStartPosition - Context.Position); // Drain deferred work until the file is completely done Context.CompleteWritingAndClose(); }