public void ResourceDirectroyEntryByNameConstructorWorks_Test()
        {
            var resourceDirectroyEntry =
                new ImageResourceDirectoryEntry(new BufferFile(RawStructures.RawResourceDirectoryEntryByName), 2, 2);

            Assert.True(resourceDirectroyEntry.IsNamedEntry);
            Assert.False(resourceDirectroyEntry.IsIdEntry);
            Assert.Equal(0x80332211, resourceDirectroyEntry.Name);
            Assert.Equal((uint)0x55443322, resourceDirectroyEntry.OffsetToData);
        }
Exemple #2
0
 private static void ValidateResourceEntry(ImageResourceDirectoryEntry originalEntry, ImageResourceDirectoryEntry directoryEntry)
 {
     Assert.Equal(originalEntry.Name, directoryEntry.Name);
     Assert.Equal(originalEntry.ResourceType, directoryEntry.ResourceType);
     Assert.Equal(originalEntry.HasData, directoryEntry.HasData);
     if (originalEntry.HasData)
     {
         Assert.Equal(originalEntry.DataEntry.Data, directoryEntry.DataEntry.Data);
     }
     else
     {
         ValidateResourceDirectory(originalEntry.SubDirectory, directoryEntry.SubDirectory);
     }
 }
Exemple #3
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);
        }
Exemple #4
0
        private ImageResourceDirectoryEntry ReadResourceDirectoryEntry(int level)
        {
            var result = new ImageResourceDirectoryEntry()
            {
                Level = level,

                Id           = _reader.ReadUInt32(),
                OffsetToData = _reader.ReadUInt32()
            };

            if (result.IdIsName)
            {
                result.Name = ReadResourceDirectoryString(result.OffsetToName);
            }

            return(result);
        }
Exemple #5
0
        private ImageResourceData ReadResourceData(ulong virtualAddress, ImageResourceDirectoryEntry entry)
        {
            _reader.SetPosition(_baseAddress, entry.OffsetToData);

            var delta = (int)virtualAddress - (int)_baseAddress;

            return(new()
            {
                Id = entry.Id,
                Level = entry.Level,
                Name = entry.Name,

                OffsetToData = (ulong)((int)_reader.ReadUInt32() - delta),
                Size = _reader.ReadUInt32(),
                CodePage = _reader.ReadUInt32(),
                Reserved = _reader.ReadUInt32()
            });
        }