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(); }
public override void WriteData(WritingContext SW) { base.WriteData(SW); SW.Write(CertificateIndex); // index of the OID value (always 1) SW.Write(Hash.Length); // length of OID SW.Write(Hash); // OID to match int Count = 4 - Hash.Length % 4; // may need to pad to alignment of 4 bytes if (Count > 0 && Count < 4) SW.WriteZeros(Count); }
public override void WriteData(WritingContext SW) { base.WriteData(SW); SW.Write(OIDIndex); // index of the OID value (always 1) SW.Write(OID.Length); // length of OID SW.Write(OID); // OID to match int Count = 4 - OID.Length % 4; // may need to pad to alignment of 4 bytes if (Count > 0 && Count < 4) SW.WriteZeros(Count); // may need to pad to alignment of 4 bytes SW.Write(MatchOp.MatchOp); // OID must exist }
public override void WriteData(WritingContext SW) { base.WriteData(SW); SW.Write(CertificateIndex); // index in the mobile provision certificate list (always 0 for now) SW.Write(FieldName.Length); // field name length SW.WriteFixedASCII(FieldName, FieldName.Length); // field name to match int Count = 4 - FieldName.Length % 4; // may need to pad to alignment of 4 bytes if (Count > 0 && Count < 4) SW.WriteZeros(Count); SW.Write(MatchOp.MatchOp); // must equal SW.Write(MatchOp.CertificateName.Length); // length of certficate name SW.WriteFixedASCII(MatchOp.CertificateName, MatchOp.CertificateName.Length);// certificate name to match Count = 4 - MatchOp.CertificateName.Length % 4; // may need to pad to alignment of 4 bytes if (Count > 0 && Count < 4) SW.WriteZeros(Count); }
public override void WriteData(WritingContext SW) { base.WriteData(SW); SW.Write(BundleIdentifier.Length); // bundle identifier length SW.WriteFixedASCII(BundleIdentifier, BundleIdentifier.Length); // bundle identifier string int Count = 4 - BundleIdentifier.Length % 4; // may need to pad to alignment of 4 bytes if (Count > 0 && Count < 4) SW.WriteZeros(Count); }