public MetadataEditor(RawModuleBytes moduleData, Metadata metadata) { this.moduleData = moduleData ?? throw new ArgumentNullException(nameof(moduleData)); this.metadata = metadata ?? throw new ArgumentNullException(nameof(metadata)); heaps = new List <MDHeap>(metadata.AllStreams.Count); foreach (var stream in metadata.AllStreams) { switch (stream) { case BlobStream blobStream: heaps.Add(BlobHeap = new BlobMDHeap(this, blobStream)); break; case GuidStream guidStream: heaps.Add(GuidHeap = new GuidMDHeap(this, guidStream)); break; case StringsStream stringsStream: heaps.Add(StringsHeap = new StringsMDHeap(this, stringsStream)); break; case USStream usStream: heaps.Add(USHeap = new USMDHeap(this, usStream)); break; case TablesStream tablesStream: heaps.Add(TablesHeap = new TablesMDHeap(this, tablesStream)); break; default: heaps.Add(new UnknownMDHeap(this, stream)); break; } } if (BlobHeap == null) { heaps.Add(BlobHeap = new BlobMDHeap(this, metadata.BlobStream)); } if (GuidHeap == null) { heaps.Add(GuidHeap = new GuidMDHeap(this, metadata.GuidStream)); } if (StringsHeap == null) { heaps.Add(StringsHeap = new StringsMDHeap(this, metadata.StringsStream)); } if (USHeap == null) { heaps.Add(USHeap = new USMDHeap(this, metadata.USStream)); } if (TablesHeap == null) { throw new InvalidOperationException(); } }
static ulong GetSortedMask(TablesMDHeap tablesHeap, ulong mask) { var ignore = tablesToIgnore; for (int i = 0; i < ignore.Length; i++) { if (ignore[i]) { mask &= ~(1UL << i); } } return(mask); }
public TablesHeapWriter(TablesMDHeap tablesHeap, StringsMDHeap stringsHeap, GuidMDHeap guidHeap, BlobMDHeap blobHeap) { this.tablesHeap = tablesHeap; this.stringsHeap = stringsHeap; this.guidHeap = guidHeap; this.blobHeap = blobHeap; if (stringsHeap.IsBig) { mdStreamFlags |= MDStreamFlags.BigStrings; } if (guidHeap.IsBig) { mdStreamFlags |= MDStreamFlags.BigGUID; } if (blobHeap.IsBig) { mdStreamFlags |= MDStreamFlags.BigBlob; } }
static ulong GetValidMask(TablesMDHeap tablesHeap) { ulong mask = 0; var infos = tablesHeap.TableInfos; for (int i = 0; i < infos.Length; i++) { if (tablesToIgnore[i]) { continue; } var info = infos[i]; if (info != null && !info.IsEmpty) { mask |= 1UL << i; } } return(mask); }