/// <summary>
 ///     Constructor
 /// </summary>
 /// <param name="imageStream">Heap stream</param>
 /// <param name="streamHeader">Stream header info</param>
 /// <param name="fullStream">Stream for the full PE file</param>
 /// <param name="baseOffset">Offset in <paramref name="fullStream" /> where the data starts</param>
 protected HotStream(IImageStream imageStream, StreamHeader streamHeader, IImageStream fullStream, FileOffset baseOffset)
     : base(imageStream, streamHeader)
 {
     this.fullStream = fullStream;
     this.baseOffset = (long)baseOffset;
     endOffset       = (long)baseOffset + imageStream.Length;
 }
Exemple #2
0
		/// <summary>
		/// Creates a <see cref="HotStream"/> instance
		/// </summary>
		/// <param name="version">Hot heap version</param>
		/// <param name="imageStream">Heap stream</param>
		/// <param name="streamHeader">Stream header info</param>
		/// <param name="fullStream">Stream for the full PE file</param>
		/// <param name="baseOffset">Offset in <paramref name="fullStream"/> where the data starts</param>
		/// <returns>A <see cref="HotStream"/> instance or <c>null</c> if <paramref name="version"/>
		/// is invalid</returns>
		public static HotStream Create(HotHeapVersion version, IImageStream imageStream, StreamHeader streamHeader, IImageStream fullStream, FileOffset baseOffset) {
			switch (version) {
			case HotHeapVersion.CLR20: return new HotStreamCLR20(imageStream, streamHeader, fullStream, baseOffset);
			case HotHeapVersion.CLR40: return new HotStreamCLR40(imageStream, streamHeader, fullStream, baseOffset);
			default: return null;
			}
		}
Exemple #3
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="reader">PE file reader pointing to the start of this section</param>
 /// <param name="verify">Verify section</param>
 /// <exception cref="BadImageFormatException">Thrown if verification fails</exception>
 public MetaDataHeader(IImageStream reader, bool verify)
 {
     SetStartOffset(reader);
     //Interaction.MsgBox(reader.Position);
     this.signature = reader.ReadUInt32();
     if (verify && this.signature != 0x424A5342)
     {
         throw new BadImageFormatException("Invalid MetaData header signature");
     }
     this.majorVersion = reader.ReadUInt16();
     this.minorVersion = reader.ReadUInt16();
     if (verify && !((majorVersion == 1 && minorVersion == 1) || (majorVersion == 0 && minorVersion >= 19)))
     {
         throw new BadImageFormatException(string.Format("Unknown MetaData header version: {0}.{1}", majorVersion, minorVersion));
     }
     this.reserved1     = reader.ReadUInt32();
     this.stringLength  = reader.ReadUInt32();
     this.versionString = ReadString(reader, stringLength);
     this.offset2ndPart = reader.FileOffset + reader.Position;
     this.flags         = (StorageFlags)reader.ReadByte();
     this.reserved2     = reader.ReadByte();
     this.streams       = reader.ReadUInt16();
     this.streamHeaders = new StreamHeader[streams];
     for (int i = 0; i < streamHeaders.Count; i++)
     {
         streamHeaders[i] = new StreamHeader(reader, verify);
     }
     SetEndoffset(reader);
 }
