static Guid?GetGuid(GUIDHeap heap, ColumnInfo column, HexPosition position) { if (heap == null) { return(null); } uint index = column.Size == 2 ? heap.Span.Buffer.ReadUInt16(position) : heap.Span.Buffer.ReadUInt32(position); return(heap.Read(index)); }
void WriteGUIDToken(int col, MetadataTable tbl, MetadataWriter wtr, uint[] lens, object val) { GUIDHeap gh = wtr.BaseStream.Root[MetadataStreamType.GUID].Heap as GUIDHeap; if (gh.Stream.Length > ushort.MaxValue) { wtr.Write((uint)(val as GUIDToken).Token.Value); } else { wtr.Write((ushort)(val as GUIDToken).Token.Value); } }
static object ReadGUIDToken(int col, MetadataTable tbl, MetadataReader rdr, uint[] lens) { if (rdr.BaseStream.Root[MetadataStreamType.GUID] == null) { rdr.ReadUInt16(); return(GUIDToken.Null); } GUIDHeap gh = rdr.BaseStream.Root[MetadataStreamType.GUID].Heap as GUIDHeap; uint tkn; if (gh.Stream.Length > ushort.MaxValue) { tkn = rdr.ReadUInt32(); } else { tkn = rdr.ReadUInt16(); } return(gh.Resolve(new MetadataToken(tkn))); }
internal GUIDToken(GUIDHeap h) : base(h) { }
DotNetHeap[] CreateCompressedHeaps() { var list = new List <DotNetHeap>(); StringsHeap stringsHeap = null; USHeap usHeap = null; BlobHeap blobHeap = null; GUIDHeap guidHeap = null; TablesHeap tablesHeap = null; PdbHeap pdbHeap = null; for (int i = storageStreamHeaders.Length - 1; i >= 0; i--) { var ssh = storageStreamHeaders[i]; var span = new HexBufferSpan(file.Buffer, ssh.DataSpan); switch (ssh.Name) { case "#Strings": if (stringsHeap == null) { stringsHeap = new StringsHeapImpl(span); list.Add(stringsHeap); continue; } break; case "#US": if (usHeap == null) { usHeap = new USHeapImpl(span); list.Add(usHeap); continue; } break; case "#Blob": if (blobHeap == null) { blobHeap = new BlobHeapImpl(span); list.Add(blobHeap); continue; } break; case "#GUID": if (guidHeap == null) { guidHeap = new GUIDHeapImpl(span); list.Add(guidHeap); continue; } break; case "#~": if (tablesHeap == null && span.Length >= TablesHeapImpl.MinimumSize) { tablesHeap = new TablesHeapImpl(span, TablesHeapType.Compressed); list.Add(tablesHeap); continue; } break; case "#!": list.Add(new HotHeapImpl(span)); continue; case "#Pdb": if (pdbHeap == null && span.Length >= PdbHeapImpl.MinimumSize) { pdbHeap = new PdbHeapImpl(span); list.Add(pdbHeap); continue; } break; } list.Add(new UnknownHeapImpl(span)); } list.Reverse(); return(list.ToArray()); }
DotNetHeap[] CreateENCHeaps() { var list = new List <DotNetHeap>(); StringsHeap stringsHeap = null; USHeap usHeap = null; BlobHeap blobHeap = null; GUIDHeap guidHeap = null; TablesHeap tablesHeap = null; foreach (var ssh in storageStreamHeaders) { var span = new HexBufferSpan(file.Buffer, ssh.DataSpan); switch (ssh.Name.ToUpperInvariant()) { case "#STRINGS": if (stringsHeap == null) { stringsHeap = new StringsHeapImpl(span); list.Add(stringsHeap); continue; } break; case "#US": if (usHeap == null) { usHeap = new USHeapImpl(span); list.Add(usHeap); continue; } break; case "#BLOB": if (blobHeap == null) { blobHeap = new BlobHeapImpl(span); list.Add(blobHeap); continue; } break; case "#GUID": if (guidHeap == null) { guidHeap = new GUIDHeapImpl(span); list.Add(guidHeap); continue; } break; case "#~": // Only if #Schema is used case "#-": if (tablesHeap == null && span.Length >= TablesHeapImpl.MinimumSize) { tablesHeap = new TablesHeapImpl(span, TablesHeapType.ENC); list.Add(tablesHeap); continue; } break; } list.Add(new UnknownHeapImpl(span)); } return(list.ToArray()); }
internal MetadataRow(MetadataTable tbl, bool needInit) : base(tbl) { vals = new object[tbl.TableDef.Columns.Length]; par = tbl; if (!needInit) { return; } BlobHeap bh = tbl.Heap.Stream.Root[MetadataStreamType.Blob].Heap as BlobHeap; StringsHeap sh = tbl.Heap.Stream.Root[MetadataStreamType.Strings].Heap as StringsHeap; GUIDHeap gh = tbl.Heap.Stream.Root[MetadataStreamType.GUID].Heap as GUIDHeap; foreach (MetadataColumn col in tbl.Columns) { if (col.Type is Type) { if ((col.Type as Type).IsEnum) { this[col.Index] = Enum.ToObject(col.Type as Type, 0); } else { switch ((col.Type as Type).FullName) { case "System.Byte": this[col.Index] = (byte)0; break; case "System.UInt16": this[col.Index] = (ushort)0; break; case "System.UInt32": this[col.Index] = (uint)0; break; case "NetPE.Core.Rva": this[col.Index] = (Rva)0; break; case "NetPE.Core.Metadata.BlobToken": this[col.Index] = bh.Resolve(new MetadataToken(MetadataTokenType.Unknown, 0)); break; case "NetPE.Core.Metadata.GUIDToken": this[col.Index] = gh.Resolve(new MetadataToken(MetadataTokenType.Unknown, 0)); break; case "NetPE.Core.Metadata.StringToken": this[col.Index] = sh.Resolve(new MetadataToken(MetadataTokenType.Unknown, 0)); break; } } } else if (col.Type is TableType) { this[col.Index] = new TableToken(tbl.Heap, new MetadataToken((MetadataTokenType)(TableType)col.Type, 0)); } else if (col.Type is CodedIndex) { this[col.Index] = new TableToken(tbl.Heap, new MetadataToken((MetadataTokenType)CodedIndexDefs.MdCodedIndexDefs[(CodedIndex)col.Type].TableTypes[0].Key, 0)); } } }