/// <summary> /// Writes a raw row /// </summary> /// <param name="writer">Writer</param> /// <param name="metadata">Metadata</param> /// <param name="table">Table</param> /// <param name="row">Row</param> public static void Write(this BinaryWriter writer, MetaData metadata, IMDTable table, IRawRow row) { if (table.Table == Table.Constant) { var cols = table.TableInfo.Columns; var row2 = (RawConstantRow)row; writer.Write(row2.Type); writer.Write(row2.Padding); cols[1].Write(writer, row2.Parent); cols[2].Write(writer, row2.Value); } else { var cols = table.TableInfo.Columns; var stringsHeap = metadata.StringsHeap; foreach (var col in cols) { if (col.ColumnSize == ColumnSize.Strings) { col.Write(writer, stringsHeap.GetOffset(row.Read(col.Index))); } else { col.Write(writer, row.Read(col.Index)); } } } }
/// <summary> /// Writes a metadata table /// </summary> /// <param name="writer">Writer</param> /// <param name="table">Table</param> public static void Write(this BinaryWriter writer, IMDTable table) { switch (table.Table) { case Table.Module: writer.Write((MDTable<RawModuleRow>)table); break; case Table.TypeRef: writer.Write((MDTable<RawTypeRefRow>)table); break; case Table.TypeDef: writer.Write((MDTable<RawTypeDefRow>)table); break; case Table.FieldPtr: writer.Write((MDTable<RawFieldPtrRow>)table); break; case Table.Field: writer.Write((MDTable<RawFieldRow>)table); break; case Table.MethodPtr: writer.Write((MDTable<RawMethodPtrRow>)table); break; case Table.Method: writer.Write((MDTable<RawMethodRow>)table); break; case Table.ParamPtr: writer.Write((MDTable<RawParamPtrRow>)table); break; case Table.Param: writer.Write((MDTable<RawParamRow>)table); break; case Table.InterfaceImpl: writer.Write((MDTable<RawInterfaceImplRow>)table); break; case Table.MemberRef: writer.Write((MDTable<RawMemberRefRow>)table); break; case Table.Constant: writer.Write((MDTable<RawConstantRow>)table); break; case Table.CustomAttribute: writer.Write((MDTable<RawCustomAttributeRow>)table); break; case Table.FieldMarshal: writer.Write((MDTable<RawFieldMarshalRow>)table); break; case Table.DeclSecurity: writer.Write((MDTable<RawDeclSecurityRow>)table); break; case Table.ClassLayout: writer.Write((MDTable<RawClassLayoutRow>)table); break; case Table.FieldLayout: writer.Write((MDTable<RawFieldLayoutRow>)table); break; case Table.StandAloneSig: writer.Write((MDTable<RawStandAloneSigRow>)table); break; case Table.EventMap: writer.Write((MDTable<RawEventMapRow>)table); break; case Table.EventPtr: writer.Write((MDTable<RawEventPtrRow>)table); break; case Table.Event: writer.Write((MDTable<RawEventRow>)table); break; case Table.PropertyMap: writer.Write((MDTable<RawPropertyMapRow>)table); break; case Table.PropertyPtr: writer.Write((MDTable<RawPropertyPtrRow>)table); break; case Table.Property: writer.Write((MDTable<RawPropertyRow>)table); break; case Table.MethodSemantics: writer.Write((MDTable<RawMethodSemanticsRow>)table); break; case Table.MethodImpl: writer.Write((MDTable<RawMethodImplRow>)table); break; case Table.ModuleRef: writer.Write((MDTable<RawModuleRefRow>)table); break; case Table.TypeSpec: writer.Write((MDTable<RawTypeSpecRow>)table); break; case Table.ImplMap: writer.Write((MDTable<RawImplMapRow>)table); break; case Table.FieldRVA: writer.Write((MDTable<RawFieldRVARow>)table); break; case Table.ENCLog: writer.Write((MDTable<RawENCLogRow>)table); break; case Table.ENCMap: writer.Write((MDTable<RawENCMapRow>)table); break; case Table.Assembly: writer.Write((MDTable<RawAssemblyRow>)table); break; case Table.AssemblyProcessor: writer.Write((MDTable<RawAssemblyProcessorRow>)table); break; case Table.AssemblyOS: writer.Write((MDTable<RawAssemblyOSRow>)table); break; case Table.AssemblyRef: writer.Write((MDTable<RawAssemblyRefRow>)table); break; case Table.AssemblyRefProcessor: writer.Write((MDTable<RawAssemblyRefProcessorRow>)table); break; case Table.AssemblyRefOS: writer.Write((MDTable<RawAssemblyRefOSRow>)table); break; case Table.File: writer.Write((MDTable<RawFileRow>)table); break; case Table.ExportedType: writer.Write((MDTable<RawExportedTypeRow>)table); break; case Table.ManifestResource:writer.Write((MDTable<RawManifestResourceRow>)table); break; case Table.NestedClass: writer.Write((MDTable<RawNestedClassRow>)table); break; case Table.GenericParam: writer.Write((MDTable<RawGenericParamRow>)table); break; case Table.MethodSpec: writer.Write((MDTable<RawMethodSpecRow>)table); break; case Table.GenericParamConstraint: writer.Write((MDTable<RawGenericParamConstraintRow>)table); break; default: var cols = table.TableInfo.Columns; foreach (var row in table.GetRawRows()) { foreach (var col in cols) col.Write(writer, row.Read(col.Index)); } break; } }
/// <summary> /// Writes a raw row /// </summary> /// <param name="writer">Writer</param> /// <param name="table">Table</param> /// <param name="row">Row</param> public static void Write(this BinaryWriter writer, IMDTable table, IRawRow row) { if (table.Table == Table.Constant) { var cols = table.TableInfo.Columns; var row2 = (RawConstantRow)row; writer.Write(row2.Type); writer.Write(row2.Padding); cols[1].Write(writer, row2.Parent); cols[2].Write(writer, row2.Value); } else { var cols = table.TableInfo.Columns; foreach (var col in cols) col.Write(writer, row.Read(col.Index)); } }
/// <summary> /// Constructor /// </summary> /// <param name="version">Hot heap version</param> /// <param name="mdTable">The MD table</param> internal HotTable(HotHeapVersion version, IMDTable mdTable) { this.mdTable = mdTable; this.version = version; switch (version) { case HotHeapVersion.CLR20: hotTableHeaderSize = 0x12; break; case HotHeapVersion.CLR40: hotTableHeaderSize = 0x16; break; default: throw new ArgumentException("Invalid hot heap version"); } this.alignedHotTableHeaderSize = Utils.AlignUp(this.hotTableHeaderSize, HT_ALIGNMENT); }
/// <summary> /// Writes a raw row /// </summary> /// <param name="writer">Writer</param> /// <param name="metadata">Metadata</param> /// <param name="table">Table</param> /// <param name="row">Row</param> public static void Write(this BinaryWriter writer, MetaData metadata, IMDTable table, IRawRow row) { var cols = table.TableInfo.Columns; var stringsHeap = metadata.StringsHeap; foreach (var col in cols) { if (col.ColumnSize == ColumnSize.Strings) { col.Write(writer, stringsHeap.GetOffset(row.Read(col.Index))); } else { col.Write(writer, row.Read(col.Index)); } } }
/// <summary> /// Writes a raw row /// </summary> /// <param name="writer">Writer</param> /// <param name="table">Table</param> /// <param name="row">Row</param> public static void Write(this BinaryWriter writer, IMDTable table, IRawRow row) { if (table.Table == Table.Constant) { var cols = table.TableInfo.Columns; var row2 = (RawConstantRow)row; writer.Write(row2.Type); writer.Write(row2.Padding); cols[1].Write(writer, row2.Parent); cols[2].Write(writer, row2.Value); } else { var cols = table.TableInfo.Columns; foreach (var col in cols) { col.Write(writer, row.Read(col.Index)); } } }
/// <summary> /// Constructor /// </summary> /// <param name="mdTable">The MD table</param> public HotTable40(IMDTable mdTable) : base(HotHeapVersion.CLR40, mdTable) { }
/// <summary> /// Creates a <see cref="HotTable"/> instance /// </summary> /// <param name="mdTable">The MD table</param> public abstract HotTable CreateHotTable(IMDTable mdTable);
/// <inheritdoc/> public override HotTable CreateHotTable(IMDTable mdTable) { return(new HotTable40(metadata, mdTable)); }
/// <summary> /// Writes a metadata table /// </summary> /// <param name="writer">Writer</param> /// <param name="table">Table</param> public static void Write(this BinaryWriter writer, IMDTable table) { switch (table.Table) { case Table.Module: writer.Write((MDTable <RawModuleRow>)table); break; case Table.TypeRef: writer.Write((MDTable <RawTypeRefRow>)table); break; case Table.TypeDef: writer.Write((MDTable <RawTypeDefRow>)table); break; case Table.FieldPtr: writer.Write((MDTable <RawFieldPtrRow>)table); break; case Table.Field: writer.Write((MDTable <RawFieldRow>)table); break; case Table.MethodPtr: writer.Write((MDTable <RawMethodPtrRow>)table); break; case Table.Method: writer.Write((MDTable <RawMethodRow>)table); break; case Table.ParamPtr: writer.Write((MDTable <RawParamPtrRow>)table); break; case Table.Param: writer.Write((MDTable <RawParamRow>)table); break; case Table.InterfaceImpl: writer.Write((MDTable <RawInterfaceImplRow>)table); break; case Table.MemberRef: writer.Write((MDTable <RawMemberRefRow>)table); break; case Table.Constant: writer.Write((MDTable <RawConstantRow>)table); break; case Table.CustomAttribute: writer.Write((MDTable <RawCustomAttributeRow>)table); break; case Table.FieldMarshal: writer.Write((MDTable <RawFieldMarshalRow>)table); break; case Table.DeclSecurity: writer.Write((MDTable <RawDeclSecurityRow>)table); break; case Table.ClassLayout: writer.Write((MDTable <RawClassLayoutRow>)table); break; case Table.FieldLayout: writer.Write((MDTable <RawFieldLayoutRow>)table); break; case Table.StandAloneSig: writer.Write((MDTable <RawStandAloneSigRow>)table); break; case Table.EventMap: writer.Write((MDTable <RawEventMapRow>)table); break; case Table.EventPtr: writer.Write((MDTable <RawEventPtrRow>)table); break; case Table.Event: writer.Write((MDTable <RawEventRow>)table); break; case Table.PropertyMap: writer.Write((MDTable <RawPropertyMapRow>)table); break; case Table.PropertyPtr: writer.Write((MDTable <RawPropertyPtrRow>)table); break; case Table.Property: writer.Write((MDTable <RawPropertyRow>)table); break; case Table.MethodSemantics: writer.Write((MDTable <RawMethodSemanticsRow>)table); break; case Table.MethodImpl: writer.Write((MDTable <RawMethodImplRow>)table); break; case Table.ModuleRef: writer.Write((MDTable <RawModuleRefRow>)table); break; case Table.TypeSpec: writer.Write((MDTable <RawTypeSpecRow>)table); break; case Table.ImplMap: writer.Write((MDTable <RawImplMapRow>)table); break; case Table.FieldRVA: writer.Write((MDTable <RawFieldRVARow>)table); break; case Table.ENCLog: writer.Write((MDTable <RawENCLogRow>)table); break; case Table.ENCMap: writer.Write((MDTable <RawENCMapRow>)table); break; case Table.Assembly: writer.Write((MDTable <RawAssemblyRow>)table); break; case Table.AssemblyProcessor: writer.Write((MDTable <RawAssemblyProcessorRow>)table); break; case Table.AssemblyOS: writer.Write((MDTable <RawAssemblyOSRow>)table); break; case Table.AssemblyRef: writer.Write((MDTable <RawAssemblyRefRow>)table); break; case Table.AssemblyRefProcessor: writer.Write((MDTable <RawAssemblyRefProcessorRow>)table); break; case Table.AssemblyRefOS: writer.Write((MDTable <RawAssemblyRefOSRow>)table); break; case Table.File: writer.Write((MDTable <RawFileRow>)table); break; case Table.ExportedType: writer.Write((MDTable <RawExportedTypeRow>)table); break; case Table.ManifestResource: writer.Write((MDTable <RawManifestResourceRow>)table); break; case Table.NestedClass: writer.Write((MDTable <RawNestedClassRow>)table); break; case Table.GenericParam: writer.Write((MDTable <RawGenericParamRow>)table); break; case Table.MethodSpec: writer.Write((MDTable <RawMethodSpecRow>)table); break; case Table.GenericParamConstraint: writer.Write((MDTable <RawGenericParamConstraintRow>)table); break; default: var cols = table.TableInfo.Columns; foreach (var row in table.GetRawRows()) { foreach (var col in cols) { col.Write(writer, row.Read(col.Index)); } } break; } }
/// <inheritdoc/> public override HotTable CreateHotTable(IMDTable mdTable) { return new HotTable40(mdTable); }
/// <summary> /// Writes a metadata table /// </summary> /// <param name="writer">Writer</param> /// <param name="metadata">Metadata</param> /// <param name="table">Table</param> public static void Write(this BinaryWriter writer, MetaData metadata, IMDTable table) { switch (table.Table) { case Table.Module: writer.Write(metadata, (MDTable <RawModuleRow>)table); break; case Table.TypeRef: writer.Write(metadata, (MDTable <RawTypeRefRow>)table); break; case Table.TypeDef: writer.Write(metadata, (MDTable <RawTypeDefRow>)table); break; case Table.FieldPtr: writer.Write(metadata, (MDTable <RawFieldPtrRow>)table); break; case Table.Field: writer.Write(metadata, (MDTable <RawFieldRow>)table); break; case Table.MethodPtr: writer.Write(metadata, (MDTable <RawMethodPtrRow>)table); break; case Table.Method: writer.Write(metadata, (MDTable <RawMethodRow>)table); break; case Table.ParamPtr: writer.Write(metadata, (MDTable <RawParamPtrRow>)table); break; case Table.Param: writer.Write(metadata, (MDTable <RawParamRow>)table); break; case Table.InterfaceImpl: writer.Write(metadata, (MDTable <RawInterfaceImplRow>)table); break; case Table.MemberRef: writer.Write(metadata, (MDTable <RawMemberRefRow>)table); break; case Table.Constant: writer.Write(metadata, (MDTable <RawConstantRow>)table); break; case Table.CustomAttribute: writer.Write(metadata, (MDTable <RawCustomAttributeRow>)table); break; case Table.FieldMarshal: writer.Write(metadata, (MDTable <RawFieldMarshalRow>)table); break; case Table.DeclSecurity: writer.Write(metadata, (MDTable <RawDeclSecurityRow>)table); break; case Table.ClassLayout: writer.Write(metadata, (MDTable <RawClassLayoutRow>)table); break; case Table.FieldLayout: writer.Write(metadata, (MDTable <RawFieldLayoutRow>)table); break; case Table.StandAloneSig: writer.Write(metadata, (MDTable <RawStandAloneSigRow>)table); break; case Table.EventMap: writer.Write(metadata, (MDTable <RawEventMapRow>)table); break; case Table.EventPtr: writer.Write(metadata, (MDTable <RawEventPtrRow>)table); break; case Table.Event: writer.Write(metadata, (MDTable <RawEventRow>)table); break; case Table.PropertyMap: writer.Write(metadata, (MDTable <RawPropertyMapRow>)table); break; case Table.PropertyPtr: writer.Write(metadata, (MDTable <RawPropertyPtrRow>)table); break; case Table.Property: writer.Write(metadata, (MDTable <RawPropertyRow>)table); break; case Table.MethodSemantics: writer.Write(metadata, (MDTable <RawMethodSemanticsRow>)table); break; case Table.MethodImpl: writer.Write(metadata, (MDTable <RawMethodImplRow>)table); break; case Table.ModuleRef: writer.Write(metadata, (MDTable <RawModuleRefRow>)table); break; case Table.TypeSpec: writer.Write(metadata, (MDTable <RawTypeSpecRow>)table); break; case Table.ImplMap: writer.Write(metadata, (MDTable <RawImplMapRow>)table); break; case Table.FieldRVA: writer.Write(metadata, (MDTable <RawFieldRVARow>)table); break; case Table.ENCLog: writer.Write(metadata, (MDTable <RawENCLogRow>)table); break; case Table.ENCMap: writer.Write(metadata, (MDTable <RawENCMapRow>)table); break; case Table.Assembly: writer.Write(metadata, (MDTable <RawAssemblyRow>)table); break; case Table.AssemblyProcessor: writer.Write(metadata, (MDTable <RawAssemblyProcessorRow>)table); break; case Table.AssemblyOS: writer.Write(metadata, (MDTable <RawAssemblyOSRow>)table); break; case Table.AssemblyRef: writer.Write(metadata, (MDTable <RawAssemblyRefRow>)table); break; case Table.AssemblyRefProcessor: writer.Write(metadata, (MDTable <RawAssemblyRefProcessorRow>)table); break; case Table.AssemblyRefOS: writer.Write(metadata, (MDTable <RawAssemblyRefOSRow>)table); break; case Table.File: writer.Write(metadata, (MDTable <RawFileRow>)table); break; case Table.ExportedType: writer.Write(metadata, (MDTable <RawExportedTypeRow>)table); break; case Table.ManifestResource: writer.Write(metadata, (MDTable <RawManifestResourceRow>)table); break; case Table.NestedClass: writer.Write(metadata, (MDTable <RawNestedClassRow>)table); break; case Table.GenericParam: writer.Write(metadata, (MDTable <RawGenericParamRow>)table); break; case Table.MethodSpec: writer.Write(metadata, (MDTable <RawMethodSpecRow>)table); break; case Table.GenericParamConstraint: writer.Write(metadata, (MDTable <RawGenericParamConstraintRow>)table); break; case Table.Document: writer.Write(metadata, (MDTable <RawDocumentRow>)table); break; case Table.MethodDebugInformation: writer.Write(metadata, (MDTable <RawMethodDebugInformationRow>)table); break; case Table.LocalScope: writer.Write(metadata, (MDTable <RawLocalScopeRow>)table); break; case Table.LocalVariable: writer.Write(metadata, (MDTable <RawLocalVariableRow>)table); break; case Table.LocalConstant: writer.Write(metadata, (MDTable <RawLocalConstantRow>)table); break; case Table.ImportScope: writer.Write(metadata, (MDTable <RawImportScopeRow>)table); break; case Table.StateMachineMethod: writer.Write(metadata, (MDTable <RawStateMachineMethodRow>)table); break; case Table.CustomDebugInformation: writer.Write(metadata, (MDTable <RawCustomDebugInformationRow>)table); break; default: Debug.Fail(string.Format("Unknown table: {0}, add a new method overload", table.Table)); var cols = table.TableInfo.Columns; var stringsHeap = metadata.StringsHeap; foreach (var row in table.GetRawRows()) { foreach (var col in cols) { if (col.ColumnSize == ColumnSize.Strings) { col.Write(writer, stringsHeap.GetOffset(row.Read(col.Index))); } else { col.Write(writer, row.Read(col.Index)); } } } break; } }
/// <inheritdoc/> public override HotTable CreateHotTable(IMDTable mdTable) { return(new HotTable20(mdTable)); }
/// <summary> /// Constructor /// </summary> /// <param name="metadata">Metadata owner</param> /// <param name="mdTable">The MD table</param> public HotTable40(MetaData metadata, IMDTable mdTable) : base(metadata, HotHeapVersion.CLR40, mdTable) { }