/// <summary> /// returns the Root of the UITree. /// </summary> /// <param name="MemoryReader"></param> /// <returns></returns> static public UITreeNode UIRoot( IPythonMemoryReader MemoryReader) { var CandidateAddresses = PyTypeObject.EnumeratePossibleAddressesOfInstancesOfPythonTypeFilteredByObType(MemoryReader, "UIRoot"); var CandidatesWithChildrenCount = new List <KeyValuePair <UITreeNode, int> >(); foreach (var CandidateAddress in CandidateAddresses) { var Candidate = new UITreeNode(CandidateAddress, MemoryReader); int CandidateChildrenCount = 0; { var CandidateChildren = Candidate.EnumerateChildrenTransitive(MemoryReader); if (null != CandidateChildren) { CandidateChildrenCount = CandidateChildren.Count(); } } CandidatesWithChildrenCount.Add(new KeyValuePair <UITreeNode, int>(Candidate, CandidateChildrenCount)); } // return the candidate the most children nodes where found in. return (CandidatesWithChildrenCount .OrderByDescending((CandidateWithChildrenCount) => CandidateWithChildrenCount.Value) .FirstOrDefault() .Key); }
public void OutputToFile(string path) { List <string> data = new List <string>(); try { ReadRootNode(); if (RootNode == null) { return; } else { data.Add("UIRoot found at " + RootNode.BaseAddress.ToString("x")); data.Add(""); } var AllNodes = new UITreeNode[] { RootNode } .Concat(RootNode.EnumerateChildrenTransitive(PyMemoryReader)).ToArray(); // show off the spoils.... foreach (var Node in AllNodes) { data.Add("=================================================================================="); data.Add("= UITree Node at " + Node.BaseAddress.ToString("x")); data.Add("=================================================================================="); data.Add(""); var Dict = Node.Dict; if (null == Dict) { continue; } var DictSlots = Dict.Slots; if (null == DictSlots) { continue; } int itterator = 0; // show info for each entry in dict that has a String as Key. foreach (var Entry in DictSlots) { var EntryKeyStr = Entry.KeyStr; if (null == EntryKeyStr) { continue; } var me_value = Entry.me_value; PyObject obj = new PyObject(me_value.Value, MemoryReader); PyTypeObject typeObject = obj.LoadType(PyMemoryReader); data.Add ( itterator + " : " + Entry.BaseAddress.ToString("x") + " + Entry[\"" + EntryKeyStr + "\"].Value(" + GetTypeName(me_value) + ") = " + (me_value.HasValue ? GetStringValueFromObject(obj) : "null") ); if (GetTypeName(me_value) == "list") { uint[] items = ((PyList)ReadValue(me_value)).Items; if (items == null) { continue; } foreach (uint address in items) { obj = new PyObject(address, MemoryReader); String type = GetTypeName(obj); data.Add("+ List Item: (" + type + ") = " + GetStringValueFromObject(obj)); } } itterator += 1; } data.Add(""); } System.IO.File.WriteAllLines(path, data.ToArray()); } finally { } }
public MemoryManager() { try { // Prep: RootNode = null; Nodes = new Dictionary <long, MemoryNode>(); ReadRootNode(); if (RootNode == null) { return; } var AllNodes = new UITreeNode[] { RootNode } .Concat(RootNode.EnumerateChildrenTransitive(PyMemoryReader)).ToArray(); // show off the spoils.... foreach (var Node in AllNodes) { MemoryNode memNode = new MemoryNode(); memNode.BaseAddress = Node.BaseAddress; var Dict = Node.Dict; if (null == Dict) { continue; } var DictSlots = Dict.Slots; if (null == DictSlots) { continue; } // show info for each entry in dict that has a String as Key. foreach (var Entry in DictSlots) { var EntryKeyStr = Entry.KeyStr; if (null == EntryKeyStr) { continue; } var me_value = Entry.me_value; PyTypeObject typeObject = new PyObject(me_value.Value, MemoryReader).LoadType(PyMemoryReader); MemoryDictEntry memEntry = new MemoryDictEntry(Entry.BaseAddress, EntryKeyStr, GetTypeName(me_value), ReadValue(me_value)); memNode.AddMemoryDictEntry(memEntry); } Nodes.Add(memNode.BaseAddress, memNode); } } finally { } }