Exemple #4
0
 /// <summary>
 ///     Constructor
 /// </summary>
 /// <param name="reader">PE file reader pointing to the start of this section</param>
 /// <param name="verify">Verify section</param>
 /// <exception cref="BadImageFormatException">Thrown if verification fails</exception>
 public MetaDataHeader(IImageStream reader, bool verify)
 {
     SetStartOffset(reader);
     Signature = reader.ReadUInt32();
     if (verify && Signature != 0x424A5342)
     {
         throw new BadImageFormatException("Invalid MetaData header signature");
     }
     MajorVersion = reader.ReadUInt16();
     MinorVersion = reader.ReadUInt16();
     if (verify && !(MajorVersion == 1 && MinorVersion == 1 || MajorVersion == 0 && MinorVersion >= 19))
     {
         throw new BadImageFormatException(string.Format("Unknown MetaData header version: {0}.{1}", MajorVersion, MinorVersion));
     }
     Reserved1           = reader.ReadUInt32();
     StringLength        = reader.ReadUInt32();
     VersionString       = ReadString(reader, StringLength);
     StorageHeaderOffset = reader.FileOffset + reader.Position;
     Flags         = (StorageFlags)reader.ReadByte();
     Reserved2     = reader.ReadByte();
     Streams       = reader.ReadUInt16();
     StreamHeaders = new StreamHeader[Streams];
     for (var i = 0; i < StreamHeaders.Count; i++)
     {
         StreamHeaders[i] = new StreamHeader(reader, verify);
     }
     SetEndoffset(reader);
 }
Exemple #5
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="reader">PE file reader pointing to the start of this section</param>
 /// <param name="runtime">Runtime reader kind</param>
 /// <param name="verify">Verify section</param>
 /// <exception cref="BadImageFormatException">Thrown if verification fails</exception>
 public MetadataHeader(ref DataReader reader, CLRRuntimeReaderKind runtime, bool verify)
 {
     SetStartOffset(ref reader);
     signature = reader.ReadUInt32();
     if (verify && signature != 0x424A5342)
     {
         throw new BadImageFormatException("Invalid metadata header signature");
     }
     majorVersion  = reader.ReadUInt16();
     minorVersion  = reader.ReadUInt16();
     reserved1     = reader.ReadUInt32();
     stringLength  = reader.ReadUInt32();
     versionString = ReadString(ref reader, stringLength, runtime);
     offset2ndPart = (FileOffset)reader.CurrentOffset;
     flags         = (StorageFlags)reader.ReadByte();
     reserved2     = reader.ReadByte();
     streams       = reader.ReadUInt16();
     streamHeaders = new StreamHeader[streams];
     for (int i = 0; i < streamHeaders.Count; i++)
     {
         // Mono doesn't verify all of these so we can't either
         var sh = new StreamHeader(ref reader, throwOnError: false, verify, runtime, out bool failedVerification);
         if (failedVerification || (ulong)sh.Offset + sh.StreamSize > reader.EndOffset)
         {
             sh = new StreamHeader(0, 0, "<invalid>");
         }
         streamHeaders[i] = sh;
     }
     SetEndoffset(ref reader);
 }
Exemple #6
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="mdReaderFactory">Data reader factory</param>
 /// <param name="metadataBaseOffset">Offset of metadata</param>
 /// <param name="streamHeader">The stream header</param>
 protected DotNetStream(DataReaderFactory mdReaderFactory, uint metadataBaseOffset, StreamHeader streamHeader)
 {
     this.mdReaderFactory = mdReaderFactory;
     mdReaderFactory.DataReaderInvalidated += DataReaderFactory_DataReaderInvalidated;
     this.mdReaderFactory    = mdReaderFactory;
     this.metadataBaseOffset = metadataBaseOffset;
     this.streamHeader       = streamHeader;
     RecreateReader(mdReaderFactory, metadataBaseOffset, streamHeader, notifyThisClass: false);
 }
		public StorageStreamNode(HexDocument doc, StreamHeader sh, int streamNumber, DotNetStream knownStream, IMetaData md)
			: base((ulong)sh.StartOffset, (ulong)sh.EndOffset - 1) {
			this.streamNumber = streamNumber;
			this.storageStreamType = GetStorageStreamType(knownStream);
			this.storageStreamVM = new StorageStreamVM(this, doc, StartOffset, (int)(EndOffset - StartOffset + 1 - 8));

			var tblStream = knownStream as TablesStream;
			if (tblStream != null)
				this.newChild = new TablesStreamNode(doc, tblStream, md);
		}
