//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #region IDebugProperty2 Members //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public virtual int EnumChildren(enum_DEBUGPROP_INFO_FLAGS dwFields, uint dwRadix, ref Guid guidFilter, enum_DBG_ATTRIB_FLAGS dwAttribFilter, string pszNameFilter, uint dwTimeout, out IEnumDebugPropertyInfo2 ppEnum) { // // Enumerates the children of a property. This provides support for dereferencing pointers, displaying members of an array, or fields of a class or struct. // LoggingUtils.PrintFunction(); try { List <DEBUG_PROPERTY_INFO> childPropertyInfo = new List <DEBUG_PROPERTY_INFO> (); List <DebuggeeProperty> childRegisterProperties = new List <DebuggeeProperty> (); foreach (DebuggeeProperty child in m_children) { bool displayProperty = false; DEBUG_PROPERTY_INFO [] infoArray = new DEBUG_PROPERTY_INFO [1]; LoggingUtils.RequireOk(child.GetPropertyInfo(dwFields, dwRadix, dwTimeout, null, 0, infoArray)); if ((guidFilter == DebuggeeProperty.Filters.guidFilterRegisters) || (guidFilter == DebuggeeProperty.Filters.guidFilterAutoRegisters)) { if ((infoArray [0].dwAttrib & enum_DBG_ATTRIB_FLAGS.DBG_ATTRIB_STORAGE_REGISTER) != 0) { childRegisterProperties.Add(child); } } else if ((guidFilter == DebuggeeProperty.Filters.guidFilterArgs) || (guidFilter == DebuggeeProperty.Filters.guidFilterAllLocalsPlusArgs) || (guidFilter == DebuggeeProperty.Filters.guidFilterLocalsPlusArgs)) { displayProperty |= ((infoArray [0].dwAttrib & enum_DBG_ATTRIB_FLAGS.DBG_ATTRIB_DATA) != 0); } else if ((guidFilter == DebuggeeProperty.Filters.guidFilterAllLocals) || (guidFilter == DebuggeeProperty.Filters.guidFilterAllLocalsPlusArgs) || (guidFilter == DebuggeeProperty.Filters.guidFilterLocals) || (guidFilter == DebuggeeProperty.Filters.guidFilterLocalsPlusArgs)) { displayProperty |= ((infoArray [0].dwAttrib & enum_DBG_ATTRIB_FLAGS.DBG_ATTRIB_DATA) != 0); } else { displayProperty = true; } /*if ((infoArray [0].dwAttrib & dwAttribFilter) != 0) * { * displayProperty = false; * }*/ if (displayProperty) { childPropertyInfo.Add(infoArray [0]); } } if ((guidFilter == DebuggeeProperty.Filters.guidFilterRegisters) || (guidFilter == DebuggeeProperty.Filters.guidFilterAutoRegisters)) { // // // Registers must be specified in a collection/list as children of a 'CPU' property. // // Other types documented: https://msdn.microsoft.com/en-us/library/aa290860(v=vs.71).aspx // DebuggeeProperty registersProperty = new DebuggeeProperty(m_debugEngine, m_stackFrame, "CPU", string.Empty); LoggingUtils.RequireOk(registersProperty.AddChildren(childRegisterProperties.ToArray())); DEBUG_PROPERTY_INFO [] infoArray = new DEBUG_PROPERTY_INFO [1]; LoggingUtils.RequireOk(registersProperty.GetPropertyInfo(dwFields, dwRadix, dwTimeout, null, 0, infoArray)); childPropertyInfo.Add(infoArray [0]); } ppEnum = new DebuggeeProperty.Enumerator(childPropertyInfo); return(Constants.S_OK); } catch (Exception e) { LoggingUtils.HandleException(e); ppEnum = null; return(Constants.E_FAIL); } }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #region IDebugStackFrame2 Members //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public virtual int EnumProperties(enum_DEBUGPROP_INFO_FLAGS requestedFields, uint radix, ref Guid guidFilter, uint timeout, out uint elementsReturned, out IEnumDebugPropertyInfo2 enumDebugProperty) { // // Creates an enumerator for properties associated with the stack frame, such as local variables. // LoggingUtils.PrintFunction(); try { uint numEnumeratedProperties; IEnumDebugPropertyInfo2 enumeratedProperties; LoggingUtils.RequireOk(m_property.EnumChildren(requestedFields, radix, ref guidFilter, enum_DBG_ATTRIB_FLAGS.DBG_ATTRIB_ALL, string.Empty, timeout, out enumeratedProperties)); LoggingUtils.RequireOk(enumeratedProperties.GetCount(out numEnumeratedProperties)); elementsReturned = numEnumeratedProperties; enumDebugProperty = enumeratedProperties; #if false //List<DEBUG_PROPERTY_INFO> filteredProperties; if ((guidFilter == DebuggeeProperty.Filters.guidFilterRegisters) || (guidFilter == DebuggeeProperty.Filters.guidFilterAutoRegisters)) { // // Registers must be specified in a collection/list as children of a 'CPU' property. // DEBUG_PROPERTY_INFO [] debugProperties = new DEBUG_PROPERTY_INFO [numEnumeratedProperties]; LoggingUtils.RequireOk(enumeratedProperties.Next(numEnumeratedProperties, debugProperties, out numEnumeratedProperties)); DebuggeeProperty registersProperty = new DebuggeeProperty(m_debugEngine, this, "CPU", string.Empty); for (uint i = 0; i < numEnumeratedProperties; ++i) { DebuggeeProperty register; if (m_stackRegisters.TryGetValue(debugProperties [i].bstrName, out register)) { registersProperty.AddChildren(new DebuggeeProperty [] { register }); } } DEBUG_PROPERTY_INFO [] infoArray = new DEBUG_PROPERTY_INFO [1]; LoggingUtils.RequireOk(registersProperty.GetPropertyInfo(requestedFields, radix, timeout, null, 0, infoArray)); elementsReturned = (uint)infoArray.Length; enumDebugProperty = new DebuggeeProperty.Enumerator(infoArray); } /*DEBUG_PROPERTY_INFO [] debugProperties = new DEBUG_PROPERTY_INFO [numProperties]; * * LoggingUtils.RequireOk (enumeratedProperties.Next (numProperties, debugProperties, out numProperties)); * * if ((guidFilter == DebuggeeProperty.Filters.guidFilterRegisters) || (guidFilter == DebuggeeProperty.Filters.guidFilterAutoRegisters)) * { * // * // Registers must be specified in a collection/list as children of a 'CPU' property. * // * * DebuggeeProperty registersProperty = new DebuggeeProperty (m_debugEngine, this, "CPU", string.Empty); * * for (uint i = 0; i < numProperties; ++i) * { * DebuggeeProperty register; * * if (m_stackRegisters.TryGetValue (debugProperties [i].bstrName, out register)) * { * registersProperty.AddChildren (new DebuggeeProperty [] { register }); * } * } * * DEBUG_PROPERTY_INFO [] infoArray = new DEBUG_PROPERTY_INFO [1]; * * LoggingUtils.RequireOk (registersProperty.GetPropertyInfo (requestedFields, radix, timeout, null, 0, infoArray)); * * filteredProperties = new List<DEBUG_PROPERTY_INFO> (1); * * filteredProperties.Add (infoArray [0]); * } * else * { * filteredProperties = new List<DEBUG_PROPERTY_INFO> ((int)numProperties); * * for (uint i = 0; i < numProperties; ++i) * { * // * // Determine whether this property should be filtered in/out. * // * * bool displayProperty = false; * * DEBUG_PROPERTY_INFO prop = debugProperties [i]; * * if ((guidFilter == DebuggeeProperty.Filters.guidFilterAllLocals) || (guidFilter == DebuggeeProperty.Filters.guidFilterAllLocalsPlusArgs)) || { || displayProperty |= true; || } || || if ((guidFilter == DebuggeeProperty.Filters.guidFilterArgs) || (guidFilter == DebuggeeProperty.Filters.guidFilterAllLocalsPlusArgs) || (guidFilter == DebuggeeProperty.Filters.guidFilterLocalsPlusArgs)) || { || displayProperty |= m_stackArguments.ContainsKey (prop.bstrName); || } || || if ((guidFilter == DebuggeeProperty.Filters.guidFilterAllLocals) || (guidFilter == DebuggeeProperty.Filters.guidFilterAllLocalsPlusArgs) || (guidFilter == DebuggeeProperty.Filters.guidFilterLocals) || (guidFilter == DebuggeeProperty.Filters.guidFilterLocalsPlusArgs)) || { || displayProperty |= m_stackLocals.ContainsKey (prop.bstrName); || } || || if (displayProperty) || { || filteredProperties.Add (prop); || } ||} ||}*/ #endif return(Constants.S_OK); } catch (Exception e) { LoggingUtils.HandleException(e); elementsReturned = 0; enumDebugProperty = null; return(Constants.E_FAIL); } }