void IDotNetHeap.SetMetadata(DotNetMetadataHeaders metadata) => this.metadata = metadata;
HexSpan?GetGoToMetadataSpan(DotNetMetadataHeaders mdHeaders, PeHeaders peHeaders, uint offsetTokenValue, GoToMetadataKind mdKind) { MDTable mdTable; switch (mdKind) { case GoToMetadataKind.Blob: if (mdHeaders.BlobStream == null) { return(null); } return(new HexSpan(mdHeaders.BlobStream.Span.Span.Start + offsetTokenValue, 0)); case GoToMetadataKind.Strings: if (mdHeaders.StringsStream == null) { return(null); } return(new HexSpan(mdHeaders.StringsStream.Span.Span.Start + offsetTokenValue, 0)); case GoToMetadataKind.US: if (mdHeaders.USStream == null) { return(null); } return(new HexSpan(mdHeaders.USStream.Span.Span.Start + (offsetTokenValue & 0x00FFFFFF), 0)); case GoToMetadataKind.GUID: if (mdHeaders.GUIDStream == null) { return(null); } return(new HexSpan(mdHeaders.GUIDStream.Span.Span.Start + (offsetTokenValue - 1) * 16, 16)); case GoToMetadataKind.Table: mdTable = GetMDTable(mdHeaders, offsetTokenValue); if (mdTable == null) { return(null); } return(new HexSpan(mdTable.Span.Start + ((offsetTokenValue & 0x00FFFFFF) - 1) * mdTable.RowSize, mdTable.RowSize)); case GoToMetadataKind.MemberRva: if (peHeaders == null) { return(null); } mdTable = GetMDTable(mdHeaders, offsetTokenValue); if (mdTable == null) { return(null); } if (mdTable.Table != Table.Method && mdTable.Table != Table.FieldRVA) { return(null); } // Column 0 is the RVA in both Method and FieldRVA tables var pos = mdTable.Span.Start + ((offsetTokenValue & 0x00FFFFFF) - 1) * mdTable.RowSize; var rva = HexView.Buffer.ReadUInt32(pos); return(new HexSpan(peHeaders.RvaToBufferPosition(rva), 0)); default: throw new InvalidOperationException(); } }