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); }
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); }
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; }
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); }
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); }
string GetStringsDescription(HexField field) { var s = ReadStringsHeap(field); if (!string.IsNullOrEmpty(s)) return string.Format("{0} (#Strings Heap Offset)", s); return "#Strings Heap Offset"; }
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); }
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; }
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"; }
Guid? ReadGuidHeap(HexField field) => mdVM.ReadGuidHeap(ReadFieldValue(field));
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); }