示例#1
0
        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);
        }
示例#2
0
        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,
            };
        }
示例#3
0
 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);
     }
 }
示例#4
0
 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;
 }
示例#5
0
        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,
            };
        }
示例#6
0
        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;
            }
        }