You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
312 lines
8.1 KiB
312 lines
8.1 KiB
/******************************************************************
|
|
|
|
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);
|
|
}
|
|
}
|