Ejemplo n.º 1
0
        public AssemblyLoader()
        {
            _signatureResolver = new SignatureResolver(this);

            _assemblyTable = new AssemblyTable(this);

            Const             = new ConstantTable(this);
            Files             = new FileTable(this);
            ManifestResources = new ManifestResourceTable(this);

            Modules = new ModuleTable(this);

            ModuleRefs   = new ModuleRefTable(this);
            AssemblyRefs = new AssemblyRefTable(this);

            TypeRefs    = new TypeRefTable(this);
            MemberRefs  = new MemberRefTable(this);
            _typeSpec   = new TypeSpecTable(this);
            _methodSpec = new MethodSpecTable(this);

            Parameters        = new ParamTable(this);
            Fields            = new FieldTable(this);
            Properties        = new PropertyTable(this);
            Events            = new EventTable(this);
            GenericParameters = new GenericParamTable(this);

            Methods = new MethodTable(this);
            Types   = new TypeTable(this);
        }
Ejemplo n.º 2
0
        void PatchResources()
        {
            ManifestResourceTable resourceTable = (ManifestResourceTable)stripped_tables [ManifestResourceTable.RId];

            if (resourceTable == null)
            {
                return;
            }

            for (int i = 0; i < resourceTable.Rows.Count; i++)
            {
                ManifestResourceRow resourceRow = resourceTable [i];

                if (resourceRow.Implementation.RID != 0)
                {
                    continue;
                }

                foreach (Resource resource in assembly.MainModule.Resources)
                {
                    EmbeddedResource er = resource as EmbeddedResource;
                    if (er == null)
                    {
                        continue;
                    }

                    if (resource.Name != original.MetadataRoot.Streams.StringsHeap [resourceRow.Name])
                    {
                        continue;
                    }

                    resourceRow.Offset = metadata_writer.AddResource(er.Data);
                }
            }
        }
Ejemplo n.º 3
0
        void AddManifestResource(uint offset, string name, ManifestResourceAttributes flags, MetadataToken impl)
        {
            ManifestResourceTable mrTable = m_tableWriter.GetManifestResourceTable();
            ManifestResourceRow   mrRow   = m_rowWriter.CreateManifestResourceRow(
                offset,
                flags,
                m_mdWriter.AddString(name),
                impl);

            mrTable.Rows.Add(mrRow);
        }
Ejemplo n.º 4
0
        public override void VisitResourceCollection(ResourceCollection resources)
        {
            if (!m_tHeap.HasTable(ManifestResourceTable.RId))
            {
                return;
            }

            ManifestResourceTable mrTable = m_tableReader.GetManifestResourceTable();
            FileTable             fTable  = m_tableReader.GetFileTable();

            for (int i = 0; i < mrTable.Rows.Count; i++)
            {
                ManifestResourceRow mrRow = mrTable [i];
                if (mrRow.Implementation.RID == 0)
                {
                    EmbeddedResource eres = new EmbeddedResource(
                        ReadString(mrRow.Name), mrRow.Flags);

                    BinaryReader br = m_ir.MetadataReader.GetDataReader(
                        m_img.CLIHeader.Resources.VirtualAddress);
                    br.BaseStream.Position += mrRow.Offset;

                    eres.Data = br.ReadBytes(br.ReadInt32());

                    resources.Add(eres);
                    continue;
                }

                switch (mrRow.Implementation.TokenType)
                {
                case TokenType.File:
                    FileRow        fRow = fTable [(int)mrRow.Implementation.RID - 1];
                    LinkedResource lres = new LinkedResource(
                        ReadString(mrRow.Name), mrRow.Flags,
                        ReadString(fRow.Name));
                    lres.Hash = ReadBlob(fRow.HashValue);
                    resources.Add(lres);
                    break;

                case TokenType.AssemblyRef:
                    AssemblyNameReference asm =
                        m_module.AssemblyReferences [(int)mrRow.Implementation.RID - 1];
                    AssemblyLinkedResource alr = new AssemblyLinkedResource(
                        ReadString(mrRow.Name),
                        mrRow.Flags, asm);
                    resources.Add(alr);
                    break;
                }
            }
        }
