bool CMSFT_PartitionRecordProcessor::Process()

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;
}