Пример #1
0
        internal void ReadTableHeaders()
        {
            SetupCodedIndexes();

            for (int i = 0; i < 45; i++)
            {
                if (tablesHeap.HasTable((MetaDataTableType)i))
                {
                    long          headerOffset = reader.BaseStream.Position + tablesHeap.StreamOffset;
                    MetaDataTable table        = CreateTable((MetaDataTableType)i, reader.ReadInt32(), headerOffset);

                    tablesHeap.tables[i] = table;
                }
            }

            uint tableOffset = (uint)(tablesHeap.StreamOffset + Marshal.SizeOf(typeof(Structures.METADATA_TABLE_HEADER)) + (tablesHeap.tablecount) * 4);

            foreach (MetaDataTable table in tablesHeap.tables)
            {
                if (table != null)
                {
                    table.TableOffset = tableOffset;
                    tableOffset      += (uint)table.PhysicalSize;
                }
            }
        }
Пример #2
0
        internal NETTableReader(TablesHeap tablesheap)
        {
            reader            = new BinaryReader(new MemoryStream(tablesheap.Contents));
            tablesheap.header = ASMGlobals.ReadStructureFromReader <Structures.METADATA_TABLE_HEADER>(reader);
            this.tablesHeap   = tablesheap;

            for (int i = 0; i < 45; i++)
            {
                if (tablesHeap.HasTable((MetaDataTableType)i))
                {
                    tablesHeap.tablecount++;
                }
            }

            tablesHeap.tablereader = this;
            if ((tablesHeap.HeapOffsetSizes & 1) == 1)
            {
                tablesHeap.netheader.StringsHeap.indexsize = 4;
            }
            if ((tablesHeap.HeapOffsetSizes & 2) == 2)
            {
                tablesHeap.netheader.GuidHeap.indexsize = 4;
            }
            if ((tablesHeap.HeapOffsetSizes & 4) == 4)
            {
                tablesHeap.netheader.BlobHeap.indexsize = 4;
            }

            // ReadTables();
        }
Пример #3
0
        public override void VisitAssemblyDefinition(AssemblyDefinition asm)
        {
            if (!m_tHeap.HasTable(AssemblyTable.RId))
            {
                throw new ReflectionException("No assembly manifest");
            }

            asm.MetadataToken = new MetadataToken(TokenType.Assembly, 1);
            m_asmDef          = asm;

            switch (m_img.MetadataRoot.Header.Version)
            {
            case "v1.0.3705":
                asm.Runtime = TargetRuntime.NET_1_0;
                break;

            case "v1.1.4322":
                asm.Runtime = TargetRuntime.NET_1_1;
                break;

            case "v2.0.50727":
                asm.Runtime = TargetRuntime.NET_2_0;
                break;

            case "v4.0.30319":
                asm.Runtime = TargetRuntime.NET_4_0;
                break;
            }

            if ((m_img.PEFileHeader.Characteristics & ImageCharacteristics.Dll) != 0)
            {
                asm.Kind = AssemblyKind.Dll;
            }
            else if (m_img.PEOptionalHeader.NTSpecificFields.SubSystem == SubSystem.WindowsGui ||
                     m_img.PEOptionalHeader.NTSpecificFields.SubSystem == SubSystem.WindowsCeGui)
            {
                asm.Kind = AssemblyKind.Windows;
            }
            else
            {
                asm.Kind = AssemblyKind.Console;
            }
        }
Пример #4
0
        internal void RemoveEmptyTables()
        {
            ulong validMask = 0;

            for (int i = 0; i < 45; i++)
            {
                if (tablesHeap.HasTable((MetaDataTableType)i))
                {
                    MetaDataTable table = tablesHeap.GetTable((MetaDataTableType)i);
                    if (table.Members.Length > 0)
                    {
                        validMask |= ((ulong)1 << i);
                    }
                    else
                    {
                        tablesHeap.tables[i] = null;
                    }
                }
            }
            tablesHeap.MaskValid = validMask;
        }
