home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tricks of the Windows Gam…ming Gurus (2nd Edition)
/
Disc2.iso
/
vc98
/
include
/
dskquota.h
< prev
next >
Wrap
C/C++ Source or Header
|
1998-04-25
|
76KB
|
2,000 lines
/************************************************************************
* *
* dskquota.h -- public header for Windows NT disk quota interfaces. *
* *
* Copyright 1991-1998, Microsoft Corp. All rights reserved. *
* *
************************************************************************/
#ifndef __DSKQUOTA_H
#define __DSKQUOTA_H
//
// This is the public header for the Windows NT disk quota control
// COM library. The interfaces are implemented in DSKQUOTA.DLL.
//
// Define the INITGUIDS macros in one source module (and only one source
// module) before including this header. This will generate a single
// definition for the GUIDs used by the library.
//
// DSKQUOTA.DLL is self-registering using REGSVR32.
//
//
// Interfaces -----------------------------------------------------------------
//
// IDiskQuotaControl
//
// Represents an NTFS volume for purposes of managing disk quota.
// Instantiate this interface for each volume to be controlled.
// Through it you can:
// * Enable/Disable disk quotas.
// * Obtain status of quota system on the volume.
// * Deny disk space to users exceding their quota limit.
// * Assign default warning threshold and quota limit values
// to be used for new volume users.
// * Locate a single user quota entry.
// * Mark a user quota entry for deletion.
// * Create an enumeration object for enumerating user quota
// entries.
// * Create a batch object for updating multiple user quota
// entries efficiently.
//
// IDiskQuotaUser
//
// Represents a user quota entry on the volume.
// Instantiated through IEnumDiskQuotaUsers,
// IDiskQuotaControl::FindUserSid or
// IDiskQuotaControl::FindUserName or
// IDiskQuotaControl::AddUser
//
// Through it you can:
// * Set/Retrieve the user's quota warning threshold and quota
// limit.
// * Retrieve the user's quota amount "used" value.
// * Retrieve the user's domain, account and friendly name.
// * Retrieve the user's security ID (SID).
//
// IEnumDiskQuotaUsers
//
// Enumerates user quota entries on the volume. Implements the
// standard OLE IEnumXXXX interface.
// Instantiated through IDiskQuotaControl::CreateEnumUsers.
//
// IDiskQuotaUserBatch
//
// Coordinates the update of multiple user quota entries into
// a single call to NTFS. Improves update efficiency when
// multiple entries must be updated.
// Instantiated through IDiskQuotaControl::CreateUserBatch.
//
// IDiskQuotaEvents
//
// The DiskQuotaControl object services this interface as
// an OLE connection point. The connection point is used to
// notify client code when a significant event has occured in
// the quota system. Currently, the only event supported is
// the asynchronous update of a quota user object's name
// information.
//
// Interfaces [end] -----------------------------------------------------------
//
//
#ifndef _WINDOWS_
#include <windows.h>
#endif
#ifndef _OLE2_H_
#include <ole2.h>
#endif
#ifndef _OLECTL_H_
#include <olectl.h>
#endif
#ifdef INITGUIDS
#include <initguid.h>
#endif
//
// Class IDs
//
// {7988B571-EC89-11cf-9C00-00AA00A14F56}
DEFINE_GUID(CLSID_DiskQuotaControl,
0x7988b571, 0xec89, 0x11cf, 0x9c, 0x0, 0x0, 0xaa, 0x0, 0xa1, 0x4f, 0x56);
//
// Interface IDs
//
// {7988B572-EC89-11cf-9C00-00AA00A14F56}
DEFINE_GUID(IID_IDiskQuotaControl,
0x7988b572, 0xec89, 0x11cf, 0x9c, 0x0, 0x0, 0xaa, 0x0, 0xa1, 0x4f, 0x56);
// {7988B574-EC89-11cf-9C00-00AA00A14F56}
DEFINE_GUID(IID_IDiskQuotaUser,
0x7988b574, 0xec89, 0x11cf, 0x9c, 0x0, 0x0, 0xaa, 0x0, 0xa1, 0x4f, 0x56);
// {7988B576-EC89-11cf-9C00-00AA00A14F56}
DEFINE_GUID(IID_IDiskQuotaUserBatch,
0x7988b576, 0xec89, 0x11cf, 0x9c, 0x0, 0x0, 0xaa, 0x0, 0xa1, 0x4f, 0x56);
// {7988B577-EC89-11cf-9C00-00AA00A14F56}
DEFINE_GUID(IID_IEnumDiskQuotaUsers,
0x7988b577, 0xec89, 0x11cf, 0x9c, 0x0, 0x0, 0xaa, 0x0, 0xa1, 0x4f, 0x56);
// {7988B579-EC89-11cf-9C00-00AA00A14F56}
DEFINE_GUID(IID_IDiskQuotaEvents,
0x7988b579, 0xec89, 0x11cf, 0x9c, 0x0, 0x0, 0xaa, 0x0, 0xa1, 0x4f, 0x56);
//
// Definitions for value and bits in DWORD returned by GetQuotaState().
//
#define DISKQUOTA_STATE_DISABLED 0x00000000
#define DISKQUOTA_STATE_TRACK 0x00000001
#define DISKQUOTA_STATE_ENFORCE 0x00000002
#define DISKQUOTA_STATE_MASK 0x00000003
#define DISKQUOTA_FILESTATE_INCOMPLETE 0x00000100
#define DISKQUOTA_FILESTATE_REBUILDING 0x00000200
#define DISKQUOTA_FILESTATE_MASK 0x00000300
//
// Helper macros for setting and testing state value.
//
#define DISKQUOTA_SET_DISABLED(s) \
((s) &= ~DISKQUOTA_STATE_MASK)
#define DISKQUOTA_SET_TRACKED(s) \
((s) |= (DISKQUOTA_STATE_MASK & DISKQUOTA_STATE_TRACK))
#define DISKQUOTA_SET_ENFORCED(s) \
((s) |= (DISKQUOTA_STATE_ENFORCE & DISKQUOTA_STATE_ENFORCE))
#define DISKQUOTA_IS_DISABLED(s) \
(DISKQUOTA_STATE_DISABLED == ((s) & DISKQUOTA_STATE_MASK))
#define DISKQUOTA_IS_TRACKED(s) \
(DISKQUOTA_STATE_TRACK == ((s) & DISKQUOTA_STATE_MASK))
#define DISKQUOTA_IS_ENFORCED(s) \
(DISKQUOTA_STATE_ENFORCE == ((s) & DISKQUOTA_STATE_MASK))
//
// These file state flags are read-only.
//
#define DISKQUOTA_FILE_INCOMPLETE(s) \
(0 != ((s) & DISKQUOTA_FILESTATE_INCOMPLETE))
#define DISKQUOTA_FILE_REBUILDING(s) \
(0 != ((s) & DISKQUOTA_FILESTATE_REBUILDING))
//
// Definitions for bits in DWORD returned by GetQuotaLogFlags().
//
#define DISKQUOTA_LOGFLAG_USER_THRESHOLD 0x00000001
#define DISKQUOTA_LOGFLAG_USER_LIMIT 0x00000002
//
// Helper macros to interrogate a log flags DWORD.
//
#define DISKQUOTA_IS_LOGGED_USER_THRESHOLD(f) \
(0 != ((f) & DISKQUOTA_LOGFLAG_USER_THRESHOLD))
#define DISKQUOTA_IS_LOGGED_USER_LIMIT(f) \
(0 != ((f) & DISKQUOTA_LOGFLAG_USER_LIMIT))
//
// Helper macros to set/clear bits in a log flags DWORD.
//
#define DISKQUOTA_SET_LOG_USER_THRESHOLD(f,yn) \
((f &= ~DISKQUOTA_LOGFLAG_USER_THRESHOLD) |= ((yn) ? DISKQUOTA_LOGFLAG_USER_THRESHOLD : 0))
#define DISKQUOTA_SET_LOG_USER_LIMIT(f,yn) \
((f &= ~DISKQUOTA_LOGFLAG_USER_LIMIT) |= ((yn) ? DISKQUOTA_LOGFLAG_USER_LIMIT : 0))
//
// Per-user quota information.
//
typedef struct DiskQuotaUserInformation {
LONGLONG QuotaUsed;
LONGLONG QuotaThreshold;
LONGLONG QuotaLimit;
} DISKQUOTA_USER_INFORMATION, *PDISKQUOTA_USER_INFORMATION;
//
// Values for fNameResolution argument to:
//
// IDiskQuotaControl::AddUser
// IDiskQuotaControl::FindUserSid
// IDiskQuotaControl::CreateEnumUsers
//
#define DISKQUOTA_USERNAME_RESOLVE_NONE 0
#define DISKQUOTA_USERNAME_RESOLVE_SYNC 1
#define DISKQUOTA_USERNAME_RESOLVE_ASYNC 2
//
// Values for status returned by IDiskQuotaUser::GetAccountStatus.
//
#define DISKQUOTA_USER_ACCOUNT_RESOLVED 0
#define DISKQUOTA_USER_ACCOUNT_UNAVAILABLE 1
#define DISKQUOTA_USER_ACCOUNT_DELETED 2
#define DISKQUOTA_USER_ACCOUNT_INVALID 3
#define DISKQUOTA_USER_ACCOUNT_UNKNOWN 4
#define DISKQUOTA_USER_ACCOUNT_UNRESOLVED 5
///////////////////////////////////////////////////////////////////////////////
// IDiskQuotaUser interface
//
// This interface represents a single user entry in the volume's quota
// information file. Through this interface, you can query and modify
// user-specific quota information on an NTFS volume. An IDiskQuotaUser
// interface is instantiated through IEnumDiskQuotaUsers,
// IDiskQuotaControl::FindUserSid, IDiskQuotaControl::FindUserName or
// IDiskQuotaControl::AddUser.
//
// IDiskQuotaUser::GetName ----------------------------------------------------
//
// Retrieves the various name strings associated with a disk quota user.
//
// Arguments:
//
// pszDomain - Address of buffer to receive the name of the user's
// network domain. May be NULL.
//
// cchDomain - Size of domain name buffer in characters. Ignored if
// pszDomain is NULL.
//
// pszName - Address of buffer to receive the name of the user's
// account in the network domain. May be NULL.
//
// cchName - Size of the name buffer in characters. Ignored if pszName
// is NULL.
//
// pszFullName - Address of buffer to receive the "full" name for
// the quota user. The "full" name is the friendly name
// associated with the user's account. For example, user
// John Doe might have an account name of "jdoe" while his
// "full" name is the string "John Doe". May be NULL.
//
// cchFullName - Size of the "full name" buffer in characters. Ignored
// if pszFullName is NULL.
//
// Returns:
// NOERROR - Success.
// DQC_E_LOCK_FAILED - Could not gain exclusive lock on user object.
//
//
// IDiskQuotaUser::GetSidLength -----------------------------------------------
//
// Retrieves the length of the user's security ID (SID) in bytes. The
// return value is used to size the destination buffer passed to
// IDiskQuotaUser::GetSid.
//
// Arguments:
//
// pdwLength - Address of DWORD variable to receive SID length.
//
// Returns:
//
// NOERROR - Success.
// E_POINTER - pdwLength argument is NULL.
// DQC_E_INVALID_SID - User's SID is invalid.
// DQC_E_LOCK_FAILED - Could not gain exclusive lock on user object.
//
//
// IDiskQuotaUser::GetSid -----------------------------------------------------
//
// Retrieves the user's security ID (SID).
//
// Arguments:
//
// pbSidBuffer - Address of destination buffer to receive SID.
//
// cbSidBuffer - Size of destination buffer in bytes.
//
// Returns:
//
// NOERROR - Success.
// E_POINTER - pbSidBuffer is NULL.
// DQC_E_INVALID_SID - Quota entry SID is invalid.
// DQC_E_INSUFFICIENT_BUFFER - Insufficient destination buffer size.
// DQC_E_LOCK_FAILED - Couldn't lock user object.
//
//
// IDiskQuotaUser::GetQuotaThreshold ------------------------------------------
//
// Retrieves the user's quota "threshold" value on the volume. The
// threshold is an arbitrary value set by the volume's quota
// administrator. It may be used to identify users who are approaching
// their quota limit.
//
// Arguments:
//
// pllThreshold - Address of LONGLONG variable to receive the
// threshold value.
//
// Returns:
//
// NOERROR - Success.
// DQC_E_ACCESS_DENIED - No READ access to quota information.
// DQC_E_LOCK_FAILED - Couldn't lock user object.
// E_POINTER - pllThreshold is NULL.
// E_OUTOFMEMORY - Insufficient memory.
// E_FAIL - Failed reading quota information.
//
//
// IDiskQuotaUser::GetQuotaThresholdText --------------------------------------
//
// Retrieves the user's quota "threshold" value expressed as a text
// string (i.e. "10.5 MB"). If the user's threshold is unlimited,
// the string "No Limit" is returned (localized).
//
// Arguments:
//
// pszText - Address of character buffer to receive text.
//
// cchText - Size of destination buffer in bytes.
//
// Returns:
//
// NOERROR - Success.
// DQC_E_ACCESS_DENIED - No READ access to quota information.
// DQC_E_LOCK_FAILED - Couldn't lock user object.
// E_OUTOFMEMORY - Insufficient memory.
// E_FAIL - Failed reading quota information.
//
//
// IDiskQuotaUser::GetQuotaLimit ----------------------------------------------
//
// Retrieves the user's quota "limit" value on the volume. The
// limit is set as the maximum amount of disk space available to the
// volume user. There are two special-case values associated with the
// quota limit.
//
// -1 = User has unlimited quota on the volume.
// -2 = User's quota entry is marked for deletion. If the entry's
// value for quota "used" is 0, the record will be deleted by
// NTFS at some future time.
//
// Arguments:
//
// pllLimit - Address of LONGLONG variable to receive the limit value.
//
// Returns:
//
// NOERROR - Success.
// DQC_E_ACCESS_DENIED - No READ access to quota information.
// DQC_E_LOCK_FAILED - Couldn't lock user object.
// E_POINTER - pllLimit is NULL.
// E_OUTOFMEMORY - Insufficient memory.
// E_FAIL - Failed reading quota information.
//
//
// IDiskQuotaUser::GetQuotaLimitText ------------------------------------------
//
// Retrieves the user's quota "limit" value expressed as a text
// string (i.e. "10.5 MB"). If the user's limit is unlimited,
// the string "No Limit" is returned (localized).
//
// Arguments:
//
// pszText - Address of character buffer to receive text.
//
// cchText - Size of destination buffer in bytes.
//
// Returns:
//
// NOERROR - Success.
// DQC_E_ACCESS_DENIED - No READ access to quota information.
// DQC_E_LOCK_FAILED - Couldn't lock user object.
// E_OUTOFMEMORY - Insufficient memory.
// E_FAIL - Failed reading quota information.
//
//
// IDiskQuotaUser::GetQuotaUsed -----------------------------------------------
//
// Retrieves the user's quota "used" value on the volume. This is the
// amount of information stored on the volume by the user. Note that
// this is the amount of uncompressed information. Therefore, the
// use of NTFS compression does not affect this value.
//
// Arguments:
//
// pllUsed - Address of LONGLONG variable to receive the
// quota used value.
//
// Returns:
//
// NOERROR - Success.
// DQC_E_ACCESS_DENIED - No READ access to quota information.
// DQC_E_LOCK_FAILED - Couldn't lock user object.
// E_POINTER - pllUsed is NULL.
// E_OUTOFMEMORY - Insufficient memory.
// E_FAIL - Failed reading quota information.
//
//
// IDiskQuotaUser::GetQuotaUsedText -------------------------------------------
//
// Retrieves the user's quota "used" value expressed as a text
// string (i.e. "10.5 MB").
//
// Arguments:
//
// pszText - Address of character buffer to receive text.
//
// cchText - Size of destination buffer in bytes.
//
// Returns:
//
// NOERROR - Success.
// DQC_E_ACCESS_DENIED - No READ access to quota information.
// DQC_E_LOCK_FAILED - Couldn't lock user object.
// E_OUTOFMEMORY - Insufficient memory.
// E_FAIL - Failed reading quota information.
//
//
// IDiskQuotaUser::GetQuotaInformation ----------------------------------------
//
// Retrieves the user's quota "threshold", "used" and "limit" values in
// a single function call.
//
// Arguments:
//
// pQuotaInfo - Address of DISKQUOTA_USER_INFORMATION structure to
// receive the quota information.
//
// cbQuotaInfo - Size of the desination buffer in bytes.
//
// Returns:
//
// NOERROR - Success.
// DQC_E_ACCESS_DENIED - No READ access to quota information.
// DQC_E_LOCK_FAILED - Couldn't lock user object.
// E_POINTER - pQuotaInfo is NULL.
// E_OUTOFMEMORY - Insufficient memory.
// E_FAIL - Failed reading quota information.
//
//
// IDiskQuotaUser::SetQuotaThreshold ------------------------------------------
//
// Sets the user's quota "threshold" value on the volume. The
// threshold is an arbitrary value set by the volume's quota
// administrator. It may be used to identify users who are approaching
// their quota limit.
//
// Arguments:
//
// llThreshold - Threshold value.
//
// fWriteThrough - Set this to TRUE if you want to immediately write
// the value to the volume's quota file. Otherwise, the value
// is only written to the quota user object's local memory.
// This value should normally be set to TRUE. Set it to FALSE
// when using the IDiskQuotaUserBatch interface to modify
// multiple user quota entries at once.
//
// Returns:
//
// NOERROR - Success.
// DQC_E_ACCESS_DENIED - No WRITE access to quota information.
// DQC_E_LOCK_FAILED - Couldn't lock user object.
// E_FAIL - Failed writing quota information.
//
//
// IDiskQuotaUser::SetQuotaLimit ----------------------------------------------
//
// Sets the user's quota "limit" value on the volume. The
// limit is set as the maximum amount of disk space available to the
// volume user.
//
// Arguments:
//
// llLimit - Limit value (bytes). -1 = Unlimitd quota.
//
// fWriteThrough - Set this to TRUE if you want to immediately write
// the value to the volume's quota file. Otherwise, the value
// is only written to the quota user object's local memory.
// This value should normally be set to TRUE. Set it to FALSE
// when using the IDiskQuotaUserBatch interface to modify
// multiple user quota entries at once.
//
// Returns:
//
// NOERROR - Success.
// DQC_E_ACCESS_DENIED - No WRITE access to quota information.
// DQC_E_LOCK_FAILED - Couldn't lock user object.
// E_FAIL - Failed writing quota information.
//
//
// IDiskQuotaUser::Invalidate -------------------------------------------------
//
// Invalidates the quota information stored in the quota user object.
// The next time information is requested, it is refreshed from disk.
//
// Arguments: None.
//
// Returns: NOERROR.
//
//
// IDiskQuotaUser::GetAccountStatus -------------------------------------------
//
// Retrieves the status of the user object's account. User information
// is identified in the quota system by user security ID (SID). This
// SID must be resolved to a user account for the user's domain,
// account name or full name to be retrieved. This status information
// may be used to determine why a user's name string(s) are not available.
//
// Arguments:
//
// pdwStatus - Address of DWORD variable to receive user's account
// status. The status value may be one of the following:
//
// DISKQUOTA_USER_ACCOUNT_RESOLVED - SID has been resolved to
// a user account. Names are available through GetName().
//
// DISKQUOTA_USER_ACCOUNT_UNAVAILABLE - User's account is
// unavailable at this time. Network domain controller
// may not be available. Name information will not be
// available.
//
// DISKQUOTA_USER_ACCOUNT_DELETED - User's account has been
// deleted from the domain. Name information will not be
// available.
//
// DISKQUOTA_USER_ACCOUNT_INVALID - User's account is invalid.
// Name information will not be available.
//
// DISKQUOTA_USER_ACCOUNT_UNKNOWN - User's account is unknown.
// Name information will not be available.
//
// DISKQUOTA_USER_ACCOUNT_UNRESOLVED - SID has yet to be resolved
// to a user account.
//
//
// Returns: NOERROR - Success.
// E_POINTER - pdwStatus argument is NULL.
//
///////////////////////////////////////////////////////////////////////////////
#undef INTERFACE
#define INTERFACE IDiskQuotaUser
DECLARE_INTERFACE_(IDiskQuotaUser, IUnknown)
{
STDMETHOD(GetName)(THIS_
LPWSTR pszDomain,
DWORD cchDomain,
LPWSTR pszName,
DWORD cchName,
LPWSTR pszFullName,
DWORD cchFullName) PURE;
STDMETHOD(GetSidLength)(THIS_
LPDWORD pdwLength) PURE;
STDMETHOD(GetSid)(THIS_
LPBYTE pbSidBuffer,
DWORD cbSidBuffer) PURE;
STDMETHOD(GetQuotaThreshold)(THIS_
PLONGLONG pllThreshold) PURE;
STDMETHOD(GetQuotaThresholdText)(THIS_
LPWSTR pszText,
DWORD cchText) PURE;
STDMETHOD(GetQuotaLimit)(THIS_
PLONGLONG pllLimit) PURE;
STDMETHOD(GetQuotaLimitText)(THIS_
LPWSTR pszText,
DWORD cchText) PURE;
STDMETHOD(GetQuotaUsed)(THIS_
PLONGLONG pllUsed) PURE;
STDMETHOD(GetQuotaUsedText)(THIS_
LPWSTR pszText,
DWORD cchText) PURE;
STDMETHOD(GetQuotaInformation)(THIS_
LPVOID pbQuotaInfo,
DWORD cbQuotaInfo) PURE;
STDMETHOD(SetQuotaThreshold)(THIS_
LONGLONG llThreshold,
BOOL fWriteThrough) PURE;
STDMETHOD(SetQuotaLimit)(THIS_
LONGLONG llLimit,
BOOL fWriteThrough) PURE;
STDMETHOD(Invalidate)(THIS) PURE;
STDMETHOD(GetAccountStatus)(THIS_
LPDWORD pdwStatus) PURE;
};
typedef IDiskQuotaUser DISKQUOTA_USER, *PDISKQUOTA_USER;
///////////////////////////////////////////////////////////////////////////////
// IEnumDiskQuotaUsers interface
//
// Implementation of a standard OLE IEnumXXXX interface for enumerating
// IDiskQuotaUser objects. IEnumDiskQuotaUsers is instantiated
// with IDiskQuotaControl::CreateEnumUsers.
//
// For a description of argument and return values, see the OLE documentation
// for IEnumXXXX.
//
///////////////////////////////////////////////////////////////////////////////
#undef INTERFACE
#define INTERFACE IEnumDiskQuotaUsers
DECLARE_INTERFACE_(IEnumDiskQuotaUsers, IUnknown)
{
STDMETHOD(Next)(THIS_
DWORD cUsers,
PDISKQUOTA_USER *rgUsers,
LPDWORD pcUsersFetched) PURE;
STDMETHOD(Skip)(THIS_
DWORD cUsers) PURE;
STDMETHOD(Reset)(THIS) PURE;
STDMETHOD(Clone)(THIS_
IEnumDiskQuotaUsers **ppEnum) PURE;
};
typedef IEnumDiskQuotaUsers ENUM_DISKQUOTA_USERS, *PENUM_DISKQUOTA_USERS;
///////////////////////////////////////////////////////////////////////////////
// IDiskQuotaUserBatch interface
//
// This interface provides a mechanism for optimizing updates of quota
// information on multiple users. Through this interface, you can add quota
// user objects to a container that is then submitted for update in a single
// call. This reduces the number of calls to the underlying file system
// providing optimal performance when large numbers of user objects must
// be updated.
//
// IDiskQuotaUserBatch::Add ---------------------------------------------------
//
// Adds an IDiskQuotaUser pointer to the batch list. When setting values
// on a quota user object in preparation for batch processing, specify
// FALSE for the fWriteThrough flag in the SetQuotaLimit and
// SetQuotaThreshold functions. This will store the values in memory
// without writing through to disk. Calling FlushToDisk will write the
// changes to disk.
// This function calls AddRef() on the pUser interface pointer.
// Release() is automatically called on each contained IDiskQuotaUser
// interface pointer when the batch object is destroyed.
//
// Arguments:
//
// pUser - Address of quota user object's IDiskQuotaUser interface.
//
// Returns:
//
// NOERROR - Success.
// E_POINTER - pUser arg is NULL.
// E_OUTOFMEMORY - Insufficient memory.
// E_UNEXPECTED - Unexpected exception occured.
//
//
// IDiskQuotaUserBatch::Remove ------------------------------------------------
//
// Removes an IDiskQuotaUser pointer from the batch list.
//
// Arguments:
//
// pUser - Address of quota user object's IDiskQuotaUser interface.
//
// Returns:
//
// NOERROR - Success.
// S_FALSE - Quota user object not found in batch.
// E_POINTER - pUser arg is NULL.
// E_UNEXPECTED - An unexpected exception occured.
//
//
// IDiskQuotaUserBatch::RemoveAll ---------------------------------------------
//
// Removes all IDiskQuotaUser pointers from the batch list.
//
// Arguments: None.
//
// Returns:
//
// NOERROR - Success.
// E_UNEXPECTED - An unexpected exception occured.
//
//
// IDiskQuotaUserBatch::FlushToDisk -------------------------------------------
//
// Writes user object changes to disk in a single call to NTFS.
//
// Note that there are limitations as to how much information can be
// written to disk in a single call to the file system. The flush
// operation may require multiple calls to NTFS. Nonetheless, it will
// be much more efficient than a single call for each user object.
//
// Arguments: None.
//
// Returns:
//
// NOERROR - Success.
// E_FAIL - Error writing quota information.
// E_OUTOFMEMORY - Insufficient memory.
// E_UNEXPECTED - An unexpected exception occured.
// DQC_E_ACCESS_DENIED - No WRITE access to quota information.
//
///////////////////////////////////////////////////////////////////////////////
#undef INTERFACE
#define INTERFACE IDiskQuotaUserBatch
DECLARE_INTERFACE_(IDiskQuotaUserBatch, IUnknown)
{
STDMETHOD(Add)(THIS_
PDISKQUOTA_USER pUser) PURE;
STDMETHOD(Remove)(THIS_
PDISKQUOTA_USER pUser) PURE;
STDMETHOD(RemoveAll)(THIS) PURE;
STDMETHOD(FlushToDisk)(THIS) PURE;
};
typedef IDiskQuotaUserBatch DISKQUOTA_USER_BATCH, *PDISKQUOTA_USER_BATCH;
///////////////////////////////////////////////////////////////////////////////
// IDiskQuotaControl interface
//
// This interface is the principle point of control for the disk quota control
// library. A client instantiates this interface through CoCreateInstance
// using the the class ID CLSID_DiskQuotaControl. The resulting quota control
// object provides a layer of abstraction around the disk quota facilities of
// a single NTFS volume. Through the IDiskQuotaControl interface, the client
// may query and set volume-specific quota attributes as well as enumerate
// all quota user entries on the volume.
//
// The DiskQuotaControl object also implements IConnectionPointContainer
// to service the IDiskQuotaEvents connection point interface.
//
//
// IDiskQuotaControl::Initialize ----------------------------------------------
//
// Initializes a new QuotaControl object by opening the NTFS volume
// with the requested access rights. The return value indicates
// if the volume does not support NTFS disk quotas or if the caller
// does not have sufficient access rights.
//
// >>>>>> NOTE <<<<<<<
//
// Accessing quota information on remote volumes is not
// supported for NT5 Beta 1. Remote volume support will be
// added after Beta 1.
//
// Arguments:
//
// pszPath - Name of NTFS path to open.
// To obtain WRITE access, this string must be
// "\\.\X" where 'X' is the drive letter for the
// volume. If only READ access is desired, the
// path may be simply "X:\"
//
// bReadWrite - TRUE = Open for read/write.
// FALSE = Open for read only
//
// Returns:
//
// NOERROR - Success.
// E_FAIL - Error getting volume information.
// DQC_E_INITIALIZED - Controller object already initialized.
// DQC_E_ACCESS_DENIED - Caller has insufficient access rights.
// DQC_E_INVALID_NAME - Invalid path string at pszPath.
// DQC_E_FILE_NOT_FOUND - Specified path doesn't exist.
// DQC_E_PATH_NOT_FOUND - Specified path doesn't exist.
// DQC_E_BAD_PATHNAME - Specified path name is invalid.
// DQC_E_NO_QUOTAS_FS - File system isn't NTFS.
// DQC_E_NO_QUOTAS_FSVER - File system isn't NTFS v5.0 or greater.
//
//
// IDiskQuotaControl::SetQuotaState -------------------------------------------
//
// Sets the state of the quota system. Note that not all state attributes
// can be modified. The enable/disable and track/enforce attributes can
// be modified.
//
// Arguments:
//
// dwState - DWORD containing the state to be applied to the volume.
// Use the following macros to set the proper bits in the dwState
// argument:
//
// Enable? Track? Enforce?
// --------- ------- --------
// DISKQUOTA_SET_DISABLED - No No No
// DISKQUOTA_SET_TRACKED - Yes Yes No
// DISKQUOTA_SET_ENFORCED - Yes Yes Yes
//
// Returns:
//
// NOERROR - Success.
// E_INVALIDARG - dwState value is incorrect.
// DQC_E_ACCESS_DENIED - No WRITE access to quota information.
// E_FAIL - Failed writing quota information.
//
//
// IDiskQuotaControl::GetQuotaState -------------------------------------------
//
// Retrieves a set of flags describing the state of the quota system.
//
// Arguments:
//
// pdwState - Address of DWORD to receive the state flags. The flag
// bits are defined as follows:
//
// DISKQUOTA_STATE_DISABLED - Quotas are not enabled on the volume.
//
// DISKQUOTA_STATE_TRACK - Quotas are enabled but the limit value
// is not being enforced. Users may exceed their quota limit.
//
// DISKQUOTA_STATE_ENFORCE - Quotas are enabled and the limit
// value is enforced. Users cannot exceed their quota limit.
//
// DISKQUOTA_FILESTATE_INCOMPLETE - The volume's quota information
// is out of date. Quotas are probably disabled.
//
// DISKQUOTA_FILESTATE_REBUILDING - The volume is rebuilding it's
// quota information.
//
// Returns:
//
// NOERROR - Success.
// E_POINTER - pdwState argument is NULL.
// DQC_E_ACCESS_DENIED - No READ access to quota information.
// E_FAIL - Error reading quota information.
//
//
// IDiskQuotaControl::SetQuotaLogFlags ----------------------------------------
//
// Controls the logging of user-related quota events on the volume.
// Logging consists of an entry in the volume server system's event log.
//
// Arguments:
//
// dwFlags - DWORD containing the flags to be applied to the volume.
// Use the following macros to set the proper bits in the dwFlags
// argument:
//
// DISKQUOTA_SET_LOG_USER_THRESHOLD - Turn on/off logging of
// user quota threshold violations. If set, an event log
// entry will be created when the user exceeds their assigned
// quota warning threshold.
//
// DISKQUOTA_SET_LOG_USER_LIMIT - Turn on/off logging of user
// quota limit violations. If set, an event log entry will
// be created when the user exceeds their assigned quota
// limit.
//
// Returns:
//
// NOERROR - Success.
// DQC_E_ACCESS_DENIED - No WRITE access to quota information.
// E_FAIL - Failed writing quota information.
//
//
// IDiskQuotaControl::GetQuotaLogFlags ----------------------------------------
//
// Retrieves the flags that control the logging of user-related quota
// events on the volume. Logging consists of an entry in the volume
// server's event log.
//
// Arguments:
//
// pdwFlags - Address of DWORD variable to receive the volume's
// quota logging flags. Use the following macros to
// interrogate the contents of the flag value:
//
// DISKQUOTA_IS_LOGGED_USER_THRESHOLD
// DISKQUOTA_IS_LOGGED_USER_LIMIT
//
// Returns:
//
// NOERROR - Success.
// E_POINTER - pdwFlags argument is NULL.
// DQC_E_ACCESS_DENIED - No READ access to quota information.
// E_FAIL - Failed reading volume quota information.
//
//
// IDiskQuotaControl::SetDefaultQuotaLimit ------------------------------------
//
// Modifies the default quota limit applied automatically to new users
// of the volume.
//
// Arguments:
//
// llLimit - Default quota limit value.
//
// Returns:
//
// NOERROR - Success.
// DQC_E_ACCESS_DENIED - No WRITE access to quota information.
// E_FAIL - Failed writing quota information.
//
//
// IDiskQuotaControl::GetDefaultQuotaLimit ------------------------------------
//
// Retrieves the default quota limit applied automatically to new users
// of the volume.
//
// Arguments:
//
// pllLimit - Address of LONGLONG variable to receive the limit value.
//
// Returns:
//
// NOERROR - Success.
// E_POINTER - pllLimit argument is NULL.
// DQC_E_ACCESS_DENIED - No READ access to quota information.
// E_FAIL - Failed reading quota information.
//
//
// IDiskQuotaControl::GetDefaultQuotaLimitText --------------------------------
//
// Retrieves the volume's default quota "limit" expressed as a text
// string (i.e. "10.5 MB"). If the volume's limit is unlimited,
// the string "No Limit" is returned (localized).
//
// Arguments:
//
// pszText - Address of character buffer to receive text.
//
// cchText - Size of destination buffer in bytes.
//
// Returns:
// NOERROR - Success.
// DQC_E_ACCESS_DENIED - No READ access to quota information.
// E_FAIL - Failed reading quota information.
//
//
// IDiskQuotaControl::SetDefaultQuotaThreshold --------------------------------
//
// Modifies the default quota warning threshold applied automatically to
// new users of the volume.
//
// Arguments:
//
// llThreshold - Default quota threshold value.
//
// Returns:
//
// NOERROR - Success.
// DQC_E_ACCESS_DENIED - No WRITE access to quota information.
// E_FAIL - Failed writing quota information.
//
//
// IDiskQuotaControl::GetDefaultQuotaThreshold --------------------------------
//
// Retrieves the default quota warning threshold applied automatically to
// new users of the volume.
//
// Arguments:
//
// pllThreshold - Address of LONGLONG variable to receive the
// warning threshold value.
//
// Returns:
//
// NOERROR - Success.
// E_POINTER - pllThreshold argument is NULL.
// DQC_E_ACCESS_DENIED - No READ access to quota information.
// E_FAIL - Failed reading quota information.
//
//
// IDiskQuotaControl::GetDefaultQuotaThresholdText ----------------------------
//
// Retrieves the volume's default quota "threshold" expressed as a text
// string (i.e. "10.5 MB"). If the volume's threshold is unlimited,
// the string "No Limit" is returned (localized).
//
// Arguments:
//
// pszText - Address of character buffer to receive text.
//
// cchText - Size of destination buffer in bytes.
//
// Returns:
// NOERROR - Success.
// DQC_E_ACCESS_DENIED - No READ access to quota information.
// E_FAIL - Failed reading quota information.
//
//
// IDiskQuotaControl::AddUserSid ----------------------------------------------
// IDiskQuotaControl::AddUserName ---------------------------------------------
//
// Adds a new quota entry on the volume for a given user. Note that
// NTFS automatically creates a user quota entry when a user first writes
// to the volume. Automatically created user entries are assigned the
// volume's default threshold and limit values. This function allows
// you to create a user quota entry before a user has written information
// to the volume. One reason for doing this might be to pre-assign
// a threshold or limit value different than the volume defaults.
//
// Arguments:
//
// pUserSid - Address of buffer containing user's security ID (SID).
//
// pszDomain - Address of user's domain name string.
//
// pszName - Address of user's account name string.
// If pszDomain points to a blank string, it is assumed that
// pszName points to a fully-qualified "Domain\Account" string.
//
// fNameResolution - Flag indicating how the user's account information
// is to be obtained. The volume's quota information contains
// only security IDs for identifying users. The user's account
// information such as domain name, account name and full user
// name must be obtained from the network domain controller, or
// the local machine if the machine is not networked. This
// information may be obtained synchronously, asynchronously or
// not at all.
// Specify one of the following values in this argument:
//
// DISKQUOTA_USERNAME_RESOLVE_NONE - Do not resolve user account
// information.
//
// DISKQUOTA_USERNAME_RESOLVE_SYNC - Resolve user account
// information synchronously. AddUser will not return until
// the information has been resolved. If the information
// is present in the disk quota SID cache, the return of
// information will be immediate. If not cached, the
// function can take a considerable amount of time to
// locate the user's information. This period is dependent
// upon many network-related factors. It can be on the
// order of several seconds.
//
// DISKQUOTA_USERNAME_RESOLVE_ASYNC - Resolve user account
// information asynchronously. AddUser will return
// immediately. The caller must implement
// IDiskQuotaUserEvents to receive notification when the
// account information is available. This option causes
// the user object to be placed on a queue. This queue
// is serviced by a thread dedicated to obtaining account
// information for disk quota users on the volume. If the
// information has been cached from a previous request,
// the notification occurs as soon as the object is serviced.
// If the information is not cached, the thread obtains
// the information from the network domain controller and
// then notifies IDiskQuotaUserEvents that the operation
// is complete.
//
// ppUser - Address of IDiskQuotaUser pointer variable to receive
// the interface pointer of the newly created quota user object.
//
//
// Returns:
//
// SUCCESS - Success.
// E_OUTOFMEMORY - Insufficient memory.
// S_FALSE - User already exists. Not added.
// E_POINTER - Pointer argument was NULL.
// DQC_E_USER_UNKNOWN - User name provided is unknown.
//
//
// IDiskQuotaControl::FindUserSid ---------------------------------------------
//
// Locates a specific user entry in the volume's quota information.
// The user's security ID (SID) is used as the search key.
//
// Arguments:
//
// pUserSid - Address of buffer containing user's security ID (SID).
//
// fNameResolution - Flag indicating how the user's account information
// is to be resolved. See description in AddUser for details.
//
// ppUser - Address of IDiskQuotaUser pointer variable to receive
// the interface pointer of the quota user object for the user.
//
// Returns:
// NOERROR - Success.
// E_FAIL - User not found in volume's quota information.
// E_POINTER - Either pUserSid or ppUser was NULL.
// E_OUTOFMEMORY - Insufficient memory.
// DQC_E_INVALID_SID - SID pointed to by pUserSid is invalid.
// DQC_E_ACCESS_DENIED - No READ access to quota information.
//
// >>>>>>>>> IMPORTANT NOTE <<<<<<<<<
//
// This method will return a user object even if there is no quota
// record for the user in the quota file. While that may sound
// strange, it is consistent with the idea of automatic user addition
// and default quota settings. If there is currently no quota entry
// for the requested user, and the user would be added to the quota
// file if they were to request disk space, the returned user object
// will have a quota threshold and limit equal to the volume defaults.
//
//
// IDiskQuotaControl::FindUserName --------------------------------------------
//
// Locates a specific entry in the volume's quota information.
// The user's domain and account name are used as the search key.
// This method can take some time as it may need to resolve the name to
// a security ID. See note for FindUserSid (above) concerning behavior
// when an entry for the user does not exist.
//
// Arguments:
//
// pszDomain - Address of buffer containing user's domain name string.
//
// pszName - Address of buffer containing user's account name string.
//
// ppUser - Address of IDiskQuotaUser pointer variable to receive
// the interface pointer of the quota user object for the user.
//
// fNameResolution - Flag indicating how the user's account information
// is to be resolved. See description in AddUser for details.
//
// Returns:
// NOERROR - Success.
// E_FAIL - User not found in volume's quota information.
// E_POINTER - Either pUserSid or ppUser was NULL.
// E_OUTOFMEMORY - Insufficient memory.
// DQC_E_INVALID_SID - SID pointed to by pUserSid is invalid.
// DQC_E_ACCESS_DENIED - No READ access to quota information.
// DQC_E_NO_SID_MAPPING- Could not map account name to a security ID.
//
//
// IDiskQuotaControl::DeleteUser ----------------------------------------------
//
// Removes a user entry from the volume's quota information file if the
// user's charged quota amount is 0 bytes. This function doesn't actually
// remove the quota entry from the volume. It marks the entry for
// deletion. NTFS performs the actual deletion at a later point in time.
// Following a call to DeleteUser, the IDiskQuotaUser interface is still
// active. This function does not delete the user object from memory.
// You must still call IUnknown::Release() on the user object to
// release it.
//
// Arguments:
//
// pUser - Pointer to IDiskQuotaUser interface of quota user who's
// quota record is marked for deletion.
//
// Returns:
//
// NOERROR - Success.
// E_POINTER - pUser argument was NULL.
// E_FAIL - Error marking entry for deletion.
// DQC_E_USER_HAS_FILES - Couldn't delete. User still has file(s) on
// the volume.
// DQC_E_ACCESS_DENIED - Insufficient access.
//
//
// IDiskQuotaControl::CreateEnumUsers -----------------------------------------
//
// Creates an enumerator object for enumerating quota users on the volume.
// The object created implements the IEnumDiskQuotaUsers interface.
// The object created supports the standard OLE IEnumXXXX functions.
//
// Arguments:
//
// rgpUserSids - Array of security ID (SID) pointers representing the
// user objects to be included in the enumeration. If this
// value is NULL, all user entries are enumerated.
//
// cpSids - Number of items in the rgpUserSids array. Ignored if
// rgpUserSids is NULL.
//
//
// ppEnum - Address of IEnumDiskQuotaUsers pointer variable to receive
// the address of the new enumerator.
//
// fNameResolution - Flag indicating how the account information for
// enumerated users is to be resolved. See description in
// AddUser for details.
//
// Returns:
// NOERROR - Success.
// E_POINTER - ppEnum argument is NULL.
// E_OUTOFMEMORY - Insufficient memory.
// DQC_E_ACCESS_DENIED - Insufficient access rights.
//
//
// IDiskQuotaControl::CreateUserBatch -----------------------------------------
//
// Creates a batching object for optimizing updates to the quota settings
// of multiple users simultaneously. See IDiskQuotaUserBatch for details.
//
// Arguments:
//
// ppBatch - Address of IDiskQuotaUserBatch pointer variable to
// receive the IDiskQuotaUserBatch interface pointer.
//
// Returns:
//
// NOERROR - Success.
// E_POINTER - ppBatch argument is NULL.
// E_OUTOFMEMORY - Insufficient memory to create batch object.
// DQC_E_ACCESS_DENIED - Insufficient access rights.
//
//
// IDiskQuotaControl::InvalidateSidNameCache ----------------------------------
//
// Invalidates the contents of the system's SID-Name cache so that
// subsequent requests for new user objects (IEnumDiskQuotaUsers::Next,
// IDiskQuotaControl::FindUserSid and IDiskQuotaControl::FindUserName)
// must obtain user names from the network domain controller. As names
// are obtained, they are again cached.
//
// In general there is no reason to call this method. It is included to
// provide a method for programmatically refreshing the entire SID-name
// cache.
//
// Arguments: None.
//
// Returns:
//
// NOERROR - Success.
// E_FAIL - SID/Name cache not available or couldn't obtain
// exclusive lock on cache.
//
//
// IDiskQuotaControl::GiveUserNameResolutionPriority --------------------------
//
// By default, quota user objects are serviced in the resolution queue in
// the order they were placed into the queue. This function will promote
// a specified user object to the head of the queue so that it is next in
// line for resolution.
//
// Arguments:
//
// pUser - Address of user object's IDiskQuotaUser interface.
//
// Returns:
//
// NOERROR - Success.
// S_FALSE - Quota user object not in resolver queue.
// E_UNEXPECTED - Unexpected error. Caught an exception or the
// Sid-Name resolver hasn't been created.
//
//
// IDiskQuotaControl::ShutdownNameResolution ----------------------------------
//
// The SID-Name resolver runs on a background thread to translate
// user security IDs to user names. When a quota control object is
// destroyed, this thread automatically terminates. If you have a
// situation where you're finished with the quota control object and
// it is not be ready to be destroyed (other open ref counts),
// this method may be called to shut down the background thread before
// the object is destroyed. Note that asynchronous name resolution will
// also cease once the thread terminates. A subsequent call to
// CreateEnumUsers, AddUserSid, AddUserName, FindUserSid or FindUserName
// may re-create the resolver thread.
//
// Arguments: None.
//
// Returns : Only returns NOERROR.
//
///////////////////////////////////////////////////////////////////////////////
#undef INTERFACE
#define INTERFACE IDiskQuotaControl
DECLARE_INTERFACE_(IDiskQuotaControl, IConnectionPointContainer)
{
STDMETHOD(Initialize)(THIS_
LPCWSTR pszPath,
BOOL bReadWrite) PURE;
STDMETHOD(SetQuotaState)(THIS_
DWORD dwState) PURE;
STDMETHOD(GetQuotaState)(THIS_
LPDWORD pdwState) PURE;
STDMETHOD(SetQuotaLogFlags)(THIS_
DWORD dwFlags) PURE;
STDMETHOD(GetQuotaLogFlags)(THIS_
LPDWORD pdwFlags) PURE;
STDMETHOD(SetDefaultQuotaThreshold)(THIS_
LONGLONG llThreshold) PURE;
STDMETHOD(GetDefaultQuotaThreshold)(THIS_
PLONGLONG pllThreshold) PURE;
STDMETHOD(GetDefaultQuotaThresholdText)(THIS_
LPWSTR pszText,
DWORD cchText) PURE;
STDMETHOD(SetDefaultQuotaLimit)(THIS_
LONGLONG llLimit) PURE;
STDMETHOD(GetDefaultQuotaLimit)(THIS_
PLONGLONG pllLimit) PURE;
STDMETHOD(GetDefaultQuotaLimitText)(THIS_
LPWSTR pszText,
DWORD cchText) PURE;
STDMETHOD(AddUserSid)(THIS_
PSID pUserSid,
DWORD fNameResolution,
PDISKQUOTA_USER *ppUser) PURE;
STDMETHOD(AddUserName)(THIS_
LPWSTR pszDomain,
LPWSTR pszName,
DWORD fNameResolution,
PDISKQUOTA_USER *ppUser) PURE;
STDMETHOD(DeleteUser)(THIS_
PDISKQUOTA_USER pUser) PURE;
STDMETHOD(FindUserSid)(THIS_
PSID pUserSid,
DWORD fNameResolution,
PDISKQUOTA_USER *ppUser) PURE;
STDMETHOD(FindUserName)(THIS_
LPCWSTR pszDomain,
LPCWSTR pszName,
PDISKQUOTA_USER *ppUser) PURE;
STDMETHOD(CreateEnumUsers)(THIS_
PSID *rgpUserSids,
DWORD cpSids,
DWORD fNameResolution,
PENUM_DISKQUOTA_USERS *ppEnum) PURE;
STDMETHOD(CreateUserBatch)(THIS_
PDISKQUOTA_USER_BATCH *ppBatch) PURE;
STDMETHOD(InvalidateSidNameCache)(THIS) PURE;
STDMETHOD(GiveUserNameResolutionPriority)(THIS_
PDISKQUOTA_USER pUser) PURE;
STDMETHOD(ShutdownNameResolution)(THIS_
VOID) PURE;
};
typedef IDiskQuotaControl DISKQUOTA_CONTROL, *PDISKQUOTA_CONTROL;
///////////////////////////////////////////////////////////////////////////////
// IDiskQuotaEvents interface
//
// A client must implement this interface as an OLE event sink in order to
// receive quota-related event notifications such as asynchronous account
// name resolution.
//
// IDiskQuotaEvents::OnUserNameChanged ----------------------------------------
//
// Notifies client's connection sink whenever a user's SID has been
// asynchronously resolved so that the user's domain, account and full
// name strings are available in the quota user object.
//
// Arguments:
//
// pUser - Address of IDiskQuotaUser interface for quota user object.
// It is not necessary to call Release() on this pointer.
// The DiskQuotaControl object controls the lifetime of the
// user object.
//
// Returns: Return value is ignored.
//
///////////////////////////////////////////////////////////////////////////////
#undef INTERFACE
#define INTERFACE IDiskQuotaEvents
DECLARE_INTERFACE_(IDiskQuotaEvents, IUnknown)
{
STDMETHOD(OnUserNameChanged)(THIS_
PDISKQUOTA_USER pUser) PURE;
};
typedef IDiskQuotaEvents DISKQUOTA_EVENTS, *PDISKQUOTA_EVENTS;
///////////////////////////////////////////////////////////////////////////////
// DiskQuotaEventSink
//
// Declaration for a class that implements IDiskQuotaEvents. A client may
// implement this class as it is declared or create their own class. The only
// requirement is that it implement IDiskQuotaEvents as an OLE connection
// point. See the SDK documentation for details on OLE connection points and
// OLE connection point containers.
//
///////////////////////////////////////////////////////////////////////////////
class DiskQuotaEventSink : public IDiskQuotaEvents
{
private:
LONG m_cRef; // Interface reference count.
public:
DWORD m_dwCookie; // Connection point cookie.
DiskQuotaEventSink(VOID);
~DiskQuotaEventSink(VOID);
//
// IUnknown methods.
//
STDMETHODIMP QueryInterface(REFIID, LPVOID *);
STDMETHODIMP_(ULONG) AddRef(VOID);
STDMETHODIMP_(ULONG) Release(VOID);
//
// IDiskQuotaEvents
//
STDMETHODIMP OnUserNameChanged(PDISKQUOTA_USER pUser);
};
///////////////////////////////////////////////////////////////////////////////
// Error codes specific to the public disk quota interfaces.
// "DQC" = Disk Quota Control
///////////////////////////////////////////////////////////////////////////////
//
// Security ID for user is invalid.
//
#define DQC_E_INVALID_SID MAKE_HRESULT(SEVERITY_ERROR, \
FACILITY_ITF, \
ERROR_INVALID_SID)
//
// Insufficient memory to complete operation.
//
#define DQC_E_INSUFFICIENT_BUFFER MAKE_HRESULT(SEVERITY_ERROR, \
FACILITY_ITF, \
ERROR_INSUFFICIENT_BUFFER)
//
// An operation/capability is not supported.
//
#define DQC_E_NOT_SUPPORTED MAKE_HRESULT(SEVERITY_ERROR, \
FACILITY_ITF, \
ERROR_NOT_SUPPORTED)
//
// No access to perform the requested operation.
//
#define DQC_E_ACCESS_DENIED MAKE_HRESULT(SEVERITY_ERROR, \
FACILITY_ITF, \
ERROR_ACCESS_DENIED)
//
// Requested file or object not found.
//
#define DQC_E_FILE_NOT_FOUND MAKE_HRESULT(SEVERITY_ERROR, \
FACILITY_ITF, \
ERROR_FILE_NOT_FOUND)
//
// Requested file path not found.
//
#define DQC_E_PATH_NOT_FOUND MAKE_HRESULT(SEVERITY_ERROR, \
FACILITY_ITF, \
ERROR_PATH_NOT_FOUND)
//
// Requested file path is invalid.
//
#define DQC_E_INVALID_NAME MAKE_HRESULT(SEVERITY_ERROR, \
FACILITY_ITF, \
ERROR_INVALID_NAME)
//
// Requested file path is invalid.
//
#define DQC_E_BAD_PATHNAME MAKE_HRESULT(SEVERITY_ERROR, \
FACILITY_ITF, \
ERROR_BAD_PATHNAME)
//
// Failed to obtain exclusive lock on a shared resource.
//
#define DQC_E_LOCK_FAILED MAKE_HRESULT(SEVERITY_ERROR, \
FACILITY_ITF, \
ERROR_LOCK_FAILED)
//
// No mapping available for security ID to user name.
//
#define DQC_E_NO_SID_MAPPING MAKE_HRESULT(SEVERITY_ERROR, \
FACILITY_ITF, \
ERROR_NONE_MAPPED)
//
// No more items in enumeration.
//
#define DQC_S_NO_MORE_ITEMS MAKE_HRESULT(SEVERITY_SUCCESS, \
FACILITY_ITF, \
ERROR_NO_MORE_ITEMS)
//
// User owns files on volume.
//
#define DQC_E_USER_HAS_FILES MAKE_HRESULT(SEVERITY_ERROR, \
FACILITY_ITF, \
0x8002)
//
// File system doesn't support quotas.
// Currently, must be NTFS.
//
#define DQC_E_NO_QUOTAS_FS MAKE_HRESULT(SEVERITY_ERROR, \
FACILITY_ITF, \
0x8003)
//
// File system version doesn't support quotas.
// Currently, must be NTFS 5.0 or greater.
//
#define DQC_E_NO_QUOTAS_FSVER MAKE_HRESULT(SEVERITY_ERROR, \
FACILITY_ITF, \
0x8004)
//
// Object has already been initialized.
// Multiple initialization is not allowed.
//
#define DQC_E_INITIALIZED MAKE_HRESULT(SEVERITY_ERROR, \
FACILITY_ITF, \
0x8005)
//
// Object has not been initialized.
// Initialization must be completed before operation can be performed.
//
#define DQC_E_NOT_INITIALIZED MAKE_HRESULT(SEVERITY_ERROR, \
FACILITY_ITF, \
0x8006)
//
// Specified user is unknown.
//
#define DQC_E_USER_UNKNOWN MAKE_HRESULT(SEVERITY_ERROR, \
FACILITY_ITF, \
0x8007)
//=============================================================================
//=============================================================================
// ActiveX Control Description
//=============================================================================
//=============================================================================
//
// DSKQUOTA.DLL also provides an ActiveX control that performs much of the
// functionality found in the vtable interfaces IDiskQuotaControl,
// IDiskQuotaUser and IDiskQuotaEvents.
//
// The following section describes the properties and methods for each
// OLE automation interface supported.
//
// ActiveX object ProgID = "Microsoft.DiskQuota.1"
// ActiveX object CLSID = {7988B571-EC89-11cf-9C00-00AA00A14F56}
// Type library CLSID = {7988B57C-EC89-11cf-9C00-00AA00A14F56}
//
// The object supports 3 automation-compatible interfaces:
//
// IID_DIDiskQuotaControl [default]
// IID_DIDiskQuotaUser
// IID_DIDiskQuotaControlEvents [default, source]
//
//
// ----------------------------------------------------------------------------
// IID_DIDiskQuotaControl - Disk Quota Controller
//
// This interface is the default controlling interface for the DiskQuota
// ActiveX component. It implements much the same functionality as
// the vtable interface IDiskQuotaControl.
//
// Properties:
//
// QuotaState
//
// Desc: The "state" of NTFS disk quotas on the volume.
// The state can be either "disabled", "tracking quota usage"
// or "enforcing quota limits". Enforcement implies
// tracking.
//
// Type: QuotaStateConstants (enumeration)
//
// Domain: dqStateDisable (0)
// qsStateTrack (1)
// qsStateEnforce (2)
//
// QuotaFileIncomplete (read only)
//
// Desc: Determines if the quota file on the volume is marked
// as "incomplete". An incomplete volume is usually the
// result of a disabled quota system.
//
// Type: VARIANT_BOOL
//
// Domain: True/False
//
// QuotaFileRebuilding (read only)
//
// Desc: Determines if the quota file on the volume is being
// rebuilt. Rebuilding automatically occurs whenever
// quotas are enabled on the system or when one or more
// user entries are marked for deletion.
//
// Type: VARIANT_BOOL
//
// Domain: True/False
//
// LogQuotaThreshold
//
// Desc: Indicates if a system event log entry should be created
// whenever a user exceeds their assigned quota warning
// threshold.
//
// Type: VARIANT_BOOL
//
// Domain: True/False
//
// LogQuotaLimit
//
// Desc: Indicates if a system event log entry should be created
// whenever a user exceeds their assigned quota limit.
//
// Type: VARIANT_BOOL
//
// Domain: True/False
//
// DefaultQuotaThreshold
//
// Desc: The default warning threshold value assigned to new users
// of the volume.
//
// Type: double
//
// Domain: Value is expressed in bytes.
//
// DefaultQuotaThresholdText (read only)
//
// Desc: The default threshold value expressed as a text
// string suitable for display. The recipient of
// the string is responsible for deleting the string
// using SysFreeString().
//
// Type: BSTR
//
// Domain: Threshold value formatted as a decimal number
// and appended with a units suffix.
//
// i.e.: "10.5 MB"
// "No Limit" if unlimited.
//
// DefaultQuotaLimit
//
// Desc: The default quota limit value assigned to new users
// of the volume.
//
// Type: double
//
// Domain: Value is expressed in bytes.
// -1 is special case meaning "no limit".
//
// DefaultQuotaLimitText (read only)
//
// Desc: The default quota limit value expressed as a text
// string suitable for display. The recipient of
// the string is responsible for deleting the string
// using SysFreeString().
//
// Type: BSTR
//
// Domain: Limit value formatted as a decimal number
// and appended with a units suffix.
//
// i.e.: "10.5 MB"
// "No Limit" if unlimited.
//
// UserNameResolution
//
// Desc: Controls the behavior of the security ID-to-Name
// resolution processing. The process may be bypassed,
// performed synchronously or performed asynchronously.
// If Asynchronous name resolution is chosen, the caller
// must implement the DIDiskQuotaControlEvents dispatch
// interface to receive notification when the name has
// been resolved.
//
// Type: UserNameResolutionConstants (enumeration)
//
// Domain: dqResolveNone (0) - No name information
// dqResolveSync (1) - Resolve synchronously
// dqResolveAsync (2) - Resolve asynchronously
//
// Methods:
//
// Initialize
//
// Desc: Initializes a DiskQuota object for a given NTFS volume.
// This method must be called before any other methods.
// If unsuccessful, any other method calls will return
// DQC_E_NOT_INITIALIZED.
//
// >>>>>> NOTE <<<<<<<
//
// Accessing quota information on remote volumes is not
// supported for NT5 Beta 1. Remote volume support will be
// added after Beta 1.
//
//
// Arguments:
// pPath [in] - Contains path of volume to initialize.
//
// Type: BSTR
//
// Domain: To obtain WRITE access, this string must be
// "\\.\X" where 'X' is the drive letter for the
// volume. If only READ access is desired, the
// path may be simply "X:\"
//
// bReadWrite [in] - Indicates if "write" access is desired.
//
// Type: VARIANT_BOOL
//
// Domain: False = Read-only
// True = Read-Write
//
// Returns: Nothing.
//
// Errors: See IDiskQuotaControl::Initialize.
//
//
// AddUser
//
// Desc: Add a new user entry to the volume's quota file.
// If the user already exists, the object for the existing
// user is returned.
//
// Arguments:
// pDomain [in] - User's account domain name.
//
// Type: BSTR
//
// Domain: Windows NT domain names.
//
// pName [in] - User's account name. If pDomain is a blank string,
// pName is assumed to contain a fully-qualified
// "Domain\Account" combination.
//
// Type: BSTR
//
// Domain: Windows NT user account names.
//
// Returns:
// Reference to newly added user object (DIDiskQuotaUser).
//
// Errors: See IDiskQuotaControl::AddUserName
//
//
// DeleteUser
//
// Arguments:
// pUser [in] - Reference to user object to be marked for deletion.
//
// Type: DIDiskQuotaUser
//
// Domain: Pointer to DIDiskQuotaUser interface.
//
// Returns: Nothing
//
// Errors: See IDiskQuotaControl::DeleteUser
//
//
// FindUser
//
// Desc: Locate user entry in the volume's quota file.
//
// Arguments:
// pDomain [in] - User's account domain name.
//
// Type: BSTR
//
// Domain: Windows NT domain names.
//
// pName [in] - User's account name.
//
// Type: BSTR
//
// Domain: Windows NT user account names.
//
// Returns:
// Reference to located user object (DIDiskQuotaUser).
//
// Errors: See IDiskQuotaControl::FindUserName
//
//
// InvalidateSidNameCache
//
// Desc: Invalidates the contents of the Security ID-User name
// cache. Following cache invalidation, subsequent
// creations of user objects will need resolve and
// re-cache account information.
//
// Arguments: None
//
// Returns: Nothing
//
// Errors: See IDiskQuotaControl::InvalidateSidNameCache
//
//
// GiveUserNameResolutionPriority
//
// Desc: When UserNameResolution is dqResolveAsync,
// user entry objects with unresolved security IDs are
// automatically placed on a queue, waiting to be
// resolved. The resolution process occurs on a background
// thread. Normally objects are processed on a FIFO
// basis (queue). This method moves the specified user
// object to the front of the line so to speak. This
// can be helpful when a user interface is being
// updated dynamically through IDiskQuotaControlEvent
// notifications.
//
// Arguments:
// pUser - Reference to user object to be promoted.
//
// Returns: Nothing.
//
// Errors: See IDiskQuotaControl::GiveUserNameResolutionPriority
//
//
// ShutdownNameResolution
//
// Desc: The SID-Name resolver runs on a background thread to
// translate user security IDs to user names. When a quota
// control object is destroyed, this thread automatically
// terminates. In situations where you're finished
// with the quota control object and it is not be ready to be
// destroyed (i.e. other open ref counts), this method may be
// called to shut down the background thread before the object
// is destroyed. Note that asynchronous name resolution will
// also cease once the thread terminates. A subsequent call
// to CreateEnumUsers, AddUserSid, AddUserName, FindUserSid or
// FindUserName may re-create the resolver thread.
//
// Arguments: None.
//
// Returns : Nothing.
//
// Errors: None.
//
//
// ----------------------------------------------------------------------------
// IID_DIDiskQuotaUser - Disk Quota user entry object.
//
// This interface represents a user entry in a volume's quota information.
// It implements much the same functionality as the vtable interface
// IDiskQuotaUser. Disk Quota user objects can only be created through
// a Disk Quota controller object (enumeration, AddUser, FindUser etc).
//
// Properties:
//
// DomainName (read only)
//
// Desc: The domain name for the user's account.
//
// Type: BSTR
//
// Domain: Windows NT network domain names.
//
// AccountName (read only)
//
// Desc: The account name for the user's account.
//
// Type: BSTR
//
// Domain: Windows NT network account names.
//
// Name (read only)
//
// Desc: The "friendly" name for the user's account.
//
// Type: BSTR
//
// Domain: Whatever string is assigned to the account.
//
// QuotaThreshold
//
// Desc: The user's quota warning threshold.
//
// Type: double
//
// Domain: Value expressed in bytes.
//
// QuotaThresholdText (read only)
//
// Desc: User's threshold value formatted as a decimal number
// and appended with a units suffix.
//
// Type: BSTR
//
// Domain: i.e. "10.5 MB"
// "No Limit" if unlimited.
//
// QuotaLimit
//
// Desc: The user's quota limit.
//
// Type: double
//
// Domain: Value expressed in bytes.
//
// QuotaLimitText (read only)
//
// Desc: User's limit value formatted as a decimal number
// and appended with a units suffix.
//
// Type: BSTR
//
// Domain: i.e. "10.5 MB"
// "No Limit" if unlimited.
//
// AccountStatus (read only)
//
// Desc: Status of the user's account information.
//
// Type: AccountStatusConstants (enumeration)
//
// Domain: dqAcctResolved (0) - Name information available
// dqAcctUnavailable (1) - Can't get name information
// dqAcctDeleted (2) - Account has been deleted
// dqAcctInvalid (3) - Account is invalid
// dqAcctUnknown (4) - Account is not known
// dqAcctUnresolved (5) - Name information not yet resolved
//
// Methods:
//
// Invalidate
//
// Desc: Invalidates the information cached in the user object.
// Following a call to Invalidate, the next call for
// a quota-related property refreshes the information from
// the NTFS volume.
//
// Arguments: None.
//
// Returns: Nothing.
//
// Errors: None. Always returns S_OK.
//
//
// ----------------------------------------------------------------------------
// IID_DIDiskQuotaControlEvents - Disk Quota Controller Events source.
//
// This interface is the default source interface for the DiskQuota
// ActiveX component. It is not implemented in the DiskQuota object. It
// merely describes the interface that must be implemented by clients if they
// are to receive user-name-update notifications for asynchronous resolution
// of user object name information.
//
// Properties: None.
//
// Methods:
//
// OnUserNameChanged
//
// Desc: Called by the DiskQuota object whenever an asynchronous
// name resolution operation has completed for a single user
// object. This notification indicates that the user's
// DomainName, AccountName and Name properties contain
// valid information.
// It is not necessary to call Release() on this pointer.
// The DiskQuotaControl object controls the lifetime of the
// user object.
//
// Arguments:
// pUser - Reference to the user object associated with the event.
//
// Returns: Ignored by DiskQuota object.
//
// Errorrs: Ignored by DiskQuota object.
//
//
#endif // __DSKQUOTA_H