Example #1
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);
        }
Example #2
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);
        }
Example #3
0
        public void Write(WriterContext ctxt)
        {
            var writer = ctxt.GetTablesWriter();

            writer.WriteUInt32(reserved0);
            writer.WriteByte(majorVersion);
            writer.WriteByte(minorVersion);
            var heapSizes = default(byte);
            if (IsStringStreamBig)
                heapSizes |= 0x01;
            if (IsGuidStreamBig)
                heapSizes |= 0x02;
            if (IsBlobStreamBig)
                heapSizes |= 0x04;
            writer.WriteByte(heapSizes);
            writer.WriteByte(Reserved1);

            var valid = new IntSet64();
            valid[(int)TableTag.Assembly] = AssemblyTable.Count > 0;
            valid[(int)TableTag.AssemblyOS] = AssemblyOSTable.Count > 0;
            valid[(int)TableTag.AssemblyProcessor] = AssemblyProcessorTable.Count > 0;
            valid[(int)TableTag.AssemblyRef] = AssemblyRefTable.Count > 0;
            valid[(int)TableTag.AssemblyRefOS] = AssemblyRefOSTable.Count > 0;
            valid[(int)TableTag.AssemblyRefProcessor] = AssemblyRefProcessorTable.Count > 0;
            valid[(int)TableTag.ClassLayout] = ClassLayoutTable.Count > 0;
            valid[(int)TableTag.Constant] = ConstantTable.Count > 0;
            valid[(int)TableTag.CustomAttribute] = CustomAttributeTable.Count > 0;
            valid[(int)TableTag.DeclSecurity] = DeclSecurityTable.Count > 0;
            valid[(int)TableTag.EventMap] = EventMapTable.Count > 0;
            valid[(int)TableTag.Event] = EventTable.Count > 0;
            valid[(int)TableTag.ExportedType] = ExportedTypeTable.Count > 0;
            valid[(int)TableTag.Field] = FieldTable.Count > 0;
            valid[(int)TableTag.FieldLayout] = FieldLayoutTable.Count > 0;
            valid[(int)TableTag.FieldMarshal] = FieldMarshalTable.Count > 0;
            valid[(int)TableTag.FieldRVA] = FieldRVATable.Count > 0;
            valid[(int)TableTag.File] = FileTable.Count > 0;
            valid[(int)TableTag.GenericParam] = GenericParamTable.Count > 0;
            valid[(int)TableTag.GenericParamConstraint] = GenericParamConstraintTable.Count > 0;
            valid[(int)TableTag.ImplMap] = ImplMapTable.Count > 0;
            valid[(int)TableTag.InterfaceImpl] = InterfaceImplTable.Count > 0;
            valid[(int)TableTag.ManifestResource] = ManifestResourceTable.Count > 0;
            valid[(int)TableTag.MemberRef] = MemberRefTable.Count > 0;
            valid[(int)TableTag.MethodDef] = MethodDefTable.Count > 0;
            valid[(int)TableTag.MethodImpl] = MethodImplTable.Count > 0;
            valid[(int)TableTag.MethodSemantics] = MethodSemanticsTable.Count > 0;
            valid[(int)TableTag.MethodSpec] = MethodSpecTable.Count > 0;
            valid[(int)TableTag.Module] = ModuleTable.Count > 0;
            valid[(int)TableTag.ModuleRef] = ModuleRefTable.Count > 0;
            valid[(int)TableTag.NestedClass] = NestedClassTable.Count > 0;
            valid[(int)TableTag.Param] = ParamTable.Count > 0;
            valid[(int)TableTag.Property] = PropertyTable.Count > 0;
            valid[(int)TableTag.PropertyMap] = PropertyMapTable.Count > 0;
            valid[(int)TableTag.StandAloneSig] = StandAloneSigTable.Count > 0;
            valid[(int)TableTag.TypeDef] = TypeDefTable.Count > 0;
            valid[(int)TableTag.TypeRef] = TypeRefTable.Count > 0;
            valid[(int)TableTag.TypeSpec] = TypeSpecTable.Count > 0;
            writer.WriteUInt64(valid.ToUInt64());
            writer.WriteUInt64(valid.ToUInt64());

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

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

            writer.WriteUInt32(reserved0);
            writer.WriteByte(majorVersion);
            writer.WriteByte(minorVersion);
            var heapSizes = default(byte);

            if (IsStringStreamBig)
            {
                heapSizes |= 0x01;
            }
            if (IsGuidStreamBig)
            {
                heapSizes |= 0x02;
            }
            if (IsBlobStreamBig)
            {
                heapSizes |= 0x04;
            }
            writer.WriteByte(heapSizes);
            writer.WriteByte(Reserved1);

            var valid = new IntSet64();

            valid[(int)TableTag.Assembly]             = AssemblyTable.Count > 0;
            valid[(int)TableTag.AssemblyOS]           = AssemblyOSTable.Count > 0;
            valid[(int)TableTag.AssemblyProcessor]    = AssemblyProcessorTable.Count > 0;
            valid[(int)TableTag.AssemblyRef]          = AssemblyRefTable.Count > 0;
            valid[(int)TableTag.AssemblyRefOS]        = AssemblyRefOSTable.Count > 0;
            valid[(int)TableTag.AssemblyRefProcessor] = AssemblyRefProcessorTable.Count > 0;
            valid[(int)TableTag.ClassLayout]          = ClassLayoutTable.Count > 0;
            valid[(int)TableTag.Constant]             = ConstantTable.Count > 0;
            valid[(int)TableTag.CustomAttribute]      = CustomAttributeTable.Count > 0;
            valid[(int)TableTag.DeclSecurity]         = DeclSecurityTable.Count > 0;
            valid[(int)TableTag.EventMap]             = EventMapTable.Count > 0;
            valid[(int)TableTag.Event]                  = EventTable.Count > 0;
            valid[(int)TableTag.ExportedType]           = ExportedTypeTable.Count > 0;
            valid[(int)TableTag.Field]                  = FieldTable.Count > 0;
            valid[(int)TableTag.FieldLayout]            = FieldLayoutTable.Count > 0;
            valid[(int)TableTag.FieldMarshal]           = FieldMarshalTable.Count > 0;
            valid[(int)TableTag.FieldRVA]               = FieldRVATable.Count > 0;
            valid[(int)TableTag.File]                   = FileTable.Count > 0;
            valid[(int)TableTag.GenericParam]           = GenericParamTable.Count > 0;
            valid[(int)TableTag.GenericParamConstraint] = GenericParamConstraintTable.Count > 0;
            valid[(int)TableTag.ImplMap]                = ImplMapTable.Count > 0;
            valid[(int)TableTag.InterfaceImpl]          = InterfaceImplTable.Count > 0;
            valid[(int)TableTag.ManifestResource]       = ManifestResourceTable.Count > 0;
            valid[(int)TableTag.MemberRef]              = MemberRefTable.Count > 0;
            valid[(int)TableTag.MethodDef]              = MethodDefTable.Count > 0;
            valid[(int)TableTag.MethodImpl]             = MethodImplTable.Count > 0;
            valid[(int)TableTag.MethodSemantics]        = MethodSemanticsTable.Count > 0;
            valid[(int)TableTag.MethodSpec]             = MethodSpecTable.Count > 0;
            valid[(int)TableTag.Module]                 = ModuleTable.Count > 0;
            valid[(int)TableTag.ModuleRef]              = ModuleRefTable.Count > 0;
            valid[(int)TableTag.NestedClass]            = NestedClassTable.Count > 0;
            valid[(int)TableTag.Param]                  = ParamTable.Count > 0;
            valid[(int)TableTag.Property]               = PropertyTable.Count > 0;
            valid[(int)TableTag.PropertyMap]            = PropertyMapTable.Count > 0;
            valid[(int)TableTag.StandAloneSig]          = StandAloneSigTable.Count > 0;
            valid[(int)TableTag.TypeDef]                = TypeDefTable.Count > 0;
            valid[(int)TableTag.TypeRef]                = TypeRefTable.Count > 0;
            valid[(int)TableTag.TypeSpec]               = TypeSpecTable.Count > 0;
            writer.WriteUInt64(valid.ToUInt64());
            writer.WriteUInt64(valid.ToUInt64());

            for (var i = 0; i < 64; i++)
            {
                if (valid[i])
                {
                    var numRows = default(int);
                    switch ((TableTag)i)
                    {
                    case TableTag.Module:
                        numRows = ModuleTable.NumRows;
                        break;

                    case TableTag.Assembly:
                        numRows = AssemblyTable.NumRows;
                        break;

                    case TableTag.AssemblyOS:
                        numRows = AssemblyOSTable.NumRows;
                        break;

                    case TableTag.AssemblyProcessor:
                        numRows = AssemblyProcessorTable.NumRows;
                        break;

                    case TableTag.AssemblyRef:
                        numRows = AssemblyRefTable.NumRows;
                        break;

                    case TableTag.AssemblyRefOS:
                        numRows = AssemblyRefOSTable.NumRows;
                        break;

                    case TableTag.AssemblyRefProcessor:
                        numRows = AssemblyRefProcessorTable.NumRows;
                        break;

                    case TableTag.ClassLayout:
                        numRows = ClassLayoutTable.NumRows;
                        break;

                    case TableTag.Constant:
                        numRows = ConstantTable.NumRows;
                        break;

                    case TableTag.CustomAttribute:
                        numRows = CustomAttributeTable.NumRows;
                        break;

                    case TableTag.DeclSecurity:
                        numRows = DeclSecurityTable.NumRows;
                        break;

                    case TableTag.EventMap:
                        numRows = EventMapTable.NumRows;
                        break;

                    case TableTag.Event:
                        numRows = EventTable.NumRows;
                        break;

                    case TableTag.ExportedType:
                        numRows = ExportedTypeTable.NumRows;
                        break;

                    case TableTag.Field:
                        numRows = FieldTable.NumRows;
                        break;

                    case TableTag.FieldLayout:
                        numRows = FieldLayoutTable.NumRows;
                        break;

                    case TableTag.FieldMarshal:
                        numRows = FieldMarshalTable.NumRows;
                        break;

                    case TableTag.FieldRVA:
                        numRows = FieldRVATable.NumRows;
                        break;

                    case TableTag.File:
                        numRows = FileTable.NumRows;
                        break;

                    case TableTag.GenericParam:
                        numRows = GenericParamTable.NumRows;
                        break;

                    case TableTag.GenericParamConstraint:
                        numRows = GenericParamConstraintTable.NumRows;
                        break;

                    case TableTag.ImplMap:
                        numRows = ImplMapTable.NumRows;
                        break;

                    case TableTag.InterfaceImpl:
                        numRows = InterfaceImplTable.NumRows;
                        break;

                    case TableTag.ManifestResource:
                        numRows = ManifestResourceTable.NumRows;
                        break;

                    case TableTag.MemberRef:
                        numRows = MemberRefTable.NumRows;
                        break;

                    case TableTag.MethodDef:
                        numRows = MethodDefTable.NumRows;
                        break;

                    case TableTag.MethodImpl:
                        numRows = MethodImplTable.NumRows;
                        break;

                    case TableTag.MethodSemantics:
                        numRows = MethodSemanticsTable.NumRows;
                        break;

                    case TableTag.MethodSpec:
                        numRows = MethodSpecTable.NumRows;
                        break;

                    case TableTag.ModuleRef:
                        numRows = ModuleRefTable.NumRows;
                        break;

                    case TableTag.NestedClass:
                        numRows = NestedClassTable.NumRows;
                        break;

                    case TableTag.Param:
                        numRows = ParamTable.NumRows;
                        break;

                    case TableTag.Property:
                        numRows = PropertyTable.NumRows;
                        break;

                    case TableTag.PropertyMap:
                        numRows = PropertyMapTable.NumRows;
                        break;

                    case TableTag.StandAloneSig:
                        numRows = StandAloneSigTable.NumRows;
                        break;

                    case TableTag.TypeDef:
                        numRows = TypeDefTable.NumRows;
                        break;

                    case TableTag.TypeRef:
                        numRows = TypeRefTable.NumRows;
                        break;

                    case TableTag.TypeSpec:
                        numRows = TypeSpecTable.NumRows;
                        break;

                    default:
                        throw new PEException("invalid TableTag");
                    }
                    writer.WriteUInt32((uint)numRows);
                }
            }

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

                    case TableTag.Assembly:
                        AssemblyTable.Write(ctxt, writer);
                        break;

                    case TableTag.AssemblyOS:
                        AssemblyOSTable.Write(ctxt, writer);
                        break;

                    case TableTag.AssemblyProcessor:
                        AssemblyProcessorTable.Write(ctxt, writer);
                        break;

                    case TableTag.AssemblyRef:
                        AssemblyRefTable.Write(ctxt, writer);
                        break;

                    case TableTag.AssemblyRefOS:
                        AssemblyRefOSTable.Write(ctxt, writer);
                        break;

                    case TableTag.AssemblyRefProcessor:
                        AssemblyRefProcessorTable.Write(ctxt, writer);
                        break;

                    case TableTag.ClassLayout:
                        ClassLayoutTable.Write(ctxt, writer);
                        break;

                    case TableTag.Constant:
                        ConstantTable.Write(ctxt, writer);
                        break;

                    case TableTag.CustomAttribute:
                        CustomAttributeTable.Write(ctxt, writer);
                        break;

                    case TableTag.DeclSecurity:
                        DeclSecurityTable.Write(ctxt, writer);
                        break;

                    case TableTag.EventMap:
                        EventMapTable.Write(ctxt, writer);
                        break;

                    case TableTag.Event:
                        EventTable.Write(ctxt, writer);
                        break;

                    case TableTag.ExportedType:
                        ExportedTypeTable.Write(ctxt, writer);
                        break;

                    case TableTag.Field:
                        FieldTable.Write(ctxt, writer);
                        break;

                    case TableTag.FieldLayout:
                        FieldLayoutTable.Write(ctxt, writer);
                        break;

                    case TableTag.FieldMarshal:
                        FieldMarshalTable.Write(ctxt, writer);
                        break;

                    case TableTag.FieldRVA:
                        FieldRVATable.Write(ctxt, writer);
                        break;

                    case TableTag.File:
                        FileTable.Write(ctxt, writer);
                        break;

                    case TableTag.GenericParam:
                        GenericParamTable.Write(ctxt, writer);
                        break;

                    case TableTag.GenericParamConstraint:
                        GenericParamConstraintTable.Write(ctxt, writer);
                        break;

                    case TableTag.ImplMap:
                        ImplMapTable.Write(ctxt, writer);
                        break;

                    case TableTag.InterfaceImpl:
                        InterfaceImplTable.Write(ctxt, writer);
                        break;

                    case TableTag.ManifestResource:
                        ManifestResourceTable.Write(ctxt, writer);
                        break;

                    case TableTag.MemberRef:
                        MemberRefTable.Write(ctxt, writer);
                        break;

                    case TableTag.MethodDef:
                        MethodDefTable.Write(ctxt, writer);
                        break;

                    case TableTag.MethodImpl:
                        MethodImplTable.Write(ctxt, writer);
                        break;

                    case TableTag.MethodSemantics:
                        MethodSemanticsTable.Write(ctxt, writer);
                        break;

                    case TableTag.MethodSpec:
                        MethodSpecTable.Write(ctxt, writer);
                        break;

                    case TableTag.ModuleRef:
                        ModuleRefTable.Write(ctxt, writer);
                        break;

                    case TableTag.NestedClass:
                        NestedClassTable.Write(ctxt, writer);
                        break;

                    case TableTag.Param:
                        ParamTable.Write(ctxt, writer);
                        break;

                    case TableTag.Property:
                        PropertyTable.Write(ctxt, writer);
                        break;

                    case TableTag.PropertyMap:
                        PropertyMapTable.Write(ctxt, writer);
                        break;

                    case TableTag.StandAloneSig:
                        StandAloneSigTable.Write(ctxt, writer);
                        break;

                    case TableTag.TypeDef:
                        TypeDefTable.Write(ctxt, writer);
                        break;

                    case TableTag.TypeRef:
                        TypeRefTable.Write(ctxt, writer);
                        break;

                    case TableTag.TypeSpec:
                        TypeSpecTable.Write(ctxt, writer);
                        break;

                    default:
                        throw new PEException("invalid TableTag");
                    }
                }
            }
        }