HexSpan?GetFieldReferenceSpan(HexBufferFile file, DotNetMetadataHeaderData header, HexPosition position) { if (header.StreamHeaders.Data.Span.Span.Contains(position)) { var stream = (DotNetStorageStream)header.StreamHeaders.Data.GetFieldByPosition(position).Data; if (stream.Offset.Data.Span.Span.Contains(position)) { uint offset = stream.Offset.Data.ReadValue(); uint size = stream.Size.Data.ReadValue(); var pos = header.Span.Span.Start + offset; if (pos >= file.Span.End) { return(null); } var mdHeaders = file.GetHeaders <DotNetMetadataHeaders>(); if (mdHeaders == null) { return(new HexSpan(pos, 0)); } if (pos >= mdHeaders.MetadataSpan.End) { return(null); } var end = pos + size; if (end > mdHeaders.MetadataSpan.End) { return(new HexSpan(pos, 0)); } return(HexSpan.FromBounds(pos, end)); } return(null); } return(null); }
public StorageHeaderVM(HexBuffer buffer, DotNetMetadataHeaderData mdHeader) : base(HexSpan.FromBounds(mdHeader.Flags.Data.Span.Start, mdHeader.StreamCount.Data.Span.End)) { FFlagsVM = new ByteFlagsHexField(mdHeader.Flags); FFlagsVM.Add(new BooleanHexBitField(mdHeader.ExtraData.Name, 0)); PadVM = new ByteHexField(mdHeader.Pad); IStreamsVM = new UInt16HexField(mdHeader.StreamCount); hexFields = new HexField[] { FFlagsVM, PadVM, IStreamsVM, }; }
public DotNetMetadataHeadersImpl(HexSpan metadataSpan, DotNetMetadataHeaderData metadataHeader, DotNetHeap[] streams) : base(metadataSpan) { MetadataHeader = metadataHeader ?? throw new ArgumentNullException(nameof(metadataHeader)); Streams = new ReadOnlyCollection <DotNetHeap>(streams); TablesStream = FindStream <TablesHeap>(streams); StringsStream = FindStream <StringsHeap>(streams); USStream = FindStream <USHeap>(streams); GUIDStream = FindStream <GUIDHeap>(streams); BlobStream = FindStream <BlobHeap>(streams); PdbStream = FindStream <PdbHeap>(streams); foreach (IDotNetHeap heap in streams) { heap.SetMetadata(this); } }
public DotNetHeapsReader(HexBufferFile file, DotNetMetadataHeaderData mdHeader, StorageStreamHeader[] storageStreamHeaders) { if (file == null) { throw new ArgumentNullException(nameof(file)); } if (mdHeader == null) { throw new ArgumentNullException(nameof(mdHeader)); } if (storageStreamHeaders == null) { throw new ArgumentNullException(nameof(storageStreamHeaders)); } this.file = file; this.mdHeader = mdHeader; this.storageStreamHeaders = storageStreamHeaders; }
public StorageSignatureVM(HexBuffer buffer, DotNetMetadataHeaderData mdHeader) : base(HexSpan.FromBounds(mdHeader.Span.Start, mdHeader.VersionString.Data.Span.End)) { LSignatureVM = new UInt32HexField(mdHeader.Signature); IMajorVerVM = new UInt16HexField(mdHeader.MajorVersion, true); IMinorVerVM = new UInt16HexField(mdHeader.MinorVersion, true); IExtraDataVM = new UInt32HexField(mdHeader.ExtraData); IVersionStringVM = new UInt32HexField(mdHeader.VersionStringCount); VersionStringVM = new StringHexField(mdHeader.VersionString); hexFields = new HexField[] { LSignatureVM, IMajorVerVM, IMinorVerVM, IExtraDataVM, IVersionStringVM, VersionStringVM, }; }
void ReadDotNetMetadataHeader(HexSpan span) { var mdReader = DotNetMetadataHeaderReader.TryCreate(file, span); if (mdReader == null) { return; } mdHeader = DotNetMetadataHeaderDataImpl.TryCreate(file, mdReader.MetadataHeaderSpan, (int)mdReader.VersionStringSpan.Length.ToUInt64(), mdReader.StorageStreamHeaders); if (mdHeader == null) { return; } metadataSpan = mdReader.MetadataSpan; var dnReader = new DotNetHeapsReader(file, mdHeader, mdReader.StorageStreamHeaders); if (dnReader.Read()) { dotNetHeaps = dnReader.Streams; } }