PERWAPI.PEReader.ReadMetaDataTables C# (CSharp) Method

ReadMetaDataTables() private method

private ReadMetaDataTables ( ) : void
return void
        private void ReadMetaDataTables()
        {
            ((PEFile)thisScope).Read(this);
            tables[(int)MDTable.Module][0] = thisScope;
            for (int ix=1; ix < MetaData.NumMetaDataTables; ix++) {
                if (tableLengths[ix] > 0) {
                    switch (ix) {
                        case ((int)MDTable.Assembly) :
                            Assembly.Read(this,tables[ix],(PEFile)thisScope);
                            break;
                        case ((int)MDTable.AssemblyOS) :
                        case ((int)MDTable.AssemblyProcessor) :
                        case ((int)MDTable.AssemblyRefOS) :
                        case ((int)MDTable.AssemblyRefProcessor) :
                            // ignore
                            Console.WriteLine("Got uncompressed table " + (MDTable)ix);
                            BaseStream.Seek(tableLengths[ix]*md.elemSize[ix],SeekOrigin.Current);
                            break;
                        case ((int)MDTable.AssemblyRef) :
                            AssemblyRef.Read(this,tables[ix]); break;
                            //case 0x25 : AssemblyRefOS.Read(this,tables[ix]); break;
                            //case 0x24 : AssemblyRefProcessor.Read(this,tables[ix]); break;
                        case ((int)MDTable.ClassLayout) :
                            ClassLayout.Read(this,tables[ix]); break;
                        case ((int)MDTable.Constant) :
                            ConstantElem.Read(this,tables[ix]); break;
                        case ((int)MDTable.CustomAttribute) :
                            CustomAttribute.Read(this,tables[ix]); break;
                        case ((int)MDTable.DeclSecurity) :
                            DeclSecurity.Read(this,tables[ix]); break;
                        case ((int)MDTable.Event) :
                            Event.Read(this,tables[ix]); break;
                        case ((int)MDTable.EventMap) :
                            MapElem.Read(this,tables[ix],MDTable.EventMap); break;
                        case ((int)MDTable.ExportedType) :
                            ExternClass.Read(this,tables[ix]); break;
                        case ((int)MDTable.Field) :
                            FieldDef.Read(this,tables[ix]); break;
                        case ((int)MDTable.FieldLayout) :
                            FieldLayout.Read(this,tables[ix]); break;
                        case ((int)MDTable.FieldMarshal) :
                            FieldMarshal.Read(this,tables[ix]); break;
                        case ((int)MDTable.FieldRVA) :
                            FieldRVA.Read(this,tables[ix]); break;
                        case ((int)MDTable.File) :
                            FileRef.Read(this,tables[ix]); break;
                        case ((int)MDTable.GenericParam) :
                            GenericParam.Read(this,tables[ix]); break;
                        case ((int)MDTable.GenericParamConstraint) :
                            GenericParamConstraint.Read(this,tables[ix]); break;
                        case ((int)MDTable.ImplMap) :
                            ImplMap.Read(this,tables[ix]); break;
                        case ((int)MDTable.InterfaceImpl) :
                            InterfaceImpl.Read(this,tables[ix]); break;
                        case ((int)MDTable.ManifestResource) :
                            ManifestResource.Read(this,tables[ix]); break;
                        case ((int)MDTable.MemberRef) :
                            Member.ReadMember(this,tables[ix]); break;
                        case ((int)MDTable.Method) :
                            MethodDef.Read(this,tables[ix]); break;
                        case ((int)MDTable.MethodImpl) :
                            MethodImpl.Read(this,tables[ix]); break;
                        case ((int)MDTable.MethodSemantics) :
                            MethodSemantics.Read(this,tables[ix]); break;
                        case ((int)MDTable.MethodSpec) :
                            MethodSpec.Read(this,tables[ix]); break;
                        case ((int)MDTable.ModuleRef) :
                            ModuleRef.Read(this,tables[ix],false); break;
                        case ((int)MDTable.NestedClass) :
                            MapElem.Read(this,tables[ix],MDTable.NestedClass);
                            tables[ix] = null;
                            break;
                        case ((int)MDTable.Param) :
                            Param.Read(this,tables[ix]); break;
                        case ((int)MDTable.Property) :
                            Property.Read(this,tables[ix]); break;
                        case ((int)MDTable.PropertyMap) :
                            MapElem.Read(this,tables[ix],MDTable.PropertyMap); break;
                        case ((int)MDTable.StandAloneSig) :
                            Signature.Read(this,tables[ix]); break;
                        case ((int)MDTable.TypeDef) :
                            ClassDef.Read(this,tables[ix],((PEFile)thisScope).isMSCorLib());
                            break;
                        case ((int)MDTable.TypeRef) :
                            ClassRef.Read(this,tables[ix],false); break;
                        case ((int)MDTable.TypeSpec) :
                            TypeSpec.Read(this,tables[ix]); break;
                        default: throw(new PEFileException("Unknown MetaData Table Type"));
                    }
                }
            }
            CheckForRefMerges();
            for (int ix=0; ix < MetaData.NumMetaDataTables; ix++) {
                if ((tables[ix] != null) && (ix != (int)MDTable.TypeSpec) &&
                    (ix != (int)MDTable.MethodSpec)) {  // resolve type/method specs when referenced
                    for (int j=0; j < tables[ix].Length; j++) {
                        //tables[ix][j].Row = (uint)j+1;
                        // KJG fix 2005:02:23
                        //   Everett ILASM leaves gaps in table[10][x] ...
                        //   so protect with a null test.
                        //
                        // ((MetaDataElement)tables[ix][j]).Resolve(this); // old line ...
                        //
                        if (tables[ix][j] != null) {
                            ((MetaDataElement)tables[ix][j]).Resolve(this);
                        } else {
                            Console.WriteLine();
                        }
                    }
                }
            }
            if (tableLengths[(int)MDTable.Assembly] > 0)
                ((PEFile)thisScope).SetThisAssembly((Assembly)tables[(int)MDTable.Assembly][0]);
            ((PEFile)thisScope).SetDefaultClass((ClassDef)tables[(int)MDTable.TypeDef][0]);
            for (int j=1; j < tables[(int)MDTable.TypeDef].Length; j++) {
                ((PEFile)thisScope).AddToClassList((ClassDef)tables[(int)MDTable.TypeDef][j]);
            }
            if (tableLengths[(int)MDTable.ManifestResource] > 0) {
                for (int j=0; j < tables[(int)MDTable.ManifestResource].Length; j++) {
                    ((PEFile)thisScope).AddToResourceList((ManifestResource)tables[(int)MDTable.ManifestResource][j]);
                }
            }
            if (entryPoint != 0) {
                MetaDataElement ep = GetTokenElement(entryPoint);
                if (ep is MethodDef)
                    ((MethodDef)ep).DeclareEntryPoint();
                else
                    ((ModuleFile)ep).SetEntryPoint();
            }
        }