Пример #1
0
        void PatchResources()
        {
            ManifestResourceTable resourceTable = (ManifestResourceTable)stripped_tables [ManifestResourceTable.RId];

            if (resourceTable == null)
            {
                return;
            }

            for (int i = 0; i < resourceTable.Rows.Count; i++)
            {
                ManifestResourceRow resourceRow = resourceTable [i];

                if (resourceRow.Implementation.RID != 0)
                {
                    continue;
                }

                foreach (Resource resource in assembly.MainModule.Resources)
                {
                    EmbeddedResource er = resource as EmbeddedResource;
                    if (er == null)
                    {
                        continue;
                    }

                    if (resource.Name != original.MetadataRoot.Streams.StringsHeap [resourceRow.Name])
                    {
                        continue;
                    }

                    resourceRow.Offset = metadata_writer.AddResource(er.Data);
                }
            }
        }
        /// <summary>
        /// Creates a manifest resource from a manifest resource metadata row.
        /// </summary>
        /// <param name="parentModule">The module that contains the resource.</param>
        /// <param name="token">The token to initialize the resource for.</param>
        /// <param name="row">The metadata table row to base the resource \on.</param>
        public SerializedManifestResource(SerializedModuleDefinition parentModule, MetadataToken token, ManifestResourceRow row)
            : base(token)
        {
            _parentModule = parentModule ?? throw new ArgumentNullException(nameof(parentModule));
            _row          = row;

            Attributes = row.Attributes;
            ((IOwnedCollectionElement <ModuleDefinition>) this).Owner = parentModule;
        }
Пример #3
0
 public override void FromRawData(byte [] buff, int offs, int numRows)
 {
     for (int i = numRows; --i >= 0;)
     {
         Row row = new ManifestResourceRow(this);
         row.FromRawData(buff, offs);
         Add(row);
         offs += ManifestResourceRow.LogicalSize;
     }
 }
Пример #4
0
        void AddManifestResource(uint offset, string name, ManifestResourceAttributes flags, MetadataToken impl)
        {
            ManifestResourceTable mrTable = m_tableWriter.GetManifestResourceTable();
            ManifestResourceRow   mrRow   = m_rowWriter.CreateManifestResourceRow(
                offset,
                flags,
                m_mdWriter.AddString(name),
                impl);

            mrTable.Rows.Add(mrRow);
        }
Пример #5
0
        /// <summary>
        /// Reads the specified token.
        /// </summary>
        /// <param name="token">The token.</param>
        /// <param name="result">The result.</param>
        public void Read(TokenTypes token, out ManifestResourceRow result)
        {
            if ((token & TokenTypes.TableMask) != TokenTypes.ManifestResource)
            {
                throw new ArgumentException("Invalid token type for ManifestResourceRow.", "token");
            }

            using (BinaryReader reader = CreateReaderForToken(token))
            {
                result = new ManifestResourceRow(reader.ReadUInt32(), (ManifestResourceAttributes)reader.ReadUInt32(), ReadIndexValue(reader, IndexType.StringHeap), ReadIndexValue(reader, IndexType.Implementation));
            }
        }
Пример #6
0
        public override void VisitResourceCollection(ResourceCollection resources)
        {
            if (!m_tHeap.HasTable(ManifestResourceTable.RId))
            {
                return;
            }

            ManifestResourceTable mrTable = m_tableReader.GetManifestResourceTable();
            FileTable             fTable  = m_tableReader.GetFileTable();

            BinaryReader br;

            for (int i = 0; i < mrTable.Rows.Count; i++)
            {
                ManifestResourceRow mrRow = mrTable [i];
                if (mrRow.Implementation.RID == 0)
                {
                    EmbeddedResource eres = new EmbeddedResource(
                        ReadString(mrRow.Name), mrRow.Flags);

                    br = m_ir.MetadataReader.GetDataReader(
                        m_img.CLIHeader.Resources.VirtualAddress);
                    br.BaseStream.Position += mrRow.Offset;

                    eres.Data = br.ReadBytes(br.ReadInt32());

                    resources.Add(eres);
                    continue;
                }

                switch (mrRow.Implementation.TokenType)
                {
                case TokenType.File:
                    FileRow        fRow = fTable [(int)mrRow.Implementation.RID - 1];
                    LinkedResource lres = new LinkedResource(
                        ReadString(mrRow.Name), mrRow.Flags,
                        ReadString(fRow.Name));
                    lres.Hash = ReadBlob(fRow.HashValue);
                    resources.Add(lres);
                    break;

                case TokenType.AssemblyRef:
                    AssemblyNameReference asm =
                        m_module.AssemblyReferences [(int)mrRow.Implementation.RID - 1];
                    AssemblyLinkedResource alr = new AssemblyLinkedResource(
                        ReadString(mrRow.Name),
                        mrRow.Flags, asm);
                    resources.Add(alr);
                    break;
                }
            }
        }
Пример #7
0
        /// <summary>
        /// Adds a single manifest resource to the buffer.
        /// </summary>
        /// <param name="resource">The resource to add.</param>
        /// <returns>The new metadata token of the resource.</returns>
        public MetadataToken AddManifestResource(ManifestResource resource)
        {
            uint offset = resource.Offset;

            if (resource.IsEmbedded)
            {
                using var stream = new MemoryStream();
                resource.EmbeddedDataSegment.Write(new BinaryStreamWriter(stream));
                offset = Resources.GetResourceDataOffset(stream.ToArray());
            }

            var table = Metadata.TablesStream.GetTable <ManifestResourceRow>(TableIndex.ManifestResource);
            var row   = new ManifestResourceRow(
                offset,
                resource.Attributes,
                Metadata.StringsStream.GetStringIndex(resource.Name),
                AddImplementation(resource.Implementation));

            var token = table.Add(row);

            AddCustomAttributes(token, resource);
            return(token);
        }
Пример #8
0
 public virtual void VisitManifestResourceRow(ManifestResourceRow row)
 {
 }
Пример #9
0
        void IMetadataProvider.Read(TokenTypes token, out ManifestResourceRow result)
        {
            TableHeap theap = (TableHeap)_streams[(int)HeapType.Tables];

            theap.Read(token, out result);
        }
 public virtual void VisitManifestResourceRow(ManifestResourceRow row)
 {
 }