Ejemplo n.º 1
0
        public LoaderResult64 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 Header64();

            elfFileHeader.Read(stream);

            stream.Seek((long)elfFileHeader.E_PHOFF, SeekOrigin.Begin);
            var programHeader = new ProgramHeader64();

            programHeader.Read(stream);

            var    image       = new byte[(int)programHeader.P_FILESZ - elfFileHeader.E_EHSIZE - (elfFileHeader.E_PHNUM * elfFileHeader.E_PHENTSIZE)];
            UInt64 imageOffset =
                elfFileHeader.E_EHSIZE
                + (UInt64)elfFileHeader.E_EHSIZE.CalculateRoundUpTo16Pad()
                + (UInt64)(elfFileHeader.E_PHNUM * (elfFileHeader.E_PHENTSIZE + elfFileHeader.E_PHENTSIZE.CalculateRoundUpTo16Pad()));

            stream.Seek((long)imageOffset, SeekOrigin.Begin);
            stream.Read(image, 0, image.Length);

            return(new LoaderResult64(elfFileHeader.E_ENTRY - (ulong)imageOffset, image,
                                      metadata: new object[] { elfFileHeader, programHeader }));
        }
Ejemplo n.º 2
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 Header64();

            elfFileHeader.Read(stream);
            metadata.Add(elfFileHeader);

            if (elfFileHeader.E_PHNUM > 0)
            {
                for (var i = 0L; i < elfFileHeader.E_PHNUM; i++)
                {
                    var phOffset = (long)elfFileHeader.E_PHOFF + (i * elfFileHeader.E_PHENTSIZE);
                    stream.Seek(phOffset, SeekOrigin.Begin);
                    var programHeader = new ProgramHeader64();
                    programHeader.Read(stream);
                    metadata.Add(programHeader);
                }
            }

            if (elfFileHeader.E_SHNUM > 0)
            {
                for (var i = 0L; i < elfFileHeader.E_SHNUM; i++)
                {
                    var shOffset = (long)elfFileHeader.E_SHOFF + (i * elfFileHeader.E_SHENTSIZE);
                    stream.Seek(shOffset, SeekOrigin.Begin);
                    var sectionHeader = new SectionHeader64();
                    sectionHeader.Read(stream);
                    metadata.Add(sectionHeader);
                }
            }

            return(metadata.ToImmutableList());
        }