Exemple #8
0
		public StorageStreamNode(HexBuffer buffer, StreamHeader sh, int streamNumber, DotNetStream knownStream, IMetaData md)
			: base(HexSpan.FromBounds((ulong)sh.StartOffset, (ulong)sh.EndOffset)) {
			StreamNumber = streamNumber;
			StorageStreamType = GetStorageStreamType(knownStream);
			storageStreamVM = new StorageStreamVM(buffer, Span.Start, (int)(Span.Length - 8).ToUInt64());

			var tblStream = knownStream as TablesStream;
			if (tblStream != null)
				newChild = new TablesStreamNode(buffer, tblStream, md);
		}
Exemple #9
0
 /// <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)
     {
         if (imageStream != null)
         {
             imageStream.Dispose();
         }
         imageStream  = null;
         streamHeader = null;
     }
 }
Exemple #10
0
 /// <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)
     {
         var mdReaderFactory = this.mdReaderFactory;
         if (mdReaderFactory != null)
         {
             mdReaderFactory.DataReaderInvalidated -= DataReaderFactory_DataReaderInvalidated;
         }
         streamHeader         = null;
         this.mdReaderFactory = null;
     }
 }
Exemple #11
0
 /// <inheritdoc/>
 public PdbStream(IImageStream imageStream, StreamHeader streamHeader)
     : base(imageStream, streamHeader)
 {
     using (var stream = GetClonedImageStream()) {
         Id         = stream.ReadBytes(20);
         EntryPoint = new MDToken(stream.ReadUInt32());
         var tables = stream.ReadUInt64();
         ReferencedTypeSystemTables = tables;
         var rows = new uint[64];
         for (int i = 0; i < rows.Length; i++, tables >>= 1)
         {
             if (((uint)tables & 1) != 0)
             {
                 rows[i] = stream.ReadUInt32();
             }
         }
         TypeSystemTableRows = rows;
     }
 }
Exemple #12
0
        /// <inheritdoc/>
        public PdbStream(DataReaderFactory mdReaderFactory, uint metadataBaseOffset, StreamHeader streamHeader)
            : base(mdReaderFactory, metadataBaseOffset, streamHeader)
        {
            var reader = CreateReader();

            Id         = reader.ReadBytes(20);
            EntryPoint = new MDToken(reader.ReadUInt32());
            var tables = reader.ReadUInt64();

            ReferencedTypeSystemTables = tables;
            var rows = new uint[64];

            for (int i = 0; i < rows.Length; i++, tables >>= 1)
            {
                if (((uint)tables & 1) != 0)
                {
                    rows[i] = reader.ReadUInt32();
                }
            }
            TypeSystemTableRows = rows;
        }
		/// <summary>
		/// Constructor
		/// </summary>
		/// <param name="imageStream">Heap stream</param>
		/// <param name="streamHeader">Stream header info</param>
		/// <param name="fullStream">Stream for the full PE file</param>
		/// <param name="baseOffset">Offset in <paramref name="fullStream"/> where the data starts</param>
		public HotStreamCLR40(IImageStream imageStream, StreamHeader streamHeader, IImageStream fullStream, FileOffset baseOffset)
			: base(imageStream, streamHeader, fullStream, baseOffset) {
		}
Exemple #14
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="imageStream">Stream data</param>
 /// <param name="streamHeader">The stream header</param>
 public DotNetStream(IImageStream imageStream, StreamHeader streamHeader)
 {
     this.imageStream  = imageStream;
     this.streamHeader = streamHeader;
 }
Exemple #15
0
		/// <inheritdoc/>
		public GuidStream(IImageStream imageStream, StreamHeader streamHeader)
			: base(imageStream, streamHeader) {
		}
Exemple #16
0
 /// <inheritdoc/>
 protected HeapStream(DataReaderFactory mdReaderFactory, uint metadataBaseOffset, StreamHeader streamHeader)
     : base(mdReaderFactory, metadataBaseOffset, streamHeader)
 {
 }
