internal MetadataBase(MetadataHeader mdHeader, bool isStandalonePortablePdb) { allStreams = new List <DotNetStream>(); peImage = null; cor20Header = null; this.mdHeader = mdHeader; this.isStandalonePortablePdb = isStandalonePortablePdb; }
/// <summary> /// Create a <see cref="MetadataBase"/> instance /// </summary> /// <param name="peImage">The PE image</param> /// <param name="runtime">Runtime reader kind</param> /// <param name="verify"><c>true</c> if we should verify that it's a .NET PE file</param> /// <returns>A new <see cref="MetadataBase"/> instance</returns> static MetadataBase Create(IPEImage peImage, CLRRuntimeReaderKind runtime, bool verify) { MetadataBase md = null; try { var dotNetDir = peImage.ImageNTHeaders.OptionalHeader.DataDirectories[14]; // Mono doesn't check that the Size field is >= 0x48 if (dotNetDir.VirtualAddress == 0) { throw new BadImageFormatException(".NET data directory RVA is 0"); } var cor20HeaderReader = peImage.CreateReader(dotNetDir.VirtualAddress, 0x48); var cor20Header = new ImageCor20Header(ref cor20HeaderReader, verify && runtime == CLRRuntimeReaderKind.CLR); if (cor20Header.Metadata.VirtualAddress == 0) { throw new BadImageFormatException(".NET metadata RVA is 0"); } var mdRva = cor20Header.Metadata.VirtualAddress; // Don't use the size field, Mono ignores it. Create a reader that can read to EOF. var mdHeaderReader = peImage.CreateReader(mdRva); var mdHeader = new MetadataHeader(ref mdHeaderReader, runtime, verify); if (verify) { foreach (var sh in mdHeader.StreamHeaders) { if ((ulong)sh.Offset + sh.StreamSize > mdHeaderReader.EndOffset) { throw new BadImageFormatException("Invalid stream header"); } } } md = GetMetadataType(mdHeader.StreamHeaders, runtime) switch { MetadataType.Compressed => new CompressedMetadata(peImage, cor20Header, mdHeader, runtime), MetadataType.ENC => new ENCMetadata(peImage, cor20Header, mdHeader, runtime), _ => throw new BadImageFormatException("No #~ or #- stream found"), }; md.Initialize(null); return(md); } catch { if (md is not null) { md.Dispose(); } throw; } }
/// <summary> /// Constructor /// </summary> /// <param name="peImage">The PE image</param> /// <param name="cor20Header">The .NET header</param> /// <param name="mdHeader">The MD header</param> protected MetadataBase(IPEImage peImage, ImageCor20Header cor20Header, MetadataHeader mdHeader) { try { allStreams = new List <DotNetStream>(); this.peImage = peImage; this.cor20Header = cor20Header; this.mdHeader = mdHeader; isStandalonePortablePdb = false; } catch { if (peImage is not null) { peImage.Dispose(); } throw; } }
/// <summary> /// Dispose method /// </summary> /// <param name="disposing"><c>true</c> if called by <see cref="Dispose()"/></param> protected virtual void Dispose(bool disposing) { if (!disposing) { return; } peImage?.Dispose(); stringsStream?.Dispose(); usStream?.Dispose(); blobStream?.Dispose(); guidStream?.Dispose(); tablesStream?.Dispose(); var as2 = allStreams; if (as2 is not null) { foreach (var stream in as2) { stream?.Dispose(); } } mdReaderFactoryToDisposeLater?.Dispose(); peImage = null; cor20Header = null; mdHeader = null; stringsStream = null; usStream = null; blobStream = null; guidStream = null; tablesStream = null; allStreams = null; fieldRidToTypeDefRid = null; methodRidToTypeDefRid = null; typeDefRidToNestedClasses = null; mdReaderFactoryToDisposeLater = null; }
/// <inheritdoc/> public CompressedMetadata(IPEImage peImage, ImageCor20Header cor20Header, MetadataHeader mdHeader, CLRRuntimeReaderKind runtime) : base(peImage, cor20Header, mdHeader) { this.runtime = runtime; }