/// <summary>
        /// Creates a new tables stream based on a segment in a file.
        /// </summary>
        /// <param name="name">The name of the stream.</param>
        /// <param name="contents">The raw contents of the stream.</param>
        /// <param name="referenceResolver">The instance that resolves references to other segments in the file to segments.</param>
        public SerializedTableStream(string name, IReadableSegment contents, ISegmentReferenceResolver referenceResolver)
        {
            Name               = name ?? throw new ArgumentNullException(nameof(name));
            _contents          = contents ?? throw new ArgumentNullException(nameof(contents));
            _referenceResolver = referenceResolver ?? throw new ArgumentNullException(nameof(referenceResolver));

            var reader = contents.CreateReader();

            Reserved       = reader.ReadUInt32();
            MajorVersion   = reader.ReadByte();
            MinorVersion   = reader.ReadByte();
            Flags          = (TablesStreamFlags)reader.ReadByte();
            Log2LargestRid = reader.ReadByte();
            _validMask     = reader.ReadUInt64();
            _sortedMask    = reader.ReadUInt64();

            _rowCounts = ReadRowCounts(reader);

            if (HasExtraData)
            {
                ExtraData = reader.ReadUInt32();
            }

            _headerSize = (uint)(reader.Offset - reader.StartOffset);

            _indexSizes = InitializeIndexSizes();
        }
 private SerializedMetadataTable <TRow> CreateNextTable <TRow>(
     TableIndex index,
     ref ulong offset,
     SerializedMetadataTable <TRow> .ReadRowExtendedDelegate readRow,
     ISegmentReferenceResolver referenceResolver)
     where TRow : struct, IMetadataRow
 {
     return(new SerializedMetadataTable <TRow>(
                CreateNextRawTableReader(index, ref offset), index, TableLayouts[(int)index], readRow, referenceResolver));
 }
Exemple #3
0
 /// <summary>
 /// Creates a new instance of the <see cref="DefaultDebugDataReader"/> class.
 /// </summary>
 /// <param name="resolver">The reference resolver to use to read from.</param>
 public DefaultDebugDataReader(ISegmentReferenceResolver resolver)
 {
     _resolver = resolver;
 }
 /// <summary>
 /// Creates a new instance of the <see cref="DefaultMetadataStreamReader"/> class.
 /// </summary>
 /// <param name="referenceResolver">
 /// The object responsible for resolving references to segments in the original PE file.
 /// </param>
 public DefaultMetadataStreamReader(ISegmentReferenceResolver referenceResolver)
 {
     _referenceResolver = referenceResolver ?? throw new ArgumentNullException(nameof(referenceResolver));
 }
 /// <summary>
 /// Initializes the PE reader parameters.
 /// </summary>
 /// <param name="resolver">
 /// The object responsible for resolving references within the original PE file.
 /// This is usually just the underlying <see cref="PEFile"/> instance.
 /// </param>
 public PEReadParameters(ISegmentReferenceResolver resolver)
 {
     ReferenceResolver    = resolver;
     MetadataStreamReader = new DefaultMetadataStreamReader(resolver);
     DebugDataReader      = new DefaultDebugDataReader(resolver);
 }
 /// <summary>
 /// Creates a new tables stream based on a byte array.
 /// </summary>
 /// <param name="name">The name of the stream.</param>
 /// <param name="rawData">The raw contents of the stream.</param>
 /// <param name="referenceResolver">The instance that resolves references to other segments in the file to segments.</param>
 public SerializedTableStream(string name, byte[] rawData, ISegmentReferenceResolver referenceResolver)
     : this(name, new DataSegment(rawData), referenceResolver)
 {
 }
 /// <summary>
 /// Reads a single method definition row from an input stream.
 /// </summary>
 /// <param name="reader">The input stream.</param>
 /// <param name="layout">The layout of the method definition table.</param>
 /// <param name="referenceResolver">The resolver to use for resolving the virtual address of the method body.</param>
 /// <returns>The row.</returns>
 public static MethodDefinitionRow FromReader(IBinaryStreamReader reader, TableLayout layout, ISegmentReferenceResolver referenceResolver)
 {
     return(new MethodDefinitionRow(
                referenceResolver.GetReferenceToRva(reader.ReadUInt32()),
                (MethodImplAttributes)reader.ReadUInt16(),
                (MethodAttributes)reader.ReadUInt16(),
                reader.ReadIndex((IndexSize)layout.Columns[3].Size),
                reader.ReadIndex((IndexSize)layout.Columns[4].Size),
                reader.ReadIndex((IndexSize)layout.Columns[5].Size)));
 }
Exemple #8
0
 /// <summary>
 /// Reads a single field RVA row from an input stream.
 /// </summary>
 /// <param name="reader">The input stream.</param>
 /// <param name="layout">The layout of the field RVA table.</param>
 /// <param name="referenceResolver"></param>
 /// <returns>The row.</returns>
 public static FieldRvaRow FromReader(IBinaryStreamReader reader, TableLayout layout, ISegmentReferenceResolver referenceResolver)
 {
     return(new FieldRvaRow(
                referenceResolver.GetReferenceToRva(reader.ReadUInt32()),
                reader.ReadIndex((IndexSize)layout.Columns[1].Size)));
 }
Exemple #9
0
 public KoiVmAwareStreamReader(ISegmentReferenceResolver referenceResolver, string koiStreamName, ILogger logger)
 {
     KoiStreamName = koiStreamName ?? throw new ArgumentNullException(nameof(koiStreamName));
     Logger        = logger;
     _reader       = new DefaultMetadataStreamReader(referenceResolver);
 }
Exemple #10
0
 public KoiVmAwareStreamReader(ISegmentReferenceResolver referenceResolver, ILogger logger)
     : this(referenceResolver, "#Koi", logger)
 {
 }
Exemple #11
0
 /// <summary>
 /// Reads a metadata table from an input stream.
 /// </summary>
 /// <param name="reader">The input stream.</param>
 /// <param name="tableIndex">The index of the table.</param>
 /// <param name="originalLayout">The layout of the table.</param>
 /// <param name="readRow">The method to use for reading each row in the table.</param>
 /// <param name="referenceResolver">The instance used to resolve RVAs to segments.</param>
 public SerializedMetadataTable(IBinaryStreamReader reader, TableIndex tableIndex, TableLayout originalLayout,
                                ReadRowExtendedDelegate readRow, ISegmentReferenceResolver referenceResolver)
     : this(reader, tableIndex, originalLayout, (r, l) => readRow(r, l, referenceResolver))
 {
 }