Exemple #17
0
		/// <summary>
		/// Constructor
		/// </summary>
		/// <param name="imageStream">Stream data</param>
		/// <param name="streamHeader">The stream header</param>
		public DotNetStream(IImageStream imageStream, StreamHeader streamHeader) {
			this.imageStream = imageStream;
			this.streamHeader = streamHeader;
		}
 /// <summary>
 ///     Constructor
 /// </summary>
 /// <param name="imageStream">Heap stream</param>
 /// <param name="streamHeader">Stream header info</param>
 /// <param name="fullStream">Stream for the full PE file</param>
 /// <param name="baseOffset">Offset in <paramref name="fullStream" /> where the data starts</param>
 public HotStreamCLR40(IImageStream imageStream, StreamHeader streamHeader, IImageStream fullStream, FileOffset baseOffset)
     : base(imageStream, streamHeader, fullStream, baseOffset)
 {
 }
 /// <inheritdoc />
 public StringsStream(IImageStream imageStream, StreamHeader streamHeader)
     : base(imageStream, streamHeader)
 {
 }
Exemple #20
0
		/// <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) {
				var ims = imageStream;
				if (ims != null)
					ims.Dispose();
				imageStream = null;
				streamHeader = null;
			}
		}
		/// <summary>
		/// Constructor
		/// </summary>
		/// <param name="reader">PE file reader pointing to the start of this section</param>
		/// <param name="verify">Verify section</param>
		/// <exception cref="BadImageFormatException">Thrown if verification fails</exception>
		public MetaDataHeader(IImageStream reader, bool verify) {
			SetStartOffset(reader);
			this.signature = reader.ReadUInt32();
			if (verify && this.signature != 0x424A5342)
				throw new BadImageFormatException("Invalid MetaData header signature");
			this.majorVersion = reader.ReadUInt16();
			this.minorVersion = reader.ReadUInt16();
			if (verify && !((majorVersion == 1 && minorVersion == 1) || (majorVersion == 0 && minorVersion >= 19)))
				throw new BadImageFormatException(string.Format("Unknown MetaData header version: {0}.{1}", majorVersion, minorVersion));
			this.reserved1 = reader.ReadUInt32();
			this.stringLength = reader.ReadUInt32();
			this.versionString = ReadString(reader, stringLength);
			this.offset2ndPart = (uint)(reader.Position - startOffset);
			this.flags = (StorageFlags)reader.ReadByte();
			if (verify && this.flags != 0)
				throw new BadImageFormatException(string.Format("Storage flags != 0 ({0})", this.flags));
			this.reserved2 = reader.ReadByte();
			this.streams = reader.ReadUInt16();
			this.streamHeaders = new StreamHeader[streams];
			for (int i = 0; i < streamHeaders.Count; i++)
				streamHeaders[i] = new StreamHeader(reader, verify);
			SetEndoffset(reader);
		}
Exemple #22
0
		/// <summary>
		/// Default constructor
		/// </summary>
		public DotNetStream() {
			this.imageStream = MemoryImageStream.CreateEmpty();
			this.streamHeader = null;
		}
Exemple #23
0
		/// <inheritdoc/>
		protected HeapStream(IImageStream imageStream, StreamHeader streamHeader)
			: base(imageStream, streamHeader) {
		}