Ejemplo n.º 5
0
        void EncodeManifestResourceTable(ManifestResourceTable table)
        {
            int index = 0;

            foreach (ManifestResourceRow row in table.Rows)
            {
                this.asm.ALIGN(Assembly.OBJECT_ALIGNMENT);
                this.asm.LABEL(moduleName + " ManifestResourceRow#" + index);
                this.asm.AddObjectFields(typeof(SharpOS.AOT.Metadata.ManifestResourceRow).ToString());
                this.asm.DATA(row.Offset);
                this.asm.DATA((uint)row.Flags);
                this.asm.DATA(row.Name);
                this.asm.DATA(row.Implementation.ToUInt());
                ++index;
            }

            this.MetadataArray("ManifestResource", table);
        }
Ejemplo n.º 6
0
 public virtual void VisitManifestResourceTable(ManifestResourceTable table)
 {
 }
Ejemplo n.º 7
0
        public void Read(ReaderContext ctxt)
        {
            var reader = ctxt.GetTablesReader();

            var actualReserved0 = reader.ReadUInt32();
            if (actualReserved0 != reserved0)
                throw new PEException("invalid MetadataTable header");
            var actualMajorVersion = reader.ReadByte();
            if (actualMajorVersion != majorVersion)
                throw new PEException("invalid MetadataTable header");
            var actualMinorVersion = reader.ReadByte();
            if (actualMinorVersion != minorVersion)
                throw new PEException("invalid MetadataTable header");
            var heapSizes = reader.ReadByte();
            IsStringStreamBig = (heapSizes & 0x01) != 0;
            IsGuidStreamBig = (heapSizes & 0x02) != 0;
            IsBlobStreamBig = (heapSizes & 0x04) != 0;
            Reserved1 = reader.ReadByte();

            var valid = new IntSet64(reader.ReadUInt64());
            var sorted = new IntSet64(reader.ReadUInt64());

            for (var i = 0; i < 64; i++)
            {
                var numRows = 0;
                if (valid[i])
                    numRows = (int)reader.ReadUInt32();

                switch ((TableTag)i)
                {
                case TableTag.Module:
                    ModuleTable = new ModuleTable(numRows);
                    break;
                case TableTag.Assembly:
                    AssemblyTable = new AssemblyTable(numRows);
                    break;
                case TableTag.AssemblyOS:
                    AssemblyOSTable = new AssemblyOSTable(numRows);
                    break;
                case TableTag.AssemblyProcessor:
                    AssemblyProcessorTable = new AssemblyProcessorTable(numRows);
                    break;
                case TableTag.AssemblyRef:
                    AssemblyRefTable = new AssemblyRefTable(numRows);
                    break;
                case TableTag.AssemblyRefOS:
                    AssemblyRefOSTable = new AssemblyRefOSTable(numRows);
                    break;
                case TableTag.AssemblyRefProcessor:
                    AssemblyRefProcessorTable = new AssemblyRefProcessorTable(numRows);
                    break;
                case TableTag.ClassLayout:
                    ClassLayoutTable = new ClassLayoutTable(numRows);
                    break;
                case TableTag.Constant:
                    ConstantTable = new ConstantTable(numRows);
                    break;
                case TableTag.CustomAttribute:
                    CustomAttributeTable = new CustomAttributeTable(numRows);
                    break;
                case TableTag.DeclSecurity:
                    DeclSecurityTable = new DeclSecurityTable(numRows);
                    break;
                case TableTag.EventMap:
                    EventMapTable = new EventMapTable(numRows);
                    break;
                case TableTag.Event:
                    EventTable = new EventTable(numRows);
                    break;
                case TableTag.ExportedType:
                    ExportedTypeTable = new ExportedTypeTable(numRows);
                    break;
                case TableTag.Field:
                    FieldTable = new FieldTable(numRows);
                    break;
                case TableTag.FieldLayout:
                    FieldLayoutTable = new FieldLayoutTable(numRows);
                    break;
                case TableTag.FieldMarshal:
                    FieldMarshalTable = new FieldMarshalTable(numRows);
                    break;
                case TableTag.FieldRVA:
                    FieldRVATable = new FieldRVATable(numRows);
                    break;
                case TableTag.File:
                    FileTable = new FileTable(numRows);
                    break;
                case TableTag.GenericParam:
                    GenericParamTable = new GenericParamTable(numRows);
                    break;
                case TableTag.GenericParamConstraint:
                    GenericParamConstraintTable = new GenericParamConstraintTable(numRows);
                    break;
                case TableTag.ImplMap:
                    ImplMapTable = new ImplMapTable(numRows);
                    break;
                case TableTag.InterfaceImpl:
                    InterfaceImplTable = new InterfaceImplTable(numRows);
                    break;
                case TableTag.ManifestResource:
                    ManifestResourceTable = new ManifestResourceTable(numRows);
                    break;
                case TableTag.MemberRef:
                    MemberRefTable = new MemberRefTable(numRows);
                    break;
                case TableTag.MethodDef:
                    MethodDefTable = new MethodDefTable(numRows);
                    break;
                case TableTag.MethodImpl:
                    MethodImplTable = new MethodImplTable(numRows);
                    break;
                case TableTag.MethodSemantics:
                    MethodSemanticsTable = new MethodSemanticsTable(numRows);
                    break;
                case TableTag.MethodSpec:
                    MethodSpecTable = new MethodSpecTable(numRows);
                    break;
                case TableTag.ModuleRef:
                    ModuleRefTable = new ModuleRefTable(numRows);
                    break;
                case TableTag.NestedClass:
                    NestedClassTable = new NestedClassTable(numRows);
                    break;
                case TableTag.Param:
                    ParamTable = new ParamTable(numRows);
                    break;
                case TableTag.Property:
                    PropertyTable = new PropertyTable(numRows);
                    break;
                case TableTag.PropertyMap:
                    PropertyMapTable = new PropertyMapTable(numRows);
                    break;
                case TableTag.StandAloneSig:
                    StandAloneSigTable = new StandAloneSigTable(numRows);
                    break;
                case TableTag.TypeDef:
                    TypeDefTable = new TypeDefTable(numRows);
                    break;
                case TableTag.TypeRef:
                    TypeRefTable = new TypeRefTable(numRows);
                    break;
                case TableTag.TypeSpec:
                    TypeSpecTable = new TypeSpecTable(numRows);
                    break;
                default:
                    // Ignore
                    break;
                }
            }

            DetermineIndexCodingSizes();

            for (var i = 0; i < 64; i++)
            {
                if (valid[i])
                {
                    switch ((TableTag)i)
                    {
                    case TableTag.Module:
                        ModuleTable.Read(ctxt, reader);
                        break;
                    case TableTag.Assembly:
                        AssemblyTable.Read(ctxt, reader);
                        break;
                    case TableTag.AssemblyOS:
                        AssemblyOSTable.Read(ctxt, reader);
                        break;
                    case TableTag.AssemblyProcessor:
                        AssemblyProcessorTable.Read(ctxt, reader);
                        break;
                    case TableTag.AssemblyRef:
                        AssemblyRefTable.Read(ctxt, reader);
                        break;
                    case TableTag.AssemblyRefOS:
                        AssemblyRefOSTable.Read(ctxt, reader);
                        break;
                    case TableTag.AssemblyRefProcessor:
                        AssemblyRefProcessorTable.Read(ctxt, reader);
                        break;
                    case TableTag.ClassLayout:
                        ClassLayoutTable.Read(ctxt, reader);
                        break;
                    case TableTag.Constant:
                        ConstantTable.Read(ctxt, reader);
                        break;
                    case TableTag.CustomAttribute:
                        CustomAttributeTable.Read(ctxt, reader);
                        break;
                    case TableTag.DeclSecurity:
                        DeclSecurityTable.Read(ctxt, reader);
                        break;
                    case TableTag.EventMap:
                        EventMapTable.Read(ctxt, reader);
                        break;
                    case TableTag.Event:
                        EventTable.Read(ctxt, reader);
                        break;
                    case TableTag.ExportedType:
                        ExportedTypeTable.Read(ctxt, reader);
                        break;
                    case TableTag.Field:
                        FieldTable.Read(ctxt, reader);
                        break;
                    case TableTag.FieldLayout:
                        FieldLayoutTable.Read(ctxt, reader);
                        break;
                    case TableTag.FieldMarshal:
                        FieldMarshalTable.Read(ctxt, reader);
                        break;
                    case TableTag.FieldRVA:
                        FieldRVATable.Read(ctxt, reader);
                        break;
                    case TableTag.File:
                        FileTable.Read(ctxt, reader);
                        break;
                    case TableTag.GenericParam:
                        GenericParamTable.Read(ctxt, reader);
                        break;
                    case TableTag.GenericParamConstraint:
                        GenericParamConstraintTable.Read(ctxt, reader);
                        break;
                    case TableTag.ImplMap:
                        ImplMapTable.Read(ctxt, reader);
                        break;
                    case TableTag.InterfaceImpl:
                        InterfaceImplTable.Read(ctxt, reader);
                        break;
                    case TableTag.ManifestResource:
                        ManifestResourceTable.Read(ctxt, reader);
                        break;
                    case TableTag.MemberRef:
                        MemberRefTable.Read(ctxt, reader);
                        break;
                    case TableTag.MethodDef:
                        MethodDefTable.Read(ctxt, reader);
                        break;
                    case TableTag.MethodImpl:
                        MethodImplTable.Read(ctxt, reader);
                        break;
                    case TableTag.MethodSemantics:
                        MethodSemanticsTable.Read(ctxt, reader);
                        break;
                    case TableTag.MethodSpec:
                        MethodSpecTable.Read(ctxt, reader);
                        break;
                    case TableTag.ModuleRef:
                        ModuleRefTable.Read(ctxt, reader);
                        break;
                    case TableTag.NestedClass:
                        NestedClassTable.Read(ctxt, reader);
                        break;
                    case TableTag.Param:
                        ParamTable.Read(ctxt, reader);
                        break;
                    case TableTag.Property:
                        PropertyTable.Read(ctxt, reader);
                        break;
                    case TableTag.PropertyMap:
                        PropertyMapTable.Read(ctxt, reader);
                        break;
                    case TableTag.StandAloneSig:
                        StandAloneSigTable.Read(ctxt, reader);
                        break;
                    case TableTag.TypeDef:
                        TypeDefTable.Read(ctxt, reader);
                        break;
                    case TableTag.TypeRef:
                        TypeRefTable.Read(ctxt, reader);
                        break;
                    case TableTag.TypeSpec:
                        TypeSpecTable.Read(ctxt, reader);
                        break;
                    default:
                        throw new PEException("unexpected table tag in MetadataTable body");
                    }
                }
            }

            ModuleTable.ResolveIndexes(ctxt);
            TypeRefTable.ResolveIndexes(ctxt);
            TypeDefTable.ResolveIndexes(ctxt);
            FieldTable.ResolveIndexes(ctxt);
            MethodDefTable.ResolveIndexes(ctxt);
            ParamTable.ResolveIndexes(ctxt);
            InterfaceImplTable.ResolveIndexes(ctxt);
            MemberRefTable.ResolveIndexes(ctxt);
            ConstantTable.ResolveIndexes(ctxt);
            CustomAttributeTable.ResolveIndexes(ctxt);
            FieldMarshalTable.ResolveIndexes(ctxt);
            DeclSecurityTable.ResolveIndexes(ctxt);
            ClassLayoutTable.ResolveIndexes(ctxt);
            FieldLayoutTable.ResolveIndexes(ctxt);
            StandAloneSigTable.ResolveIndexes(ctxt);
            EventMapTable.ResolveIndexes(ctxt);
            EventTable.ResolveIndexes(ctxt);
            PropertyMapTable.ResolveIndexes(ctxt);
            PropertyTable.ResolveIndexes(ctxt);
            MethodSemanticsTable.ResolveIndexes(ctxt);
            MethodImplTable.ResolveIndexes(ctxt);
            ModuleRefTable.ResolveIndexes(ctxt);
            TypeSpecTable.ResolveIndexes(ctxt);
            ImplMapTable.ResolveIndexes(ctxt);
            FieldRVATable.ResolveIndexes(ctxt);
            AssemblyTable.ResolveIndexes(ctxt);
            AssemblyProcessorTable.ResolveIndexes(ctxt);
            AssemblyOSTable.ResolveIndexes(ctxt);
            AssemblyRefTable.ResolveIndexes(ctxt);
            AssemblyRefProcessorTable.ResolveIndexes(ctxt);
            AssemblyRefOSTable.ResolveIndexes(ctxt);
            FileTable.ResolveIndexes(ctxt);
            ExportedTypeTable.ResolveIndexes(ctxt);
            ManifestResourceTable.ResolveIndexes(ctxt);
            NestedClassTable.ResolveIndexes(ctxt);
            GenericParamTable.ResolveIndexes(ctxt);
            MethodSpecTable.ResolveIndexes(ctxt);
            GenericParamConstraintTable.ResolveIndexes(ctxt);
        }
 public virtual void VisitManifestResourceTable(ManifestResourceTable table)
 {
 }
