windows-nt/Source/XPSP1/NT/shell/osshell/dskquota/control/fsobject.h
2020-09-26 16:20:57 +08:00

325 lines
9 KiB
C++

#ifndef _INC_DSKQUOTA_FSOBJECT_H
#define _INC_DSKQUOTA_FSOBJECT_H
///////////////////////////////////////////////////////////////////////////////
/* File: fsobject.h
Description: Contains declarations for file system objects used in the
quota management library. Abstractions are provided for NTFS
volumes, directories and local/remote versions of both. The idea
is to hide any peculiarities of these variations behind a common
FSObject interface.
The holder of a pointer to an FSObject can call the member functions
IsLocal() and Type() to determine the exact type and locality of
the object.
Revision History:
Date Description Programmer
-------- --------------------------------------------------- ----------
05/22/96 Initial creation. BrianAu
*/
///////////////////////////////////////////////////////////////////////////////
class FSObject
{
private:
LONG m_cRef; // Instance ref counter.
//
// Prevent copy construction.
//
FSObject(const FSObject& obj);
void operator = (const FSObject& obj);
protected:
CPath m_strFSObjName;
DWORD m_dwAccessRights; // Access rights granted to client.
// 0 = None.
// GENERIC_READ = Read
// GENRIC_READ | GENERIC_WRITE = Read/Write.
static HRESULT HResultFromNtStatus(NTSTATUS status);
public:
//
// Types of FS Objects.
//
enum { TypeUnknown, Volume, Directory };
//
// Flags used to indicate what data is to be updated in calls to
// SetObjectQuotaInformation() and SetUserQuotaInformation().
//
enum {
ChangeState = 0x01,
ChangeLogFlags = 0x02,
ChangeThreshold = 0x04,
ChangeLimit = 0x08
};
FSObject(LPCTSTR pszObjName)
: m_cRef(0),
m_dwAccessRights(0),
m_strFSObjName(pszObjName)
{ DBGTRACE((DM_CONTROL, DL_MID, TEXT("FSObject::FSObject"))); }
virtual ~FSObject(void);
ULONG AddRef(VOID);
ULONG Release(VOID);
//
// Pure virtual interface for opening volume/directory.
//
virtual HRESULT Initialize(DWORD dwAccess) = 0;
static HRESULT
Create(
LPCTSTR pszFSObjName,
DWORD dwAccess,
FSObject **ppNewObject);
static HRESULT
Create(
const FSObject& obj,
FSObject **ppNewObject);
static HRESULT
ObjectSupportsQuotas(
LPCTSTR pszFSObjName);
HRESULT GetName(LPTSTR pszBuffer, ULONG cchBuffer) const;
virtual HRESULT QueryUserQuotaInformation(
PVOID pBuffer,
ULONG cBufferLength,
BOOL bReturnSingleEntry,
PVOID pSidList,
ULONG cSidListLength,
PSID pStartSid,
BOOL bRestartScan
) = 0;
virtual HRESULT SetUserQuotaInformation(
PVOID pBuffer,
ULONG cBufferLength
) const = 0;
virtual HRESULT QueryObjectQuotaInformation(
PDISKQUOTA_FSOBJECT_INFORMATION poi
) = 0;
virtual HRESULT SetObjectQuotaInformation(
PDISKQUOTA_FSOBJECT_INFORMATION poi,
DWORD dwChangeMask
) const = 0;
virtual BOOL IsLocal(VOID) const = 0;
virtual UINT Type(VOID) const = 0;
DWORD GetAccessRights(VOID) const
{ return m_dwAccessRights; }
BOOL GrantedAccess(DWORD dwAccess) const
{ return (m_dwAccessRights & dwAccess) == dwAccess; }
};
class FSVolume : public FSObject
{
private:
//
// Prevent copying.
//
FSVolume(const FSVolume&);
FSVolume& operator = (const FSVolume&);
protected:
HANDLE m_hVolume;
public:
FSVolume(LPCTSTR pszVolName)
: FSObject(pszVolName),
m_hVolume(INVALID_HANDLE_VALUE)
{ DBGTRACE((DM_CONTROL, DL_MID, TEXT("FSVolume::FSVolume"))); }
virtual ~FSVolume(void);
HRESULT Initialize(DWORD dwAccess);
UINT Type(VOID) const
{ return FSObject::Volume; }
virtual HRESULT QueryObjectQuotaInformation(
PDISKQUOTA_FSOBJECT_INFORMATION poi
);
virtual HRESULT SetObjectQuotaInformation(
PDISKQUOTA_FSOBJECT_INFORMATION poi,
DWORD dwChangeMask
) const;
virtual HRESULT QueryUserQuotaInformation(
PVOID pBuffer,
ULONG cBufferLength,
BOOL bReturnSingleEntry,
PVOID pSidList,
ULONG cSidListLength,
PSID pStartSid,
BOOL bRestartScan
);
virtual HRESULT SetUserQuotaInformation(
PVOID pBuffer,
ULONG cBufferLength
) const;
};
class FSLocalVolume : public FSVolume
{
private:
//
// Prevent copying.
//
FSLocalVolume(const FSLocalVolume&);
FSLocalVolume& operator = (const FSLocalVolume&);
public:
FSLocalVolume(LPCTSTR pszVolName)
: FSVolume(pszVolName) { }
BOOL IsLocal(VOID) const
{ return TRUE; }
};
HRESULT FSObject_CreateLocalVolume(LPCTSTR pszVolumeName, FSObject **ppObject);
//
// These next classes were originally designed when I thought we might
// need a hierarchy of file system object "types". As it turns out,
// we really only need FSVolume and FSLocalVolume. I'll leave these
// in case the problem changes again sometime in the future. For now,
// these are excluded from compilation. [brianau - 2/17/98]
//
#if 0
/*
class FSRemoteVolume : public FSVolume
{
private:
//
// Prevent copying.
//
FSRemoteVolume(const FSRemoteVolume&);
void operator = (const FSRemoteVolume&);
public:
FSRemoteVolume(VOID)
: FSVolume() { }
BOOL IsLocal(VOID) const
{ return FALSE; }
};
class FSDirectory : public FSObject
{
private:
//
// Prevent copying.
//
FSDirectory(const FSDirectory&);
void operator = (const FSDirectory&);
protected:
HANDLE m_hDirectory;
public:
FSDirectory(VOID)
: FSObject(),
m_hDirectory(NULL) { }
HRESULT Initialize(DWORD dwAccess)
{ return E_NOTIMPL; }
UINT Type(VOID) const
{ return FSObject::Directory; }
virtual HRESULT QueryObjectQuotaInformation(
PDISKQUOTA_FSOBJECT_INFORMATION poi
) { return E_NOTIMPL; }
virtual HRESULT SetObjectQuotaInformation(
PDISKQUOTA_FSOBJECT_INFORMATION poi,
DWORD dwChangeMask
) const { return E_NOTIMPL; }
virtual HRESULT QueryUserQuotaInformation(
PVOID pUserInfoBuffer,
ULONG uBufferLength,
BOOL bReturnSingleEntry,
PVOID pSidList,
ULONG uSidListLength,
PSID pStartSid,
BOOL bRestartScan
) { return E_NOTIMPL; }
virtual HRESULT SetUserQuotaInformation(
PVOID pUserInfoBuffer,
ULONG uBufferLength
) const { return E_NOTIMPL; }
};
class FSLocalDirectory : public FSDirectory
{
private:
//
// Prevent copying.
//
FSLocalDirectory(const FSLocalDirectory&);
void operator = (const FSLocalDirectory&);
public:
FSLocalDirectory(VOID)
: FSDirectory() { }
BOOL IsLocal(VOID) const
{ return TRUE; }
};
class FSRemoteDirectory : public FSDirectory
{
private:
//
// Prevent copying.
//
FSRemoteDirectory(const FSRemoteDirectory&);
void operator = (const FSRemoteDirectory&);
public:
FSRemoteDirectory(VOID)
: FSDirectory() { }
BOOL IsLocal(VOID) const
{ return FALSE; }
};
*/
#endif // #if 0
#endif // DISKQUOTA_FSOBJECT_H