示例#1
0
 public void AddResourceDirectory(ImageResourceDirectory directory, int level)
 {
     while (_levelBuilders.Count <= level)
     {
         _levelBuilders.Add(new SimpleFileSegmentBuilder());
         Segments.Add(_levelBuilders[_levelBuilders.Count - 1]);
     }
     _levelBuilders[level].Segments.Add(directory);
     _directories.Add(directory);
 }
示例#2
0
 public static void ValidateResourceDirectory(ImageResourceDirectory original, ImageResourceDirectory directory)
 {
     Assert.Equal(original.Characteristics, directory.Characteristics);
     Assert.Equal(original.TimeDateStamp, directory.TimeDateStamp);
     Assert.Equal(original.IdEntriesCount, directory.IdEntriesCount);
     Assert.Equal(original.NamedEntriesCount, directory.NamedEntriesCount);
     for (int i = 0; i < original.Entries.Count; i++)
     {
         ValidateResourceEntry(original.Entries[i], directory.Entries[i]);
     }
 }
        public void ImageResourceDirectoryConstructorWorks_Test()
        {
            var resourceDirectory = new ImageResourceDirectory(new BufferFile(RawStructures.RawResourceDirectory), 2, 2);

            Assert.Equal((uint)0x33221100, resourceDirectory.Characteristics);
            Assert.Equal((uint)0x77665544, resourceDirectory.TimeDateStamp);
            Assert.Equal((ushort)0x9988, resourceDirectory.MajorVersion);
            Assert.Equal((ushort)0xbbaa, resourceDirectory.MinorVersion);
            Assert.Equal((ushort)0x0001, resourceDirectory.NumberOfNameEntries);
            Assert.Equal((ushort)0x0001, resourceDirectory.NumberOfIdEntries);
            Assert.Equal((uint)0x44332211, resourceDirectory.DirectoryEntries[0].Name);
            Assert.Equal(0x88776655, resourceDirectory.DirectoryEntries[0].OffsetToData);
            Assert.Equal((uint)0x44332222 & 0xFFFF, resourceDirectory.DirectoryEntries[1].ID);
            Assert.Equal(0x88776622, resourceDirectory.DirectoryEntries[1].OffsetToData);
        }
示例#4
0
        internal ImageResourceDirectory ReadResourceDirectory(ulong virtualAddress, int index, ImageResourceDirectoryEntry?entry)
        {
            _reader.SetPosition(_baseAddress, entry?.OffsetToData ?? 0);

            var result = new ImageResourceDirectory()
            {
                Index   = index,
                Id      = entry?.Id ?? 0,
                Level   = entry?.Level ?? 0,
                HasName = entry?.IdIsName ?? true,
                Name    = entry?.Name ?? "<root>",

                Characteristics      = _reader.ReadUInt32(),
                TimeDateStamp        = _reader.ReadUInt32(),
                MajorVersion         = _reader.ReadUInt16(),
                MinorVersion         = _reader.ReadUInt16(),
                NumberOfNamedEntries = _reader.ReadUInt16(),
                NumberOfIdEntries    = _reader.ReadUInt16()
            };
            var totalEntries = result.NumberOfIdEntries + result.NumberOfNamedEntries;

            var entries = new ImageResourceDirectoryEntry[totalEntries];

            for (var i = 0; i < entries.Length; i++)
            {
                entries[i] = ReadResourceDirectoryEntry(result.Level + 1);
            }

            var dirEntries  = new List <ImageResourceDirectory>();
            var dataEntries = new List <ImageResourceData>();

            var idx = 0;

            foreach (var dir in entries.Where(e => e.IsDirectory))
            {
                dirEntries.Add(ReadResourceDirectory(virtualAddress, idx++, dir));
            }

            foreach (var data in entries.Where(e => e.IsData))
            {
                dataEntries.Add(ReadResourceData(virtualAddress, data));
            }

            result.Directories = dirEntries.ToImmutableArray();
            result.Data        = dataEntries.ToImmutableArray();

            return(result);
        }
示例#5
0
            private void UpdateReferences(ImageResourceDirectory directory)
            {
                long resourcesFileOffset = StartOffset;

                foreach (var entry in directory.Entries)
                {
                    if (entry.HasData)
                    {
                        entry.OffsetToData = (uint)(entry.DataEntry.StartOffset - resourcesFileOffset);
                    }
                    else
                    {
                        entry.OffsetToData = (uint)((entry.SubDirectory.StartOffset - resourcesFileOffset) | (1 << 31));
                    }
                }
            }
示例#6
0
            private void UpdateReferences(ImageResourceDirectory directory)
            {
                var resourcesFileOffset = _offsetConverter.RvaToFileOffset(_resourceDirectory.VirtualAddress);

                foreach (var entry in directory.Entries)
                {
                    if (entry.HasData)
                    {
                        entry.OffsetToData = (uint)(entry.DataEntry.StartOffset - resourcesFileOffset);
                    }
                    else
                    {
                        entry.OffsetToData = (uint)((entry.SubDirectory.StartOffset - resourcesFileOffset) | (1 << 31));
                    }
                }
            }
 private void AddDirectory(ImageResourceDirectory directory, int level)
 {
     // TODO: add entry names
     _directoryTablesBuilder.AddResourceDirectory(directory, level);
     foreach (var entry in directory.Entries)
     {
         if (entry.HasData)
         {
             _dataDirectoryTableBuilder.AddDataEntry(entry.DataEntry);
             _dataTableBuilder.GetDataSegment(entry.DataEntry);
         }
         else
         {
             AddDirectory(entry.SubDirectory, level + 1);
         }
     }
 }
