/* Copyright (C) 2014-2019 de4dot@gmail.com This file is part of dnSpy dnSpy is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. dnSpy is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with dnSpy. If not, see . */ using System; using System.Collections.Generic; using System.Diagnostics; using System.Text; using dnSpy.AsmEditor.Properties; using dnSpy.Contracts.Hex; using dnSpy.Contracts.Hex.Files.DotNet; namespace dnSpy.AsmEditor.Hex.PE { abstract class MetadataTableVM : HexVM { public Table Table => TableInfo.Table; public uint Rows { get; } public TableInfo TableInfo { get; } public override string Name => $"{(byte)TableInfo.Table:X2} {TableInfo.Table}"; public string Column0Name => GetColumnName(0); public string Column1Name => GetColumnName(1); public string Column2Name => GetColumnName(2); public string Column3Name => GetColumnName(3); public string Column4Name => GetColumnName(4); public string Column5Name => GetColumnName(5); public string Column6Name => GetColumnName(6); public string Column7Name => GetColumnName(7); public string Column8Name => GetColumnName(8); public string Column9Name => GetColumnName(9); public string GetColumnName(int col) { Debug.Assert(col < TableInfo.Columns.Count); if (col >= TableInfo.Columns.Count) return string.Empty; return TableInfo.Columns[col].Name; } public string InfoName => dnSpy_AsmEditor_Resources.Info; public virtual bool HasInfo => false; public override IEnumerable HexFields => hexFields; readonly HexField[] hexFields = Array.Empty(); public VirtualizedList Collection { get; } public object? SelectedItem { get => selectedItem; set { if (selectedItem != value) { selectedItem = value; OnPropertyChanged(nameof(SelectedItem)); } } } object? selectedItem; public HexBuffer Buffer => buffer; public TablesStreamVM TablesStream { get; } public object? Owner { get; set; } readonly HexBuffer buffer; readonly HexSpan stringsHeapSpan; readonly HexSpan guidHeapSpan; protected MetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(mdTable.Span) { this.buffer = buffer; TablesStream = tablesStream; this.stringsHeapSpan = stringsHeapSpan; this.guidHeapSpan = guidHeapSpan; Rows = mdTable.Rows; TableInfo = CreateTableInfo(mdTable.TableInfo); Collection = new VirtualizedList((int)Rows, CreateItem); } MetadataTableRecordVM CreateItem(int index) { Debug.Assert(index >= 0 && (uint)index < Rows); switch (TableInfo.Table) { case Table.Module: return new ModuleMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.TypeRef: return new TypeRefMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.TypeDef: return new TypeDefMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.FieldPtr: return new FieldPtrMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.Field: return new FieldMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.MethodPtr: return new MethodPtrMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.Method: return new MethodMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.ParamPtr: return new ParamPtrMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.Param: return new ParamMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.InterfaceImpl: return new InterfaceImplMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.MemberRef: return new MemberRefMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.Constant: return new ConstantMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.CustomAttribute: return new CustomAttributeMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.FieldMarshal: return new FieldMarshalMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.DeclSecurity: return new DeclSecurityMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.ClassLayout: return new ClassLayoutMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.FieldLayout: return new FieldLayoutMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.StandAloneSig: return new StandAloneSigMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.EventMap: return new EventMapMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.EventPtr: return new EventPtrMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.Event: return new EventMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.PropertyMap: return new PropertyMapMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.PropertyPtr: return new PropertyPtrMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.Property: return new PropertyMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.MethodSemantics: return new MethodSemanticsMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.MethodImpl: return new MethodImplMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.ModuleRef: return new ModuleRefMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.TypeSpec: return new TypeSpecMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.ImplMap: return new ImplMapMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.FieldRVA: return new FieldRVAMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.ENCLog: return new ENCLogMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.ENCMap: return new ENCMapMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.Assembly: return new AssemblyMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.AssemblyProcessor: return new AssemblyProcessorMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.AssemblyOS: return new AssemblyOSMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.AssemblyRef: return new AssemblyRefMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.AssemblyRefProcessor: return new AssemblyRefProcessorMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.AssemblyRefOS: return new AssemblyRefOSMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.File: return new FileMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.ExportedType: return new ExportedTypeMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.ManifestResource: return new ManifestResourceMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.NestedClass: return new NestedClassMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.GenericParam: return TableInfo.Columns.Count == 5 ? (MetadataTableRecordVM)new GenericParamMetadataTableRecordV11VM(this, new MDToken(TableInfo.Table, index + 1)) : new GenericParamMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.MethodSpec: return new MethodSpecMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.GenericParamConstraint: return new GenericParamConstraintMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.Document: return new DocumentMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.MethodDebugInformation: return new MethodDebugInformationMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.LocalScope: return new LocalScopeMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.LocalVariable: return new LocalVariableMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.LocalConstant: return new LocalConstantMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.ImportScope: return new ImportScopeMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.StateMachineMethod: return new StateMachineMethodMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); case Table.CustomDebugInformation: return new CustomDebugInformationMetadataTableRecordVM(this, new MDToken(TableInfo.Table, index + 1)); default: throw new InvalidOperationException(); } } public static MetadataTableVM Create(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) { switch (mdTable.Table) { case Table.Module: return new ModuleMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.TypeRef: return new TypeRefMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.TypeDef: return new TypeDefMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.FieldPtr: return new FieldPtrMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.Field: return new FieldMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.MethodPtr: return new MethodPtrMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.Method: return new MethodMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.ParamPtr: return new ParamPtrMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.Param: return new ParamMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.InterfaceImpl: return new InterfaceImplMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.MemberRef: return new MemberRefMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.Constant: return new ConstantMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.CustomAttribute: return new CustomAttributeMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.FieldMarshal: return new FieldMarshalMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.DeclSecurity: return new DeclSecurityMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.ClassLayout: return new ClassLayoutMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.FieldLayout: return new FieldLayoutMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.StandAloneSig: return new StandAloneSigMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.EventMap: return new EventMapMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.EventPtr: return new EventPtrMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.Event: return new EventMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.PropertyMap: return new PropertyMapMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.PropertyPtr: return new PropertyPtrMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.Property: return new PropertyMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.MethodSemantics: return new MethodSemanticsMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.MethodImpl: return new MethodImplMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.ModuleRef: return new ModuleRefMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.TypeSpec: return new TypeSpecMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.ImplMap: return new ImplMapMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.FieldRVA: return new FieldRVAMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.ENCLog: return new ENCLogMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.ENCMap: return new ENCMapMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.Assembly: return new AssemblyMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.AssemblyProcessor: return new AssemblyProcessorMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.AssemblyOS: return new AssemblyOSMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.AssemblyRef: return new AssemblyRefMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.AssemblyRefProcessor: return new AssemblyRefProcessorMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.AssemblyRefOS: return new AssemblyRefOSMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.File: return new FileMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.ExportedType: return new ExportedTypeMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.ManifestResource: return new ManifestResourceMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.NestedClass: return new NestedClassMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.GenericParam: return mdTable.Columns.Count == 5 ? (MetadataTableVM)new GenericParamMetadataTableV11VM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) : new GenericParamMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.MethodSpec: return new MethodSpecMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.GenericParamConstraint: return new GenericParamConstraintMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.Document: return new DocumentMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.MethodDebugInformation: return new MethodDebugInformationMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.LocalScope: return new LocalScopeMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.LocalVariable: return new LocalVariableMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.LocalConstant: return new LocalConstantMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.ImportScope: return new ImportScopeMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.StateMachineMethod: return new StateMachineMethodMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); case Table.CustomDebugInformation: return new CustomDebugInformationMetadataTableVM(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan); default: throw new InvalidOperationException(); } } static TableInfo CreateTableInfo(TableInfo info) { var newCols = new List(info.Columns.Count + 1); int offs = 0; for (int i = 0, coli = 0; i < info.Columns.Count; i++, coli++) { var col = info.Columns[i]; newCols.Add(new ColumnInfo((byte)coli, col.Name, col.ColumnSize, (byte)offs, (byte)col.Size)); offs += col.Size; int nextOffs = i + 1 >= info.Columns.Count ? info.RowSize : info.Columns[i + 1].Offset; int padding = nextOffs - (col.Offset + col.Size); for (int j = 0; j < padding; j++) { newCols.Add(new ColumnInfo((byte)(coli++ + 1), dnSpy_AsmEditor_Resources.Padding, ColumnSize.Byte, (byte)offs, 1)); offs++; } } return new TableInfo(info.Table, info.Name, newCols.ToArray(), offs); } public override void OnBufferChanged(NormalizedHexChangeCollection changes) { foreach (var change in changes) { if (!change.OldSpan.OverlapsWith(Span)) continue; var start = HexPosition.Max(Span.Start, change.OldSpan.Start); var end = HexPosition.Min(Span.End, change.OldSpan.End); int i = (int)((start - Span.Start).ToUInt64() / (ulong)TableInfo.RowSize); int endi = (int)((end - 1 - Span.Start).ToUInt64() / (ulong)TableInfo.RowSize); Debug.Assert(0 <= i && i <= endi && endi < Collection.Count); while (i <= endi) { var obj = Collection.TryGet(i); if (obj is not null) obj.OnBufferChanged(changes); i++; } } } public MetadataTableRecordVM Get(int index) => Collection[index]; public MetadataTableRecordVM? TryGet(int index) => Collection.TryGet(index); public string ReadStringsHeap(uint offset, uint maxLen = 0x200) { if (offset == 0) return string.Empty; var offs = stringsHeapSpan.Start + offset; var bytes = new List(); bool tooLongString = false; while (offs < stringsHeapSpan.End) { int b = buffer.TryReadByte(offs); if (b <= 0) break; if (bytes.Count >= maxLen) { tooLongString = true; break; } bytes.Add((byte)b); offs++; } var s = Encoding.UTF8.GetString(bytes.ToArray()); return tooLongString ? s + "..." : s; } public Guid? ReadGuidHeap(uint index) { if (index == 0) return null; var offs = guidHeapSpan.Start + (index - 1) * 16; var bytes = new byte[16]; int i = 0; while (offs < guidHeapSpan.End) { int b = buffer.TryReadByte(offs); if (b < 0) break; bytes[i++] = (byte)b; offs++; if (i == 16) return new Guid(bytes); } return null; } } abstract class MetadataTable1VM : MetadataTableVM { public MetadataTable1VM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } abstract class MetadataTable2VM : MetadataTableVM { public MetadataTable2VM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } abstract class MetadataTable3VM : MetadataTableVM { public MetadataTable3VM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } abstract class MetadataTable4VM : MetadataTableVM { public MetadataTable4VM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } abstract class MetadataTable5VM : MetadataTableVM { public MetadataTable5VM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } abstract class MetadataTable6VM : MetadataTableVM { public MetadataTable6VM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } abstract class MetadataTable9VM : MetadataTableVM { public MetadataTable9VM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } abstract class MetadataTable1InfoVM : MetadataTable1VM { public override bool HasInfo => true; public MetadataTable1InfoVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } abstract class MetadataTable2InfoVM : MetadataTable2VM { public override bool HasInfo => true; public MetadataTable2InfoVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } abstract class MetadataTable3InfoVM : MetadataTable3VM { public override bool HasInfo => true; public MetadataTable3InfoVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } abstract class MetadataTable4InfoVM : MetadataTable4VM { public override bool HasInfo => true; public MetadataTable4InfoVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } abstract class MetadataTable5InfoVM : MetadataTable5VM { public override bool HasInfo => true; public MetadataTable5InfoVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } abstract class MetadataTable6InfoVM : MetadataTable6VM { public override bool HasInfo => true; public MetadataTable6InfoVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } abstract class MetadataTable9InfoVM : MetadataTable9VM { public override bool HasInfo => true; public MetadataTable9InfoVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class ModuleMetadataTableVM : MetadataTable5InfoVM { public ModuleMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class TypeRefMetadataTableVM : MetadataTable3InfoVM { public TypeRefMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class TypeDefMetadataTableVM : MetadataTable6InfoVM { public TypeDefMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class FieldPtrMetadataTableVM : MetadataTable1VM { public FieldPtrMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class FieldMetadataTableVM : MetadataTable3InfoVM { public FieldMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class MethodPtrMetadataTableVM : MetadataTable1VM { public MethodPtrMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class MethodMetadataTableVM : MetadataTable6InfoVM { public MethodMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class ParamPtrMetadataTableVM : MetadataTable1VM { public ParamPtrMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class ParamMetadataTableVM : MetadataTable3InfoVM { public ParamMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class InterfaceImplMetadataTableVM : MetadataTable2VM { public InterfaceImplMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class MemberRefMetadataTableVM : MetadataTable3InfoVM { public MemberRefMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class ConstantMetadataTableVM : MetadataTable4VM { public ConstantMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class CustomAttributeMetadataTableVM : MetadataTable3VM { public CustomAttributeMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class FieldMarshalMetadataTableVM : MetadataTable2VM { public FieldMarshalMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class DeclSecurityMetadataTableVM : MetadataTable3VM { public DeclSecurityMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class ClassLayoutMetadataTableVM : MetadataTable3VM { public ClassLayoutMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class FieldLayoutMetadataTableVM : MetadataTable2VM { public FieldLayoutMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class StandAloneSigMetadataTableVM : MetadataTable1VM { public StandAloneSigMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class EventMapMetadataTableVM : MetadataTable2VM { public EventMapMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class EventPtrMetadataTableVM : MetadataTable1VM { public EventPtrMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class EventMetadataTableVM : MetadataTable3InfoVM { public EventMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class PropertyMapMetadataTableVM : MetadataTable2VM { public PropertyMapMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class PropertyPtrMetadataTableVM : MetadataTable1VM { public PropertyPtrMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class PropertyMetadataTableVM : MetadataTable3InfoVM { public PropertyMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class MethodSemanticsMetadataTableVM : MetadataTable3VM { public MethodSemanticsMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class MethodImplMetadataTableVM : MetadataTable3VM { public MethodImplMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class ModuleRefMetadataTableVM : MetadataTable1InfoVM { public ModuleRefMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class TypeSpecMetadataTableVM : MetadataTable1VM { public TypeSpecMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class ImplMapMetadataTableVM : MetadataTable4InfoVM { public ImplMapMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class FieldRVAMetadataTableVM : MetadataTable2VM { public FieldRVAMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class ENCLogMetadataTableVM : MetadataTable2VM { public ENCLogMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class ENCMapMetadataTableVM : MetadataTable1VM { public ENCMapMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class AssemblyMetadataTableVM : MetadataTable9InfoVM { public AssemblyMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class AssemblyProcessorMetadataTableVM : MetadataTable1VM { public AssemblyProcessorMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class AssemblyOSMetadataTableVM : MetadataTable3VM { public AssemblyOSMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class AssemblyRefMetadataTableVM : MetadataTable9InfoVM { public AssemblyRefMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class AssemblyRefProcessorMetadataTableVM : MetadataTable2VM { public AssemblyRefProcessorMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class AssemblyRefOSMetadataTableVM : MetadataTable4VM { public AssemblyRefOSMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class FileMetadataTableVM : MetadataTable3InfoVM { public FileMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class ExportedTypeMetadataTableVM : MetadataTable5InfoVM { public ExportedTypeMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class ManifestResourceMetadataTableVM : MetadataTable4InfoVM { public ManifestResourceMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class NestedClassMetadataTableVM : MetadataTable2VM { public NestedClassMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class GenericParamMetadataTableV11VM : MetadataTable5InfoVM { public GenericParamMetadataTableV11VM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class GenericParamMetadataTableVM : MetadataTable4InfoVM { public GenericParamMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class MethodSpecMetadataTableVM : MetadataTable2VM { public MethodSpecMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class GenericParamConstraintMetadataTableVM : MetadataTable2VM { public GenericParamConstraintMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class DocumentMetadataTableVM : MetadataTable4VM { public DocumentMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class MethodDebugInformationMetadataTableVM : MetadataTable2VM { public MethodDebugInformationMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class LocalScopeMetadataTableVM : MetadataTable6VM { public LocalScopeMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class LocalVariableMetadataTableVM : MetadataTable3VM { public LocalVariableMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class LocalConstantMetadataTableVM : MetadataTable2VM { public LocalConstantMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class ImportScopeMetadataTableVM : MetadataTable2VM { public ImportScopeMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class StateMachineMethodMetadataTableVM : MetadataTable2VM { public StateMachineMethodMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } sealed class CustomDebugInformationMetadataTableVM : MetadataTable3VM { public CustomDebugInformationMetadataTableVM(HexBuffer buffer, TablesStreamVM tablesStream, MDTable mdTable, HexSpan stringsHeapSpan, HexSpan guidHeapSpan) : base(buffer, tablesStream, mdTable, stringsHeapSpan, guidHeapSpan) { } } }