/// <summary>
        /// Reads a .NET directory from an input stream.
        /// </summary>
        /// <param name="peFile">The PE file containing the .NET directory.</param>
        /// <param name="reader">The input stream.</param>
        /// <param name="metadataStreamReader"></param>
        /// <exception cref="ArgumentNullException">Occurs when any of the arguments are <c>null</c>.</exception>
        public SerializedDotNetDirectory(IPEFile peFile, IBinaryStreamReader reader,
                                         IMetadataStreamReader metadataStreamReader)
        {
            if (reader == null)
            {
                throw new ArgumentNullException(nameof(reader));
            }
            _peFile = peFile ?? throw new ArgumentNullException(nameof(peFile));
            _metadataStreamReader = metadataStreamReader;

            Offset = reader.Offset;

            uint cb = reader.ReadUInt32();

            MajorRuntimeVersion = reader.ReadUInt16();
            MinorRuntimeVersion = reader.ReadUInt16();
            _metadataDirectory  = DataDirectory.FromReader(reader);
            Flags                  = (DotNetDirectoryFlags)reader.ReadUInt32();
            Entrypoint             = reader.ReadUInt32();
            _resourcesDirectory    = DataDirectory.FromReader(reader);
            _strongNameDirectory   = DataDirectory.FromReader(reader);
            _codeManagerDirectory  = DataDirectory.FromReader(reader);
            _vtableFixupsDirectory = DataDirectory.FromReader(reader);
            _exportsDirectory      = DataDirectory.FromReader(reader);
            _nativeHeaderDirectory = DataDirectory.FromReader(reader);
        }
예제 #2
0
 /// <summary>
 /// Prepares a new lazy-initialized metadata stream list.
 /// </summary>
 /// <param name="metadataReader">The input stream containing the metadata directory.</param>
 /// <param name="reader">The input stream containing the metadata stream entries.</param>
 /// <param name="numberOfStreams">The number of streams.</param>
 /// <param name="metadataStreamReader"></param>
 public MetadataStreamList(IBinaryStreamReader metadataReader, IBinaryStreamReader reader, int numberOfStreams,
                           IMetadataStreamReader metadataStreamReader)
 {
     _metadataReader       = metadataReader ?? throw new ArgumentNullException(nameof(metadataReader));
     _entriesReader        = reader ?? throw new ArgumentNullException(nameof(reader));
     _numberOfStreams      = numberOfStreams;
     _metadataStreamReader = metadataStreamReader;
 }
예제 #3
0
        /// <summary>
        /// Reads a metadata directory from an input stream.
        /// </summary>
        /// <param name="reader">The input stream.</param>
        /// <param name="metadataStreamReader"></param>
        /// <exception cref="ArgumentNullException">Occurs when any of the arguments are <c>null</c>.</exception>
        /// <exception cref="NotSupportedException">Occurs when an unsupported metadata directory format was encountered.</exception>
        /// <exception cref="BadImageFormatException">Occurs when the metadata directory header is invalid.</exception>
        public SerializedMetadata(IBinaryStreamReader reader, IMetadataStreamReader metadataStreamReader)
        {
            if (reader == null)
            {
                throw new ArgumentNullException(nameof(reader));
            }
            _metadataStreamReader = metadataStreamReader;

            _streamContentsReader = reader.Fork();

            var signature = (MetadataSignature)reader.ReadUInt32();

            switch (signature)
            {
            case MetadataSignature.Bsjb:
                // BSJB header is the default header.
                break;

            case MetadataSignature.Moc:
                throw new NotSupportedException("Old +MOC metadata header format is not supported.");

            default:
                throw new BadImageFormatException($"Invalid metadata header ({(uint) signature:X8}).");
            }

            MajorVersion = reader.ReadUInt16();
            MinorVersion = reader.ReadUInt16();
            Reserved     = reader.ReadUInt32();

            int versionLength = reader.ReadInt32();

            if (!reader.CanRead(versionLength))
            {
                throw new BadImageFormatException($"Invalid version length in metadata header ({versionLength} characters).");
            }

            var versionBytes = new byte[versionLength];

            reader.ReadBytes(versionBytes, 0, versionBytes.Length);
            VersionString = Encoding.ASCII.GetString(versionBytes);

            Flags                = reader.ReadUInt16();
            _numberOfStreams     = reader.ReadInt16();
            _streamEntriesReader = reader.Fork();
        }
예제 #4
0
 public KoiVmAwareStreamReader(ISegmentReferenceResolver referenceResolver, string koiStreamName, ILogger logger)
 {
     KoiStreamName = koiStreamName ?? throw new ArgumentNullException(nameof(koiStreamName));
     Logger        = logger;
     _reader       = new DefaultMetadataStreamReader(referenceResolver);
 }
예제 #5
0
 public KoiVmAwareStreamReader(string koiStreamName, ILogger logger)
 {
     KoiStreamName = koiStreamName ?? throw new ArgumentNullException(nameof(koiStreamName));
     Logger        = logger;
     _reader       = new DefaultMetadataStreamReader();
 }