public static UInt16 ReadUInt16(this System.IO.Stream stream, ElfDocumentHeader header) { byte[] buf = new byte[2]; stream.Read(buf, 0, 2); header.ResortArray(buf); return(BitConverter.ToUInt16(buf, 0)); }
public static byte[] ResortArray(this ElfDocumentHeader header, byte[] src) { if (BitConverter.IsLittleEndian == header.Head_IsLittleEndian) { return(src); } byte[] dest = new byte[src.Length]; unsafe { int last = src.Length - 1; int forlen = src.Length / 2; fixed(byte *_src = src) { for (var i = 0; i < forlen; i++) { //a = i; //b = last-i; byte t = _src[i]; byte b = _src[last - i]; _src[i] = b; _src[last - i] = t; } } } return(src); }
public static Int64 ReadInt64(this System.IO.Stream stream, ElfDocumentHeader header) { byte[] buf = new byte[8]; stream.Read(buf, 0, 8); header.ResortArray(buf); return(BitConverter.ToInt64(buf, 0)); }
public static UInt64 ReadUIntPtr(this System.IO.Stream stream, ElfDocumentHeader header) { if (header.Head_Is64Bit) { return(ReadUInt64(stream, header)); } else { return(ReadUInt32(stream, header)); } }
public void Read(System.IO.Stream stream, ElfDocumentHeader header) { NameIndex = stream.ReadUInt32(header); Type = (SectionType)stream.ReadUInt32(header); var RawFlags = stream.ReadUIntPtr(header); Flags = unchecked ((SectionFlags)RawFlags); Flag_Writable = (Flags & SectionFlags.Writable) > 0; Flag_Allocatable = (Flags & SectionFlags.Allocatable) > 0; Flag_Executable = (Flags & SectionFlags.Executable) > 0; LoadAddress = stream.ReadUIntPtr(header); Offset = stream.ReadUIntPtr(header); Size = stream.ReadUIntPtr(header); Link = stream.ReadUInt32(header); Info = stream.ReadUInt32(header); Alignment = stream.ReadUIntPtr(header); EntrySize = stream.ReadUIntPtr(header); }
public void Read(System.IO.Stream stream) { //read header; this.header = new ElfDocumentHeader(); header.Read(stream); //read sectionheaders sectionHeaders.Clear(); for (var i = 0; i < header.Head_SectionHeaderEntryCount; i++) { long offset = (long)header.Head_SectionHeaderOffset + (long)i * header.Head_SectionHeaderEntrySize; stream.Seek(offset, System.IO.SeekOrigin.Begin); ElfSectionHeader _header = new ElfSectionHeader(); _header.Read(stream, header); long offsetend = stream.Position; var size = offsetend - offset; if (size != header.Head_SectionHeaderEntrySize) { throw new Exception("Error Section Read"); } sectionHeaders.Add(_header); } //read sectiondata sectionRaws.Clear(); for (var i = 0; i < header.Head_SectionHeaderEntryCount; i++) { byte[] data = new byte[this.sectionHeaders[i].Size]; var offset = (int)this.sectionHeaders[i].Offset; stream.Seek(offset, System.IO.SeekOrigin.Begin); stream.Read(data, 0, data.Length); sectionRaws.Add(data); } //read segmentheaders for (var i = 0; i < header.Head_SegmentHeaderEntryCount; i++) { long offset = (long)header.Head_SegmentHeaderOffset + (long)i * header.Head_SegmentHeaderEntrySize; stream.Seek(offset, System.IO.SeekOrigin.Begin); ElfSegmentHeader segment = new ElfSegmentHeader(); segment.Read(stream, header); segments.Add(segment); } Read_StringTable(); }
public void Read(System.IO.Stream stream, ElfDocumentHeader header) { Type = (SegmentType)stream.ReadUInt32(header); if (header.Head_Is64Bit) { Flags = (SegmentFlags)stream.ReadUInt32(header); } // TODO: some functions?s Offset = stream.ReadUIntPtr(header); Address = stream.ReadUIntPtr(header); PhysicalAddress = stream.ReadUIntPtr(header); FileSize = stream.ReadUIntPtr(header); Size = stream.ReadUIntPtr(header); if (!header.Head_Is64Bit) { Flags = (SegmentFlags)stream.ReadUInt32(header); } Alignment = stream.ReadUIntPtr(header); }
public static bool NeedTurn(this ElfDocumentHeader header) { return(BitConverter.IsLittleEndian != header.Head_IsLittleEndian); }