Mono.Cecil.PE.ImageReader.ComputeTableInformations C# (CSharp) Method

ComputeTableInformations() private method

private ComputeTableInformations ( ) : void
return void
        void ComputeTableInformations()
        {
            uint offset = (uint) BaseStream.Position - table_heap_offset - image.MetadataSection.PointerToRawData; // header

            int stridx_size = image.StringHeap.IndexSize;
            int guididx_size = image.GuidHeap.IndexSize;
            int blobidx_size = image.BlobHeap != null ? image.BlobHeap.IndexSize : 2;

            var heap = image.TableHeap;
            var tables = heap.Tables;

            for (int i = 0; i < Mixin.TableCount; i++) {
                var table = (Table) i;
                if (!heap.HasTable (table))
                    continue;

                int size;
                switch (table) {
                case Table.Module:
                    size = 2	// Generation
                        + stridx_size	// Name
                        + (guididx_size * 3);	// Mvid, EncId, EncBaseId
                    break;
                case Table.TypeRef:
                    size = GetCodedIndexSize (CodedIndex.ResolutionScope)	// ResolutionScope
                        + (stridx_size * 2);	// Name, Namespace
                    break;
                case Table.TypeDef:
                    size = 4	// Flags
                        + (stridx_size * 2)	// Name, Namespace
                        + GetCodedIndexSize (CodedIndex.TypeDefOrRef)	// BaseType
                        + GetTableIndexSize (Table.Field)	// FieldList
                        + GetTableIndexSize (Table.Method);	// MethodList
                    break;
                case Table.FieldPtr:
                    size = GetTableIndexSize (Table.Field);	// Field
                    break;
                case Table.Field:
                    size = 2	// Flags
                        + stridx_size	// Name
                        + blobidx_size;	// Signature
                    break;
                case Table.MethodPtr:
                    size = GetTableIndexSize (Table.Method);	// Method
                    break;
                case Table.Method:
                    size = 8	// Rva 4, ImplFlags 2, Flags 2
                        + stridx_size	// Name
                        + blobidx_size	// Signature
                        + GetTableIndexSize (Table.Param); // ParamList
                    break;
                case Table.ParamPtr:
                    size = GetTableIndexSize (Table.Param); // Param
                    break;
                case Table.Param:
                    size = 4	// Flags 2, Sequence 2
                        + stridx_size;	// Name
                    break;
                case Table.InterfaceImpl:
                    size = GetTableIndexSize (Table.TypeDef)	// Class
                        + GetCodedIndexSize (CodedIndex.TypeDefOrRef);	// Interface
                    break;
                case Table.MemberRef:
                    size = GetCodedIndexSize (CodedIndex.MemberRefParent)	// Class
                        + stridx_size	// Name
                        + blobidx_size;	// Signature
                    break;
                case Table.Constant:
                    size = 2	// Type
                        + GetCodedIndexSize (CodedIndex.HasConstant)	// Parent
                        + blobidx_size;	// Value
                    break;
                case Table.CustomAttribute:
                    size = GetCodedIndexSize (CodedIndex.HasCustomAttribute)	// Parent
                        + GetCodedIndexSize (CodedIndex.CustomAttributeType)	// Type
                        + blobidx_size;	// Value
                    break;
                case Table.FieldMarshal:
                    size = GetCodedIndexSize (CodedIndex.HasFieldMarshal)	// Parent
                        + blobidx_size;	// NativeType
                    break;
                case Table.DeclSecurity:
                    size = 2	// Action
                        + GetCodedIndexSize (CodedIndex.HasDeclSecurity)	// Parent
                        + blobidx_size;	// PermissionSet
                    break;
                case Table.ClassLayout:
                    size = 6	// PackingSize 2, ClassSize 4
                        + GetTableIndexSize (Table.TypeDef);	// Parent
                    break;
                case Table.FieldLayout:
                    size = 4	// Offset
                        + GetTableIndexSize (Table.Field);	// Field
                    break;
                case Table.StandAloneSig:
                    size = blobidx_size;	// Signature
                    break;
                case Table.EventMap:
                    size = GetTableIndexSize (Table.TypeDef)	// Parent
                        + GetTableIndexSize (Table.Event);	// EventList
                    break;
                case Table.EventPtr:
                    size = GetTableIndexSize (Table.Event);	// Event
                    break;
                case Table.Event:
                    size = 2	// Flags
                        + stridx_size // Name
                        + GetCodedIndexSize (CodedIndex.TypeDefOrRef);	// EventType
                    break;
                case Table.PropertyMap:
                    size = GetTableIndexSize (Table.TypeDef)	// Parent
                        + GetTableIndexSize (Table.Property);	// PropertyList
                    break;
                case Table.PropertyPtr:
                    size = GetTableIndexSize (Table.Property);	// Property
                    break;
                case Table.Property:
                    size = 2	// Flags
                        + stridx_size	// Name
                        + blobidx_size;	// Type
                    break;
                case Table.MethodSemantics:
                    size = 2	// Semantics
                        + GetTableIndexSize (Table.Method)	// Method
                        + GetCodedIndexSize (CodedIndex.HasSemantics);	// Association
                    break;
                case Table.MethodImpl:
                    size = GetTableIndexSize (Table.TypeDef)	// Class
                        + GetCodedIndexSize (CodedIndex.MethodDefOrRef)	// MethodBody
                        + GetCodedIndexSize (CodedIndex.MethodDefOrRef);	// MethodDeclaration
                    break;
                case Table.ModuleRef:
                    size = stridx_size;	// Name
                    break;
                case Table.TypeSpec:
                    size = blobidx_size;	// Signature
                    break;
                case Table.ImplMap:
                    size = 2	// MappingFlags
                        + GetCodedIndexSize (CodedIndex.MemberForwarded)	// MemberForwarded
                        + stridx_size	// ImportName
                        + GetTableIndexSize (Table.ModuleRef);	// ImportScope
                    break;
                case Table.FieldRVA:
                    size = 4	// RVA
                        + GetTableIndexSize (Table.Field);	// Field
                    break;
                case Table.EncLog:
                    size = 8;
                    break;
                case Table.EncMap:
                    size = 4;
                    break;
                case Table.Assembly:
                    size = 16 // HashAlgId 4, Version 4 * 2, Flags 4
                        + blobidx_size	// PublicKey
                        + (stridx_size * 2);	// Name, Culture
                    break;
                case Table.AssemblyProcessor:
                    size = 4;	// Processor
                    break;
                case Table.AssemblyOS:
                    size = 12;	// Platform 4, Version 2 * 4
                    break;
                case Table.AssemblyRef:
                    size = 12	// Version 2 * 4 + Flags 4
                        + (blobidx_size * 2)	// PublicKeyOrToken, HashValue
                        + (stridx_size * 2);	// Name, Culture
                    break;
                case Table.AssemblyRefProcessor:
                    size = 4	// Processor
                        + GetTableIndexSize (Table.AssemblyRef);	// AssemblyRef
                    break;
                case Table.AssemblyRefOS:
                    size = 12	// Platform 4, Version 2 * 4
                        + GetTableIndexSize (Table.AssemblyRef);	// AssemblyRef
                    break;
                case Table.File:
                    size = 4	// Flags
                        + stridx_size	// Name
                        + blobidx_size;	// HashValue
                    break;
                case Table.ExportedType:
                    size = 8	// Flags 4, TypeDefId 4
                        + (stridx_size * 2)	// Name, Namespace
                        + GetCodedIndexSize (CodedIndex.Implementation);	// Implementation
                    break;
                case Table.ManifestResource:
                    size = 8	// Offset, Flags
                        + stridx_size	// Name
                        + GetCodedIndexSize (CodedIndex.Implementation);	// Implementation
                    break;
                case Table.NestedClass:
                    size = GetTableIndexSize (Table.TypeDef)	// NestedClass
                        + GetTableIndexSize (Table.TypeDef);	// EnclosingClass
                    break;
                case Table.GenericParam:
                    size = 4	// Number, Flags
                        + GetCodedIndexSize (CodedIndex.TypeOrMethodDef)	// Owner
                        + stridx_size;	// Name
                    break;
                case Table.MethodSpec:
                    size = GetCodedIndexSize (CodedIndex.MethodDefOrRef)	// Method
                        + blobidx_size;	// Instantiation
                    break;
                case Table.GenericParamConstraint:
                    size = GetTableIndexSize (Table.GenericParam)	// Owner
                        + GetCodedIndexSize (CodedIndex.TypeDefOrRef);	// Constraint
                    break;
                case Table.Document:
                    size = blobidx_size	// Name
                        + guididx_size	// HashAlgorithm
                        + blobidx_size	// Hash
                        + guididx_size;	// Language
                    break;
                case Table.MethodDebugInformation:
                    size = GetTableIndexSize (Table.Document)  // Document
                        + blobidx_size;	// SequencePoints
                    break;
                case Table.LocalScope:
                    size = GetTableIndexSize (Table.Method)	// Method
                        + GetTableIndexSize (Table.ImportScope)	// ImportScope
                        + GetTableIndexSize (Table.LocalVariable)	// VariableList
                        + GetTableIndexSize (Table.LocalConstant)	// ConstantList
                        + 4 * 2;	// StartOffset, Length
                    break;
                case Table.LocalVariable:
                    size = 2	// Attributes
                        + 2		// Index
                        + stridx_size;	// Name
                    break;
                case Table.LocalConstant:
                    size = stridx_size	// Name
                        + blobidx_size;	// Signature
                    break;
                case Table.ImportScope:
                    size = GetTableIndexSize (Table.ImportScope)	// Parent
                        + blobidx_size;
                    break;
                case Table.StateMachineMethod:
                    size = GetTableIndexSize (Table.Method) // MoveNextMethod
                        + GetTableIndexSize (Table.Method);	// KickOffMethod
                    break;
                case Table.CustomDebugInformation:
                    size = GetCodedIndexSize (CodedIndex.HasCustomDebugInformation) // Parent
                        + guididx_size	// Kind
                        + blobidx_size;	// Value
                    break;
                default:
                    throw new NotSupportedException ();
                }

                tables [i].RowSize = (uint) size;
                tables [i].Offset = offset;

                offset += (uint) size * tables [i].Length;
            }
        }