in host/AzureRecoveryLib/win32/WmiRecordProcessors.cpp [594:944]
bool CMSFT_PartitionRecordProcessor::Process(IWbemClassObject *precordobj, IWbemServices* pNamespace)
{
TRACE_FUNC_BEGIN;
bool bprocessed = true;
VARIANT vtProp;
HRESULT hrCol;
do
{
msft_disk_partition disk_partition;
//
// DiskNumber
//
hrCol = precordobj->Get(_bstr_t(MSFT_DiskPartition_Properties::DiskNumber), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
disk_partition.DiskNumber = vtProp.uintVal;
}
else
{
bprocessed = false;
m_error_msg = "failed to get MSFT_Partition object property: ";
m_error_msg += MSFT_DiskPartition_Properties::DiskNumber;
}
VariantClear(&vtProp); if (!bprocessed) break;
//
// PartitionNumber
//
hrCol = precordobj->Get(_bstr_t(MSFT_DiskPartition_Properties::PartitionNumber), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
disk_partition.PartitionNumber = vtProp.uintVal;
}
else
{
bprocessed = false;
m_error_msg = "failed to get MSFT_Partition object property: ";
m_error_msg += MSFT_DiskPartition_Properties::PartitionNumber;
}
VariantClear(&vtProp); if (!bprocessed) break;
//
// DriveLetter
//
hrCol = precordobj->Get(_bstr_t(MSFT_DiskPartition_Properties::DriveLetter), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
if (vtProp.vt != VT_NULL && vtProp.vt != VT_EMPTY)
{
disk_partition.DriveLetter = vtProp.cVal;
}
}
else
{
bprocessed = false;
m_error_msg = "failed to get MSFT_Partition object property: ";
m_error_msg += MSFT_DiskPartition_Properties::DriveLetter;
}
VariantClear(&vtProp); if (!bprocessed) break;
//
// AccessPaths
//
hrCol = precordobj->Get(_bstr_t(MSFT_DiskPartition_Properties::AccessPaths), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
if (vtProp.vt & VT_ARRAY &&
vtProp.vt & VT_BSTR &&
vtProp.parray != NULL)
{
BSTR *pAccessPath = NULL;
HRESULT hr = SafeArrayAccessData(vtProp.parray, (void **)&pAccessPath);
if (!FAILED(hr) &&
pAccessPath != NULL &&
vtProp.parray->rgsabound != NULL)
{
std::stringstream accessPaths;
for (long index = 0; index < vtProp.parray->rgsabound[0].cElements; index++)
{
accessPaths << _bstr_t(pAccessPath[index]) << " ";
}
SafeArrayUnaccessData(vtProp.parray);
disk_partition.AccessPaths = accessPaths.str();
}
}
}
else
{
bprocessed = false;
m_error_msg = "failed to get MSFT_Partition object property: ";
m_error_msg += MSFT_DiskPartition_Properties::AccessPaths;
}
VariantClear(&vtProp); if (!bprocessed) break;
//
// OperationalStatus
//
hrCol = precordobj->Get(_bstr_t(MSFT_DiskPartition_Properties::OperationalStatus), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
disk_partition.OperationalStatus = vtProp.uintVal;
}
else
{
bprocessed = false;
m_error_msg = "failed to get MSFT_Partition object property: ";
m_error_msg += MSFT_DiskPartition_Properties::OperationalStatus;
}
VariantClear(&vtProp); if (!bprocessed) break;
//
// TransitionState
//
hrCol = precordobj->Get(_bstr_t(MSFT_DiskPartition_Properties::TransitionState), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
disk_partition.TransitionState = vtProp.uintVal;
}
else
{
bprocessed = false;
m_error_msg = "failed to get MSFT_Partition object property: ";
m_error_msg += MSFT_DiskPartition_Properties::TransitionState;
}
VariantClear(&vtProp); if (!bprocessed) break;
//
// Size
//
hrCol = precordobj->Get(_bstr_t(MSFT_DiskPartition_Properties::Size), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
if (vtProp.vt == VT_BSTR)
disk_partition.Size = _bstr_t(vtProp.bstrVal);
}
else
{
bprocessed = false;
m_error_msg = "failed to get MSFT_Partition object property: ";
m_error_msg += MSFT_DiskPartition_Properties::Size;
}
VariantClear(&vtProp); if (!bprocessed) break;
//
// Offset
//
hrCol = precordobj->Get(_bstr_t(MSFT_DiskPartition_Properties::Offset), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
if (vtProp.vt == VT_BSTR)
disk_partition.Offset = _bstr_t(vtProp.bstrVal);
}
else
{
//bprocessed = false;
m_error_msg = "failed to get MSFT_Partition object property: ";
m_error_msg += MSFT_DiskPartition_Properties::Offset;
}
VariantClear(&vtProp); if (!bprocessed) break;
//
// MbrType
//
hrCol = precordobj->Get(_bstr_t(MSFT_DiskPartition_Properties::MbrType), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
if (vtProp.vt != VT_NULL)
disk_partition.MbrType = vtProp.uintVal;
}
else
{
bprocessed = false;
m_error_msg = "failed to get MSFT_Partition object property: ";
m_error_msg += MSFT_DiskPartition_Properties::MbrType;
}
VariantClear(&vtProp); if (!bprocessed) break;
//
// GptType
//
hrCol = precordobj->Get(_bstr_t(MSFT_DiskPartition_Properties::GptType), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
if (vtProp.vt == VT_BSTR)
disk_partition.GptType = _bstr_t(vtProp.bstrVal);
}
else
{
bprocessed = false;
m_error_msg = "failed to get MSFT_Partition object property: ";
m_error_msg += MSFT_DiskPartition_Properties::GptType;
}
VariantClear(&vtProp); if (!bprocessed) break;
//
// Guid
//
hrCol = precordobj->Get(_bstr_t(MSFT_DiskPartition_Properties::Guid), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
if (vtProp.vt == VT_BSTR)
disk_partition.Guid = _bstr_t(vtProp.bstrVal);
}
else
{
bprocessed = false;
m_error_msg = "failed to get MSFT_Partition object property: ";
m_error_msg += MSFT_DiskPartition_Properties::Guid;
}
VariantClear(&vtProp); if (!bprocessed) break;
//
// IsReadOnly
//
hrCol = precordobj->Get(_bstr_t(MSFT_DiskPartition_Properties::IsReadOnly), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
disk_partition.IsReadOnly = vtProp.boolVal;
}
else
{
bprocessed = false;
m_error_msg = "failed to get MSFT_Partition object property: ";
m_error_msg += MSFT_DiskPartition_Properties::IsReadOnly;
}
VariantClear(&vtProp); if (!bprocessed) break;
//
// IsOffline
//
hrCol = precordobj->Get(_bstr_t(MSFT_DiskPartition_Properties::IsOffline), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
disk_partition.IsOffline = vtProp.boolVal;
}
else
{
bprocessed = false;
m_error_msg = "failed to get MSFT_Partition object property: ";
m_error_msg += MSFT_DiskPartition_Properties::IsOffline;
}
VariantClear(&vtProp); if (!bprocessed) break;
//
// IsSystem
//
hrCol = precordobj->Get(_bstr_t(MSFT_DiskPartition_Properties::IsSystem), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
disk_partition.IsSystem = vtProp.boolVal;
}
else
{
bprocessed = false;
m_error_msg = "failed to get MSFT_Partition object property: ";
m_error_msg += MSFT_DiskPartition_Properties::IsSystem;
}
VariantClear(&vtProp); if (!bprocessed) break;
//
// IsBoot
//
hrCol = precordobj->Get(_bstr_t(MSFT_DiskPartition_Properties::IsBoot), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
disk_partition.IsBoot = vtProp.boolVal;
}
else
{
bprocessed = false;
m_error_msg = "failed to get MSFT_Partition object property: ";
m_error_msg += MSFT_DiskPartition_Properties::IsBoot;
}
VariantClear(&vtProp); if (!bprocessed) break;
//
// IsActive
//
hrCol = precordobj->Get(_bstr_t(MSFT_DiskPartition_Properties::IsActive), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
disk_partition.IsActive = vtProp.boolVal;
}
else
{
bprocessed = false;
m_error_msg = "failed to get MSFT_Partition object property: ";
m_error_msg += MSFT_DiskPartition_Properties::IsActive;
}
VariantClear(&vtProp); if (!bprocessed) break;
//
// IsHidden
//
hrCol = precordobj->Get(_bstr_t(MSFT_DiskPartition_Properties::IsHidden), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
disk_partition.IsHidden = vtProp.boolVal;
}
else
{
bprocessed = false;
m_error_msg = "failed to get MSFT_Partition object property: ";
m_error_msg += MSFT_DiskPartition_Properties::IsHidden;
}
VariantClear(&vtProp); if (!bprocessed) break;
//
// IsShadowCopy
//
hrCol = precordobj->Get(_bstr_t(MSFT_DiskPartition_Properties::IsShadowCopy), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
disk_partition.IsShadowCopy = vtProp.boolVal;
}
else
{
bprocessed = false;
m_error_msg = "failed to get MSFT_Partition object property: ";
m_error_msg += MSFT_DiskPartition_Properties::IsShadowCopy;
}
VariantClear(&vtProp); if (!bprocessed) break;
//
// NoDefaultDriveLetter
//
hrCol = precordobj->Get(_bstr_t(MSFT_DiskPartition_Properties::NoDefaultDriveLetter), 0, &vtProp, 0, 0);
if (!FAILED(hrCol))
{
disk_partition.NoDefaultDriveLetter = vtProp.boolVal;
}
else
{
bprocessed = false;
m_error_msg = "failed to get MSFT_Partition object property: ";
m_error_msg += MSFT_DiskPartition_Properties::NoDefaultDriveLetter;
}
VariantClear(&vtProp); if (!bprocessed) break;
m_disk_partitions.push_back(disk_partition);
} while (false);
TRACE_FUNC_END;
return bprocessed;
}