internal override void WriteTo(BinaryWriter writer, IAssemblingContext context) { uint size = context.GetFileSize(this); for (int i = 0; i < size; i++) { writer.Write(m_padding); } }
internal override void WriteTo(BinaryWriter writer, IAssemblingContext context) { InternalWriteTo(writer, context); if (m_next != null) { m_next.WriteTo(writer, context); } }
internal override void WriteTo(BinaryWriter writer, IAssemblingContext context) { foreach (char c in m_value) { writer.Write((byte)c); } writer.Write((byte)0); }
protected internal override uint InternalComputeSize(IAssemblingContext context) { if (m_address.OffsetElement != null && !context.IsPositioned(m_address.OffsetElement)) { return(6); // max size } int dispValue = GetDisplacementValue(context); uint dispCode = GetDisplacementCode(dispValue); uint dispSize = GetDisplacementSize(dispCode); if (m_address.Base == null) { if (m_address.Index == null) { return(5); // modrm + disp32 } else { return(6); // modrm + sib + disp32 } } else { if (m_address.Base == Register32.ESP) { return(2 + dispSize); // modrm + sib + ? } else { if (m_address.Base == Register32.EBP) { if (dispCode == 0) { return(3); // modrm + sib + disp8 } else { return(2 + dispSize); // modrm + sib + ? } } else { if (m_address.Index == null) { return(1 + dispSize); // modrm + ? } else { return(2 + dispSize); // modrm + sib + ? } } } } }
internal override uint ComputeFileSize(IAssemblingContext context) { uint modulo = context.GetFileAddress(this) % m_fileAlignment; if (modulo == 0) { return(0); } return(m_fileAlignment - modulo); }
protected internal override void InternalWriteTo(BinaryWriter writer, IAssemblingContext context) { Int32 value = m_displacement; if (m_element != null) { value += (Int32)context.GetAbsoluteMemoryAddress(m_element); } writer.Write(value); }
protected internal override void InternalWriteTo(BinaryWriter writer, IAssemblingContext context) { UInt32 value = m_immediate; if (m_reference != null) { value += (UInt32)context.GetAbsoluteMemoryAddress(m_reference); } writer.Write(value); }
internal override void WriteTo(BinaryWriter writer, IAssemblingContext context) { if (m_target != null) { writer.Write((UInt16)context.GetMemorySize(m_target)); } else { writer.Write((UInt16)0); } }
internal override void WriteTo(BinaryWriter writer, IAssemblingContext context) { if (m_target != null) { context.GetPointerSize().WriteTo(writer, context.GetAbsoluteMemoryAddress(m_target)); } else { context.GetPointerSize().WriteTo(writer, 0); } }
internal override void WriteTo(BinaryWriter writer, IAssemblingContext context) { if (m_target != null) { writer.Write(context.GetRelativeMemoryAddress(m_target)); } else { writer.Write((UInt32)0); } }
private int GetDisplacementValue(IAssemblingContext context) { if (m_address.OffsetElement == null) { return(m_address.OffsetValue); } else { int reference = (int)context.GetAbsoluteMemoryAddress(m_address.OffsetElement); return(reference + m_address.OffsetValue); } }
internal override void WriteTo(BinaryWriter writer, IAssemblingContext context) { for (int i = 0; i < m_length; i++) { if (m_value != null && i < m_value.Length) { writer.Write((byte)m_value[i]); } else { writer.Write((byte)0); } } }
internal override void WriteTo(BinaryWriter writer, IAssemblingContext context) { uint value = 0; foreach (ImageSection section in m_sections) { if (Match(section)) { value += context.GetFileSize(section); } } writer.Write(value); }
internal override void WriteTo(BinaryWriter writer, IAssemblingContext context) { uint value = 0; foreach (ImageSection section in m_sections) { if (Match(section)) { value = value == 0 ? context.GetRelativeMemoryAddress(section) : Math.Min(value, context.GetRelativeMemoryAddress(section)); } } writer.Write(value); }
internal override void WriteTo(BinaryWriter writer, IAssemblingContext context) { UInt32 jmpAddress = context.GetRelativeMemoryAddress(this); UInt32 refAddress = context.GetRelativeMemoryAddress(m_offsetElement); int diff = (int)(refAddress - jmpAddress) + m_offsetValue; if (diff >= -126 && diff <= 129) { writer.Write(m_opcode); writer.Write((SByte)(diff - 2)); } else { throw new Exception("Invalid loop range"); } }
internal override void WriteTo(BinaryWriter writer, IAssemblingContext context) { UInt32 jmpAddress = context.GetRelativeMemoryAddress(this); UInt32 refAddress = context.GetRelativeMemoryAddress(m_offsetElement); int diff = (int)(refAddress - jmpAddress) + m_offsetValue; if (diff >= -126 && diff <= 129) { writer.Write((Byte)0xeb); writer.Write((SByte)(diff - 2)); } else { writer.Write((Byte)0xe9); writer.Write((Int32)(diff - 5)); } }
internal override uint ComputeSize(IAssemblingContext context) { if (!context.IsPositioned(this) || !context.IsPositioned(m_offsetElement)) { return(5); } UInt32 jmpAddress = context.GetRelativeMemoryAddress(this); UInt32 refAddress = context.GetRelativeMemoryAddress(m_offsetElement); int diff = (int)(refAddress - jmpAddress) + m_offsetValue; if (diff >= -126 && diff <= 129) { return(2); } else { return(5); } }
internal override uint ComputeSize(IAssemblingContext context) { return(context.GetPointerSize().Bytes); }
internal override void WriteTo(BinaryWriter writer, IAssemblingContext context) { writer.Write(m_bytes, 0, m_bytes.Length); }
internal override uint ComputeSize(IAssemblingContext context) { return((uint)m_bytes.Length); }
internal override void WriteTo(BinaryWriter writer, IAssemblingContext context) { writer.Write(m_value); }
internal override uint ComputeSize(IAssemblingContext context) { return(m_next == null?InternalComputeSize(context) : m_next.ComputeSize(context) + InternalComputeSize(context)); }
protected internal override uint InternalComputeSize(IAssemblingContext context) { return(1); }
protected internal abstract void InternalWriteTo(BinaryWriter writer, IAssemblingContext context);
protected internal override void InternalWriteTo(BinaryWriter writer, IAssemblingContext context) { int dispValue = GetDisplacementValue(context); int dispCode = (int)GetDisplacementCode(dispValue); if (m_address.Base == null) { if (m_address.Index == null) { WriteModRM(writer, 0, 5); WriteDisp(writer, dispValue, 2); } else { WriteModRM(writer, 0, 4); WriteSib(writer, m_address.IndexScaleFactor, m_address.Index.Id, 5); WriteDisp(writer, dispValue, 2); } } else { if (m_address.Base == Register32.ESP) { if (m_address.Index == null) { WriteModRM(writer, dispCode, 4); WriteSib(writer, 0, 4, m_address.Base.Id); WriteDisp(writer, dispValue, dispCode); } else { WriteModRM(writer, dispCode, 4); WriteSib(writer, m_address.IndexScaleFactor, m_address.Index.Id, m_address.Base.Id); WriteDisp(writer, dispValue, dispCode); } } else { if (m_address.Base == Register32.EBP) { if (dispCode == 0) { if (m_address.Index == null) { WriteModRM(writer, 1, 4); WriteSib(writer, 0, 4, 5); WriteDisp(writer, 0, 1); } else { WriteModRM(writer, 1, 4); WriteSib(writer, m_address.IndexScaleFactor, m_address.Index.Id, 5); WriteDisp(writer, 0, 1); } } else { if (m_address.Index == null) { WriteModRM(writer, dispCode, 4); WriteSib(writer, 0, 4, 5); WriteDisp(writer, dispValue, dispCode); } else { WriteModRM(writer, dispCode, 4); WriteSib(writer, m_address.IndexScaleFactor, m_address.Index.Id, 5); WriteDisp(writer, dispValue, dispCode); } } } else { if (m_address.Index == null) { WriteModRM(writer, dispCode, m_address.Base.Id); WriteDisp(writer, dispValue, dispCode); } else { WriteModRM(writer, dispCode, 4); WriteSib(writer, m_address.IndexScaleFactor, m_address.Index.Id, m_address.Base.Id); WriteDisp(writer, dispValue, dispCode); } } } } }
protected internal override void InternalWriteTo(BinaryWriter writer, IAssemblingContext context) { writer.Write((byte)(m_opcode + m_register.Id)); }
internal override uint ComputeSize(IAssemblingContext context) { return(4); }
protected internal override void InternalWriteTo(BinaryWriter writer, IAssemblingContext context) { writer.Write(m_prefix); }
protected internal abstract uint InternalComputeSize(IAssemblingContext context);
protected internal override void InternalWriteTo(BinaryWriter writer, IAssemblingContext context) { WriteModRM(writer, 3, m_register1.Id, m_register0.Id); }