internal AssemblyProcessorTable(int numberOfRows, int start, MemoryBlock block)
 {
     NumberOfRows = numberOfRows;
     ProcessorOffset = 0;
     RowSize = ProcessorOffset + sizeof(UInt32);
     Table = block.GetRange(start, RowSize * numberOfRows);
 }
Exemple #2
0
 public MemoryReader(MemoryBlock block)
 {
     if (block == null) {
         throw new ArgumentNullException("block");
     }
     _block = block;
 }
 internal AssemblyOSTable(int numberOfRows, int start, MemoryBlock block)
 {
     NumberOfRows = numberOfRows;
     OSPlatformIdOffset = 0;
     OSMajorVersionIdOffset = OSPlatformIdOffset + sizeof(UInt32);
     OSMinorVersionIdOffset = OSMajorVersionIdOffset + sizeof(UInt32);
     RowSize = OSMinorVersionIdOffset + sizeof(UInt32);
     Table = block.GetRange(start, RowSize * numberOfRows);
 }
 internal TypeRefTable(int numberOfRows, int resolutionScopeRefSize, int stringHeapRefSize, int start, MemoryBlock block) {
     NumberOfRows = numberOfRows;
     IsResolutionScopeRefSizeSmall = resolutionScopeRefSize == 2;
     IsStringHeapRefSizeSmall = stringHeapRefSize == 2;
     ResolutionScopeOffset = 0;
     NameOffset = ResolutionScopeOffset + resolutionScopeRefSize;
     NamespaceOffset = NameOffset + stringHeapRefSize;
     RowSize = NamespaceOffset + stringHeapRefSize;
     Table = block.GetRange(start, RowSize * numberOfRows);
 }
