예제 #1
0
파일: PENode.cs 프로젝트: azureidea/dnSpy-1
        public HexNode FindNode(HexVM structure, HexField field)
        {
            if (structure is MetaDataTableRecordVM mdTblRecord)
            {
                return(FindTokenNode(mdTblRecord.Token.Raw));
            }

            TreeNode.EnsureChildrenLoaded();
            foreach (var child in TreeNode.DataChildren.OfType <HexNode>())
            {
                var node = child.FindNode(structure, field);
                if (node != null)
                {
                    return(node);
                }
            }
            return(null);
        }
예제 #2
0
파일: HexNode.cs 프로젝트: pashav15/pashav
        public HexNode FindNode(HexVM structure, HexField field)
        {
            Debug.Assert(!(structure is MetaDataTableRecordVM), "Use " + nameof(PENode) + "'s method instead");
            bool found = false;

            foreach (var span in Spans)
            {
                if (span.Contains(field.Span))
                {
                    found = true;
                    break;
                }
            }
            if (!found)
            {
                return(null);
            }

            foreach (var vm in HexVMs)
            {
                foreach (var f in vm.HexFields)
                {
                    if (f == field)
                    {
                        return(this);
                    }
                }
            }

            TreeNode.EnsureChildrenLoaded();
            foreach (var child in TreeNode.DataChildren.OfType <HexNode>())
            {
                var node = child.FindNode(structure, field);
                if (node != null)
                {
                    return(node);
                }
            }

            return(null);
        }
예제 #3
0
		uint ReadFieldValue(HexField field) {
			if (field.Size == 2)
				return mdVM.Document.ReadUInt16(field.StartOffset);
			else if (field.Size == 4)
				return mdVM.Document.ReadUInt32(field.StartOffset);
			return 0;
		}
예제 #4
0
		string GetCodedTokenDescription(CodedToken codedToken, string codedTokenName, ColumnInfo col, HexField field) {
			MDToken token;
			if (!codedToken.Decode(ReadFieldValue(field), out token))
				return string.Format("Invalid {0} Coded Token", codedTokenName);

			var info = GetInfo(token.Table, token.Rid);
			if (string.IsNullOrEmpty(info))
				return string.Format("{0}: {1}[{2}], 0x{3:X8})", codedTokenName, token.Table, token.Rid, token.Raw);
			return string.Format("{0} ({1}: {2}[{3}], 0x{4:X8})", info, codedTokenName, token.Table, token.Rid, token.Raw);
		}
예제 #5
0
		string GetDescription(Table table, HexField field) {
			var info = GetInfo(table, ReadFieldValue(field));
			if (string.IsNullOrEmpty(info))
				return string.Format("{0} RID", table);
			return string.Format("{0} ({1} RID)", info, table);
		}
예제 #6
0
		string GetStringsDescription(HexField field) {
			var s = ReadStringsHeap(field);
			if (!string.IsNullOrEmpty(s))
				return string.Format("{0} (#Strings Heap Offset)", s);
			return "#Strings Heap Offset";
		}
예제 #7
0
		protected string ReadStringsHeap(HexField field) {
			var s = NumberVMUtils.ToString(mdVM.ReadStringsHeap(ReadFieldValue(field)), false);
			Debug.Assert(s.Length >= 2);
			if (s.Length < 2)
				return s;
			return s.Substring(1, s.Length - 2);
		}
예제 #8
0
		uint ReadFieldValue(HexField field) {
			if (field.Size == 2)
				return mdVM.Buffer.ReadUInt16(field.Span.Start);
			else if (field.Size == 4)
				return mdVM.Buffer.ReadUInt32(field.Span.Start);
			return 0;
		}
예제 #9
0
		string GetGuidDescription(HexField field) {
			var g = ReadGuidHeap(field);
			if (g != null)
				return string.Format("{0} (#GUID Heap Index)", g.Value.ToString());
			return "#GUID Heap Index";
		}
예제 #10
0
		Guid? ReadGuidHeap(HexField field) => mdVM.ReadGuidHeap(ReadFieldValue(field));
예제 #11
0
		protected string ReadStringsHeap(HexField field) {
			var s = SimpleTypeConverter.ToString(mdVM.ReadStringsHeap(ReadFieldValue(field)), false);
			Debug.Assert(s.Length >= 2);
			if (s.Length < 2)
				return s;
			return s.Substring(1, s.Length - 2);
		}