Example #1
0
        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());
        }
Example #2
0
        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 }));
        }