public static void GetExpressionName(DkmVisualizedExpression expression, out string name, out string fullName) { if (expression.TagValue == DkmVisualizedExpression.Tag.RootVisualizedExpression) { DkmRootVisualizedExpression rootExpr = (DkmRootVisualizedExpression)expression; name = rootExpr.Name; fullName = rootExpr.FullName; } else { DkmChildVisualizedExpression childExpr = (DkmChildVisualizedExpression)expression; name = childExpr.EvaluationResult.Name; fullName = childExpr.EvaluationResult.FullName; } }
/// <summary> /// Evaluates visual expression and converts it to result visualizer. /// </summary> private void Evaluate() { if (VisualizedExpression.TagValue == DkmVisualizedExpression.Tag.RootVisualizedExpression) { DkmRootVisualizedExpression rootVisualizedExpression = VisualizedExpression as DkmRootVisualizedExpression; int processId = rootVisualizedExpression.InspectionSession?.Process?.LivePart?.Id ?? 0; string moduleName = rootVisualizedExpression.Module?.Name; string typeString = rootVisualizedExpression.Type; ulong address = 0; bool hasAddress = false; if (VisualizedExpression.ValueHome.TagValue == DkmExpressionValueHome.Tag.PointerValueHome) { address = (VisualizedExpression.ValueHome as DkmPointerValueHome).Address; hasAddress = true; } if (string.IsNullOrEmpty(typeString) || string.IsNullOrEmpty(moduleName) || !hasAddress) { string displayString = "{...CsDebugScript failure...}"; EvaluationResult = DkmSuccessEvaluationResult.Create( VisualizedExpression.InspectionContext, VisualizedExpression.StackFrame, rootVisualizedExpression.Name, rootVisualizedExpression.FullName, DkmEvaluationResultFlags.ReadOnly, displayString, "", rootVisualizedExpression.Type, DkmEvaluationResultCategory.Other, DkmEvaluationResultAccessType.None, DkmEvaluationResultStorageType.None, DkmEvaluationResultTypeModifierFlags.None, null, null, null, null); return; } string title; try { Process process = Process.All.First(p => p.SystemId == processId); Module module = process.ModulesByName[System.IO.Path.GetFileNameWithoutExtension(moduleName)]; CodeType codeType = ResolveCodeType(process, module, typeString); Variable = codeType.IsPointer ? Variable.CreatePointer(codeType, address) : Variable.Create(codeType, address); title = Variable.ToString(); ResultVisualizer = CsDebugScript.UI.ResultVisualizers.ResultVisualizer.Create(Variable, Variable.GetType(), "result", CompletionDataType.Unknown, dummyInteractiveResultVisualizer); } catch { title = "{...CsDebugScript...}"; } DkmDataAddress dkmDataAddress = DkmDataAddress.Create(VisualizedExpression.RuntimeInstance, address, rootVisualizedExpression.StackFrame?.InstructionAddress); EvaluationResult = DkmSuccessEvaluationResult.Create( VisualizedExpression.InspectionContext, VisualizedExpression.StackFrame, rootVisualizedExpression.Name, rootVisualizedExpression.FullName, DkmEvaluationResultFlags.ReadOnly | DkmEvaluationResultFlags.Expandable, title, "", rootVisualizedExpression.Type, DkmEvaluationResultCategory.Other, DkmEvaluationResultAccessType.None, DkmEvaluationResultStorageType.None, DkmEvaluationResultTypeModifierFlags.None, dkmDataAddress, VSUIVisualizerService.GetUIVisualizers(ResultVisualizer), null, null); return; } // This should never happen... throw new NotImplementedException(); }