ResourceInfo[] CreateResourceInfos(HexBufferFile file, MDTable resourceTable, StringsHeap stringsHeap)
        {
            if (resourceTable == null)
            {
                return(Array.Empty <ResourceInfo>());
            }
            var list = new List <ResourceInfo>((int)resourceTable.Rows);

            var recordPos = resourceTable.Span.Start;
            var buffer    = file.Buffer;

            for (uint rid = 1; rid <= resourceTable.Rows; rid++, recordPos += resourceTable.RowSize)
            {
                uint offset     = buffer.ReadUInt32(recordPos);
                uint nameOffset = resourceTable.TableInfo.Columns[2].Size == 2 ?
                                  buffer.ReadUInt16(recordPos + 8) :
                                  buffer.ReadUInt32(recordPos + 8);
                uint implementation = resourceTable.TableInfo.Columns[3].Size == 2 ?
                                      buffer.ReadUInt16(recordPos + resourceTable.RowSize - 2) :
                                      buffer.ReadUInt32(recordPos + resourceTable.RowSize - 4);

                MDToken implementationToken;
                if (!CodedToken.Implementation.Decode(implementation, out implementationToken))
                {
                    continue;
                }
                if (implementationToken.Rid != 0)
                {
                    continue;
                }

                var resourceSpan = GetResourceSpan(file.Buffer, offset);
                if (resourceSpan == null)
                {
                    continue;
                }

                var token        = new MDToken(Table.ManifestResource, rid);
                var filteredName = NameUtils.FilterName(stringsHeap?.Read(nameOffset) ?? string.Empty);
                list.Add(new ResourceInfo(token.Raw, resourceSpan.Value, filteredName));
            }

            list.Sort(ResourceInfoComparer.Instance);
            return(list.ToArray());
        }
示例#2
0
        DotNetMultiFileResourcesImpl(HexBufferFile file, Bit7String?resourceTypeSpan, Bit7String?resourceSetTypeSpan, HexPosition versionPosition, HexSpan paddingSpan, Bit7String[] typeNames, int numResources, HexPosition dataSectionPosition, HexPosition nameSectionPosition)
            : base(file)
        {
            DataSectionPosition = dataSectionPosition;
            var headerSpan = new HexBufferSpan(file.Buffer, HexSpan.FromBounds(file.Span.Start, nameSectionPosition));

            Header = new DotNetMultiFileResourceHeaderDataImpl(headerSpan, resourceTypeSpan, resourceSetTypeSpan, versionPosition, paddingSpan, typeNames, numResources);
            ResourceInfo[] resourceInfos;
            dataArray = CreateDataArray(typeNames, numResources, paddingSpan.End, dataSectionPosition, nameSectionPosition, out resourceInfos);

            var files = new List <BufferFileOptions>(resourceInfos.Length);

            foreach (var info in resourceInfos)
            {
                var data = info.ResData;
                if (data == null)
                {
                    continue;
                }
                if (data.NestedFileData.IsEmpty)
                {
                    continue;
                }
                if (!IsNestedFile(data.TypeCode))
                {
                    continue;
                }
                var name         = Encoding.Unicode.GetString(File.Buffer.ReadBytes(info.UnicodeName.StringSpan));
                var filteredName = NameUtils.FilterName(name);
                var tags         = data.TypeCode >= ResourceTypeCode.UserTypes ? tagsSerialized : tagsNonSerialized;
                files.Add(new BufferFileOptions(data.NestedFileData, filteredName, string.Empty, tags));
            }
            if (files.Count > 0)
            {
                File.CreateFiles(files.ToArray());
            }
        }