/****************************************************************** DskCommonRoutines.CPP -- Description: Common routines that are used by all the three classes of Disk Quota Provider Copyright (c) 2000-2001 Microsoft Corporation, All Rights Reserved ******************************************************************/ #include "precomp.h" #include "DskQuotaCommon.h" /***************************************************************************** * * FUNCTION : DskCommonRoutines:: GetVolume * * DESCRIPTION : This method Parses the key and gets the Volume from * the Object Path. The input of this method could be * Logical Disk key which is on the form "D:" or could * receive volume Path which is in the form "D:\" * *****************************************************************************/ HRESULT DskCommonRoutines::GetVolume ( LPCWSTR a_Key, WCHAR &a_Drive ) { HRESULT hRes = WBEM_E_INVALID_PARAMETER; CObjectPathParser t_PathParser; ParsedObjectPath *t_ObjPath = NULL; if ( t_PathParser.Parse( a_Key, &t_ObjPath ) == t_PathParser.NoError ) { try { CHString t_KeyString = t_ObjPath->GetKeyString(); // checking for the validity of the path if ( ( t_KeyString.GetLength() == 3 ) || (t_KeyString.GetLength() == 2 ) ) { if ( (( t_KeyString.GetAt(0) >= L'A') && ( t_KeyString.GetAt(0) <= L'Z')) || (( t_KeyString.GetAt(0) >= L'a') && ( t_KeyString.GetAt(0) <= L'z') ) ) { if ( t_KeyString.GetAt(1) == L':' ) { if ( t_KeyString.GetLength() == 3 ) { if ( t_KeyString.GetAt(2) == L'\\' ) { hRes = WBEM_S_NO_ERROR; } } else { hRes = WBEM_S_NO_ERROR; } a_Drive = t_KeyString.GetAt(0); } } } } catch ( ... ) { t_PathParser.Free ( t_ObjPath ); throw; } t_PathParser.Free ( t_ObjPath ); } return hRes; } /***************************************************************************** * * FUNCTION : DskCommonRoutines:: SearchLogicalDisk * * DESCRIPTION : This method Searches whether a given Logical disks exists * in the logicaldisks strings of the system * *****************************************************************************/ HRESULT DskCommonRoutines::SearchLogicalDisk ( WCHAR a_Drive, LPCWSTR a_DriveStrings ) { int iLen = 0; LPCWSTR lpTempDriveString = a_DriveStrings; HRESULT hRes = WBEM_S_NO_ERROR; a_Drive = (WCHAR)toupper(a_Drive); while ( true ) { iLen = lstrlen ( lpTempDriveString ); if ( iLen == 0 ) { hRes = WBEM_E_NOT_FOUND; break; } if ( lpTempDriveString [ 0 ] == a_Drive ) break; lpTempDriveString = &lpTempDriveString [ iLen + 1 ]; } return hRes; } /***************************************************************************** * * FUNCTION : DskCommonRoutines:: GetVolumeDrive * * DESCRIPTION : Gets the Volume Drive from the Given Path * *****************************************************************************/ void DskCommonRoutines::GetVolumeDrive ( LPCWSTR a_VolumePath, LPCWSTR a_DriveStrings, CHString &a_DriveName ) { int iLen = 0; WCHAR w_Drive[ 4 ]; LPCWSTR lpTempDriveString = a_DriveStrings; WCHAR t_TempVolumeName [ MAX_PATH + 1 ]; while ( true ) { iLen = lstrlen ( lpTempDriveString ); if ( iLen == 0 ) break; lstrcpy ( w_Drive, lpTempDriveString ); BOOL bVol = GetVolumeNameForVolumeMountPoint( w_Drive, t_TempVolumeName, MAX_PATH ); if ( lstrcmp ( t_TempVolumeName, a_VolumePath ) == 0 ) { a_DriveName = w_Drive; break; } lpTempDriveString = &lpTempDriveString [ iLen + 1 ]; } } /***************************************************************************** * * FUNCTION : DskCommonRoutines:: InitializeInterfacePointer * * DESCRIPTION : This method Initializes the DiskQuotaInterface pointer for a * given volume * *****************************************************************************/ HRESULT DskCommonRoutines::InitializeInterfacePointer ( IDiskQuotaControl* pIQuotaControl, LPCWSTR a_VolumeName ) { HRESULT hRes = WBEM_S_NO_ERROR; BOOL bRetVal = TRUE; WCHAR w_VolumePathName [ MAX_PATH + 1 ]; bRetVal = GetVolumePathName( a_VolumeName, // file path w_VolumePathName, // volume mount point MAX_PATH // Size of the Buffer ); if ( bRetVal ) { if ( FAILED ( pIQuotaControl->Initialize ( w_VolumePathName, TRUE ) ) ) { hRes = WBEM_E_FAILED; } } return hRes; } /***************************************************************************** * * FUNCTION : DskCommonRoutines:: VolumeSupportsDiskQuota * * DESCRIPTION : This method checks if the volume supports Disk Quotas, * *****************************************************************************/ HRESULT DskCommonRoutines::VolumeSupportsDiskQuota ( LPCWSTR a_VolumeName, CHString &a_QuotaVolumeName ) { // Get the name of the Volume Name Property LPWSTR t_VolumeNameBuffer = a_QuotaVolumeName.GetBuffer(MAX_PATH + 1); DWORD dwMaximumComponentLength = 0; DWORD dwFileSystemFlags = 0; HRESULT hRes = WBEM_S_NO_ERROR; BOOL bRetVal = GetVolumeInformation( a_VolumeName, // root directory t_VolumeNameBuffer, // volume name buffer MAX_PATH, // length of name buffer NULL, // volume serial number &dwMaximumComponentLength, // maximum file name length &dwFileSystemFlags, // file system options NULL, // file system name buffer 0 // length of file system name buffer ); if ( ( bRetVal ) && ( ( dwFileSystemFlags & FILE_VOLUME_QUOTAS) == FILE_VOLUME_QUOTAS )) { a_QuotaVolumeName = t_VolumeNameBuffer; } else { hRes = WBEM_E_NOT_FOUND; } a_QuotaVolumeName.ReleaseBuffer(); return hRes; } /***************************************************************************** * * FUNCTION : DskCommonRoutines:: MakeObjectPath * * DESCRIPTION : This method Adds a keyvalue for a given key property * into the Object Path and gives the Object Path * *****************************************************************************/ void DskCommonRoutines::MakeObjectPath ( LPWSTR &a_ObjPathString, LPWSTR a_ClassName, LPCWSTR a_AttributeName, LPCWSTR a_AttributeVal ) { ParsedObjectPath t_ObjPath; variant_t t_Path(a_AttributeVal); t_ObjPath.SetClassName ( a_ClassName ); t_ObjPath.AddKeyRef ( a_AttributeName, &t_Path ); CObjectPathParser t_PathParser; if ( t_PathParser.Unparse( &t_ObjPath, &a_ObjPathString ) != t_PathParser.NoError ) { a_ObjPathString = NULL; } } /***************************************************************************** * * FUNCTION : DskCommonRoutines:: AddToObjectPath * * DESCRIPTION : This method Adds a keyvalue for a given key property * into the existing Object Path. * *****************************************************************************/ void DskCommonRoutines::AddToObjectPath ( LPWSTR &a_ObjPathString, LPCWSTR a_AttributeName, LPCWSTR a_AttributeVal ) { CObjectPathParser t_PathParser; ParsedObjectPath *t_ObjPath; if ( t_PathParser.Parse( a_ObjPathString, &t_ObjPath ) == t_PathParser.NoError ) { try { variant_t t_Path(a_AttributeVal); t_ObjPath->AddKeyRef ( a_AttributeName, &t_Path ); LPWSTR t_ObjPathString = NULL; delete [] a_ObjPathString; a_ObjPathString = NULL; if ( t_PathParser.Unparse( t_ObjPath, &t_ObjPathString ) != t_PathParser.NoError ) { a_ObjPathString = NULL; } else { a_ObjPathString = t_ObjPathString; } } catch ( ... ) { t_PathParser.Free (t_ObjPath); throw; } t_PathParser.Free (t_ObjPath); } }