Exemple #5
0
        internal MetadataImport(MemoryBlock image) {
            _image = image;

            try {
                ReadPEFileLevelData();
                ReadCORModuleLevelData();
                ReadMetadataLevelData();
            } catch (ArgumentOutOfRangeException) {
                throw new BadImageFormatException();
            }
        }
 internal ModuleTable(int numberOfRows, int stringHeapRefSize, int guidHeapRefSize, int start, MemoryBlock block) {
     NumberOfRows = numberOfRows;
     IsStringHeapRefSizeSmall = stringHeapRefSize == 2;
     IsGUIDHeapRefSizeSmall = guidHeapRefSize == 2;
     GenerationOffset = 0;
     NameOffset = GenerationOffset + sizeof(UInt16);
     MVIdOffset = NameOffset + stringHeapRefSize;
     EnCIdOffset = MVIdOffset + guidHeapRefSize;
     EnCBaseIdOffset = EnCIdOffset + guidHeapRefSize;
     RowSize = EnCBaseIdOffset + guidHeapRefSize;
     Table = block.GetRange(start, RowSize * numberOfRows);
 }
 internal MethodSpecTable(int numberOfRows, int methodDefOrRefRefSize, int blobHeapRefSize, int start, MemoryBlock block)
 {
     NumberOfRows = numberOfRows;
     IsMethodDefOrRefRefSizeSmall = methodDefOrRefRefSize == 2;
     IsBlobHeapRefSizeSmall = blobHeapRefSize == 2;
     MethodOffset = 0;
     InstantiationOffset = MethodOffset + methodDefOrRefRefSize;
     RowSize = InstantiationOffset + blobHeapRefSize;
     Table = block.GetRange(start, RowSize * numberOfRows);
 }
 internal DeclSecurityTable(int numberOfRows, int hasDeclSecurityRefSize, int blobHeapRefSize, int start, MemoryBlock block)
 {
     NumberOfRows = numberOfRows;
     // IsHasDeclSecurityRefSizeSmall = hasDeclSecurityRefSize == 2;
     // IsBlobHeapRefSizeSmall = blobHeapRefSize == 2;
     ActionOffset = 0;
     ParentOffset = ActionOffset + sizeof(UInt16);
     PermissionSetOffset = ParentOffset + hasDeclSecurityRefSize;
     RowSize = PermissionSetOffset + blobHeapRefSize;
     Table = block.GetRange(start, RowSize * numberOfRows);
 }
 internal EnCMapTable(int numberOfRows, int start, MemoryBlock block)
 {
     NumberOfRows = numberOfRows;
     TokenOffset = 0;
     RowSize = TokenOffset + sizeof(UInt32);
     Table = block.GetRange(start, RowSize * numberOfRows);
 }
 internal ParamPtrTable(int numberOfRows, int paramTableRowRefSize, int start, MemoryBlock block)
 {
     NumberOfRows = numberOfRows;
     IsParamTableRowRefSizeSmall = paramTableRowRefSize == 2;
     ParamOffset = 0;
     RowSize = ParamOffset + paramTableRowRefSize;
     Table = block.GetRange(start, RowSize * numberOfRows);
 }
 internal CustomAttributeTable(int numberOfRows, int hasCustomAttributeRefSize, int customAttributeTypeRefSize, int blobHeapRefSize, int start, MemoryBlock block)
 {
     NumberOfRows = numberOfRows;
     IsHasCustomAttributeRefSizeSmall = hasCustomAttributeRefSize == 2;
     IsCustomAttriubuteTypeRefSizeSmall = customAttributeTypeRefSize == 2;
     IsBlobHeapRefSizeSmall = blobHeapRefSize == 2;
     ParentOffset = 0;
     TypeOffset = ParentOffset + hasCustomAttributeRefSize;
     ValueOffset = TypeOffset + customAttributeTypeRefSize;
     RowSize = ValueOffset + blobHeapRefSize;
     Table = block.GetRange(start, RowSize * numberOfRows);
 }
 internal EventTable(int numberOfRows, int typeDefOrRefRefSize, int stringHeapRefSize, int start, MemoryBlock block)
 {
     NumberOfRows = numberOfRows;
     IsTypeDefOrRefRefSizeSmall = typeDefOrRefRefSize == 2;
     IsStringHeapRefSizeSmall = stringHeapRefSize == 2;
     FlagsOffset = 0;
     NameOffset = FlagsOffset + sizeof(UInt16);
     EventTypeOffset = NameOffset + stringHeapRefSize;
     RowSize = EventTypeOffset + typeDefOrRefRefSize;
     Table = block.GetRange(start, RowSize * numberOfRows);
 }
 internal FieldLayoutTable(int numberOfRows, int fieldTableRowRefSize, int start, MemoryBlock block)
 {
     NumberOfRows = numberOfRows;
     // IsFieldTableRowRefSizeSmall = fieldTableRowRefSize == 2;
     OffsetOffset = 0;
     FieldOffset = OffsetOffset + sizeof(UInt32);
     RowSize = FieldOffset + fieldTableRowRefSize;
     Table = block.GetRange(start, RowSize * numberOfRows);
 }
 internal AssemblyTable(int numberOfRows, int stringHeapRefSize, int blobHeapRefSize, int start, MemoryBlock block)
 {
     NumberOfRows = numberOfRows;
     IsStringHeapRefSizeSmall = stringHeapRefSize == 2;
     IsBlobHeapRefSizeSmall = blobHeapRefSize == 2;
     HashAlgIdOffset = 0;
     MajorVersionOffset = HashAlgIdOffset + sizeof(UInt32);
     MinorVersionOffset = MajorVersionOffset + sizeof(UInt16);
     BuildNumberOffset = MinorVersionOffset + sizeof(UInt16);
     RevisionNumberOffset = BuildNumberOffset + sizeof(UInt16);
     FlagsOffset = RevisionNumberOffset + sizeof(UInt16);
     PublicKeyOffset = FlagsOffset + sizeof(UInt32);
     NameOffset = PublicKeyOffset + blobHeapRefSize;
     CultureOffset = NameOffset + stringHeapRefSize;
     RowSize = CultureOffset + stringHeapRefSize;
     Table = block.GetRange(start, RowSize * numberOfRows);
 }
