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();
}
}