public ImmutableList <object> LoadMetadata() { var metadata = new List <object>(); if (!stream.CanRead) { throw new ArgumentException("Stream is not available for reading", nameof(stream)); } if (!stream.CanSeek) { throw new ArgumentException("Stream is not available for seeking", nameof(stream)); } var elfFileHeader = new Header32(); elfFileHeader.Read(stream); metadata.Add(elfFileHeader); stream.Seek((long)elfFileHeader.E_PHOFF, SeekOrigin.Begin); var programHeader = new ProgramHeader32(); programHeader.Read(stream); metadata.Add(programHeader); return(metadata.ToImmutableList()); }
public LoaderResult32 LoadImage() { if (!stream.CanRead) { throw new ArgumentException("Stream is not available for reading", nameof(stream)); } if (!stream.CanSeek) { throw new ArgumentException("Stream is not available for seeking", nameof(stream)); } var elfFileHeader = new Header32(); elfFileHeader.Read(stream); stream.Seek((long)elfFileHeader.E_PHOFF, SeekOrigin.Begin); var programHeader = new ProgramHeader32(); programHeader.Read(stream); var image = new byte[(int)programHeader.P_FILESZ - elfFileHeader.E_EHSIZE - (elfFileHeader.E_PHNUM * elfFileHeader.E_PHENTSIZE)]; UInt32 imageOffset = elfFileHeader.E_EHSIZE + (UInt32)elfFileHeader.E_EHSIZE.CalculateRoundUpTo16Pad() + (UInt32)(elfFileHeader.E_PHNUM * (elfFileHeader.E_PHENTSIZE + elfFileHeader.E_PHENTSIZE.CalculateRoundUpTo16Pad())); stream.Seek(imageOffset, SeekOrigin.Begin); stream.Read(image, 0, image.Length); return(new LoaderResult32(elfFileHeader.E_ENTRY - imageOffset, image, metadata: new object[] { elfFileHeader, programHeader })); }
public static bool TryRead(Stream stream, out Header32 header) { try { header = new Header32(); header.Read(stream); return(true); } catch (Exception) { header = default(Header32); return(false); } }
public static bool IsFileType(Stream stream) { if (!stream.CanRead) { throw new ArgumentException("Stream is not available for reading", nameof(stream)); } if (!stream.CanSeek) { throw new ArgumentException("Stream is not available for seeking", nameof(stream)); } if (stream.Position != 0) { stream.Seek(0, SeekOrigin.Begin); } var magicBuffer = new byte[MAGIC.Length]; var bytesRead = stream.Read(magicBuffer, 0, MAGIC.Length); if (bytesRead != MAGIC.Length) { return(false); } var magicMatch = bytesRead == MAGIC.Length && Enumerable.SequenceEqual(MAGIC, magicBuffer); if (!magicMatch) { return(false); } stream.Seek(0, SeekOrigin.Begin); Header32 potentialHeader; if (!Header32.TryRead(stream, out potentialHeader)) { return(false); } return(potentialHeader.EI_CLASS == HeaderIdentityClass.ELFCLASS32); }