Exemple #15
0
        private void ProcessAndCacheStreams(MemoryBlock metadataRoot) {
            _metadataStreamKind = MetadataStreamKind.Illegal;

            foreach (StreamHeader streamHeader in _streamHeaders) {
                if ((long)streamHeader.Offset + streamHeader.Size > metadataRoot.Length) {
                    throw new BadImageFormatException();
                }
                MemoryBlock block = metadataRoot.GetRange((int)streamHeader.Offset, (int)streamHeader.Size);

                switch (streamHeader.Name) {
                    case COR20Constants.StringStreamName:
                        if (_stringStream != null) {
                            throw new BadImageFormatException();
                        }
                        // the first and the last byte of the heap must be zero:
                        if (block.Length == 0 || block.ReadByte(0) != 0 || block.ReadByte(block.Length - 1) != 0) {
                            throw new BadImageFormatException();
                        }
                        _stringStream = block;
                        break;

                    case COR20Constants.BlobStreamName:
                        if (_blobStream != null) {
                            throw new BadImageFormatException();
                        }
                        _blobStream = block;
                        break;

                    case COR20Constants.GUIDStreamName:
                        if (_guidStream != null) {
                            throw new BadImageFormatException();
                        }
                        _guidStream = block;
                        break;

                    case COR20Constants.UserStringStreamName:
                        if (_userStringStream != null) {
                            throw new BadImageFormatException();
                        }
                        _userStringStream = block;
                        break;

                    case COR20Constants.CompressedMetadataTableStreamName:
                        if (_metadataStreamKind != MetadataStreamKind.Illegal) {
                            throw new BadImageFormatException();
                        }
                        _metadataStreamKind = MetadataStreamKind.Compressed;
                        _metadataTableStream = block;
                        break;

                    case COR20Constants.UncompressedMetadataTableStreamName:
                        if (_metadataStreamKind != MetadataStreamKind.Illegal) {
                            throw new BadImageFormatException();
                        }
                        _metadataStreamKind = MetadataStreamKind.UnCompressed;
                        _metadataTableStream = block;
                        break;

                    default:
		                throw new BadImageFormatException();
                }
            }

            // mandatory streams:
            if (_stringStream == null || _guidStream == null || _metadataStreamKind == MetadataStreamKind.Illegal) {
                throw new BadImageFormatException();
            }
        }
 internal PropertyTable(int numberOfRows, int stringHeapRefSize, int blobHeapRefSize, int start, MemoryBlock block)
 {
     NumberOfRows = numberOfRows;
     IsStringHeapRefSizeSmall = stringHeapRefSize == 2;
     IsBlobHeapRefSizeSmall = blobHeapRefSize == 2;
     FlagsOffset = 0;
     NameOffset = FlagsOffset + sizeof(UInt16);
     SignatureOffset = NameOffset + stringHeapRefSize;
     RowSize = SignatureOffset + blobHeapRefSize;
     Table = block.GetRange(start, RowSize * numberOfRows);
 }
 internal TypeDefTable(int numberOfRows, int fieldRefSize, int methodRefSize, int typeDefOrRefRefSize, int stringHeapRefSize, int start, MemoryBlock block)
 {
     NumberOfRows = numberOfRows;
     IsFieldRefSizeSmall = fieldRefSize == 2;
     IsMethodRefSizeSmall = methodRefSize == 2;
     IsTypeDefOrRefRefSizeSmall = typeDefOrRefRefSize == 2;
     IsStringHeapRefSizeSmall = stringHeapRefSize == 2;
     FlagsOffset = 0;
     NameOffset = FlagsOffset + sizeof(UInt32);
     NamespaceOffset = NameOffset + stringHeapRefSize;
     ExtendsOffset = NamespaceOffset + stringHeapRefSize;
     FieldListOffset = ExtendsOffset + typeDefOrRefRefSize;
     MethodListOffset = FieldListOffset + fieldRefSize;
     RowSize = MethodListOffset + methodRefSize;
     Table = block.GetRange(start, RowSize * numberOfRows);
 }
 internal PropertyPtrTable(int numberOfRows, int propertyTableRowRefSize, int start, MemoryBlock block)
 {
     NumberOfRows = numberOfRows;
     IsPropertyTableRowRefSizeSmall = propertyTableRowRefSize == 2;
     PropertyOffset = 0;
     RowSize = PropertyOffset + propertyTableRowRefSize;
     Table = block.GetRange(start, RowSize * numberOfRows);
 }
 internal PropertyMapTable(int numberOfRows, int typeDefTableRowRefSize, int propertyRefSize, int start, MemoryBlock block)
 {
     NumberOfRows = numberOfRows;
     IsTypeDefTableRowRefSizeSmall = typeDefTableRowRefSize == 2;
     IsPropertyRefSizeSmall = propertyRefSize == 2;
     ParentOffset = 0;
     PropertyListOffset = ParentOffset + typeDefTableRowRefSize;
     RowSize = PropertyListOffset + propertyRefSize;
     Table = block.GetRange(start, RowSize * numberOfRows);
 }
 internal ParamTable(int numberOfRows, int stringHeapRefSize, int start, MemoryBlock block)
 {
     NumberOfRows = numberOfRows;
     IsStringHeapRefSizeSmall = stringHeapRefSize == 2;
     FlagsOffset = 0;
     SequenceOffset = FlagsOffset + sizeof(UInt16);
     NameOffset = SequenceOffset + sizeof(UInt16);
     RowSize = NameOffset + stringHeapRefSize;
     Table = block.GetRange(start, RowSize * numberOfRows);
 }
 internal EventMapTable(int numberOfRows, int typeDefTableRowRefSize, int eventRefSize, int start, MemoryBlock block)
 {
     NumberOfRows = numberOfRows;
     IsTypeDefTableRowRefSizeSmall = typeDefTableRowRefSize == 2;
     IsEventRefSizeSmall = eventRefSize == 2;
     ParentOffset = 0;
     EventListOffset = ParentOffset + typeDefTableRowRefSize;
     RowSize = EventListOffset + eventRefSize;
     Table = block.GetRange(start, RowSize * numberOfRows);
 }
 internal ModuleRefTable(int numberOfRows, int stringHeapRefSize, int start, MemoryBlock block)
 {
     NumberOfRows = numberOfRows;
     IsStringHeapRefSizeSmall = stringHeapRefSize == 2;
     NameOffset = 0;
     RowSize = NameOffset + stringHeapRefSize;
     Table = block.GetRange(start, RowSize * numberOfRows);
 }
 internal EventPtrTable(int numberOfRows, int eventTableRowRefSize, int start, MemoryBlock block)
 {
     NumberOfRows = numberOfRows;
     IsEventTableRowRefSizeSmall = eventTableRowRefSize == 2;
     EventOffset = 0;
     RowSize = EventOffset + eventTableRowRefSize;
     Table = block.GetRange(start, RowSize * numberOfRows);
 }
 internal MethodTable(int numberOfRows, int paramRefSize, int stringHeapRefSize, int blobHeapRefSize, int start, MemoryBlock block)
 {
     NumberOfRows = numberOfRows;
     IsParamRefSizeSmall = paramRefSize == 2;
     IsStringHeapRefSizeSmall = stringHeapRefSize == 2;
     IsBlobHeapRefSizeSmall = blobHeapRefSize == 2;
     RVAOffset = 0;
     ImplFlagsOffset = RVAOffset + sizeof(UInt32);
     FlagsOffset = ImplFlagsOffset + sizeof(UInt16);
     NameOffset = FlagsOffset + sizeof(UInt16);
     SignatureOffset = NameOffset + stringHeapRefSize;
     ParamListOffset = SignatureOffset + blobHeapRefSize;
     RowSize = ParamListOffset + paramRefSize;
     Table = block.GetRange(start, RowSize * numberOfRows);
 }
 internal ExportedTypeTable(int numberOfRows, int implementationRefSize, int stringHeapRefSize, int start, MemoryBlock block)
 {
     NumberOfRows = numberOfRows;
     IsImplementationRefSizeSmall = implementationRefSize == 2;
     IsStringHeapRefSizeSmall = stringHeapRefSize == 2;
     FlagsOffset = 0;
     TypeDefIdOffset = FlagsOffset + sizeof(UInt32);
     TypeNameOffset = TypeDefIdOffset + sizeof(UInt32);
     TypeNamespaceOffset = TypeNameOffset + stringHeapRefSize;
     ImplementationOffset = TypeNamespaceOffset + stringHeapRefSize;
     RowSize = ImplementationOffset + implementationRefSize;
     Table = block.GetRange(start, RowSize * numberOfRows);
 }
 internal ConstantTable(int numberOfRows, int hasConstantRefSize, int blobHeapRefSize, int start, MemoryBlock block)
 {
     NumberOfRows = numberOfRows;
     IsHasConstantRefSizeSmall = hasConstantRefSize == 2;
     IsBlobHeapRefSizeSmall = blobHeapRefSize == 2;
     TypeOffset = 0;
     ParentOffset = TypeOffset + sizeof(Byte) + 1; //  Alignment here (+1)...
     ValueOffset = ParentOffset + hasConstantRefSize;
     RowSize = ValueOffset + blobHeapRefSize;
     Table = block.GetRange(start, RowSize * numberOfRows);
 }
 internal TypeSpecTable(int numberOfRows, int blobHeapRefSize, int start, MemoryBlock block)
 {
     NumberOfRows = numberOfRows;
     IsBlobHeapRefSizeSmall = blobHeapRefSize == 2;
     SignatureOffset = 0;
     RowSize = SignatureOffset + blobHeapRefSize;
     Table = block.GetRange(start, RowSize * numberOfRows);
 }
 internal NestedClassTable(int numberOfRows, int typeDefTableRowRefSize, int start, MemoryBlock block)
 {
     NumberOfRows = numberOfRows;
     IsTypeDefTableRowRefSizeSmall = typeDefTableRowRefSize == 2;
     NestedClassOffset = 0;
     EnclosingClassOffset = NestedClassOffset + typeDefTableRowRefSize;
     RowSize = EnclosingClassOffset + typeDefTableRowRefSize;
     Table = block.GetRange(start, RowSize * numberOfRows);
 }
