|
|
/*++
Copyright (c) 1998 Microsoft Corporation
Module Name:
FTMan
File Name:
PhPart.cpp
Abstract:
Implementation of the CPhysicalPartitionData class. The class that stores all information related to a physical partition
Author:
Cristian Teodorescu October 23, 1998
Notes:
Revision History:
--*/
#include "stdafx.h"
#include "Global.h"
#include "MainFrm.h"
#include "PhPart.h"
#include "Resource.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
///////////////////////////////////////////////////////////////////////////////////////////////////
// CPhysicalPartitionData
// Constructor
CPhysicalPartitionData::CPhysicalPartitionData( DWORD dwDiskNumber, DWORD dwSignature, const PPARTITION_INFORMATION pPartInfo, PARTITION_TYPE wPartitionType, CItemData* pParentData /* = NULL */, BOOL bIsRootVolume /* = FALSE */ ) : CItemData( IT_PhysicalPartition, pParentData, bIsRootVolume ), m_dwDiskNumber(dwDiskNumber), m_dwSignature(dwSignature), m_wPartitionType( wPartitionType ) { ASSERT( pPartInfo ); memcpy(&m_PartInfo, pPartInfo, sizeof(PARTITION_INFORMATION) ); }
////////////////////////////////////////////////////////////////////////////////////////////////////
// Public methods
BOOL CPhysicalPartitionData::ReadItemInfo( CString& strErrors ) { MY_TRY
m_bValid = TRUE; strErrors = _T(""); m_ulNumMembers = 0; // Read the drive letter, volume name and mount paths ( if any )
if( !ReadDriveLetterAndVolumeName() ) { //AddError( strErrors, IDS_ERR_READ_DRIVE_LETTER_AND_VOLUME_NAME, FALSE );
m_bValid = FALSE; }
// The mount paths will be retrieved later together with all other siblings mount paths ( for performance reason )
m_arrMountPaths.RemoveAll(); // Retrieve all disks used by this volume
if( !RetrieveDisksSet() ) { AddError( strErrors, IDS_ERR_RETRIEVE_DISKS_SET, FALSE ); m_bValid = FALSE; }
m_bIoOK = TRUE;
m_iImage = ComputeImageIndex(); return m_bValid;
MY_CATCH_AND_THROW }
BOOL CPhysicalPartitionData::ReadMembers( CObArray& arrMembersData, CString& strErrors ) { MY_TRY
arrMembersData.RemoveAll(); strErrors = _T(""); m_ulNumMembers = 0; return TRUE;
MY_CATCH_AND_THROW }
int CPhysicalPartitionData::ComputeImageIndex() const { if( m_bValid && m_bIoOK ) return II_PhysicalPartition; else return II_PhysicalPartition_Error; }
BOOL CPhysicalPartitionData::operator==(CItemData& rData) const { if( rData.GetItemType() != IT_PhysicalPartition ) return FALSE;
CPhysicalPartitionData* pPhPartData = (CPhysicalPartitionData*)(&rData);
return( ( m_dwDiskNumber == pPhPartData->m_dwDiskNumber ) && ( m_PartInfo.StartingOffset.QuadPart == pPhPartData->m_PartInfo.StartingOffset.QuadPart ) && ( m_PartInfo.PartitionLength.QuadPart == pPhPartData->m_PartInfo.PartitionLength.QuadPart ) ); }
void CPhysicalPartitionData::GetDisplayName( CString& strDisplay ) const { MY_TRY
strDisplay = _T(""); for( int i = 0; i < m_arrMountPaths.GetSize(); i++ ) { if( i != 0 ) strDisplay += _T("; "); strDisplay += m_arrMountPaths[i]; }
if( strDisplay.IsEmpty() ) { if( m_cDriveLetter ) strDisplay.Format(_T("%c:"), m_cDriveLetter ); /*
else strDisplay.Format( IDS_STR_PHYSICAL_PARTITION_NAME, m_dwDiskNumber, m_PartInfo.PartitionNumber ); */ }
CString str; str.Format( IDS_STR_PHYSICAL_PARTITION_NAME, m_dwDiskNumber, m_PartInfo.PartitionNumber ); if( !strDisplay.IsEmpty() ) strDisplay += (" "); strDisplay += str;
MY_CATCH_AND_THROW }
void CPhysicalPartitionData::GetDisplayType( CString& strDisplay ) const { MY_TRY
switch( m_wPartitionType ) { case PT_Primary: strDisplay.LoadString( IDS_TYPE_PRIMARY_PARTITION); break; case PT_InExtendedPartition: strDisplay.LoadString( IDS_TYPE_PARTITION_IN_EXTENDED_PARTITION); break; default: ASSERT(FALSE); }
MY_CATCH_AND_THROW }
BOOL CPhysicalPartitionData::GetSize( LONGLONG& llSize ) const { llSize = m_PartInfo.PartitionLength.QuadPart; return TRUE; }
BOOL CPhysicalPartitionData::GetDiskNumber( ULONG& ulDiskNumber ) const { ulDiskNumber = m_dwDiskNumber; return TRUE; }
BOOL CPhysicalPartitionData::GetOffset( LONGLONG& llOffset) const { llOffset = m_PartInfo.StartingOffset.QuadPart; return TRUE; }
BOOL CPhysicalPartitionData::IsFTPartition() const { // FT partitions have the most significant bit of PartitionType equal with 1
return ( ( m_PartInfo.PartitionType & 0x80 ) != 0 ); }
////////////////////////////////////////////////////////////////////////////////////////////////////
// Protected methods
BOOL CPhysicalPartitionData::RetrieveNTName( CString& strNTName ) const { MY_TRY
strNTName.Format(_T("\\Device\\Harddisk%lu\\Partition%lu"), m_dwDiskNumber, m_PartInfo.PartitionNumber ); return TRUE;
MY_CATCH_AND_THROW }
BOOL CPhysicalPartitionData::RetrieveDisksSet() { MY_TRY
m_setDisks.RemoveAll(); m_setDisks.Add( m_dwDiskNumber ); return TRUE;
MY_CATCH_AND_THROW }
|