public override IEnumerable GetValues()
        {
            yield return TokenString("Name", row.NameString);
            yield return Value("Flags", row.Flags.ToString());
            yield return Value("ImplFlags", row.ImplFlags.ToString());
            yield return Value("ParamList", row.ParamList);
            yield return Value("Rva", row.Rva.ToString());

            MethodSignature signature = new MethodSignature(Metadata, row.SignatureBlob);
            yield return Value("Signature", signature.ToString());

            if (row.Rva != 0)
            {
                var code = MetadataModule.GetInstructionStream((long)row.Rva);
                var codeReader = new EndianAwareBinaryReader(code, Endianness.Little);
                var header = new MethodHeader(codeReader);

                if (header.LocalVarSigTok.RID != 0)
                {
                    yield return Value("LocalVarSigTok", header.LocalVarSigTok.ToString());

                    StandAloneSigRow standAlongSigRow = Metadata.ReadStandAloneSigRow(header.LocalVarSigTok);
                    var local = new LocalVariableSignature(Metadata, standAlongSigRow.SignatureBlob);
                    yield return Value("Method Header", local.ToString());
                }
            }
        }
        /// <summary>
        /// Loads and validates the image file header.
        /// </summary>
        /// <param name="reader">The reader, to read From.</param>
        public void Read(EndianAwareBinaryReader reader)
        {
            this.Signature = reader.ReadUInt32();
            if (this.Signature != PE_SIGNATURE)
                throw new BadImageFormatException();

            this.FileHeader.Read(reader);
            this.OptionalHeader.Read(reader);
        }
Exemple #3
0
 /// <summary>
 /// Loads the CLI_HEADER from the reader.
 /// </summary>
 /// <param name="reader">The reader.</param>
 public void Read(EndianAwareBinaryReader reader)
 {
     Cb = reader.ReadUInt32();
     MajorRuntimeVersion = reader.ReadUInt16();
     MinorRuntimeVersion = reader.ReadUInt16();
     Metadata.Read(reader);
     Flags = (RuntimeImageFlags)reader.ReadUInt32();
     EntryPointToken = reader.ReadUInt32();
     Resources.Read(reader);
     StrongNameSignature.Read(reader);
     CodeManagerTable.Read(reader);
     VTableFixups.Read(reader);
     ExportAddressTableJumps.Read(reader);
     ManagedNativeHeader.Read(reader);
 }
        /// <summary>
        /// Loads and validates the DOS header.
        /// </summary>
        public void Read(EndianAwareBinaryReader reader)
        {
            e_magic = reader.ReadUInt16();
            e_cblp = reader.ReadUInt16();
            e_cp = reader.ReadUInt16();
            e_crlc = reader.ReadUInt16();
            e_cparhdr = reader.ReadUInt16();
            e_minalloc = reader.ReadUInt16();
            e_maxalloc = reader.ReadUInt16();
            e_ss = reader.ReadUInt16();
            e_sp = reader.ReadUInt16();
            e_csum = reader.ReadUInt16();
            e_ip = reader.ReadUInt16();
            e_cs = reader.ReadUInt16();
            e_lfarlc = reader.ReadUInt16();
            e_ovno = reader.ReadUInt16();
            e_res00 = reader.ReadUInt16();
            e_res01 = reader.ReadUInt16();
            e_res02 = reader.ReadUInt16();
            e_res03 = reader.ReadUInt16();
            e_oemid = reader.ReadUInt16();
            e_oeminfo = reader.ReadUInt16();
            e_res20 = reader.ReadUInt16();
            e_res21 = reader.ReadUInt16();
            e_res22 = reader.ReadUInt16();
            e_res23 = reader.ReadUInt16();
            e_res24 = reader.ReadUInt16();
            e_res25 = reader.ReadUInt16();
            e_res26 = reader.ReadUInt16();
            e_res27 = reader.ReadUInt16();
            e_res28 = reader.ReadUInt16();
            e_res29 = reader.ReadUInt16();
            e_lfanew = reader.ReadUInt32();

            if (DOS_HEADER_MAGIC != e_magic)
                throw new BadImageFormatException();
        }
        /// <summary>
        /// Loads the header from the reader.
        /// </summary>
        /// <param name="reader">The reader.</param>
        public void Read(EndianAwareBinaryReader reader)
        {
            Magic = reader.ReadUInt16();
            if (IMAGE_OPTIONAL_HEADER_MAGIC != Magic)
                throw new BadImageFormatException();

            MajorLinkerVersion = reader.ReadByte();
            MinorLinkerVersion = reader.ReadByte();
            SizeOfCode = reader.ReadUInt32();
            SizeOfInitializedData = reader.ReadUInt32();
            SizeOfUninitializedData = reader.ReadUInt32();
            AddressOfEntryPoint = reader.ReadUInt32();
            BaseOfCode = reader.ReadUInt32();
            BaseOfData = reader.ReadUInt32();

            ImageBase = reader.ReadUInt32();
            SectionAlignment = reader.ReadUInt32();
            FileAlignment = reader.ReadUInt32();
            MajorOperatingSystemVersion = reader.ReadUInt16();
            MinorOperatingSystemVersion = reader.ReadUInt16();
            MajorImageVersion = reader.ReadUInt16();
            MinorImageVersion = reader.ReadUInt16();
            MajorSubsystemVersion = reader.ReadUInt16();
            MinorSubsystemVersion = reader.ReadUInt16();
            Win32VersionValue = reader.ReadUInt32();
            SizeOfImage = reader.ReadUInt32();
            SizeOfHeaders = reader.ReadUInt32();
            CheckSum = reader.ReadUInt32();
            Subsystem = reader.ReadUInt16();
            DllCharacteristics = reader.ReadUInt16();
            SizeOfStackReserve = reader.ReadUInt32();
            SizeOfStackCommit = reader.ReadUInt32();
            SizeOfHeapReserve = reader.ReadUInt32();
            SizeOfHeapCommit = reader.ReadUInt32();
            LoaderFlags = reader.ReadUInt32();
            NumberOfRvaAndSizes = reader.ReadUInt32();

            DataDirectory = new ImageDataDirectory[NumberOfRvaAndSizes];
            for (int i = 0; i < NumberOfRvaAndSizes; i++)
            {
                DataDirectory[i].Read(reader);
            }
        }
 /// <summary>
 /// Loads the IMAGE_DATA_DIRECTORY from the reader.
 /// </summary>
 /// <param name="reader">The reader.</param>
 public void Read(EndianAwareBinaryReader reader)
 {
     VirtualAddress = reader.ReadUInt32();
     Size = reader.ReadInt32();
 }