Пример #5
0
        void addTableItem_Click(object sender, EventArgs e)
        {
            List <object> tablesLeft = new List <object>();

            for (int i = 0; i < 45; i++)
            {
                if (!currentTablesHeap.HasTable((MetaDataTableType)i))
                {
                    tablesLeft.Add((MetaDataTableType)i);
                }
            }
            ComboBoxDlg dlg = new ComboBoxDlg("Select table to add.", "Add table", tablesLeft.ToArray());

            if (dlg.ShowDialog() == DialogResult.OK)
            {
                currentTablesHeap.AddTable((MetaDataTableType)dlg.SelectedObject);
            }
        }
Пример #6
0
        private void CollectMembers(TablesHeap tablesHeap, Workspace workspace)
        {
            Constructor.Log("Collecting .NET metadata members.");
            for (int i = 0; i < tablesHeap._tables.Length; i++)
            {
                MetaDataTableType tableType = (MetaDataTableType)i;
                if (tablesHeap.HasTable(tableType))
                {
                    MetaDataTable table = tablesHeap.GetTable(tableType);

                    if (table.Members.Count != 0)
                    {
                        MetaDataMemberInfo[] subMembers = new MetaDataMemberInfo[table.Members.Count];

                        for (int j = 0; j < subMembers.Length; j++)
                        {
                            subMembers[j] = new MetaDataMemberInfo(table.Members[j]);
                        }

                        workspace.Members.Add(tableType, subMembers);
                    }
                }
            }
        }
        public override void VisitTypeDefinitionCollection(TypeDefinitionCollection types)
        {
            // type def reading
            TypeDefTable typesTable = m_tableReader.GetTypeDefTable();

            m_typeDefs = new TypeDefinition [typesTable.Rows.Count];
            for (int i = 0; i < typesTable.Rows.Count; i++)
            {
                TypeDefRow     type = typesTable [i];
                TypeDefinition t    = new TypeDefinition(
                    m_root.Streams.StringsHeap [type.Name],
                    m_root.Streams.StringsHeap [type.Namespace],
                    type.Flags);
                t.MetadataToken = MetadataToken.FromMetadataRow(TokenType.TypeDef, i);

                m_typeDefs [i] = t;
            }

            // nested types
            if (m_tHeap.HasTable(NestedClassTable.RId))
            {
                NestedClassTable nested = m_tableReader.GetNestedClassTable();
                for (int i = 0; i < nested.Rows.Count; i++)
                {
                    NestedClassRow row = nested [i];

                    TypeDefinition parent = GetTypeDefAt(row.EnclosingClass);
                    TypeDefinition child  = GetTypeDefAt(row.NestedClass);

                    parent.NestedTypes.Add(child);
                }
            }

            foreach (TypeDefinition type in m_typeDefs)
            {
                types.Add(type);
            }

            // type ref reading
            if (m_tHeap.HasTable(TypeRefTable.RId))
            {
                TypeRefTable typesRef = m_tableReader.GetTypeRefTable();

                m_typeRefs = new TypeReference [typesRef.Rows.Count];

                for (int i = 0; i < typesRef.Rows.Count; i++)
                {
                    AddTypeRef(typesRef, i);
                }
            }
            else
            {
                m_typeRefs = new TypeReference [0];
            }

            ReadTypeSpecs();
            ReadMethodSpecs();

            ReadMethods();
            ReadGenericParameters();

            // set base types
            for (int i = 0; i < typesTable.Rows.Count; i++)
            {
                TypeDefRow     type  = typesTable [i];
                TypeDefinition child = m_typeDefs [i];
                child.BaseType = GetTypeDefOrRef(type.Extends, new GenericContext(child));
            }

            CompleteMethods();
            ReadAllFields();
            ReadMemberReferences();
        }