Exemple #29
0
        private void ProcessAndCacheMetadataTableBlocks(MemoryBlock metadataTablesMemoryBlock) {
            int[] rowCountArray = _tableRowCounts = new int[TableCount];
            int[] rowRefSizeArray = new int[TableCount];
            int[] rowCountCompressedArray = _metadataTableHeader.CompressedMetadataTableRowCount;
            ulong validTables = (ulong)_metadataTableHeader.ValidTables;

            //  Fill in the row count and table reference sizes...
            for (int tableIndex = 0, arrayIndex = 0; tableIndex < rowRefSizeArray.Length; tableIndex++) {
                if ((validTables & 0x0000000000000001UL) != 0) {
                    int rowCount = rowCountCompressedArray[arrayIndex++];
                    rowCountArray[tableIndex] = rowCount;
                    rowRefSizeArray[tableIndex] = rowCount < MetadataStreamConstants.LargeTableRowCount ? 2 : 4;
                } else {
                    rowRefSizeArray[tableIndex] = 2;
                }
                validTables >>= 1;
            }

            //  Compute ref sizes for tables that can have pointer tables for it
            int fieldRefSize = rowRefSizeArray[FieldPtrTable.TableIndex] > 2 ? 4 : rowRefSizeArray[FieldPtrTable.TableIndex];
            int methodRefSize = rowRefSizeArray[MethodPtrTable.TableIndex] > 2 ? 4 : rowRefSizeArray[MethodPtrTable.TableIndex];
            int paramRefSize = rowRefSizeArray[ParamPtrTable.TableIndex] > 2 ? 4 : rowRefSizeArray[ParamPtrTable.TableIndex];
            int eventRefSize = rowRefSizeArray[EventPtrTable.TableIndex] > 2 ? 4 : rowRefSizeArray[EventPtrTable.TableIndex];
            int propertyRefSize = rowRefSizeArray[PropertyPtrTable.TableIndex] > 2 ? 4 : rowRefSizeArray[PropertyPtrTable.TableIndex];
            //  Compute the coded token ref sizes
            int typeDefOrRefRefSize = ComputeCodedTokenSize(TypeDefOrRefTag.LargeRowSize, rowCountArray, TypeDefOrRefTag.TablesReferenced);
            int hasConstantRefSize = ComputeCodedTokenSize(HasConstantTag.LargeRowSize, rowCountArray, HasConstantTag.TablesReferenced);
            int hasCustomAttributeRefSize = ComputeCodedTokenSize(HasCustomAttributeTag.LargeRowSize, rowCountArray, HasCustomAttributeTag.TablesReferenced);
            int hasFieldMarshalRefSize = ComputeCodedTokenSize(HasFieldMarshalTag.LargeRowSize, rowCountArray, HasFieldMarshalTag.TablesReferenced);
            int hasDeclSecurityRefSize = ComputeCodedTokenSize(HasDeclSecurityTag.LargeRowSize, rowCountArray, HasDeclSecurityTag.TablesReferenced);
            int memberRefParentRefSize = ComputeCodedTokenSize(MemberRefParentTag.LargeRowSize, rowCountArray, MemberRefParentTag.TablesReferenced);
            int hasSemanticsRefSize = ComputeCodedTokenSize(HasSemanticsTag.LargeRowSize, rowCountArray, HasSemanticsTag.TablesReferenced);
            int methodDefOrRefRefSize = ComputeCodedTokenSize(MethodDefOrRefTag.LargeRowSize, rowCountArray, MethodDefOrRefTag.TablesReferenced);
            int memberForwardedRefSize = ComputeCodedTokenSize(MemberForwardedTag.LargeRowSize, rowCountArray, MemberForwardedTag.TablesReferenced);
            int implementationRefSize = ComputeCodedTokenSize(ImplementationTag.LargeRowSize, rowCountArray, ImplementationTag.TablesReferenced);
            int customAttributeTypeRefSize = ComputeCodedTokenSize(CustomAttributeTypeTag.LargeRowSize, rowCountArray, CustomAttributeTypeTag.TablesReferenced);
            int resolutionScopeRefSize = ComputeCodedTokenSize(ResolutionScopeTag.LargeRowSize, rowCountArray, ResolutionScopeTag.TablesReferenced);
            int typeOrMethodDefRefSize = ComputeCodedTokenSize(TypeOrMethodDefTag.LargeRowSize, rowCountArray, TypeOrMethodDefTag.TablesReferenced);
            //  Compute HeapRef Sizes
            int stringHeapRefSize = (_metadataTableHeader.HeapSizeFlags & HeapSizeFlag.StringHeapLarge) == HeapSizeFlag.StringHeapLarge ? 4 : 2;
            int guidHeapRefSize = (_metadataTableHeader.HeapSizeFlags & HeapSizeFlag.GUIDHeapLarge) == HeapSizeFlag.GUIDHeapLarge ? 4 : 2;
            int blobHeapRefSize = (_metadataTableHeader.HeapSizeFlags & HeapSizeFlag.BlobHeapLarge) == HeapSizeFlag.BlobHeapLarge ? 4 : 2;
            
            //  Populate the Table blocks
            int totalRequiredSize = 0;
            int currentTableSize = 0;
            int currentPointer = 0;

            ModuleTable = new ModuleTable(rowCountArray[ModuleTable.TableIndex], stringHeapRefSize, guidHeapRefSize, currentPointer, metadataTablesMemoryBlock);
            currentTableSize = ModuleTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            TypeRefTable = new TypeRefTable(rowCountArray[TypeRefTable.TableIndex], resolutionScopeRefSize, stringHeapRefSize, currentPointer, metadataTablesMemoryBlock);
            currentTableSize = TypeRefTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            TypeDefTable = new TypeDefTable(rowCountArray[TypeDefTable.TableIndex], fieldRefSize, methodRefSize, typeDefOrRefRefSize, stringHeapRefSize, currentPointer, metadataTablesMemoryBlock);
            currentTableSize = TypeDefTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            FieldPtrTable = new FieldPtrTable(rowCountArray[FieldPtrTable.TableIndex], rowRefSizeArray[FieldPtrTable.TableIndex], currentPointer, metadataTablesMemoryBlock);
            currentTableSize = FieldPtrTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            FieldTable = new FieldTable(rowCountArray[FieldTable.TableIndex], stringHeapRefSize, blobHeapRefSize, currentPointer, metadataTablesMemoryBlock);
            currentTableSize = FieldTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            MethodPtrTable = new MethodPtrTable(rowCountArray[MethodPtrTable.TableIndex], rowRefSizeArray[MethodPtrTable.TableIndex], currentPointer, metadataTablesMemoryBlock);
            currentTableSize = MethodPtrTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            MethodTable = new MethodTable(rowCountArray[MethodTable.TableIndex], paramRefSize, stringHeapRefSize, blobHeapRefSize, currentPointer, metadataTablesMemoryBlock);
            currentTableSize = MethodTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            ParamPtrTable = new ParamPtrTable(rowCountArray[ParamPtrTable.TableIndex], rowRefSizeArray[ParamPtrTable.TableIndex], currentPointer, metadataTablesMemoryBlock);
            currentTableSize = ParamPtrTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            ParamTable = new ParamTable(rowCountArray[ParamTable.TableIndex], stringHeapRefSize, currentPointer, metadataTablesMemoryBlock);
            currentTableSize = ParamTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            InterfaceImplTable = new InterfaceImplTable(rowCountArray[InterfaceImplTable.TableIndex], rowRefSizeArray[InterfaceImplTable.TableIndex], typeDefOrRefRefSize, currentPointer, metadataTablesMemoryBlock);
            currentTableSize = InterfaceImplTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            MemberRefTable = new MemberRefTable(rowCountArray[MemberRefTable.TableIndex], memberRefParentRefSize, stringHeapRefSize, blobHeapRefSize, currentPointer, metadataTablesMemoryBlock);
            currentTableSize = MemberRefTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            ConstantTable = new ConstantTable(rowCountArray[ConstantTable.TableIndex], hasConstantRefSize, blobHeapRefSize, currentPointer, metadataTablesMemoryBlock);
            currentTableSize = ConstantTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            CustomAttributeTable = new CustomAttributeTable(rowCountArray[CustomAttributeTable.TableIndex], hasCustomAttributeRefSize, customAttributeTypeRefSize, blobHeapRefSize, currentPointer, metadataTablesMemoryBlock);
            currentTableSize = CustomAttributeTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            FieldMarshalTable = new FieldMarshalTable(rowCountArray[FieldMarshalTable.TableIndex], hasFieldMarshalRefSize, blobHeapRefSize, currentPointer, metadataTablesMemoryBlock);
            currentTableSize = FieldMarshalTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            DeclSecurityTable = new DeclSecurityTable(rowCountArray[DeclSecurityTable.TableIndex], hasDeclSecurityRefSize, blobHeapRefSize, currentPointer, metadataTablesMemoryBlock);
            currentTableSize = DeclSecurityTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            ClassLayoutTable = new ClassLayoutTable(rowCountArray[ClassLayoutTable.TableIndex], rowRefSizeArray[ClassLayoutTable.TableIndex], currentPointer, metadataTablesMemoryBlock);
            currentTableSize = ClassLayoutTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            FieldLayoutTable = new FieldLayoutTable(rowCountArray[FieldLayoutTable.TableIndex], rowRefSizeArray[FieldLayoutTable.TableIndex], currentPointer, metadataTablesMemoryBlock);
            currentTableSize = FieldLayoutTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            StandAloneSigTable = new StandAloneSigTable(rowCountArray[StandAloneSigTable.TableIndex], blobHeapRefSize, currentPointer, metadataTablesMemoryBlock);
            currentTableSize = StandAloneSigTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            EventMapTable = new EventMapTable(rowCountArray[EventMapTable.TableIndex], rowRefSizeArray[EventMapTable.TableIndex], eventRefSize, currentPointer, metadataTablesMemoryBlock);
            currentTableSize = EventMapTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            EventPtrTable = new EventPtrTable(rowCountArray[EventPtrTable.TableIndex], rowRefSizeArray[EventPtrTable.TableIndex], currentPointer, metadataTablesMemoryBlock);
            currentTableSize = EventPtrTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            EventTable = new EventTable(rowCountArray[EventTable.TableIndex], typeDefOrRefRefSize, stringHeapRefSize, currentPointer, metadataTablesMemoryBlock);
            currentTableSize = EventTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            PropertyMapTable = new PropertyMapTable(rowCountArray[PropertyMapTable.TableIndex], rowRefSizeArray[PropertyMapTable.TableIndex], propertyRefSize, currentPointer, metadataTablesMemoryBlock);
            currentTableSize = PropertyMapTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            PropertyPtrTable = new PropertyPtrTable(rowCountArray[PropertyPtrTable.TableIndex], rowRefSizeArray[PropertyPtrTable.TableIndex], currentPointer, metadataTablesMemoryBlock);
            currentTableSize = PropertyPtrTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            PropertyTable = new PropertyTable(rowCountArray[PropertyTable.TableIndex], stringHeapRefSize, blobHeapRefSize, currentPointer, metadataTablesMemoryBlock);
            currentTableSize = PropertyTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            MethodSemanticsTable = new MethodSemanticsTable(rowCountArray[MethodSemanticsTable.TableIndex], rowRefSizeArray[MethodSemanticsTable.TableIndex], hasSemanticsRefSize, currentPointer, metadataTablesMemoryBlock);
            currentTableSize = MethodSemanticsTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            MethodImplTable = new MethodImplTable(rowCountArray[MethodImplTable.TableIndex], rowRefSizeArray[MethodImplTable.TableIndex], methodDefOrRefRefSize, currentPointer, metadataTablesMemoryBlock);
            currentTableSize = MethodImplTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            ModuleRefTable = new ModuleRefTable(rowCountArray[ModuleRefTable.TableIndex], stringHeapRefSize, currentPointer, metadataTablesMemoryBlock);
            currentTableSize = ModuleRefTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            TypeSpecTable = new TypeSpecTable(rowCountArray[TypeSpecTable.TableIndex], blobHeapRefSize, currentPointer, metadataTablesMemoryBlock);
            currentTableSize = TypeSpecTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            ImplMapTable = new ImplMapTable(rowCountArray[ImplMapTable.TableIndex], rowRefSizeArray[ImplMapTable.TableIndex], memberForwardedRefSize, stringHeapRefSize, currentPointer, metadataTablesMemoryBlock);
            currentTableSize = ImplMapTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            FieldRVATable = new FieldRVATable(rowCountArray[FieldRVATable.TableIndex], rowRefSizeArray[FieldRVATable.TableIndex], currentPointer, metadataTablesMemoryBlock);
            currentTableSize = FieldRVATable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            EnCLogTable = new EnCLogTable(rowCountArray[EnCLogTable.TableIndex], currentPointer, metadataTablesMemoryBlock);
            currentTableSize = EnCLogTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            EnCMapTable = new EnCMapTable(rowCountArray[EnCMapTable.TableIndex], currentPointer, metadataTablesMemoryBlock);
            currentTableSize = EnCMapTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            AssemblyTable = new AssemblyTable(rowCountArray[AssemblyTable.TableIndex], stringHeapRefSize, blobHeapRefSize, currentPointer, metadataTablesMemoryBlock);
            currentTableSize = AssemblyTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            AssemblyProcessorTable = new AssemblyProcessorTable(rowCountArray[AssemblyProcessorTable.TableIndex], currentPointer, metadataTablesMemoryBlock);
            currentTableSize = AssemblyProcessorTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            AssemblyOSTable = new AssemblyOSTable(rowCountArray[AssemblyOSTable.TableIndex], currentPointer, metadataTablesMemoryBlock);
            currentTableSize = AssemblyOSTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            AssemblyRefTable = new AssemblyRefTable(rowCountArray[AssemblyRefTable.TableIndex], stringHeapRefSize, blobHeapRefSize, currentPointer, metadataTablesMemoryBlock);
            currentTableSize = AssemblyRefTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            AssemblyRefProcessorTable = new AssemblyRefProcessorTable(rowCountArray[AssemblyRefProcessorTable.TableIndex], rowRefSizeArray[AssemblyRefProcessorTable.TableIndex], currentPointer, metadataTablesMemoryBlock);
            currentTableSize = AssemblyRefProcessorTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            AssemblyRefOSTable = new AssemblyRefOSTable(rowCountArray[AssemblyRefOSTable.TableIndex], rowRefSizeArray[AssemblyRefOSTable.TableIndex], currentPointer, metadataTablesMemoryBlock);
            currentTableSize = AssemblyRefOSTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            FileTable = new FileTable(rowCountArray[FileTable.TableIndex], stringHeapRefSize, blobHeapRefSize, currentPointer, metadataTablesMemoryBlock);
            currentTableSize = FileTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            ExportedTypeTable = new ExportedTypeTable(rowCountArray[ExportedTypeTable.TableIndex], implementationRefSize, stringHeapRefSize, currentPointer, metadataTablesMemoryBlock);
            currentTableSize = ExportedTypeTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            ManifestResourceTable = new ManifestResourceTable(rowCountArray[ManifestResourceTable.TableIndex], implementationRefSize, stringHeapRefSize, currentPointer, metadataTablesMemoryBlock);
            currentTableSize = ManifestResourceTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            NestedClassTable = new NestedClassTable(rowCountArray[NestedClassTable.TableIndex], rowRefSizeArray[NestedClassTable.TableIndex], currentPointer, metadataTablesMemoryBlock);
            currentTableSize = NestedClassTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            GenericParamTable = new GenericParamTable(rowCountArray[GenericParamTable.TableIndex], typeOrMethodDefRefSize, stringHeapRefSize, currentPointer, metadataTablesMemoryBlock);
            currentTableSize = GenericParamTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            MethodSpecTable = new MethodSpecTable(rowCountArray[MethodSpecTable.TableIndex], methodDefOrRefRefSize, blobHeapRefSize, currentPointer, metadataTablesMemoryBlock);
            currentTableSize = MethodSpecTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
            GenericParamConstraintTable = new GenericParamConstraintTable(rowCountArray[GenericParamConstraintTable.TableIndex], rowRefSizeArray[GenericParamConstraintTable.TableIndex], typeDefOrRefRefSize, currentPointer, metadataTablesMemoryBlock);
            currentTableSize = GenericParamConstraintTable.Table.Length;
            totalRequiredSize += currentTableSize;
            currentPointer += currentTableSize;
        }
 internal ClassLayoutTable(int numberOfRows, int typeDefTableRowRefSize, int start, MemoryBlock block)
 {
     NumberOfRows = numberOfRows;
     // IsTypeDefTableRowRefSizeSmall = typeDefTableRowRefSize == 2;
     PackagingSizeOffset = 0;
     ClassSizeOffset = PackagingSizeOffset + sizeof(UInt16);
     ParentOffset = ClassSizeOffset + sizeof(UInt32);
     RowSize = ParentOffset + typeDefTableRowRefSize;
     Table = block.GetRange(start, RowSize * numberOfRows);
 }