Ejemplo n.º 9
0
        public void Read(ReaderContext ctxt)
        {
            var reader = ctxt.GetTablesReader();

            var actualReserved0 = reader.ReadUInt32();

            if (actualReserved0 != reserved0)
            {
                throw new PEException("invalid MetadataTable header");
            }
            var actualMajorVersion = reader.ReadByte();

            if (actualMajorVersion != majorVersion)
            {
                throw new PEException("invalid MetadataTable header");
            }
            var actualMinorVersion = reader.ReadByte();

            if (actualMinorVersion != minorVersion)
            {
                throw new PEException("invalid MetadataTable header");
            }
            var heapSizes = reader.ReadByte();

            IsStringStreamBig = (heapSizes & 0x01) != 0;
            IsGuidStreamBig   = (heapSizes & 0x02) != 0;
            IsBlobStreamBig   = (heapSizes & 0x04) != 0;
            Reserved1         = reader.ReadByte();

            var valid  = new IntSet64(reader.ReadUInt64());
            var sorted = new IntSet64(reader.ReadUInt64());

            for (var i = 0; i < 64; i++)
            {
                var numRows = 0;
                if (valid[i])
                {
                    numRows = (int)reader.ReadUInt32();
                }

                switch ((TableTag)i)
                {
                case TableTag.Module:
                    ModuleTable = new ModuleTable(numRows);
                    break;

                case TableTag.Assembly:
                    AssemblyTable = new AssemblyTable(numRows);
                    break;

                case TableTag.AssemblyOS:
                    AssemblyOSTable = new AssemblyOSTable(numRows);
                    break;

                case TableTag.AssemblyProcessor:
                    AssemblyProcessorTable = new AssemblyProcessorTable(numRows);
                    break;

                case TableTag.AssemblyRef:
                    AssemblyRefTable = new AssemblyRefTable(numRows);
                    break;

                case TableTag.AssemblyRefOS:
                    AssemblyRefOSTable = new AssemblyRefOSTable(numRows);
                    break;

                case TableTag.AssemblyRefProcessor:
                    AssemblyRefProcessorTable = new AssemblyRefProcessorTable(numRows);
                    break;

                case TableTag.ClassLayout:
                    ClassLayoutTable = new ClassLayoutTable(numRows);
                    break;

                case TableTag.Constant:
                    ConstantTable = new ConstantTable(numRows);
                    break;

                case TableTag.CustomAttribute:
                    CustomAttributeTable = new CustomAttributeTable(numRows);
                    break;

                case TableTag.DeclSecurity:
                    DeclSecurityTable = new DeclSecurityTable(numRows);
                    break;

                case TableTag.EventMap:
                    EventMapTable = new EventMapTable(numRows);
                    break;

                case TableTag.Event:
                    EventTable = new EventTable(numRows);
                    break;

                case TableTag.ExportedType:
                    ExportedTypeTable = new ExportedTypeTable(numRows);
                    break;

                case TableTag.Field:
                    FieldTable = new FieldTable(numRows);
                    break;

                case TableTag.FieldLayout:
                    FieldLayoutTable = new FieldLayoutTable(numRows);
                    break;

                case TableTag.FieldMarshal:
                    FieldMarshalTable = new FieldMarshalTable(numRows);
                    break;

                case TableTag.FieldRVA:
                    FieldRVATable = new FieldRVATable(numRows);
                    break;

                case TableTag.File:
                    FileTable = new FileTable(numRows);
                    break;

                case TableTag.GenericParam:
                    GenericParamTable = new GenericParamTable(numRows);
                    break;

                case TableTag.GenericParamConstraint:
                    GenericParamConstraintTable = new GenericParamConstraintTable(numRows);
                    break;

                case TableTag.ImplMap:
                    ImplMapTable = new ImplMapTable(numRows);
                    break;

                case TableTag.InterfaceImpl:
                    InterfaceImplTable = new InterfaceImplTable(numRows);
                    break;

                case TableTag.ManifestResource:
                    ManifestResourceTable = new ManifestResourceTable(numRows);
                    break;

                case TableTag.MemberRef:
                    MemberRefTable = new MemberRefTable(numRows);
                    break;

                case TableTag.MethodDef:
                    MethodDefTable = new MethodDefTable(numRows);
                    break;

                case TableTag.MethodImpl:
                    MethodImplTable = new MethodImplTable(numRows);
                    break;

                case TableTag.MethodSemantics:
                    MethodSemanticsTable = new MethodSemanticsTable(numRows);
                    break;

                case TableTag.MethodSpec:
                    MethodSpecTable = new MethodSpecTable(numRows);
                    break;

                case TableTag.ModuleRef:
                    ModuleRefTable = new ModuleRefTable(numRows);
                    break;

                case TableTag.NestedClass:
                    NestedClassTable = new NestedClassTable(numRows);
                    break;

                case TableTag.Param:
                    ParamTable = new ParamTable(numRows);
                    break;

                case TableTag.Property:
                    PropertyTable = new PropertyTable(numRows);
                    break;

                case TableTag.PropertyMap:
                    PropertyMapTable = new PropertyMapTable(numRows);
                    break;

                case TableTag.StandAloneSig:
                    StandAloneSigTable = new StandAloneSigTable(numRows);
                    break;

                case TableTag.TypeDef:
                    TypeDefTable = new TypeDefTable(numRows);
                    break;

                case TableTag.TypeRef:
                    TypeRefTable = new TypeRefTable(numRows);
                    break;

                case TableTag.TypeSpec:
                    TypeSpecTable = new TypeSpecTable(numRows);
                    break;

                default:
                    // Ignore
                    break;
                }
            }

            DetermineIndexCodingSizes();

            for (var i = 0; i < 64; i++)
            {
                if (valid[i])
                {
                    switch ((TableTag)i)
                    {
                    case TableTag.Module:
                        ModuleTable.Read(ctxt, reader);
                        break;

                    case TableTag.Assembly:
                        AssemblyTable.Read(ctxt, reader);
                        break;

                    case TableTag.AssemblyOS:
                        AssemblyOSTable.Read(ctxt, reader);
                        break;

                    case TableTag.AssemblyProcessor:
                        AssemblyProcessorTable.Read(ctxt, reader);
                        break;

                    case TableTag.AssemblyRef:
                        AssemblyRefTable.Read(ctxt, reader);
                        break;

                    case TableTag.AssemblyRefOS:
                        AssemblyRefOSTable.Read(ctxt, reader);
                        break;

                    case TableTag.AssemblyRefProcessor:
                        AssemblyRefProcessorTable.Read(ctxt, reader);
                        break;

                    case TableTag.ClassLayout:
                        ClassLayoutTable.Read(ctxt, reader);
                        break;

                    case TableTag.Constant:
                        ConstantTable.Read(ctxt, reader);
                        break;

                    case TableTag.CustomAttribute:
                        CustomAttributeTable.Read(ctxt, reader);
                        break;

                    case TableTag.DeclSecurity:
                        DeclSecurityTable.Read(ctxt, reader);
                        break;

                    case TableTag.EventMap:
                        EventMapTable.Read(ctxt, reader);
                        break;

                    case TableTag.Event:
                        EventTable.Read(ctxt, reader);
                        break;

                    case TableTag.ExportedType:
                        ExportedTypeTable.Read(ctxt, reader);
                        break;

                    case TableTag.Field:
                        FieldTable.Read(ctxt, reader);
                        break;

                    case TableTag.FieldLayout:
                        FieldLayoutTable.Read(ctxt, reader);
                        break;

                    case TableTag.FieldMarshal:
                        FieldMarshalTable.Read(ctxt, reader);
                        break;

                    case TableTag.FieldRVA:
                        FieldRVATable.Read(ctxt, reader);
                        break;

                    case TableTag.File:
                        FileTable.Read(ctxt, reader);
                        break;

                    case TableTag.GenericParam:
                        GenericParamTable.Read(ctxt, reader);
                        break;

                    case TableTag.GenericParamConstraint:
                        GenericParamConstraintTable.Read(ctxt, reader);
                        break;

                    case TableTag.ImplMap:
                        ImplMapTable.Read(ctxt, reader);
                        break;

                    case TableTag.InterfaceImpl:
                        InterfaceImplTable.Read(ctxt, reader);
                        break;

                    case TableTag.ManifestResource:
                        ManifestResourceTable.Read(ctxt, reader);
                        break;

                    case TableTag.MemberRef:
                        MemberRefTable.Read(ctxt, reader);
                        break;

                    case TableTag.MethodDef:
                        MethodDefTable.Read(ctxt, reader);
                        break;

                    case TableTag.MethodImpl:
                        MethodImplTable.Read(ctxt, reader);
                        break;

                    case TableTag.MethodSemantics:
                        MethodSemanticsTable.Read(ctxt, reader);
                        break;

                    case TableTag.MethodSpec:
                        MethodSpecTable.Read(ctxt, reader);
                        break;

                    case TableTag.ModuleRef:
                        ModuleRefTable.Read(ctxt, reader);
                        break;

                    case TableTag.NestedClass:
                        NestedClassTable.Read(ctxt, reader);
                        break;

                    case TableTag.Param:
                        ParamTable.Read(ctxt, reader);
                        break;

                    case TableTag.Property:
                        PropertyTable.Read(ctxt, reader);
                        break;

                    case TableTag.PropertyMap:
                        PropertyMapTable.Read(ctxt, reader);
                        break;

                    case TableTag.StandAloneSig:
                        StandAloneSigTable.Read(ctxt, reader);
                        break;

                    case TableTag.TypeDef:
                        TypeDefTable.Read(ctxt, reader);
                        break;

                    case TableTag.TypeRef:
                        TypeRefTable.Read(ctxt, reader);
                        break;

                    case TableTag.TypeSpec:
                        TypeSpecTable.Read(ctxt, reader);
                        break;

                    default:
                        throw new PEException("unexpected table tag in MetadataTable body");
                    }
                }
            }

            ModuleTable.ResolveIndexes(ctxt);
            TypeRefTable.ResolveIndexes(ctxt);
            TypeDefTable.ResolveIndexes(ctxt);
            FieldTable.ResolveIndexes(ctxt);
            MethodDefTable.ResolveIndexes(ctxt);
            ParamTable.ResolveIndexes(ctxt);
            InterfaceImplTable.ResolveIndexes(ctxt);
            MemberRefTable.ResolveIndexes(ctxt);
            ConstantTable.ResolveIndexes(ctxt);
            CustomAttributeTable.ResolveIndexes(ctxt);
            FieldMarshalTable.ResolveIndexes(ctxt);
            DeclSecurityTable.ResolveIndexes(ctxt);
            ClassLayoutTable.ResolveIndexes(ctxt);
            FieldLayoutTable.ResolveIndexes(ctxt);
            StandAloneSigTable.ResolveIndexes(ctxt);
            EventMapTable.ResolveIndexes(ctxt);
            EventTable.ResolveIndexes(ctxt);
            PropertyMapTable.ResolveIndexes(ctxt);
            PropertyTable.ResolveIndexes(ctxt);
            MethodSemanticsTable.ResolveIndexes(ctxt);
            MethodImplTable.ResolveIndexes(ctxt);
            ModuleRefTable.ResolveIndexes(ctxt);
            TypeSpecTable.ResolveIndexes(ctxt);
            ImplMapTable.ResolveIndexes(ctxt);
            FieldRVATable.ResolveIndexes(ctxt);
            AssemblyTable.ResolveIndexes(ctxt);
            AssemblyProcessorTable.ResolveIndexes(ctxt);
            AssemblyOSTable.ResolveIndexes(ctxt);
            AssemblyRefTable.ResolveIndexes(ctxt);
            AssemblyRefProcessorTable.ResolveIndexes(ctxt);
            AssemblyRefOSTable.ResolveIndexes(ctxt);
            FileTable.ResolveIndexes(ctxt);
            ExportedTypeTable.ResolveIndexes(ctxt);
            ManifestResourceTable.ResolveIndexes(ctxt);
            NestedClassTable.ResolveIndexes(ctxt);
            GenericParamTable.ResolveIndexes(ctxt);
            MethodSpecTable.ResolveIndexes(ctxt);
            GenericParamConstraintTable.ResolveIndexes(ctxt);
        }