Exemplo n.º 1
0
 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="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, 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);
                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, verify);
                if (verify)
                {
                    foreach (var sh in mdHeader.StreamHeaders)
                    {
                        if ((ulong)sh.Offset + sh.StreamSize > mdHeaderReader.EndOffset)
                        {
                            throw new BadImageFormatException("Invalid stream header");
                        }
                    }
                }

                switch (GetMetadataType(mdHeader.StreamHeaders))
                {
                case MetadataType.Compressed:
                    md = new CompressedMetadata(peImage, cor20Header, mdHeader);
                    break;

                case MetadataType.ENC:
                    md = new ENCMetadata(peImage, cor20Header, mdHeader);
                    break;

                default:
                    throw new BadImageFormatException("No #~ or #- stream found");
                }
                md.Initialize(null);

                return(md);
            }
            catch {
                if (md != null)
                {
                    md.Dispose();
                }
                throw;
            }
        }
Exemplo n.º 3
0
 /// <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 != null)
         {
             peImage.Dispose();
         }
         throw;
     }
 }
Exemplo n.º 4
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)
            {
                return;
            }
            peImage?.Dispose();
            stringsStream?.Dispose();
            usStream?.Dispose();
            blobStream?.Dispose();
            guidStream?.Dispose();
            tablesStream?.Dispose();
            var as2 = allStreams;

            if (as2 != 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;
        }
Exemplo n.º 5
0
 /// <inheritdoc/>
 public ENCMetadata(IPEImage peImage, ImageCor20Header cor20Header, MetadataHeader mdHeader)
     : base(peImage, cor20Header, mdHeader)
 {
 }
 /// <inheritdoc/>
 public CompressedMetadata(IPEImage peImage, ImageCor20Header cor20Header, MetadataHeader mdHeader)
     : base(peImage, cor20Header, mdHeader)
 {
 }