Exemple #24
0
 /// <inheritdoc/>
 public BlobStream(DataReaderFactory mdReaderFactory, uint metadataBaseOffset, StreamHeader streamHeader)
     : base(mdReaderFactory, metadataBaseOffset, streamHeader)
 {
 }
		/// <inheritdoc/>
		public StringsStream(IImageStream imageStream, StreamHeader streamHeader)
			: base(imageStream, streamHeader) {
		}
 /// <inheritdoc/>
 public GuidStream(IImageStream imageStream, StreamHeader streamHeader)
     : base(imageStream, streamHeader)
 {
 }
 /// <inheritdoc/>
 public TablesStream(IImageStream imageStream, StreamHeader streamHeader)
     : base(imageStream, streamHeader)
 {
 }
		/// <inheritdoc/>
		public BlobStream(IImageStream imageStream, StreamHeader streamHeader)
			: base(imageStream, streamHeader) {
		}
        /// <summary>
        ///     Creates a <see cref="HotStream" /> instance
        /// </summary>
        /// <param name="version">Hot heap version</param>
        /// <param name="imageStream">Heap stream</param>
        /// <param name="streamHeader">Stream header info</param>
        /// <param name="fullStream">Stream for the full PE file</param>
        /// <param name="baseOffset">Offset in <paramref name="fullStream" /> where the data starts</param>
        /// <returns>
        ///     A <see cref="HotStream" /> instance or <c>null</c> if <paramref name="version" />
        ///     is invalid
        /// </returns>
        public static HotStream Create(HotHeapVersion version, IImageStream imageStream, StreamHeader streamHeader, IImageStream fullStream, FileOffset baseOffset)
        {
            switch (version)
            {
            case HotHeapVersion.CLR20: return(new HotStreamCLR20(imageStream, streamHeader, fullStream, baseOffset));

            case HotHeapVersion.CLR40: return(new HotStreamCLR40(imageStream, streamHeader, fullStream, baseOffset));

            default: return(null);
            }
        }
		/// <inheritdoc/>
		public TablesStream(IImageStream imageStream, StreamHeader streamHeader)
			: base(imageStream, streamHeader) {
		}
		/// <summary>
		/// Constructor
		/// </summary>
		/// <param name="imageStream">Heap stream</param>
		/// <param name="streamHeader">Stream header info</param>
		/// <param name="fullStream">Stream for the full PE file</param>
		/// <param name="baseOffset">Offset in <paramref name="fullStream"/> where the data starts</param>
		protected HotStream(IImageStream imageStream, StreamHeader streamHeader, IImageStream fullStream, FileOffset baseOffset)
			: base(imageStream, streamHeader) {
			this.fullStream = fullStream;
			this.baseOffset = (long)baseOffset;
			this.endOffset = (long)baseOffset + imageStream.Length;
		}
Exemple #32
0
 /// <inheritdoc/>
 protected HeapStream(IImageStream imageStream, StreamHeader streamHeader)
     : base(imageStream, streamHeader)
 {
 }
Exemple #33
0
 void RecreateReader(DataReaderFactory mdReaderFactory, uint metadataBaseOffset, StreamHeader streamHeader, bool notifyThisClass)
 {
     if (mdReaderFactory is null || streamHeader is null)
     {
         dataReader = default;
     }
Exemple #34
0
 /// <summary>
 /// Default constructor
 /// </summary>
 public DotNetStream()
 {
     this.imageStream  = MemoryImageStream.CreateEmpty();
     this.streamHeader = null;
 }
Exemple #35
0
 /// <summary>
 /// Default constructor
 /// </summary>
 protected DotNetStream()
 {
     streamHeader = null;
     dataReader   = default;
 }
Exemple #36
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="mdReaderFactory">Data reader factory</param>
 /// <param name="metadataBaseOffset">Offset of metadata</param>
 /// <param name="streamHeader">The stream header</param>
 public CustomDotNetStream(DataReaderFactory mdReaderFactory, uint metadataBaseOffset, StreamHeader streamHeader)
     : base(mdReaderFactory, metadataBaseOffset, streamHeader)
 {
 }
Exemple #37
0
 void RecreateReader(DataReaderFactory mdReaderFactory, uint metadataBaseOffset, StreamHeader streamHeader, bool notifyThisClass)
 {
     if (mdReaderFactory == null || streamHeader == null)
     {
         dataReader = default;
     }
     else
     {
         dataReader = mdReaderFactory.CreateReader(metadataBaseOffset + streamHeader.Offset, streamHeader.StreamSize);
     }
     if (notifyThisClass)
     {
         OnReaderRecreated();
     }
 }
Exemple #38
0
 /// <inheritdoc/>
 public BlobStream(IImageStream imageStream, StreamHeader streamHeader)
     : base(imageStream, streamHeader)
 {
 }