Exemple #7
0
        /// <summary>
        /// Reads the method header from the instruction stream.
        /// </summary>
        /// <param name="reader">The reader used to decode the instruction stream.</param>
        /// <returns></returns>
        public MethodHeader(EndianAwareBinaryReader reader)
        {
            Clauses = new List<ExceptionHandlingClause>();

            // Read first byte
            Flags = (MethodFlags)reader.ReadByte();

            // Check least significant 2 bits
            switch (Flags & MethodFlags.HeaderMask)
            {
                case MethodFlags.TinyFormat:
                    CodeSize = ((int)(Flags & MethodFlags.TinyCodeSizeMask) >> 2);
                    Flags &= MethodFlags.HeaderMask;
                    break;

                case MethodFlags.FatFormat:
                    // Read second byte of flags
                    Flags = (MethodFlags)(reader.ReadByte() << 8 | (byte)Flags);

                    if (MethodFlags.ValidHeader != (Flags & MethodFlags.HeaderSizeMask))
                        throw new CompilerException("Invalid method ");

                    MaxStack = reader.ReadUInt16();
                    CodeSize = reader.ReadInt32();
                    LocalVarSigTok = new Token(reader.ReadUInt32()); // ReadStandAloneSigRow
                    break;

                default:
                    throw new CompilerException("Invalid method header");
            }

            // Are there sections following the code?
            if (MethodFlags.MoreSections != (Flags & MethodFlags.MoreSections))
                return;

            // Yes, seek to them and process those sections
            long codepos = reader.BaseStream.Position;

            // Seek to the end of the code...
            long dataSectPos = codepos + CodeSize;
            if (0 != (dataSectPos & 3))
                dataSectPos += (4 - (dataSectPos % 4));
            reader.BaseStream.Position = dataSectPos;

            // Read all headers, so the IL decoder knows how to handle these...
            byte flags;

            do
            {
                flags = reader.ReadByte();
                bool isFat = (0x40 == (flags & 0x40));
                int length;
                int blocks;
                if (isFat)
                {
                    byte a = reader.ReadByte();
                    byte b = reader.ReadByte();
                    byte c = reader.ReadByte();

                    length = (c << 24) | (b << 16) | a;
                    blocks = (length - 4) / 24;
                }
                else
                {
                    length = reader.ReadByte();
                    blocks = (length - 4) / 12;

                    /* Read & skip the padding. */
                    reader.ReadInt16();
                }

                Debug.Assert(0x01 == (flags & 0x3F), "Unsupported method data section.");

                // Read the clause
                for (int i = 0; i < blocks; i++)
                {
                    ExceptionHandlingClause clause = new ExceptionHandlingClause();
                    clause.Read(reader, isFat);
                    Clauses.Add(clause);
                }
            }
            while (0x80 == (flags & 0x80));

            reader.BaseStream.Position = codepos;
        }