Leaked source code of windows server 2003
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

/******************************************************************
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);
}
}