Exemplo n.º 1
0
        public override void GoToMetadata(GoToMetadataKind mdKind)
        {
            var origPos   = HexView.Caret.Position.Position.ActivePosition.BufferPosition;
            var mdHeaders = TryGetMetadataHeaders(origPos);

            if (mdHeaders == null)
            {
                return;
            }
            var peHeaders = TryGetPeHeaders(origPos);

            if (peHeaders == null && mdKind == GoToMetadataKind.MemberRva)
            {
                mdKind = GoToMetadataKind.Table;
            }
            var data = new GoToMetadataVM(HexView.Buffer, mdHeaders, peHeaders, HexView.Buffer.ReadUInt32(origPos));

            data.GoToMetadataKind = mdKind;
            var win = new GoToMetadataDlg();

            win.DataContext = data;
            win.Owner       = OwnerWindow;
            if (win.ShowDialog() != true)
            {
                return;
            }

            var span = GetGoToMetadataSpan(mdHeaders, peHeaders, data.OffsetTokenValue, data.GoToMetadataKind);

            Debug.Assert(span != null);
            if (span == null)
            {
                return;
            }
            var info = UserValueToSelection(span.Value.End, span.Value.Start);

            MoveTo(new HexBufferPoint(HexView.Buffer, info.Anchor), new HexBufferPoint(HexView.Buffer, info.Active), new HexBufferPoint(HexView.Buffer, info.Caret), select: false);
        }
Exemplo n.º 2
0
 public abstract void GoToMetadata(GoToMetadataKind mdKind);
Exemplo n.º 3
0
        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();
            }
        }
Exemplo n.º 4
0
 public GoToMetadataKindVM(GoToMetadataKind kind, string text, string inputGestureText)
 {
     Kind             = kind;
     Text             = text;
     InputGestureText = inputGestureText;
 }