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); }
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); }
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); }
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)); } } }
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); } } }
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); } } }
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); } }
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); }