示例#8
0
 public void AddDirectory(ImageResourceDirectory directory, int level)
 {
     // TODO: add entry names
     DirectoryTable.AddResourceDirectory(directory, level);
     foreach (var entry in directory.Entries)
     {
         if (entry.HasData)
         {
             DataDirectoryTable.AddDataEntry(entry.DataEntry);
             DataTable.GetDataSegment(entry.DataEntry);
         }
         else
         {
             AddDirectory(entry.SubDirectory, level + 1);
         }
     }
 }
示例#9
0
 private void AddDirectory(ImageResourceDirectory directory, int level)
 {
     // TODO: add entry names
     _directoryTablesBuilder.AddResourceDirectory(directory, level);
     foreach (var entry in directory.Entries)
     {
         if (entry.HasData)
         {
             _dataDirectoryTableBuilder.AddDataEntry(entry.DataEntry);
             _dataTableBuilder.GetDataSegment(entry.DataEntry);
         }
         else
         {
             AddDirectory(entry.SubDirectory, level + 1);
         }
     }
 }
        public ResourceDirectoryBuilder(NetAssemblyBuilder builder, IOffsetConverter offsetConverter, ImageResourceDirectory rootDirectory)
        {
            if (builder == null)
                throw new ArgumentNullException("builder");
            if (offsetConverter == null)
                throw new ArgumentNullException("offsetConverter");
            if (rootDirectory == null)
                throw new ArgumentNullException("rootDirectory");

            _offsetConverter = offsetConverter;
            _rootDirectory = rootDirectory;

            _resourceDirectory = builder.Assembly.NtHeaders.OptionalHeader.DataDirectories[ImageDataDirectory.ResourceDirectoryIndex];

            Segments.Add(_directoryTablesBuilder = new DirectoryTablesBuilder(_resourceDirectory, offsetConverter));
            Segments.Add(_dataDirectoryTableBuilder = new DataDirectoryTablesBuilder(_dataTableBuilder, offsetConverter));
            Segments.Add(_dataTableBuilder);
        }
        public void PersistentNativeResources()
        {
            var contents = new byte[] { 0, 1, 2, 3, 4, 5, 6 };

            var assembly = CreateTempAssembly();

            assembly.NetDirectory.MetadataHeader.UnlockMetadata();

            var rootDirectory = new ImageResourceDirectory();

            rootDirectory.Entries.Add(new ImageResourceDirectoryEntry
            {
                ResourceType = ImageResourceDirectoryType.VersionInfo,
                SubDirectory = new ImageResourceDirectory
                {
                    Entries =
                    {
                        new ImageResourceDirectoryEntry(1)
                        {
                            SubDirectory = new ImageResourceDirectory
                            {
                                Entries =
                                {
                                    new ImageResourceDirectoryEntry
                                    {
                                        DataEntry = new ImageResourceDataEntry(contents)
                                    }
                                }
                            }
                        }
                    }
                }
            });

            assembly.RootResourceDirectory = rootDirectory;

            using (var stream = new MemoryStream())
            {
                assembly.Write(new BinaryStreamWriter(stream), new CompactNetAssemblyBuilder(assembly));
                assembly = WindowsAssembly.FromBytes(stream.ToArray());

                Utilities.ValidateResourceDirectory(rootDirectory, assembly.RootResourceDirectory);
            }
        }
示例#12
0
        public ResourceDirectoryBuilder(NetAssemblyBuilder builder, IOffsetConverter offsetConverter, ImageResourceDirectory rootDirectory)
        {
            if (builder == null)
            {
                throw new ArgumentNullException("builder");
            }
            if (offsetConverter == null)
            {
                throw new ArgumentNullException("offsetConverter");
            }
            if (rootDirectory == null)
            {
                throw new ArgumentNullException("rootDirectory");
            }

            _offsetConverter = offsetConverter;
            _rootDirectory   = rootDirectory;

            _resourceDirectory = builder.Assembly.NtHeaders.OptionalHeader.DataDirectories[ImageDataDirectory.ResourceDirectoryIndex];

            Segments.Add(_directoryTablesBuilder    = new DirectoryTablesBuilder(_resourceDirectory, offsetConverter));
            Segments.Add(_dataDirectoryTableBuilder = new DataDirectoryTablesBuilder(_dataTableBuilder, offsetConverter));
            Segments.Add(_dataTableBuilder);
        }
 private void UpdateReferences(ImageResourceDirectory directory)
 {
     var resourcesFileOffset = _offsetConverter.RvaToFileOffset(_resourceDirectory.VirtualAddress);
     foreach (var entry in directory.Entries)
     {
         if (entry.HasData)
             entry.OffsetToData = (uint)(entry.DataEntry.StartOffset - resourcesFileOffset);
         else
             entry.OffsetToData = (uint)((entry.SubDirectory.StartOffset - resourcesFileOffset) | (1 << 31));
     }
 }
 public void AddResourceDirectory(ImageResourceDirectory directory, int level)
 {
     while (_levelBuilders.Count <= level)
     {
         _levelBuilders.Add(new FileSegmentBuilder());
         Segments.Add(_levelBuilders[_levelBuilders.Count - 1]);
     }
     _levelBuilders[level].Segments.Add(directory);
     _directories.Add(directory);
 }