in natvis/object_visualizer.cpp [247:350]
static HRESULT CreateChildVisualizedExpression(
_In_ PropertyData const& prop,
_In_ DkmVisualizedExpression* pParent,
bool isAbiObject,
_Deref_out_ DkmChildVisualizedExpression** ppResult
)
{
*ppResult = nullptr;
com_ptr<DkmEvaluationResult> pEvaluationResult;
auto valueHome = make_com_ptr(pParent->ValueHome());
com_ptr<DkmPointerValueHome> pParentPointer = valueHome.as<DkmPointerValueHome>();
IF_FAIL_RET(EvaluatePropertyExpression(prop, pParent, pParentPointer.get(), isAbiObject, pEvaluationResult));
if (pEvaluationResult->TagValue() != DkmEvaluationResult::Tag::SuccessResult)
{
return E_FAIL;
}
com_ptr<DkmSuccessEvaluationResult> pSuccessEvaluationResult = pEvaluationResult.as<DkmSuccessEvaluationResult>();
com_ptr<DkmString> pValue;
com_ptr<DkmPointerValueHome> pChildPointer;
bool isNonNullObject = false;
if (prop.category == PropertyCategory::Class)
{
auto childObjectAddress = pSuccessEvaluationResult->Address()->Value();
if (childObjectAddress)
{
isNonNullObject = true;
IF_FAIL_RET(DkmPointerValueHome::Create(childObjectAddress, pChildPointer.put()));
IF_FAIL_RET(ObjectToString(pParent, pChildPointer.get(), true, pValue));
}
}
if(!isNonNullObject)
{
com_ptr<DkmExpressionValueHome> expressionValueHome = make_com_ptr(pParent->ValueHome());
pChildPointer = expressionValueHome.as<DkmPointerValueHome>();
pValue.copy_from(pSuccessEvaluationResult->Value());
}
com_ptr<DkmString> pDisplayName;
IF_FAIL_RET(DkmString::Create(prop.displayName.c_str(), pDisplayName.put()));
PCWSTR displayType;
if (prop.category < PropertyCategory::Value)
{
displayType = g_categoryData[(int)prop.category].displayType;
}
else
{
displayType = prop.displayType.c_str();
}
com_ptr<DkmString> pDisplayType;
IF_FAIL_RET(DkmString::Create(displayType, pDisplayType.put()));
com_ptr<DkmSuccessEvaluationResult> pVisualizedResult;
IF_FAIL_RET(DkmSuccessEvaluationResult::Create(
pParent->InspectionContext(),
pParent->StackFrame(),
pDisplayName.get(),
pSuccessEvaluationResult->FullName(),
pSuccessEvaluationResult->Flags(),
pValue.get(),
pSuccessEvaluationResult->EditableValue(),
pDisplayType.get(),
pSuccessEvaluationResult->Category(),
pSuccessEvaluationResult->Access(),
pSuccessEvaluationResult->StorageType(),
pSuccessEvaluationResult->TypeModifierFlags(),
pSuccessEvaluationResult->Address(),
pSuccessEvaluationResult->CustomUIVisualizers(),
pSuccessEvaluationResult->ExternalModules(),
DkmDataItem::Null(),
pVisualizedResult.put()
));
com_ptr<DkmChildVisualizedExpression> pChildVisualizedExpression;
IF_FAIL_RET(DkmChildVisualizedExpression::Create(
pParent->InspectionContext(),
pParent->VisualizerId(),
pParent->SourceId(),
pParent->StackFrame(),
pChildPointer.get(),
pVisualizedResult.get(),
pParent,
2,
DkmDataItem::Null(),
pChildVisualizedExpression.put()
));
if (isNonNullObject)
{
com_ptr<object_visualizer> pObjectVisualizer = make_self<object_visualizer>(pChildVisualizedExpression.get(), true);
IF_FAIL_RET(pChildVisualizedExpression->SetDataItem(DkmDataCreationDisposition::CreateNew, pObjectVisualizer.get()));
}
else
{
com_ptr<property_visualizer> pPropertyVisualizer = make_self<property_visualizer>(pChildVisualizedExpression.get(), pSuccessEvaluationResult.get());
IF_FAIL_RET(pChildVisualizedExpression->SetDataItem(DkmDataCreationDisposition::CreateNew, pPropertyVisualizer.get()));
}
*ppResult = pChildVisualizedExpression.detach();
return S_OK;
}