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