/*** Autogenerated by WIDL 10.8 from include/fsrmquota.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __fsrmquota_h__
#define __fsrmquota_h__

/* Forward declarations */

#ifndef __IFsrmQuotaManager_FWD_DEFINED__
#define __IFsrmQuotaManager_FWD_DEFINED__
typedef interface IFsrmQuotaManager IFsrmQuotaManager;
#ifdef __cplusplus
interface IFsrmQuotaManager;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmQuotaTemplateManager_FWD_DEFINED__
#define __IFsrmQuotaTemplateManager_FWD_DEFINED__
typedef interface IFsrmQuotaTemplateManager IFsrmQuotaTemplateManager;
#ifdef __cplusplus
interface IFsrmQuotaTemplateManager;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmQuotaBase_FWD_DEFINED__
#define __IFsrmQuotaBase_FWD_DEFINED__
typedef interface IFsrmQuotaBase IFsrmQuotaBase;
#ifdef __cplusplus
interface IFsrmQuotaBase;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmQuotaObject_FWD_DEFINED__
#define __IFsrmQuotaObject_FWD_DEFINED__
typedef interface IFsrmQuotaObject IFsrmQuotaObject;
#ifdef __cplusplus
interface IFsrmQuotaObject;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmQuotaTemplate_FWD_DEFINED__
#define __IFsrmQuotaTemplate_FWD_DEFINED__
typedef interface IFsrmQuotaTemplate IFsrmQuotaTemplate;
#ifdef __cplusplus
interface IFsrmQuotaTemplate;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmQuota_FWD_DEFINED__
#define __IFsrmQuota_FWD_DEFINED__
typedef interface IFsrmQuota IFsrmQuota;
#ifdef __cplusplus
interface IFsrmQuota;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmAutoApplyQuota_FWD_DEFINED__
#define __IFsrmAutoApplyQuota_FWD_DEFINED__
typedef interface IFsrmAutoApplyQuota IFsrmAutoApplyQuota;
#ifdef __cplusplus
interface IFsrmAutoApplyQuota;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmQuotaManagerEx_FWD_DEFINED__
#define __IFsrmQuotaManagerEx_FWD_DEFINED__
typedef interface IFsrmQuotaManagerEx IFsrmQuotaManagerEx;
#ifdef __cplusplus
interface IFsrmQuotaManagerEx;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmQuotaTemplateImported_FWD_DEFINED__
#define __IFsrmQuotaTemplateImported_FWD_DEFINED__
typedef interface IFsrmQuotaTemplateImported IFsrmQuotaTemplateImported;
#ifdef __cplusplus
interface IFsrmQuotaTemplateImported;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <oaidl.h>
#include <fsrmenums.h>
#include <fsrm.h>

#ifdef __cplusplus
extern "C" {
#endif

#include <winapifamily.h>

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
#ifndef __IFsrmAutoApplyQuota_FWD_DEFINED__
#define __IFsrmAutoApplyQuota_FWD_DEFINED__
typedef interface IFsrmAutoApplyQuota IFsrmAutoApplyQuota;
#ifdef __cplusplus
interface IFsrmAutoApplyQuota;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmQuota_FWD_DEFINED__
#define __IFsrmQuota_FWD_DEFINED__
typedef interface IFsrmQuota IFsrmQuota;
#ifdef __cplusplus
interface IFsrmQuota;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmQuotaBase_FWD_DEFINED__
#define __IFsrmQuotaBase_FWD_DEFINED__
typedef interface IFsrmQuotaBase IFsrmQuotaBase;
#ifdef __cplusplus
interface IFsrmQuotaBase;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmQuotaObject_FWD_DEFINED__
#define __IFsrmQuotaObject_FWD_DEFINED__
typedef interface IFsrmQuotaObject IFsrmQuotaObject;
#ifdef __cplusplus
interface IFsrmQuotaObject;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmQuotaManager_FWD_DEFINED__
#define __IFsrmQuotaManager_FWD_DEFINED__
typedef interface IFsrmQuotaManager IFsrmQuotaManager;
#ifdef __cplusplus
interface IFsrmQuotaManager;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmQuotaTemplate_FWD_DEFINED__
#define __IFsrmQuotaTemplate_FWD_DEFINED__
typedef interface IFsrmQuotaTemplate IFsrmQuotaTemplate;
#ifdef __cplusplus
interface IFsrmQuotaTemplate;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmQuotaTemplateImported_FWD_DEFINED__
#define __IFsrmQuotaTemplateImported_FWD_DEFINED__
typedef interface IFsrmQuotaTemplateImported IFsrmQuotaTemplateImported;
#ifdef __cplusplus
interface IFsrmQuotaTemplateImported;
#endif /* __cplusplus */
#endif

#ifndef __IFsrmQuotaTemplateManager_FWD_DEFINED__
#define __IFsrmQuotaTemplateManager_FWD_DEFINED__
typedef interface IFsrmQuotaTemplateManager IFsrmQuotaTemplateManager;
#ifdef __cplusplus
interface IFsrmQuotaTemplateManager;
#endif /* __cplusplus */
#endif

typedef LONG FSRM_QUOTA_THRESHOLD;
#define FSRM_DISPID_QUOTA_BASE (FSRM_DISPID_FEATURE_QUOTA | 0x100000)

#define FSRM_DISPID_QUOTA_OBJECT (FSRM_DISPID_QUOTA_BASE | 0x10000)

#define FSRM_DISPID_QUOTA (FSRM_DISPID_QUOTA_OBJECT | 0x1000)

#define FSRM_DISPID_AUTOAPPLYQUOTA (FSRM_DISPID_QUOTA_OBJECT | 0x2000)

#define FSRM_DISPID_QUOTA_TEMPLATE (FSRM_DISPID_QUOTA_BASE | 0x20000)

#define FSRM_DISPID_QUOTA_TEMPLATE_IMPORTED (FSRM_DISPID_QUOTA_TEMPLATE | 0x1000)

#define FSRM_DISPID_QUOTA_MANAGER (FSRM_DISPID_FEATURE_QUOTA | 0x200000)

#define FSRM_DISPID_QUOTA_TEMPLATE_MANAGER (FSRM_DISPID_FEATURE_QUOTA | 0x300000)

#define FSRM_DISPID_QUOTA_MANAGER_EX (FSRM_DISPID_FEATURE_QUOTA | 0x400000)

#define FsrmMaxNumberThresholds (16)

#define FsrmMinThresholdValue (1)

#define FsrmMaxThresholdValue (250)

#define FsrmMinQuotaLimit (1024)

#define FsrmMaxExcludeFolders (32)

/*****************************************************************************
 * IFsrmQuotaManager interface
 */
#ifndef __IFsrmQuotaManager_INTERFACE_DEFINED__
#define __IFsrmQuotaManager_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmQuotaManager, 0x8bb68c7d, 0x19d8, 0x4ffb, 0x80,0x9e, 0xbe,0x4f,0xc1,0x73,0x40,0x14);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8bb68c7d-19d8-4ffb-809e-be4fc1734014")
IFsrmQuotaManager : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_ActionVariables(
        SAFEARRAY **variables) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ActionVariableDescriptions(
        SAFEARRAY **descriptions) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateQuota(
        BSTR path,
        IFsrmQuota **quota) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateAutoApplyQuota(
        BSTR quotaTemplateName,
        BSTR path,
        IFsrmAutoApplyQuota **quota) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetQuota(
        BSTR path,
        IFsrmQuota **quota) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAutoApplyQuota(
        BSTR path,
        IFsrmAutoApplyQuota **quota) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRestrictiveQuota(
        BSTR path,
        IFsrmQuota **quota) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumQuotas(
        BSTR path,
        FsrmEnumOptions options,
        IFsrmCommittableCollection **quotas) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumAutoApplyQuotas(
        BSTR path,
        FsrmEnumOptions options,
        IFsrmCommittableCollection **quotas) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumEffectiveQuotas(
        BSTR path,
        FsrmEnumOptions options,
        IFsrmCommittableCollection **quotas) = 0;

    virtual HRESULT STDMETHODCALLTYPE Scan(
        BSTR strPath) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateQuotaCollection(
        IFsrmCommittableCollection **collection) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmQuotaManager, 0x8bb68c7d, 0x19d8, 0x4ffb, 0x80,0x9e, 0xbe,0x4f,0xc1,0x73,0x40,0x14)
#endif
#else
typedef struct IFsrmQuotaManagerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IFsrmQuotaManager *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IFsrmQuotaManager *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IFsrmQuotaManager *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IFsrmQuotaManager *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IFsrmQuotaManager *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IFsrmQuotaManager *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IFsrmQuotaManager *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IFsrmQuotaManager methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ActionVariables)(
        IFsrmQuotaManager *This,
        SAFEARRAY **variables);

    HRESULT (STDMETHODCALLTYPE *get_ActionVariableDescriptions)(
        IFsrmQuotaManager *This,
        SAFEARRAY **descriptions);

    HRESULT (STDMETHODCALLTYPE *CreateQuota)(
        IFsrmQuotaManager *This,
        BSTR path,
        IFsrmQuota **quota);

    HRESULT (STDMETHODCALLTYPE *CreateAutoApplyQuota)(
        IFsrmQuotaManager *This,
        BSTR quotaTemplateName,
        BSTR path,
        IFsrmAutoApplyQuota **quota);

    HRESULT (STDMETHODCALLTYPE *GetQuota)(
        IFsrmQuotaManager *This,
        BSTR path,
        IFsrmQuota **quota);

    HRESULT (STDMETHODCALLTYPE *GetAutoApplyQuota)(
        IFsrmQuotaManager *This,
        BSTR path,
        IFsrmAutoApplyQuota **quota);

    HRESULT (STDMETHODCALLTYPE *GetRestrictiveQuota)(
        IFsrmQuotaManager *This,
        BSTR path,
        IFsrmQuota **quota);

    HRESULT (STDMETHODCALLTYPE *EnumQuotas)(
        IFsrmQuotaManager *This,
        BSTR path,
        FsrmEnumOptions options,
        IFsrmCommittableCollection **quotas);

    HRESULT (STDMETHODCALLTYPE *EnumAutoApplyQuotas)(
        IFsrmQuotaManager *This,
        BSTR path,
        FsrmEnumOptions options,
        IFsrmCommittableCollection **quotas);

    HRESULT (STDMETHODCALLTYPE *EnumEffectiveQuotas)(
        IFsrmQuotaManager *This,
        BSTR path,
        FsrmEnumOptions options,
        IFsrmCommittableCollection **quotas);

    HRESULT (STDMETHODCALLTYPE *Scan)(
        IFsrmQuotaManager *This,
        BSTR strPath);

    HRESULT (STDMETHODCALLTYPE *CreateQuotaCollection)(
        IFsrmQuotaManager *This,
        IFsrmCommittableCollection **collection);

    END_INTERFACE
} IFsrmQuotaManagerVtbl;

interface IFsrmQuotaManager {
    CONST_VTBL IFsrmQuotaManagerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmQuotaManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmQuotaManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmQuotaManager_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmQuotaManager_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmQuotaManager_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmQuotaManager_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmQuotaManager_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmQuotaManager methods ***/
#define IFsrmQuotaManager_get_ActionVariables(This,variables) (This)->lpVtbl->get_ActionVariables(This,variables)
#define IFsrmQuotaManager_get_ActionVariableDescriptions(This,descriptions) (This)->lpVtbl->get_ActionVariableDescriptions(This,descriptions)
#define IFsrmQuotaManager_CreateQuota(This,path,quota) (This)->lpVtbl->CreateQuota(This,path,quota)
#define IFsrmQuotaManager_CreateAutoApplyQuota(This,quotaTemplateName,path,quota) (This)->lpVtbl->CreateAutoApplyQuota(This,quotaTemplateName,path,quota)
#define IFsrmQuotaManager_GetQuota(This,path,quota) (This)->lpVtbl->GetQuota(This,path,quota)
#define IFsrmQuotaManager_GetAutoApplyQuota(This,path,quota) (This)->lpVtbl->GetAutoApplyQuota(This,path,quota)
#define IFsrmQuotaManager_GetRestrictiveQuota(This,path,quota) (This)->lpVtbl->GetRestrictiveQuota(This,path,quota)
#define IFsrmQuotaManager_EnumQuotas(This,path,options,quotas) (This)->lpVtbl->EnumQuotas(This,path,options,quotas)
#define IFsrmQuotaManager_EnumAutoApplyQuotas(This,path,options,quotas) (This)->lpVtbl->EnumAutoApplyQuotas(This,path,options,quotas)
#define IFsrmQuotaManager_EnumEffectiveQuotas(This,path,options,quotas) (This)->lpVtbl->EnumEffectiveQuotas(This,path,options,quotas)
#define IFsrmQuotaManager_Scan(This,strPath) (This)->lpVtbl->Scan(This,strPath)
#define IFsrmQuotaManager_CreateQuotaCollection(This,collection) (This)->lpVtbl->CreateQuotaCollection(This,collection)
#else
/*** IUnknown methods ***/
static inline HRESULT IFsrmQuotaManager_QueryInterface(IFsrmQuotaManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IFsrmQuotaManager_AddRef(IFsrmQuotaManager* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IFsrmQuotaManager_Release(IFsrmQuotaManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IFsrmQuotaManager_GetTypeInfoCount(IFsrmQuotaManager* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IFsrmQuotaManager_GetTypeInfo(IFsrmQuotaManager* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static inline HRESULT IFsrmQuotaManager_GetIDsOfNames(IFsrmQuotaManager* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static inline HRESULT IFsrmQuotaManager_Invoke(IFsrmQuotaManager* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IFsrmQuotaManager methods ***/
static inline HRESULT IFsrmQuotaManager_get_ActionVariables(IFsrmQuotaManager* This,SAFEARRAY **variables) {
    return This->lpVtbl->get_ActionVariables(This,variables);
}
static inline HRESULT IFsrmQuotaManager_get_ActionVariableDescriptions(IFsrmQuotaManager* This,SAFEARRAY **descriptions) {
    return This->lpVtbl->get_ActionVariableDescriptions(This,descriptions);
}
static inline HRESULT IFsrmQuotaManager_CreateQuota(IFsrmQuotaManager* This,BSTR path,IFsrmQuota **quota) {
    return This->lpVtbl->CreateQuota(This,path,quota);
}
static inline HRESULT IFsrmQuotaManager_CreateAutoApplyQuota(IFsrmQuotaManager* This,BSTR quotaTemplateName,BSTR path,IFsrmAutoApplyQuota **quota) {
    return This->lpVtbl->CreateAutoApplyQuota(This,quotaTemplateName,path,quota);
}
static inline HRESULT IFsrmQuotaManager_GetQuota(IFsrmQuotaManager* This,BSTR path,IFsrmQuota **quota) {
    return This->lpVtbl->GetQuota(This,path,quota);
}
static inline HRESULT IFsrmQuotaManager_GetAutoApplyQuota(IFsrmQuotaManager* This,BSTR path,IFsrmAutoApplyQuota **quota) {
    return This->lpVtbl->GetAutoApplyQuota(This,path,quota);
}
static inline HRESULT IFsrmQuotaManager_GetRestrictiveQuota(IFsrmQuotaManager* This,BSTR path,IFsrmQuota **quota) {
    return This->lpVtbl->GetRestrictiveQuota(This,path,quota);
}
static inline HRESULT IFsrmQuotaManager_EnumQuotas(IFsrmQuotaManager* This,BSTR path,FsrmEnumOptions options,IFsrmCommittableCollection **quotas) {
    return This->lpVtbl->EnumQuotas(This,path,options,quotas);
}
static inline HRESULT IFsrmQuotaManager_EnumAutoApplyQuotas(IFsrmQuotaManager* This,BSTR path,FsrmEnumOptions options,IFsrmCommittableCollection **quotas) {
    return This->lpVtbl->EnumAutoApplyQuotas(This,path,options,quotas);
}
static inline HRESULT IFsrmQuotaManager_EnumEffectiveQuotas(IFsrmQuotaManager* This,BSTR path,FsrmEnumOptions options,IFsrmCommittableCollection **quotas) {
    return This->lpVtbl->EnumEffectiveQuotas(This,path,options,quotas);
}
static inline HRESULT IFsrmQuotaManager_Scan(IFsrmQuotaManager* This,BSTR strPath) {
    return This->lpVtbl->Scan(This,strPath);
}
static inline HRESULT IFsrmQuotaManager_CreateQuotaCollection(IFsrmQuotaManager* This,IFsrmCommittableCollection **collection) {
    return This->lpVtbl->CreateQuotaCollection(This,collection);
}
#endif
#endif

#endif


#endif  /* __IFsrmQuotaManager_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFsrmQuotaTemplateManager interface
 */
#ifndef __IFsrmQuotaTemplateManager_INTERFACE_DEFINED__
#define __IFsrmQuotaTemplateManager_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmQuotaTemplateManager, 0x4173ac41, 0x172d, 0x4d52, 0x96,0x3c, 0xfd,0xc7,0xe4,0x15,0xf7,0x17);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("4173ac41-172d-4d52-963c-fdc7e415f717")
IFsrmQuotaTemplateManager : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE CreateTemplate(
        IFsrmQuotaTemplate **quotaTemplate) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTemplate(
        BSTR name,
        IFsrmQuotaTemplate **quotaTemplate) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumTemplates(
        FsrmEnumOptions options,
        IFsrmCommittableCollection **quotaTemplates) = 0;

    virtual HRESULT STDMETHODCALLTYPE ExportTemplates(
        VARIANT *quotaTemplateNamesArray,
        BSTR *serializedQuotaTemplates) = 0;

    virtual HRESULT STDMETHODCALLTYPE ImportTemplates(
        BSTR serializedQuotaTemplates,
        VARIANT *quotaTemplateNamesArray,
        IFsrmCommittableCollection **quotaTemplates) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmQuotaTemplateManager, 0x4173ac41, 0x172d, 0x4d52, 0x96,0x3c, 0xfd,0xc7,0xe4,0x15,0xf7,0x17)
#endif
#else
typedef struct IFsrmQuotaTemplateManagerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IFsrmQuotaTemplateManager *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IFsrmQuotaTemplateManager *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IFsrmQuotaTemplateManager *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IFsrmQuotaTemplateManager *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IFsrmQuotaTemplateManager *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IFsrmQuotaTemplateManager *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IFsrmQuotaTemplateManager *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IFsrmQuotaTemplateManager methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateTemplate)(
        IFsrmQuotaTemplateManager *This,
        IFsrmQuotaTemplate **quotaTemplate);

    HRESULT (STDMETHODCALLTYPE *GetTemplate)(
        IFsrmQuotaTemplateManager *This,
        BSTR name,
        IFsrmQuotaTemplate **quotaTemplate);

    HRESULT (STDMETHODCALLTYPE *EnumTemplates)(
        IFsrmQuotaTemplateManager *This,
        FsrmEnumOptions options,
        IFsrmCommittableCollection **quotaTemplates);

    HRESULT (STDMETHODCALLTYPE *ExportTemplates)(
        IFsrmQuotaTemplateManager *This,
        VARIANT *quotaTemplateNamesArray,
        BSTR *serializedQuotaTemplates);

    HRESULT (STDMETHODCALLTYPE *ImportTemplates)(
        IFsrmQuotaTemplateManager *This,
        BSTR serializedQuotaTemplates,
        VARIANT *quotaTemplateNamesArray,
        IFsrmCommittableCollection **quotaTemplates);

    END_INTERFACE
} IFsrmQuotaTemplateManagerVtbl;

interface IFsrmQuotaTemplateManager {
    CONST_VTBL IFsrmQuotaTemplateManagerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmQuotaTemplateManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmQuotaTemplateManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmQuotaTemplateManager_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmQuotaTemplateManager_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmQuotaTemplateManager_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmQuotaTemplateManager_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmQuotaTemplateManager_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmQuotaTemplateManager methods ***/
#define IFsrmQuotaTemplateManager_CreateTemplate(This,quotaTemplate) (This)->lpVtbl->CreateTemplate(This,quotaTemplate)
#define IFsrmQuotaTemplateManager_GetTemplate(This,name,quotaTemplate) (This)->lpVtbl->GetTemplate(This,name,quotaTemplate)
#define IFsrmQuotaTemplateManager_EnumTemplates(This,options,quotaTemplates) (This)->lpVtbl->EnumTemplates(This,options,quotaTemplates)
#define IFsrmQuotaTemplateManager_ExportTemplates(This,quotaTemplateNamesArray,serializedQuotaTemplates) (This)->lpVtbl->ExportTemplates(This,quotaTemplateNamesArray,serializedQuotaTemplates)
#define IFsrmQuotaTemplateManager_ImportTemplates(This,serializedQuotaTemplates,quotaTemplateNamesArray,quotaTemplates) (This)->lpVtbl->ImportTemplates(This,serializedQuotaTemplates,quotaTemplateNamesArray,quotaTemplates)
#else
/*** IUnknown methods ***/
static inline HRESULT IFsrmQuotaTemplateManager_QueryInterface(IFsrmQuotaTemplateManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IFsrmQuotaTemplateManager_AddRef(IFsrmQuotaTemplateManager* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IFsrmQuotaTemplateManager_Release(IFsrmQuotaTemplateManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IFsrmQuotaTemplateManager_GetTypeInfoCount(IFsrmQuotaTemplateManager* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IFsrmQuotaTemplateManager_GetTypeInfo(IFsrmQuotaTemplateManager* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static inline HRESULT IFsrmQuotaTemplateManager_GetIDsOfNames(IFsrmQuotaTemplateManager* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static inline HRESULT IFsrmQuotaTemplateManager_Invoke(IFsrmQuotaTemplateManager* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IFsrmQuotaTemplateManager methods ***/
static inline HRESULT IFsrmQuotaTemplateManager_CreateTemplate(IFsrmQuotaTemplateManager* This,IFsrmQuotaTemplate **quotaTemplate) {
    return This->lpVtbl->CreateTemplate(This,quotaTemplate);
}
static inline HRESULT IFsrmQuotaTemplateManager_GetTemplate(IFsrmQuotaTemplateManager* This,BSTR name,IFsrmQuotaTemplate **quotaTemplate) {
    return This->lpVtbl->GetTemplate(This,name,quotaTemplate);
}
static inline HRESULT IFsrmQuotaTemplateManager_EnumTemplates(IFsrmQuotaTemplateManager* This,FsrmEnumOptions options,IFsrmCommittableCollection **quotaTemplates) {
    return This->lpVtbl->EnumTemplates(This,options,quotaTemplates);
}
static inline HRESULT IFsrmQuotaTemplateManager_ExportTemplates(IFsrmQuotaTemplateManager* This,VARIANT *quotaTemplateNamesArray,BSTR *serializedQuotaTemplates) {
    return This->lpVtbl->ExportTemplates(This,quotaTemplateNamesArray,serializedQuotaTemplates);
}
static inline HRESULT IFsrmQuotaTemplateManager_ImportTemplates(IFsrmQuotaTemplateManager* This,BSTR serializedQuotaTemplates,VARIANT *quotaTemplateNamesArray,IFsrmCommittableCollection **quotaTemplates) {
    return This->lpVtbl->ImportTemplates(This,serializedQuotaTemplates,quotaTemplateNamesArray,quotaTemplates);
}
#endif
#endif

#endif


#endif  /* __IFsrmQuotaTemplateManager_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFsrmQuotaBase interface
 */
#ifndef __IFsrmQuotaBase_INTERFACE_DEFINED__
#define __IFsrmQuotaBase_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmQuotaBase, 0x1568a795, 0x3924, 0x4118, 0xb7,0x4b, 0x68,0xd8,0xf0,0xfa,0x5d,0xaf);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1568a795-3924-4118-b74b-68d8f0fa5daf")
IFsrmQuotaBase : public IFsrmObject
{
    virtual HRESULT STDMETHODCALLTYPE get_QuotaLimit(
        VARIANT *quotaLimit) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_QuotaLimit(
        VARIANT quotaLimit) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_QuotaFlags(
        LONG *quotaFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_QuotaFlags(
        LONG quotaFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Thresholds(
        SAFEARRAY **thresholds) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddThreshold(
        FSRM_QUOTA_THRESHOLD threshold) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteThreshold(
        FSRM_QUOTA_THRESHOLD threshold) = 0;

    virtual HRESULT STDMETHODCALLTYPE ModifyThreshold(
        FSRM_QUOTA_THRESHOLD threshold,
        FSRM_QUOTA_THRESHOLD newThreshold) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateThresholdAction(
        FSRM_QUOTA_THRESHOLD threshold,
        FsrmActionType actionType,
        IFsrmAction **action) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumThresholdActions(
        FSRM_QUOTA_THRESHOLD threshold,
        IFsrmCollection **actions) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmQuotaBase, 0x1568a795, 0x3924, 0x4118, 0xb7,0x4b, 0x68,0xd8,0xf0,0xfa,0x5d,0xaf)
#endif
#else
typedef struct IFsrmQuotaBaseVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IFsrmQuotaBase *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IFsrmQuotaBase *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IFsrmQuotaBase *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IFsrmQuotaBase *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IFsrmQuotaBase *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IFsrmQuotaBase *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IFsrmQuotaBase *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IFsrmObject methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Id)(
        IFsrmQuotaBase *This,
        FSRM_OBJECT_ID *id);

    HRESULT (STDMETHODCALLTYPE *get_Description)(
        IFsrmQuotaBase *This,
        BSTR *description);

    HRESULT (STDMETHODCALLTYPE *put_Description)(
        IFsrmQuotaBase *This,
        BSTR description);

    HRESULT (STDMETHODCALLTYPE *Delete)(
        IFsrmQuotaBase *This);

    HRESULT (STDMETHODCALLTYPE *Commit)(
        IFsrmQuotaBase *This);

    /*** IFsrmQuotaBase methods ***/
    HRESULT (STDMETHODCALLTYPE *get_QuotaLimit)(
        IFsrmQuotaBase *This,
        VARIANT *quotaLimit);

    HRESULT (STDMETHODCALLTYPE *put_QuotaLimit)(
        IFsrmQuotaBase *This,
        VARIANT quotaLimit);

    HRESULT (STDMETHODCALLTYPE *get_QuotaFlags)(
        IFsrmQuotaBase *This,
        LONG *quotaFlags);

    HRESULT (STDMETHODCALLTYPE *put_QuotaFlags)(
        IFsrmQuotaBase *This,
        LONG quotaFlags);

    HRESULT (STDMETHODCALLTYPE *get_Thresholds)(
        IFsrmQuotaBase *This,
        SAFEARRAY **thresholds);

    HRESULT (STDMETHODCALLTYPE *AddThreshold)(
        IFsrmQuotaBase *This,
        FSRM_QUOTA_THRESHOLD threshold);

    HRESULT (STDMETHODCALLTYPE *DeleteThreshold)(
        IFsrmQuotaBase *This,
        FSRM_QUOTA_THRESHOLD threshold);

    HRESULT (STDMETHODCALLTYPE *ModifyThreshold)(
        IFsrmQuotaBase *This,
        FSRM_QUOTA_THRESHOLD threshold,
        FSRM_QUOTA_THRESHOLD newThreshold);

    HRESULT (STDMETHODCALLTYPE *CreateThresholdAction)(
        IFsrmQuotaBase *This,
        FSRM_QUOTA_THRESHOLD threshold,
        FsrmActionType actionType,
        IFsrmAction **action);

    HRESULT (STDMETHODCALLTYPE *EnumThresholdActions)(
        IFsrmQuotaBase *This,
        FSRM_QUOTA_THRESHOLD threshold,
        IFsrmCollection **actions);

    END_INTERFACE
} IFsrmQuotaBaseVtbl;

interface IFsrmQuotaBase {
    CONST_VTBL IFsrmQuotaBaseVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmQuotaBase_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmQuotaBase_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmQuotaBase_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmQuotaBase_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmQuotaBase_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmQuotaBase_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmQuotaBase_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmObject methods ***/
#define IFsrmQuotaBase_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
#define IFsrmQuotaBase_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
#define IFsrmQuotaBase_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
#define IFsrmQuotaBase_Delete(This) (This)->lpVtbl->Delete(This)
#define IFsrmQuotaBase_Commit(This) (This)->lpVtbl->Commit(This)
/*** IFsrmQuotaBase methods ***/
#define IFsrmQuotaBase_get_QuotaLimit(This,quotaLimit) (This)->lpVtbl->get_QuotaLimit(This,quotaLimit)
#define IFsrmQuotaBase_put_QuotaLimit(This,quotaLimit) (This)->lpVtbl->put_QuotaLimit(This,quotaLimit)
#define IFsrmQuotaBase_get_QuotaFlags(This,quotaFlags) (This)->lpVtbl->get_QuotaFlags(This,quotaFlags)
#define IFsrmQuotaBase_put_QuotaFlags(This,quotaFlags) (This)->lpVtbl->put_QuotaFlags(This,quotaFlags)
#define IFsrmQuotaBase_get_Thresholds(This,thresholds) (This)->lpVtbl->get_Thresholds(This,thresholds)
#define IFsrmQuotaBase_AddThreshold(This,threshold) (This)->lpVtbl->AddThreshold(This,threshold)
#define IFsrmQuotaBase_DeleteThreshold(This,threshold) (This)->lpVtbl->DeleteThreshold(This,threshold)
#define IFsrmQuotaBase_ModifyThreshold(This,threshold,newThreshold) (This)->lpVtbl->ModifyThreshold(This,threshold,newThreshold)
#define IFsrmQuotaBase_CreateThresholdAction(This,threshold,actionType,action) (This)->lpVtbl->CreateThresholdAction(This,threshold,actionType,action)
#define IFsrmQuotaBase_EnumThresholdActions(This,threshold,actions) (This)->lpVtbl->EnumThresholdActions(This,threshold,actions)
#else
/*** IUnknown methods ***/
static inline HRESULT IFsrmQuotaBase_QueryInterface(IFsrmQuotaBase* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IFsrmQuotaBase_AddRef(IFsrmQuotaBase* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IFsrmQuotaBase_Release(IFsrmQuotaBase* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IFsrmQuotaBase_GetTypeInfoCount(IFsrmQuotaBase* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IFsrmQuotaBase_GetTypeInfo(IFsrmQuotaBase* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static inline HRESULT IFsrmQuotaBase_GetIDsOfNames(IFsrmQuotaBase* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static inline HRESULT IFsrmQuotaBase_Invoke(IFsrmQuotaBase* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IFsrmObject methods ***/
static inline HRESULT IFsrmQuotaBase_get_Id(IFsrmQuotaBase* This,FSRM_OBJECT_ID *id) {
    return This->lpVtbl->get_Id(This,id);
}
static inline HRESULT IFsrmQuotaBase_get_Description(IFsrmQuotaBase* This,BSTR *description) {
    return This->lpVtbl->get_Description(This,description);
}
static inline HRESULT IFsrmQuotaBase_put_Description(IFsrmQuotaBase* This,BSTR description) {
    return This->lpVtbl->put_Description(This,description);
}
static inline HRESULT IFsrmQuotaBase_Delete(IFsrmQuotaBase* This) {
    return This->lpVtbl->Delete(This);
}
static inline HRESULT IFsrmQuotaBase_Commit(IFsrmQuotaBase* This) {
    return This->lpVtbl->Commit(This);
}
/*** IFsrmQuotaBase methods ***/
static inline HRESULT IFsrmQuotaBase_get_QuotaLimit(IFsrmQuotaBase* This,VARIANT *quotaLimit) {
    return This->lpVtbl->get_QuotaLimit(This,quotaLimit);
}
static inline HRESULT IFsrmQuotaBase_put_QuotaLimit(IFsrmQuotaBase* This,VARIANT quotaLimit) {
    return This->lpVtbl->put_QuotaLimit(This,quotaLimit);
}
static inline HRESULT IFsrmQuotaBase_get_QuotaFlags(IFsrmQuotaBase* This,LONG *quotaFlags) {
    return This->lpVtbl->get_QuotaFlags(This,quotaFlags);
}
static inline HRESULT IFsrmQuotaBase_put_QuotaFlags(IFsrmQuotaBase* This,LONG quotaFlags) {
    return This->lpVtbl->put_QuotaFlags(This,quotaFlags);
}
static inline HRESULT IFsrmQuotaBase_get_Thresholds(IFsrmQuotaBase* This,SAFEARRAY **thresholds) {
    return This->lpVtbl->get_Thresholds(This,thresholds);
}
static inline HRESULT IFsrmQuotaBase_AddThreshold(IFsrmQuotaBase* This,FSRM_QUOTA_THRESHOLD threshold) {
    return This->lpVtbl->AddThreshold(This,threshold);
}
static inline HRESULT IFsrmQuotaBase_DeleteThreshold(IFsrmQuotaBase* This,FSRM_QUOTA_THRESHOLD threshold) {
    return This->lpVtbl->DeleteThreshold(This,threshold);
}
static inline HRESULT IFsrmQuotaBase_ModifyThreshold(IFsrmQuotaBase* This,FSRM_QUOTA_THRESHOLD threshold,FSRM_QUOTA_THRESHOLD newThreshold) {
    return This->lpVtbl->ModifyThreshold(This,threshold,newThreshold);
}
static inline HRESULT IFsrmQuotaBase_CreateThresholdAction(IFsrmQuotaBase* This,FSRM_QUOTA_THRESHOLD threshold,FsrmActionType actionType,IFsrmAction **action) {
    return This->lpVtbl->CreateThresholdAction(This,threshold,actionType,action);
}
static inline HRESULT IFsrmQuotaBase_EnumThresholdActions(IFsrmQuotaBase* This,FSRM_QUOTA_THRESHOLD threshold,IFsrmCollection **actions) {
    return This->lpVtbl->EnumThresholdActions(This,threshold,actions);
}
#endif
#endif

#endif


#endif  /* __IFsrmQuotaBase_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFsrmQuotaObject interface
 */
#ifndef __IFsrmQuotaObject_INTERFACE_DEFINED__
#define __IFsrmQuotaObject_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmQuotaObject, 0x42dc3511, 0x61d5, 0x48ae, 0xb6,0xdc, 0x59,0xfc,0x00,0xc0,0xa8,0xd6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("42dc3511-61d5-48ae-b6dc-59fc00c0a8d6")
IFsrmQuotaObject : public IFsrmQuotaBase
{
    virtual HRESULT STDMETHODCALLTYPE get_Path(
        BSTR *path) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_UserSid(
        BSTR *userSid) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_UserAccount(
        BSTR *userAccount) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_SourceTemplateName(
        BSTR *quotaTemplateName) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MatchesSourceTemplate(
        VARIANT_BOOL *matches) = 0;

    virtual HRESULT STDMETHODCALLTYPE ApplyTemplate(
        BSTR quotaTemplateName) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmQuotaObject, 0x42dc3511, 0x61d5, 0x48ae, 0xb6,0xdc, 0x59,0xfc,0x00,0xc0,0xa8,0xd6)
#endif
#else
typedef struct IFsrmQuotaObjectVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IFsrmQuotaObject *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IFsrmQuotaObject *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IFsrmQuotaObject *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IFsrmQuotaObject *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IFsrmQuotaObject *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IFsrmQuotaObject *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IFsrmQuotaObject *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IFsrmObject methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Id)(
        IFsrmQuotaObject *This,
        FSRM_OBJECT_ID *id);

    HRESULT (STDMETHODCALLTYPE *get_Description)(
        IFsrmQuotaObject *This,
        BSTR *description);

    HRESULT (STDMETHODCALLTYPE *put_Description)(
        IFsrmQuotaObject *This,
        BSTR description);

    HRESULT (STDMETHODCALLTYPE *Delete)(
        IFsrmQuotaObject *This);

    HRESULT (STDMETHODCALLTYPE *Commit)(
        IFsrmQuotaObject *This);

    /*** IFsrmQuotaBase methods ***/
    HRESULT (STDMETHODCALLTYPE *get_QuotaLimit)(
        IFsrmQuotaObject *This,
        VARIANT *quotaLimit);

    HRESULT (STDMETHODCALLTYPE *put_QuotaLimit)(
        IFsrmQuotaObject *This,
        VARIANT quotaLimit);

    HRESULT (STDMETHODCALLTYPE *get_QuotaFlags)(
        IFsrmQuotaObject *This,
        LONG *quotaFlags);

    HRESULT (STDMETHODCALLTYPE *put_QuotaFlags)(
        IFsrmQuotaObject *This,
        LONG quotaFlags);

    HRESULT (STDMETHODCALLTYPE *get_Thresholds)(
        IFsrmQuotaObject *This,
        SAFEARRAY **thresholds);

    HRESULT (STDMETHODCALLTYPE *AddThreshold)(
        IFsrmQuotaObject *This,
        FSRM_QUOTA_THRESHOLD threshold);

    HRESULT (STDMETHODCALLTYPE *DeleteThreshold)(
        IFsrmQuotaObject *This,
        FSRM_QUOTA_THRESHOLD threshold);

    HRESULT (STDMETHODCALLTYPE *ModifyThreshold)(
        IFsrmQuotaObject *This,
        FSRM_QUOTA_THRESHOLD threshold,
        FSRM_QUOTA_THRESHOLD newThreshold);

    HRESULT (STDMETHODCALLTYPE *CreateThresholdAction)(
        IFsrmQuotaObject *This,
        FSRM_QUOTA_THRESHOLD threshold,
        FsrmActionType actionType,
        IFsrmAction **action);

    HRESULT (STDMETHODCALLTYPE *EnumThresholdActions)(
        IFsrmQuotaObject *This,
        FSRM_QUOTA_THRESHOLD threshold,
        IFsrmCollection **actions);

    /*** IFsrmQuotaObject methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Path)(
        IFsrmQuotaObject *This,
        BSTR *path);

    HRESULT (STDMETHODCALLTYPE *get_UserSid)(
        IFsrmQuotaObject *This,
        BSTR *userSid);

    HRESULT (STDMETHODCALLTYPE *get_UserAccount)(
        IFsrmQuotaObject *This,
        BSTR *userAccount);

    HRESULT (STDMETHODCALLTYPE *get_SourceTemplateName)(
        IFsrmQuotaObject *This,
        BSTR *quotaTemplateName);

    HRESULT (STDMETHODCALLTYPE *get_MatchesSourceTemplate)(
        IFsrmQuotaObject *This,
        VARIANT_BOOL *matches);

    HRESULT (STDMETHODCALLTYPE *ApplyTemplate)(
        IFsrmQuotaObject *This,
        BSTR quotaTemplateName);

    END_INTERFACE
} IFsrmQuotaObjectVtbl;

interface IFsrmQuotaObject {
    CONST_VTBL IFsrmQuotaObjectVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmQuotaObject_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmQuotaObject_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmQuotaObject_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmQuotaObject_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmQuotaObject_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmQuotaObject_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmQuotaObject_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmObject methods ***/
#define IFsrmQuotaObject_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
#define IFsrmQuotaObject_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
#define IFsrmQuotaObject_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
#define IFsrmQuotaObject_Delete(This) (This)->lpVtbl->Delete(This)
#define IFsrmQuotaObject_Commit(This) (This)->lpVtbl->Commit(This)
/*** IFsrmQuotaBase methods ***/
#define IFsrmQuotaObject_get_QuotaLimit(This,quotaLimit) (This)->lpVtbl->get_QuotaLimit(This,quotaLimit)
#define IFsrmQuotaObject_put_QuotaLimit(This,quotaLimit) (This)->lpVtbl->put_QuotaLimit(This,quotaLimit)
#define IFsrmQuotaObject_get_QuotaFlags(This,quotaFlags) (This)->lpVtbl->get_QuotaFlags(This,quotaFlags)
#define IFsrmQuotaObject_put_QuotaFlags(This,quotaFlags) (This)->lpVtbl->put_QuotaFlags(This,quotaFlags)
#define IFsrmQuotaObject_get_Thresholds(This,thresholds) (This)->lpVtbl->get_Thresholds(This,thresholds)
#define IFsrmQuotaObject_AddThreshold(This,threshold) (This)->lpVtbl->AddThreshold(This,threshold)
#define IFsrmQuotaObject_DeleteThreshold(This,threshold) (This)->lpVtbl->DeleteThreshold(This,threshold)
#define IFsrmQuotaObject_ModifyThreshold(This,threshold,newThreshold) (This)->lpVtbl->ModifyThreshold(This,threshold,newThreshold)
#define IFsrmQuotaObject_CreateThresholdAction(This,threshold,actionType,action) (This)->lpVtbl->CreateThresholdAction(This,threshold,actionType,action)
#define IFsrmQuotaObject_EnumThresholdActions(This,threshold,actions) (This)->lpVtbl->EnumThresholdActions(This,threshold,actions)
/*** IFsrmQuotaObject methods ***/
#define IFsrmQuotaObject_get_Path(This,path) (This)->lpVtbl->get_Path(This,path)
#define IFsrmQuotaObject_get_UserSid(This,userSid) (This)->lpVtbl->get_UserSid(This,userSid)
#define IFsrmQuotaObject_get_UserAccount(This,userAccount) (This)->lpVtbl->get_UserAccount(This,userAccount)
#define IFsrmQuotaObject_get_SourceTemplateName(This,quotaTemplateName) (This)->lpVtbl->get_SourceTemplateName(This,quotaTemplateName)
#define IFsrmQuotaObject_get_MatchesSourceTemplate(This,matches) (This)->lpVtbl->get_MatchesSourceTemplate(This,matches)
#define IFsrmQuotaObject_ApplyTemplate(This,quotaTemplateName) (This)->lpVtbl->ApplyTemplate(This,quotaTemplateName)
#else
/*** IUnknown methods ***/
static inline HRESULT IFsrmQuotaObject_QueryInterface(IFsrmQuotaObject* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IFsrmQuotaObject_AddRef(IFsrmQuotaObject* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IFsrmQuotaObject_Release(IFsrmQuotaObject* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IFsrmQuotaObject_GetTypeInfoCount(IFsrmQuotaObject* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IFsrmQuotaObject_GetTypeInfo(IFsrmQuotaObject* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static inline HRESULT IFsrmQuotaObject_GetIDsOfNames(IFsrmQuotaObject* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static inline HRESULT IFsrmQuotaObject_Invoke(IFsrmQuotaObject* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IFsrmObject methods ***/
static inline HRESULT IFsrmQuotaObject_get_Id(IFsrmQuotaObject* This,FSRM_OBJECT_ID *id) {
    return This->lpVtbl->get_Id(This,id);
}
static inline HRESULT IFsrmQuotaObject_get_Description(IFsrmQuotaObject* This,BSTR *description) {
    return This->lpVtbl->get_Description(This,description);
}
static inline HRESULT IFsrmQuotaObject_put_Description(IFsrmQuotaObject* This,BSTR description) {
    return This->lpVtbl->put_Description(This,description);
}
static inline HRESULT IFsrmQuotaObject_Delete(IFsrmQuotaObject* This) {
    return This->lpVtbl->Delete(This);
}
static inline HRESULT IFsrmQuotaObject_Commit(IFsrmQuotaObject* This) {
    return This->lpVtbl->Commit(This);
}
/*** IFsrmQuotaBase methods ***/
static inline HRESULT IFsrmQuotaObject_get_QuotaLimit(IFsrmQuotaObject* This,VARIANT *quotaLimit) {
    return This->lpVtbl->get_QuotaLimit(This,quotaLimit);
}
static inline HRESULT IFsrmQuotaObject_put_QuotaLimit(IFsrmQuotaObject* This,VARIANT quotaLimit) {
    return This->lpVtbl->put_QuotaLimit(This,quotaLimit);
}
static inline HRESULT IFsrmQuotaObject_get_QuotaFlags(IFsrmQuotaObject* This,LONG *quotaFlags) {
    return This->lpVtbl->get_QuotaFlags(This,quotaFlags);
}
static inline HRESULT IFsrmQuotaObject_put_QuotaFlags(IFsrmQuotaObject* This,LONG quotaFlags) {
    return This->lpVtbl->put_QuotaFlags(This,quotaFlags);
}
static inline HRESULT IFsrmQuotaObject_get_Thresholds(IFsrmQuotaObject* This,SAFEARRAY **thresholds) {
    return This->lpVtbl->get_Thresholds(This,thresholds);
}
static inline HRESULT IFsrmQuotaObject_AddThreshold(IFsrmQuotaObject* This,FSRM_QUOTA_THRESHOLD threshold) {
    return This->lpVtbl->AddThreshold(This,threshold);
}
static inline HRESULT IFsrmQuotaObject_DeleteThreshold(IFsrmQuotaObject* This,FSRM_QUOTA_THRESHOLD threshold) {
    return This->lpVtbl->DeleteThreshold(This,threshold);
}
static inline HRESULT IFsrmQuotaObject_ModifyThreshold(IFsrmQuotaObject* This,FSRM_QUOTA_THRESHOLD threshold,FSRM_QUOTA_THRESHOLD newThreshold) {
    return This->lpVtbl->ModifyThreshold(This,threshold,newThreshold);
}
static inline HRESULT IFsrmQuotaObject_CreateThresholdAction(IFsrmQuotaObject* This,FSRM_QUOTA_THRESHOLD threshold,FsrmActionType actionType,IFsrmAction **action) {
    return This->lpVtbl->CreateThresholdAction(This,threshold,actionType,action);
}
static inline HRESULT IFsrmQuotaObject_EnumThresholdActions(IFsrmQuotaObject* This,FSRM_QUOTA_THRESHOLD threshold,IFsrmCollection **actions) {
    return This->lpVtbl->EnumThresholdActions(This,threshold,actions);
}
/*** IFsrmQuotaObject methods ***/
static inline HRESULT IFsrmQuotaObject_get_Path(IFsrmQuotaObject* This,BSTR *path) {
    return This->lpVtbl->get_Path(This,path);
}
static inline HRESULT IFsrmQuotaObject_get_UserSid(IFsrmQuotaObject* This,BSTR *userSid) {
    return This->lpVtbl->get_UserSid(This,userSid);
}
static inline HRESULT IFsrmQuotaObject_get_UserAccount(IFsrmQuotaObject* This,BSTR *userAccount) {
    return This->lpVtbl->get_UserAccount(This,userAccount);
}
static inline HRESULT IFsrmQuotaObject_get_SourceTemplateName(IFsrmQuotaObject* This,BSTR *quotaTemplateName) {
    return This->lpVtbl->get_SourceTemplateName(This,quotaTemplateName);
}
static inline HRESULT IFsrmQuotaObject_get_MatchesSourceTemplate(IFsrmQuotaObject* This,VARIANT_BOOL *matches) {
    return This->lpVtbl->get_MatchesSourceTemplate(This,matches);
}
static inline HRESULT IFsrmQuotaObject_ApplyTemplate(IFsrmQuotaObject* This,BSTR quotaTemplateName) {
    return This->lpVtbl->ApplyTemplate(This,quotaTemplateName);
}
#endif
#endif

#endif


#endif  /* __IFsrmQuotaObject_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFsrmQuotaTemplate interface
 */
#ifndef __IFsrmQuotaTemplate_INTERFACE_DEFINED__
#define __IFsrmQuotaTemplate_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmQuotaTemplate, 0xa2efab31, 0x295e, 0x46bb, 0xb9,0x76, 0xe8,0x6d,0x58,0xb5,0x2e,0x8b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a2efab31-295e-46bb-b976-e86d58b52e8b")
IFsrmQuotaTemplate : public IFsrmQuotaBase
{
    virtual HRESULT STDMETHODCALLTYPE get_Name(
        BSTR *name) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Name(
        BSTR name) = 0;

    virtual HRESULT STDMETHODCALLTYPE CopyTemplate(
        BSTR quotaTemplateName) = 0;

    virtual HRESULT STDMETHODCALLTYPE CommitAndUpdateDerived(
        FsrmCommitOptions commitOptions,
        FsrmTemplateApplyOptions applyOptions,
        IFsrmDerivedObjectsResult **derivedObjectsResult) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmQuotaTemplate, 0xa2efab31, 0x295e, 0x46bb, 0xb9,0x76, 0xe8,0x6d,0x58,0xb5,0x2e,0x8b)
#endif
#else
typedef struct IFsrmQuotaTemplateVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IFsrmQuotaTemplate *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IFsrmQuotaTemplate *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IFsrmQuotaTemplate *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IFsrmQuotaTemplate *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IFsrmQuotaTemplate *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IFsrmQuotaTemplate *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IFsrmQuotaTemplate *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IFsrmObject methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Id)(
        IFsrmQuotaTemplate *This,
        FSRM_OBJECT_ID *id);

    HRESULT (STDMETHODCALLTYPE *get_Description)(
        IFsrmQuotaTemplate *This,
        BSTR *description);

    HRESULT (STDMETHODCALLTYPE *put_Description)(
        IFsrmQuotaTemplate *This,
        BSTR description);

    HRESULT (STDMETHODCALLTYPE *Delete)(
        IFsrmQuotaTemplate *This);

    HRESULT (STDMETHODCALLTYPE *Commit)(
        IFsrmQuotaTemplate *This);

    /*** IFsrmQuotaBase methods ***/
    HRESULT (STDMETHODCALLTYPE *get_QuotaLimit)(
        IFsrmQuotaTemplate *This,
        VARIANT *quotaLimit);

    HRESULT (STDMETHODCALLTYPE *put_QuotaLimit)(
        IFsrmQuotaTemplate *This,
        VARIANT quotaLimit);

    HRESULT (STDMETHODCALLTYPE *get_QuotaFlags)(
        IFsrmQuotaTemplate *This,
        LONG *quotaFlags);

    HRESULT (STDMETHODCALLTYPE *put_QuotaFlags)(
        IFsrmQuotaTemplate *This,
        LONG quotaFlags);

    HRESULT (STDMETHODCALLTYPE *get_Thresholds)(
        IFsrmQuotaTemplate *This,
        SAFEARRAY **thresholds);

    HRESULT (STDMETHODCALLTYPE *AddThreshold)(
        IFsrmQuotaTemplate *This,
        FSRM_QUOTA_THRESHOLD threshold);

    HRESULT (STDMETHODCALLTYPE *DeleteThreshold)(
        IFsrmQuotaTemplate *This,
        FSRM_QUOTA_THRESHOLD threshold);

    HRESULT (STDMETHODCALLTYPE *ModifyThreshold)(
        IFsrmQuotaTemplate *This,
        FSRM_QUOTA_THRESHOLD threshold,
        FSRM_QUOTA_THRESHOLD newThreshold);

    HRESULT (STDMETHODCALLTYPE *CreateThresholdAction)(
        IFsrmQuotaTemplate *This,
        FSRM_QUOTA_THRESHOLD threshold,
        FsrmActionType actionType,
        IFsrmAction **action);

    HRESULT (STDMETHODCALLTYPE *EnumThresholdActions)(
        IFsrmQuotaTemplate *This,
        FSRM_QUOTA_THRESHOLD threshold,
        IFsrmCollection **actions);

    /*** IFsrmQuotaTemplate methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Name)(
        IFsrmQuotaTemplate *This,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *put_Name)(
        IFsrmQuotaTemplate *This,
        BSTR name);

    HRESULT (STDMETHODCALLTYPE *CopyTemplate)(
        IFsrmQuotaTemplate *This,
        BSTR quotaTemplateName);

    HRESULT (STDMETHODCALLTYPE *CommitAndUpdateDerived)(
        IFsrmQuotaTemplate *This,
        FsrmCommitOptions commitOptions,
        FsrmTemplateApplyOptions applyOptions,
        IFsrmDerivedObjectsResult **derivedObjectsResult);

    END_INTERFACE
} IFsrmQuotaTemplateVtbl;

interface IFsrmQuotaTemplate {
    CONST_VTBL IFsrmQuotaTemplateVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmQuotaTemplate_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmQuotaTemplate_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmQuotaTemplate_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmQuotaTemplate_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmQuotaTemplate_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmQuotaTemplate_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmQuotaTemplate_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmObject methods ***/
#define IFsrmQuotaTemplate_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
#define IFsrmQuotaTemplate_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
#define IFsrmQuotaTemplate_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
#define IFsrmQuotaTemplate_Delete(This) (This)->lpVtbl->Delete(This)
#define IFsrmQuotaTemplate_Commit(This) (This)->lpVtbl->Commit(This)
/*** IFsrmQuotaBase methods ***/
#define IFsrmQuotaTemplate_get_QuotaLimit(This,quotaLimit) (This)->lpVtbl->get_QuotaLimit(This,quotaLimit)
#define IFsrmQuotaTemplate_put_QuotaLimit(This,quotaLimit) (This)->lpVtbl->put_QuotaLimit(This,quotaLimit)
#define IFsrmQuotaTemplate_get_QuotaFlags(This,quotaFlags) (This)->lpVtbl->get_QuotaFlags(This,quotaFlags)
#define IFsrmQuotaTemplate_put_QuotaFlags(This,quotaFlags) (This)->lpVtbl->put_QuotaFlags(This,quotaFlags)
#define IFsrmQuotaTemplate_get_Thresholds(This,thresholds) (This)->lpVtbl->get_Thresholds(This,thresholds)
#define IFsrmQuotaTemplate_AddThreshold(This,threshold) (This)->lpVtbl->AddThreshold(This,threshold)
#define IFsrmQuotaTemplate_DeleteThreshold(This,threshold) (This)->lpVtbl->DeleteThreshold(This,threshold)
#define IFsrmQuotaTemplate_ModifyThreshold(This,threshold,newThreshold) (This)->lpVtbl->ModifyThreshold(This,threshold,newThreshold)
#define IFsrmQuotaTemplate_CreateThresholdAction(This,threshold,actionType,action) (This)->lpVtbl->CreateThresholdAction(This,threshold,actionType,action)
#define IFsrmQuotaTemplate_EnumThresholdActions(This,threshold,actions) (This)->lpVtbl->EnumThresholdActions(This,threshold,actions)
/*** IFsrmQuotaTemplate methods ***/
#define IFsrmQuotaTemplate_get_Name(This,name) (This)->lpVtbl->get_Name(This,name)
#define IFsrmQuotaTemplate_put_Name(This,name) (This)->lpVtbl->put_Name(This,name)
#define IFsrmQuotaTemplate_CopyTemplate(This,quotaTemplateName) (This)->lpVtbl->CopyTemplate(This,quotaTemplateName)
#define IFsrmQuotaTemplate_CommitAndUpdateDerived(This,commitOptions,applyOptions,derivedObjectsResult) (This)->lpVtbl->CommitAndUpdateDerived(This,commitOptions,applyOptions,derivedObjectsResult)
#else
/*** IUnknown methods ***/
static inline HRESULT IFsrmQuotaTemplate_QueryInterface(IFsrmQuotaTemplate* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IFsrmQuotaTemplate_AddRef(IFsrmQuotaTemplate* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IFsrmQuotaTemplate_Release(IFsrmQuotaTemplate* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IFsrmQuotaTemplate_GetTypeInfoCount(IFsrmQuotaTemplate* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IFsrmQuotaTemplate_GetTypeInfo(IFsrmQuotaTemplate* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static inline HRESULT IFsrmQuotaTemplate_GetIDsOfNames(IFsrmQuotaTemplate* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static inline HRESULT IFsrmQuotaTemplate_Invoke(IFsrmQuotaTemplate* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IFsrmObject methods ***/
static inline HRESULT IFsrmQuotaTemplate_get_Id(IFsrmQuotaTemplate* This,FSRM_OBJECT_ID *id) {
    return This->lpVtbl->get_Id(This,id);
}
static inline HRESULT IFsrmQuotaTemplate_get_Description(IFsrmQuotaTemplate* This,BSTR *description) {
    return This->lpVtbl->get_Description(This,description);
}
static inline HRESULT IFsrmQuotaTemplate_put_Description(IFsrmQuotaTemplate* This,BSTR description) {
    return This->lpVtbl->put_Description(This,description);
}
static inline HRESULT IFsrmQuotaTemplate_Delete(IFsrmQuotaTemplate* This) {
    return This->lpVtbl->Delete(This);
}
static inline HRESULT IFsrmQuotaTemplate_Commit(IFsrmQuotaTemplate* This) {
    return This->lpVtbl->Commit(This);
}
/*** IFsrmQuotaBase methods ***/
static inline HRESULT IFsrmQuotaTemplate_get_QuotaLimit(IFsrmQuotaTemplate* This,VARIANT *quotaLimit) {
    return This->lpVtbl->get_QuotaLimit(This,quotaLimit);
}
static inline HRESULT IFsrmQuotaTemplate_put_QuotaLimit(IFsrmQuotaTemplate* This,VARIANT quotaLimit) {
    return This->lpVtbl->put_QuotaLimit(This,quotaLimit);
}
static inline HRESULT IFsrmQuotaTemplate_get_QuotaFlags(IFsrmQuotaTemplate* This,LONG *quotaFlags) {
    return This->lpVtbl->get_QuotaFlags(This,quotaFlags);
}
static inline HRESULT IFsrmQuotaTemplate_put_QuotaFlags(IFsrmQuotaTemplate* This,LONG quotaFlags) {
    return This->lpVtbl->put_QuotaFlags(This,quotaFlags);
}
static inline HRESULT IFsrmQuotaTemplate_get_Thresholds(IFsrmQuotaTemplate* This,SAFEARRAY **thresholds) {
    return This->lpVtbl->get_Thresholds(This,thresholds);
}
static inline HRESULT IFsrmQuotaTemplate_AddThreshold(IFsrmQuotaTemplate* This,FSRM_QUOTA_THRESHOLD threshold) {
    return This->lpVtbl->AddThreshold(This,threshold);
}
static inline HRESULT IFsrmQuotaTemplate_DeleteThreshold(IFsrmQuotaTemplate* This,FSRM_QUOTA_THRESHOLD threshold) {
    return This->lpVtbl->DeleteThreshold(This,threshold);
}
static inline HRESULT IFsrmQuotaTemplate_ModifyThreshold(IFsrmQuotaTemplate* This,FSRM_QUOTA_THRESHOLD threshold,FSRM_QUOTA_THRESHOLD newThreshold) {
    return This->lpVtbl->ModifyThreshold(This,threshold,newThreshold);
}
static inline HRESULT IFsrmQuotaTemplate_CreateThresholdAction(IFsrmQuotaTemplate* This,FSRM_QUOTA_THRESHOLD threshold,FsrmActionType actionType,IFsrmAction **action) {
    return This->lpVtbl->CreateThresholdAction(This,threshold,actionType,action);
}
static inline HRESULT IFsrmQuotaTemplate_EnumThresholdActions(IFsrmQuotaTemplate* This,FSRM_QUOTA_THRESHOLD threshold,IFsrmCollection **actions) {
    return This->lpVtbl->EnumThresholdActions(This,threshold,actions);
}
/*** IFsrmQuotaTemplate methods ***/
static inline HRESULT IFsrmQuotaTemplate_get_Name(IFsrmQuotaTemplate* This,BSTR *name) {
    return This->lpVtbl->get_Name(This,name);
}
static inline HRESULT IFsrmQuotaTemplate_put_Name(IFsrmQuotaTemplate* This,BSTR name) {
    return This->lpVtbl->put_Name(This,name);
}
static inline HRESULT IFsrmQuotaTemplate_CopyTemplate(IFsrmQuotaTemplate* This,BSTR quotaTemplateName) {
    return This->lpVtbl->CopyTemplate(This,quotaTemplateName);
}
static inline HRESULT IFsrmQuotaTemplate_CommitAndUpdateDerived(IFsrmQuotaTemplate* This,FsrmCommitOptions commitOptions,FsrmTemplateApplyOptions applyOptions,IFsrmDerivedObjectsResult **derivedObjectsResult) {
    return This->lpVtbl->CommitAndUpdateDerived(This,commitOptions,applyOptions,derivedObjectsResult);
}
#endif
#endif

#endif


#endif  /* __IFsrmQuotaTemplate_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFsrmQuota interface
 */
#ifndef __IFsrmQuota_INTERFACE_DEFINED__
#define __IFsrmQuota_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmQuota, 0x377f739d, 0x9647, 0x4b8e, 0x97,0xd2, 0x5f,0xfc,0xe6,0xd7,0x59,0xcd);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("377f739d-9647-4b8e-97d2-5ffce6d759cd")
IFsrmQuota : public IFsrmQuotaObject
{
    virtual HRESULT STDMETHODCALLTYPE get_QuotaUsed(
        VARIANT *used) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_QuotaPeakUsage(
        VARIANT *peakUsage) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_QuotaPeakUsageTime(
        DATE *peakUsageDateTime) = 0;

    virtual HRESULT STDMETHODCALLTYPE ResetPeakUsage(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE RefreshUsageProperties(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmQuota, 0x377f739d, 0x9647, 0x4b8e, 0x97,0xd2, 0x5f,0xfc,0xe6,0xd7,0x59,0xcd)
#endif
#else
typedef struct IFsrmQuotaVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IFsrmQuota *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IFsrmQuota *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IFsrmQuota *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IFsrmQuota *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IFsrmQuota *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IFsrmQuota *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IFsrmQuota *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IFsrmObject methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Id)(
        IFsrmQuota *This,
        FSRM_OBJECT_ID *id);

    HRESULT (STDMETHODCALLTYPE *get_Description)(
        IFsrmQuota *This,
        BSTR *description);

    HRESULT (STDMETHODCALLTYPE *put_Description)(
        IFsrmQuota *This,
        BSTR description);

    HRESULT (STDMETHODCALLTYPE *Delete)(
        IFsrmQuota *This);

    HRESULT (STDMETHODCALLTYPE *Commit)(
        IFsrmQuota *This);

    /*** IFsrmQuotaBase methods ***/
    HRESULT (STDMETHODCALLTYPE *get_QuotaLimit)(
        IFsrmQuota *This,
        VARIANT *quotaLimit);

    HRESULT (STDMETHODCALLTYPE *put_QuotaLimit)(
        IFsrmQuota *This,
        VARIANT quotaLimit);

    HRESULT (STDMETHODCALLTYPE *get_QuotaFlags)(
        IFsrmQuota *This,
        LONG *quotaFlags);

    HRESULT (STDMETHODCALLTYPE *put_QuotaFlags)(
        IFsrmQuota *This,
        LONG quotaFlags);

    HRESULT (STDMETHODCALLTYPE *get_Thresholds)(
        IFsrmQuota *This,
        SAFEARRAY **thresholds);

    HRESULT (STDMETHODCALLTYPE *AddThreshold)(
        IFsrmQuota *This,
        FSRM_QUOTA_THRESHOLD threshold);

    HRESULT (STDMETHODCALLTYPE *DeleteThreshold)(
        IFsrmQuota *This,
        FSRM_QUOTA_THRESHOLD threshold);

    HRESULT (STDMETHODCALLTYPE *ModifyThreshold)(
        IFsrmQuota *This,
        FSRM_QUOTA_THRESHOLD threshold,
        FSRM_QUOTA_THRESHOLD newThreshold);

    HRESULT (STDMETHODCALLTYPE *CreateThresholdAction)(
        IFsrmQuota *This,
        FSRM_QUOTA_THRESHOLD threshold,
        FsrmActionType actionType,
        IFsrmAction **action);

    HRESULT (STDMETHODCALLTYPE *EnumThresholdActions)(
        IFsrmQuota *This,
        FSRM_QUOTA_THRESHOLD threshold,
        IFsrmCollection **actions);

    /*** IFsrmQuotaObject methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Path)(
        IFsrmQuota *This,
        BSTR *path);

    HRESULT (STDMETHODCALLTYPE *get_UserSid)(
        IFsrmQuota *This,
        BSTR *userSid);

    HRESULT (STDMETHODCALLTYPE *get_UserAccount)(
        IFsrmQuota *This,
        BSTR *userAccount);

    HRESULT (STDMETHODCALLTYPE *get_SourceTemplateName)(
        IFsrmQuota *This,
        BSTR *quotaTemplateName);

    HRESULT (STDMETHODCALLTYPE *get_MatchesSourceTemplate)(
        IFsrmQuota *This,
        VARIANT_BOOL *matches);

    HRESULT (STDMETHODCALLTYPE *ApplyTemplate)(
        IFsrmQuota *This,
        BSTR quotaTemplateName);

    /*** IFsrmQuota methods ***/
    HRESULT (STDMETHODCALLTYPE *get_QuotaUsed)(
        IFsrmQuota *This,
        VARIANT *used);

    HRESULT (STDMETHODCALLTYPE *get_QuotaPeakUsage)(
        IFsrmQuota *This,
        VARIANT *peakUsage);

    HRESULT (STDMETHODCALLTYPE *get_QuotaPeakUsageTime)(
        IFsrmQuota *This,
        DATE *peakUsageDateTime);

    HRESULT (STDMETHODCALLTYPE *ResetPeakUsage)(
        IFsrmQuota *This);

    HRESULT (STDMETHODCALLTYPE *RefreshUsageProperties)(
        IFsrmQuota *This);

    END_INTERFACE
} IFsrmQuotaVtbl;

interface IFsrmQuota {
    CONST_VTBL IFsrmQuotaVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmQuota_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmQuota_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmQuota_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmQuota_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmQuota_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmQuota_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmQuota_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmObject methods ***/
#define IFsrmQuota_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
#define IFsrmQuota_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
#define IFsrmQuota_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
#define IFsrmQuota_Delete(This) (This)->lpVtbl->Delete(This)
#define IFsrmQuota_Commit(This) (This)->lpVtbl->Commit(This)
/*** IFsrmQuotaBase methods ***/
#define IFsrmQuota_get_QuotaLimit(This,quotaLimit) (This)->lpVtbl->get_QuotaLimit(This,quotaLimit)
#define IFsrmQuota_put_QuotaLimit(This,quotaLimit) (This)->lpVtbl->put_QuotaLimit(This,quotaLimit)
#define IFsrmQuota_get_QuotaFlags(This,quotaFlags) (This)->lpVtbl->get_QuotaFlags(This,quotaFlags)
#define IFsrmQuota_put_QuotaFlags(This,quotaFlags) (This)->lpVtbl->put_QuotaFlags(This,quotaFlags)
#define IFsrmQuota_get_Thresholds(This,thresholds) (This)->lpVtbl->get_Thresholds(This,thresholds)
#define IFsrmQuota_AddThreshold(This,threshold) (This)->lpVtbl->AddThreshold(This,threshold)
#define IFsrmQuota_DeleteThreshold(This,threshold) (This)->lpVtbl->DeleteThreshold(This,threshold)
#define IFsrmQuota_ModifyThreshold(This,threshold,newThreshold) (This)->lpVtbl->ModifyThreshold(This,threshold,newThreshold)
#define IFsrmQuota_CreateThresholdAction(This,threshold,actionType,action) (This)->lpVtbl->CreateThresholdAction(This,threshold,actionType,action)
#define IFsrmQuota_EnumThresholdActions(This,threshold,actions) (This)->lpVtbl->EnumThresholdActions(This,threshold,actions)
/*** IFsrmQuotaObject methods ***/
#define IFsrmQuota_get_Path(This,path) (This)->lpVtbl->get_Path(This,path)
#define IFsrmQuota_get_UserSid(This,userSid) (This)->lpVtbl->get_UserSid(This,userSid)
#define IFsrmQuota_get_UserAccount(This,userAccount) (This)->lpVtbl->get_UserAccount(This,userAccount)
#define IFsrmQuota_get_SourceTemplateName(This,quotaTemplateName) (This)->lpVtbl->get_SourceTemplateName(This,quotaTemplateName)
#define IFsrmQuota_get_MatchesSourceTemplate(This,matches) (This)->lpVtbl->get_MatchesSourceTemplate(This,matches)
#define IFsrmQuota_ApplyTemplate(This,quotaTemplateName) (This)->lpVtbl->ApplyTemplate(This,quotaTemplateName)
/*** IFsrmQuota methods ***/
#define IFsrmQuota_get_QuotaUsed(This,used) (This)->lpVtbl->get_QuotaUsed(This,used)
#define IFsrmQuota_get_QuotaPeakUsage(This,peakUsage) (This)->lpVtbl->get_QuotaPeakUsage(This,peakUsage)
#define IFsrmQuota_get_QuotaPeakUsageTime(This,peakUsageDateTime) (This)->lpVtbl->get_QuotaPeakUsageTime(This,peakUsageDateTime)
#define IFsrmQuota_ResetPeakUsage(This) (This)->lpVtbl->ResetPeakUsage(This)
#define IFsrmQuota_RefreshUsageProperties(This) (This)->lpVtbl->RefreshUsageProperties(This)
#else
/*** IUnknown methods ***/
static inline HRESULT IFsrmQuota_QueryInterface(IFsrmQuota* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IFsrmQuota_AddRef(IFsrmQuota* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IFsrmQuota_Release(IFsrmQuota* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IFsrmQuota_GetTypeInfoCount(IFsrmQuota* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IFsrmQuota_GetTypeInfo(IFsrmQuota* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static inline HRESULT IFsrmQuota_GetIDsOfNames(IFsrmQuota* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static inline HRESULT IFsrmQuota_Invoke(IFsrmQuota* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IFsrmObject methods ***/
static inline HRESULT IFsrmQuota_get_Id(IFsrmQuota* This,FSRM_OBJECT_ID *id) {
    return This->lpVtbl->get_Id(This,id);
}
static inline HRESULT IFsrmQuota_get_Description(IFsrmQuota* This,BSTR *description) {
    return This->lpVtbl->get_Description(This,description);
}
static inline HRESULT IFsrmQuota_put_Description(IFsrmQuota* This,BSTR description) {
    return This->lpVtbl->put_Description(This,description);
}
static inline HRESULT IFsrmQuota_Delete(IFsrmQuota* This) {
    return This->lpVtbl->Delete(This);
}
static inline HRESULT IFsrmQuota_Commit(IFsrmQuota* This) {
    return This->lpVtbl->Commit(This);
}
/*** IFsrmQuotaBase methods ***/
static inline HRESULT IFsrmQuota_get_QuotaLimit(IFsrmQuota* This,VARIANT *quotaLimit) {
    return This->lpVtbl->get_QuotaLimit(This,quotaLimit);
}
static inline HRESULT IFsrmQuota_put_QuotaLimit(IFsrmQuota* This,VARIANT quotaLimit) {
    return This->lpVtbl->put_QuotaLimit(This,quotaLimit);
}
static inline HRESULT IFsrmQuota_get_QuotaFlags(IFsrmQuota* This,LONG *quotaFlags) {
    return This->lpVtbl->get_QuotaFlags(This,quotaFlags);
}
static inline HRESULT IFsrmQuota_put_QuotaFlags(IFsrmQuota* This,LONG quotaFlags) {
    return This->lpVtbl->put_QuotaFlags(This,quotaFlags);
}
static inline HRESULT IFsrmQuota_get_Thresholds(IFsrmQuota* This,SAFEARRAY **thresholds) {
    return This->lpVtbl->get_Thresholds(This,thresholds);
}
static inline HRESULT IFsrmQuota_AddThreshold(IFsrmQuota* This,FSRM_QUOTA_THRESHOLD threshold) {
    return This->lpVtbl->AddThreshold(This,threshold);
}
static inline HRESULT IFsrmQuota_DeleteThreshold(IFsrmQuota* This,FSRM_QUOTA_THRESHOLD threshold) {
    return This->lpVtbl->DeleteThreshold(This,threshold);
}
static inline HRESULT IFsrmQuota_ModifyThreshold(IFsrmQuota* This,FSRM_QUOTA_THRESHOLD threshold,FSRM_QUOTA_THRESHOLD newThreshold) {
    return This->lpVtbl->ModifyThreshold(This,threshold,newThreshold);
}
static inline HRESULT IFsrmQuota_CreateThresholdAction(IFsrmQuota* This,FSRM_QUOTA_THRESHOLD threshold,FsrmActionType actionType,IFsrmAction **action) {
    return This->lpVtbl->CreateThresholdAction(This,threshold,actionType,action);
}
static inline HRESULT IFsrmQuota_EnumThresholdActions(IFsrmQuota* This,FSRM_QUOTA_THRESHOLD threshold,IFsrmCollection **actions) {
    return This->lpVtbl->EnumThresholdActions(This,threshold,actions);
}
/*** IFsrmQuotaObject methods ***/
static inline HRESULT IFsrmQuota_get_Path(IFsrmQuota* This,BSTR *path) {
    return This->lpVtbl->get_Path(This,path);
}
static inline HRESULT IFsrmQuota_get_UserSid(IFsrmQuota* This,BSTR *userSid) {
    return This->lpVtbl->get_UserSid(This,userSid);
}
static inline HRESULT IFsrmQuota_get_UserAccount(IFsrmQuota* This,BSTR *userAccount) {
    return This->lpVtbl->get_UserAccount(This,userAccount);
}
static inline HRESULT IFsrmQuota_get_SourceTemplateName(IFsrmQuota* This,BSTR *quotaTemplateName) {
    return This->lpVtbl->get_SourceTemplateName(This,quotaTemplateName);
}
static inline HRESULT IFsrmQuota_get_MatchesSourceTemplate(IFsrmQuota* This,VARIANT_BOOL *matches) {
    return This->lpVtbl->get_MatchesSourceTemplate(This,matches);
}
static inline HRESULT IFsrmQuota_ApplyTemplate(IFsrmQuota* This,BSTR quotaTemplateName) {
    return This->lpVtbl->ApplyTemplate(This,quotaTemplateName);
}
/*** IFsrmQuota methods ***/
static inline HRESULT IFsrmQuota_get_QuotaUsed(IFsrmQuota* This,VARIANT *used) {
    return This->lpVtbl->get_QuotaUsed(This,used);
}
static inline HRESULT IFsrmQuota_get_QuotaPeakUsage(IFsrmQuota* This,VARIANT *peakUsage) {
    return This->lpVtbl->get_QuotaPeakUsage(This,peakUsage);
}
static inline HRESULT IFsrmQuota_get_QuotaPeakUsageTime(IFsrmQuota* This,DATE *peakUsageDateTime) {
    return This->lpVtbl->get_QuotaPeakUsageTime(This,peakUsageDateTime);
}
static inline HRESULT IFsrmQuota_ResetPeakUsage(IFsrmQuota* This) {
    return This->lpVtbl->ResetPeakUsage(This);
}
static inline HRESULT IFsrmQuota_RefreshUsageProperties(IFsrmQuota* This) {
    return This->lpVtbl->RefreshUsageProperties(This);
}
#endif
#endif

#endif


#endif  /* __IFsrmQuota_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFsrmAutoApplyQuota interface
 */
#ifndef __IFsrmAutoApplyQuota_INTERFACE_DEFINED__
#define __IFsrmAutoApplyQuota_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmAutoApplyQuota, 0xf82e5729, 0x6aba, 0x4740, 0xbf,0xc7, 0xc7,0xf5,0x8f,0x75,0xfb,0x7b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f82e5729-6aba-4740-bfc7-c7f58f75fb7b")
IFsrmAutoApplyQuota : public IFsrmQuotaObject
{
    virtual HRESULT STDMETHODCALLTYPE get_ExcludeFolders(
        SAFEARRAY **folders) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ExcludeFolders(
        SAFEARRAY *folders) = 0;

    virtual HRESULT STDMETHODCALLTYPE CommitAndUpdateDerived(
        FsrmCommitOptions commitOptions,
        FsrmTemplateApplyOptions applyOptions,
        IFsrmDerivedObjectsResult **derivedObjectsResult) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmAutoApplyQuota, 0xf82e5729, 0x6aba, 0x4740, 0xbf,0xc7, 0xc7,0xf5,0x8f,0x75,0xfb,0x7b)
#endif
#else
typedef struct IFsrmAutoApplyQuotaVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IFsrmAutoApplyQuota *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IFsrmAutoApplyQuota *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IFsrmAutoApplyQuota *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IFsrmAutoApplyQuota *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IFsrmAutoApplyQuota *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IFsrmAutoApplyQuota *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IFsrmAutoApplyQuota *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IFsrmObject methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Id)(
        IFsrmAutoApplyQuota *This,
        FSRM_OBJECT_ID *id);

    HRESULT (STDMETHODCALLTYPE *get_Description)(
        IFsrmAutoApplyQuota *This,
        BSTR *description);

    HRESULT (STDMETHODCALLTYPE *put_Description)(
        IFsrmAutoApplyQuota *This,
        BSTR description);

    HRESULT (STDMETHODCALLTYPE *Delete)(
        IFsrmAutoApplyQuota *This);

    HRESULT (STDMETHODCALLTYPE *Commit)(
        IFsrmAutoApplyQuota *This);

    /*** IFsrmQuotaBase methods ***/
    HRESULT (STDMETHODCALLTYPE *get_QuotaLimit)(
        IFsrmAutoApplyQuota *This,
        VARIANT *quotaLimit);

    HRESULT (STDMETHODCALLTYPE *put_QuotaLimit)(
        IFsrmAutoApplyQuota *This,
        VARIANT quotaLimit);

    HRESULT (STDMETHODCALLTYPE *get_QuotaFlags)(
        IFsrmAutoApplyQuota *This,
        LONG *quotaFlags);

    HRESULT (STDMETHODCALLTYPE *put_QuotaFlags)(
        IFsrmAutoApplyQuota *This,
        LONG quotaFlags);

    HRESULT (STDMETHODCALLTYPE *get_Thresholds)(
        IFsrmAutoApplyQuota *This,
        SAFEARRAY **thresholds);

    HRESULT (STDMETHODCALLTYPE *AddThreshold)(
        IFsrmAutoApplyQuota *This,
        FSRM_QUOTA_THRESHOLD threshold);

    HRESULT (STDMETHODCALLTYPE *DeleteThreshold)(
        IFsrmAutoApplyQuota *This,
        FSRM_QUOTA_THRESHOLD threshold);

    HRESULT (STDMETHODCALLTYPE *ModifyThreshold)(
        IFsrmAutoApplyQuota *This,
        FSRM_QUOTA_THRESHOLD threshold,
        FSRM_QUOTA_THRESHOLD newThreshold);

    HRESULT (STDMETHODCALLTYPE *CreateThresholdAction)(
        IFsrmAutoApplyQuota *This,
        FSRM_QUOTA_THRESHOLD threshold,
        FsrmActionType actionType,
        IFsrmAction **action);

    HRESULT (STDMETHODCALLTYPE *EnumThresholdActions)(
        IFsrmAutoApplyQuota *This,
        FSRM_QUOTA_THRESHOLD threshold,
        IFsrmCollection **actions);

    /*** IFsrmQuotaObject methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Path)(
        IFsrmAutoApplyQuota *This,
        BSTR *path);

    HRESULT (STDMETHODCALLTYPE *get_UserSid)(
        IFsrmAutoApplyQuota *This,
        BSTR *userSid);

    HRESULT (STDMETHODCALLTYPE *get_UserAccount)(
        IFsrmAutoApplyQuota *This,
        BSTR *userAccount);

    HRESULT (STDMETHODCALLTYPE *get_SourceTemplateName)(
        IFsrmAutoApplyQuota *This,
        BSTR *quotaTemplateName);

    HRESULT (STDMETHODCALLTYPE *get_MatchesSourceTemplate)(
        IFsrmAutoApplyQuota *This,
        VARIANT_BOOL *matches);

    HRESULT (STDMETHODCALLTYPE *ApplyTemplate)(
        IFsrmAutoApplyQuota *This,
        BSTR quotaTemplateName);

    /*** IFsrmAutoApplyQuota methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ExcludeFolders)(
        IFsrmAutoApplyQuota *This,
        SAFEARRAY **folders);

    HRESULT (STDMETHODCALLTYPE *put_ExcludeFolders)(
        IFsrmAutoApplyQuota *This,
        SAFEARRAY *folders);

    HRESULT (STDMETHODCALLTYPE *CommitAndUpdateDerived)(
        IFsrmAutoApplyQuota *This,
        FsrmCommitOptions commitOptions,
        FsrmTemplateApplyOptions applyOptions,
        IFsrmDerivedObjectsResult **derivedObjectsResult);

    END_INTERFACE
} IFsrmAutoApplyQuotaVtbl;

interface IFsrmAutoApplyQuota {
    CONST_VTBL IFsrmAutoApplyQuotaVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmAutoApplyQuota_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmAutoApplyQuota_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmAutoApplyQuota_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmAutoApplyQuota_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmAutoApplyQuota_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmAutoApplyQuota_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmAutoApplyQuota_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmObject methods ***/
#define IFsrmAutoApplyQuota_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
#define IFsrmAutoApplyQuota_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
#define IFsrmAutoApplyQuota_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
#define IFsrmAutoApplyQuota_Delete(This) (This)->lpVtbl->Delete(This)
#define IFsrmAutoApplyQuota_Commit(This) (This)->lpVtbl->Commit(This)
/*** IFsrmQuotaBase methods ***/
#define IFsrmAutoApplyQuota_get_QuotaLimit(This,quotaLimit) (This)->lpVtbl->get_QuotaLimit(This,quotaLimit)
#define IFsrmAutoApplyQuota_put_QuotaLimit(This,quotaLimit) (This)->lpVtbl->put_QuotaLimit(This,quotaLimit)
#define IFsrmAutoApplyQuota_get_QuotaFlags(This,quotaFlags) (This)->lpVtbl->get_QuotaFlags(This,quotaFlags)
#define IFsrmAutoApplyQuota_put_QuotaFlags(This,quotaFlags) (This)->lpVtbl->put_QuotaFlags(This,quotaFlags)
#define IFsrmAutoApplyQuota_get_Thresholds(This,thresholds) (This)->lpVtbl->get_Thresholds(This,thresholds)
#define IFsrmAutoApplyQuota_AddThreshold(This,threshold) (This)->lpVtbl->AddThreshold(This,threshold)
#define IFsrmAutoApplyQuota_DeleteThreshold(This,threshold) (This)->lpVtbl->DeleteThreshold(This,threshold)
#define IFsrmAutoApplyQuota_ModifyThreshold(This,threshold,newThreshold) (This)->lpVtbl->ModifyThreshold(This,threshold,newThreshold)
#define IFsrmAutoApplyQuota_CreateThresholdAction(This,threshold,actionType,action) (This)->lpVtbl->CreateThresholdAction(This,threshold,actionType,action)
#define IFsrmAutoApplyQuota_EnumThresholdActions(This,threshold,actions) (This)->lpVtbl->EnumThresholdActions(This,threshold,actions)
/*** IFsrmQuotaObject methods ***/
#define IFsrmAutoApplyQuota_get_Path(This,path) (This)->lpVtbl->get_Path(This,path)
#define IFsrmAutoApplyQuota_get_UserSid(This,userSid) (This)->lpVtbl->get_UserSid(This,userSid)
#define IFsrmAutoApplyQuota_get_UserAccount(This,userAccount) (This)->lpVtbl->get_UserAccount(This,userAccount)
#define IFsrmAutoApplyQuota_get_SourceTemplateName(This,quotaTemplateName) (This)->lpVtbl->get_SourceTemplateName(This,quotaTemplateName)
#define IFsrmAutoApplyQuota_get_MatchesSourceTemplate(This,matches) (This)->lpVtbl->get_MatchesSourceTemplate(This,matches)
#define IFsrmAutoApplyQuota_ApplyTemplate(This,quotaTemplateName) (This)->lpVtbl->ApplyTemplate(This,quotaTemplateName)
/*** IFsrmAutoApplyQuota methods ***/
#define IFsrmAutoApplyQuota_get_ExcludeFolders(This,folders) (This)->lpVtbl->get_ExcludeFolders(This,folders)
#define IFsrmAutoApplyQuota_put_ExcludeFolders(This,folders) (This)->lpVtbl->put_ExcludeFolders(This,folders)
#define IFsrmAutoApplyQuota_CommitAndUpdateDerived(This,commitOptions,applyOptions,derivedObjectsResult) (This)->lpVtbl->CommitAndUpdateDerived(This,commitOptions,applyOptions,derivedObjectsResult)
#else
/*** IUnknown methods ***/
static inline HRESULT IFsrmAutoApplyQuota_QueryInterface(IFsrmAutoApplyQuota* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IFsrmAutoApplyQuota_AddRef(IFsrmAutoApplyQuota* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IFsrmAutoApplyQuota_Release(IFsrmAutoApplyQuota* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IFsrmAutoApplyQuota_GetTypeInfoCount(IFsrmAutoApplyQuota* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IFsrmAutoApplyQuota_GetTypeInfo(IFsrmAutoApplyQuota* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static inline HRESULT IFsrmAutoApplyQuota_GetIDsOfNames(IFsrmAutoApplyQuota* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static inline HRESULT IFsrmAutoApplyQuota_Invoke(IFsrmAutoApplyQuota* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IFsrmObject methods ***/
static inline HRESULT IFsrmAutoApplyQuota_get_Id(IFsrmAutoApplyQuota* This,FSRM_OBJECT_ID *id) {
    return This->lpVtbl->get_Id(This,id);
}
static inline HRESULT IFsrmAutoApplyQuota_get_Description(IFsrmAutoApplyQuota* This,BSTR *description) {
    return This->lpVtbl->get_Description(This,description);
}
static inline HRESULT IFsrmAutoApplyQuota_put_Description(IFsrmAutoApplyQuota* This,BSTR description) {
    return This->lpVtbl->put_Description(This,description);
}
static inline HRESULT IFsrmAutoApplyQuota_Delete(IFsrmAutoApplyQuota* This) {
    return This->lpVtbl->Delete(This);
}
static inline HRESULT IFsrmAutoApplyQuota_Commit(IFsrmAutoApplyQuota* This) {
    return This->lpVtbl->Commit(This);
}
/*** IFsrmQuotaBase methods ***/
static inline HRESULT IFsrmAutoApplyQuota_get_QuotaLimit(IFsrmAutoApplyQuota* This,VARIANT *quotaLimit) {
    return This->lpVtbl->get_QuotaLimit(This,quotaLimit);
}
static inline HRESULT IFsrmAutoApplyQuota_put_QuotaLimit(IFsrmAutoApplyQuota* This,VARIANT quotaLimit) {
    return This->lpVtbl->put_QuotaLimit(This,quotaLimit);
}
static inline HRESULT IFsrmAutoApplyQuota_get_QuotaFlags(IFsrmAutoApplyQuota* This,LONG *quotaFlags) {
    return This->lpVtbl->get_QuotaFlags(This,quotaFlags);
}
static inline HRESULT IFsrmAutoApplyQuota_put_QuotaFlags(IFsrmAutoApplyQuota* This,LONG quotaFlags) {
    return This->lpVtbl->put_QuotaFlags(This,quotaFlags);
}
static inline HRESULT IFsrmAutoApplyQuota_get_Thresholds(IFsrmAutoApplyQuota* This,SAFEARRAY **thresholds) {
    return This->lpVtbl->get_Thresholds(This,thresholds);
}
static inline HRESULT IFsrmAutoApplyQuota_AddThreshold(IFsrmAutoApplyQuota* This,FSRM_QUOTA_THRESHOLD threshold) {
    return This->lpVtbl->AddThreshold(This,threshold);
}
static inline HRESULT IFsrmAutoApplyQuota_DeleteThreshold(IFsrmAutoApplyQuota* This,FSRM_QUOTA_THRESHOLD threshold) {
    return This->lpVtbl->DeleteThreshold(This,threshold);
}
static inline HRESULT IFsrmAutoApplyQuota_ModifyThreshold(IFsrmAutoApplyQuota* This,FSRM_QUOTA_THRESHOLD threshold,FSRM_QUOTA_THRESHOLD newThreshold) {
    return This->lpVtbl->ModifyThreshold(This,threshold,newThreshold);
}
static inline HRESULT IFsrmAutoApplyQuota_CreateThresholdAction(IFsrmAutoApplyQuota* This,FSRM_QUOTA_THRESHOLD threshold,FsrmActionType actionType,IFsrmAction **action) {
    return This->lpVtbl->CreateThresholdAction(This,threshold,actionType,action);
}
static inline HRESULT IFsrmAutoApplyQuota_EnumThresholdActions(IFsrmAutoApplyQuota* This,FSRM_QUOTA_THRESHOLD threshold,IFsrmCollection **actions) {
    return This->lpVtbl->EnumThresholdActions(This,threshold,actions);
}
/*** IFsrmQuotaObject methods ***/
static inline HRESULT IFsrmAutoApplyQuota_get_Path(IFsrmAutoApplyQuota* This,BSTR *path) {
    return This->lpVtbl->get_Path(This,path);
}
static inline HRESULT IFsrmAutoApplyQuota_get_UserSid(IFsrmAutoApplyQuota* This,BSTR *userSid) {
    return This->lpVtbl->get_UserSid(This,userSid);
}
static inline HRESULT IFsrmAutoApplyQuota_get_UserAccount(IFsrmAutoApplyQuota* This,BSTR *userAccount) {
    return This->lpVtbl->get_UserAccount(This,userAccount);
}
static inline HRESULT IFsrmAutoApplyQuota_get_SourceTemplateName(IFsrmAutoApplyQuota* This,BSTR *quotaTemplateName) {
    return This->lpVtbl->get_SourceTemplateName(This,quotaTemplateName);
}
static inline HRESULT IFsrmAutoApplyQuota_get_MatchesSourceTemplate(IFsrmAutoApplyQuota* This,VARIANT_BOOL *matches) {
    return This->lpVtbl->get_MatchesSourceTemplate(This,matches);
}
static inline HRESULT IFsrmAutoApplyQuota_ApplyTemplate(IFsrmAutoApplyQuota* This,BSTR quotaTemplateName) {
    return This->lpVtbl->ApplyTemplate(This,quotaTemplateName);
}
/*** IFsrmAutoApplyQuota methods ***/
static inline HRESULT IFsrmAutoApplyQuota_get_ExcludeFolders(IFsrmAutoApplyQuota* This,SAFEARRAY **folders) {
    return This->lpVtbl->get_ExcludeFolders(This,folders);
}
static inline HRESULT IFsrmAutoApplyQuota_put_ExcludeFolders(IFsrmAutoApplyQuota* This,SAFEARRAY *folders) {
    return This->lpVtbl->put_ExcludeFolders(This,folders);
}
static inline HRESULT IFsrmAutoApplyQuota_CommitAndUpdateDerived(IFsrmAutoApplyQuota* This,FsrmCommitOptions commitOptions,FsrmTemplateApplyOptions applyOptions,IFsrmDerivedObjectsResult **derivedObjectsResult) {
    return This->lpVtbl->CommitAndUpdateDerived(This,commitOptions,applyOptions,derivedObjectsResult);
}
#endif
#endif

#endif


#endif  /* __IFsrmAutoApplyQuota_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFsrmQuotaManagerEx interface
 */
#ifndef __IFsrmQuotaManagerEx_INTERFACE_DEFINED__
#define __IFsrmQuotaManagerEx_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmQuotaManagerEx, 0x4846cb01, 0xd430, 0x494f, 0xab,0xb4, 0xb1,0x05,0x49,0x99,0xfb,0x09);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("4846cb01-d430-494f-abb4-b1054999fb09")
IFsrmQuotaManagerEx : public IFsrmQuotaManager
{
    virtual HRESULT STDMETHODCALLTYPE IsAffectedByQuota(
        BSTR path,
        FsrmEnumOptions options,
        VARIANT_BOOL *affected) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmQuotaManagerEx, 0x4846cb01, 0xd430, 0x494f, 0xab,0xb4, 0xb1,0x05,0x49,0x99,0xfb,0x09)
#endif
#else
typedef struct IFsrmQuotaManagerExVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IFsrmQuotaManagerEx *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IFsrmQuotaManagerEx *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IFsrmQuotaManagerEx *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IFsrmQuotaManagerEx *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IFsrmQuotaManagerEx *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IFsrmQuotaManagerEx *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IFsrmQuotaManagerEx *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IFsrmQuotaManager methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ActionVariables)(
        IFsrmQuotaManagerEx *This,
        SAFEARRAY **variables);

    HRESULT (STDMETHODCALLTYPE *get_ActionVariableDescriptions)(
        IFsrmQuotaManagerEx *This,
        SAFEARRAY **descriptions);

    HRESULT (STDMETHODCALLTYPE *CreateQuota)(
        IFsrmQuotaManagerEx *This,
        BSTR path,
        IFsrmQuota **quota);

    HRESULT (STDMETHODCALLTYPE *CreateAutoApplyQuota)(
        IFsrmQuotaManagerEx *This,
        BSTR quotaTemplateName,
        BSTR path,
        IFsrmAutoApplyQuota **quota);

    HRESULT (STDMETHODCALLTYPE *GetQuota)(
        IFsrmQuotaManagerEx *This,
        BSTR path,
        IFsrmQuota **quota);

    HRESULT (STDMETHODCALLTYPE *GetAutoApplyQuota)(
        IFsrmQuotaManagerEx *This,
        BSTR path,
        IFsrmAutoApplyQuota **quota);

    HRESULT (STDMETHODCALLTYPE *GetRestrictiveQuota)(
        IFsrmQuotaManagerEx *This,
        BSTR path,
        IFsrmQuota **quota);

    HRESULT (STDMETHODCALLTYPE *EnumQuotas)(
        IFsrmQuotaManagerEx *This,
        BSTR path,
        FsrmEnumOptions options,
        IFsrmCommittableCollection **quotas);

    HRESULT (STDMETHODCALLTYPE *EnumAutoApplyQuotas)(
        IFsrmQuotaManagerEx *This,
        BSTR path,
        FsrmEnumOptions options,
        IFsrmCommittableCollection **quotas);

    HRESULT (STDMETHODCALLTYPE *EnumEffectiveQuotas)(
        IFsrmQuotaManagerEx *This,
        BSTR path,
        FsrmEnumOptions options,
        IFsrmCommittableCollection **quotas);

    HRESULT (STDMETHODCALLTYPE *Scan)(
        IFsrmQuotaManagerEx *This,
        BSTR strPath);

    HRESULT (STDMETHODCALLTYPE *CreateQuotaCollection)(
        IFsrmQuotaManagerEx *This,
        IFsrmCommittableCollection **collection);

    /*** IFsrmQuotaManagerEx methods ***/
    HRESULT (STDMETHODCALLTYPE *IsAffectedByQuota)(
        IFsrmQuotaManagerEx *This,
        BSTR path,
        FsrmEnumOptions options,
        VARIANT_BOOL *affected);

    END_INTERFACE
} IFsrmQuotaManagerExVtbl;

interface IFsrmQuotaManagerEx {
    CONST_VTBL IFsrmQuotaManagerExVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmQuotaManagerEx_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmQuotaManagerEx_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmQuotaManagerEx_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmQuotaManagerEx_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmQuotaManagerEx_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmQuotaManagerEx_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmQuotaManagerEx_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmQuotaManager methods ***/
#define IFsrmQuotaManagerEx_get_ActionVariables(This,variables) (This)->lpVtbl->get_ActionVariables(This,variables)
#define IFsrmQuotaManagerEx_get_ActionVariableDescriptions(This,descriptions) (This)->lpVtbl->get_ActionVariableDescriptions(This,descriptions)
#define IFsrmQuotaManagerEx_CreateQuota(This,path,quota) (This)->lpVtbl->CreateQuota(This,path,quota)
#define IFsrmQuotaManagerEx_CreateAutoApplyQuota(This,quotaTemplateName,path,quota) (This)->lpVtbl->CreateAutoApplyQuota(This,quotaTemplateName,path,quota)
#define IFsrmQuotaManagerEx_GetQuota(This,path,quota) (This)->lpVtbl->GetQuota(This,path,quota)
#define IFsrmQuotaManagerEx_GetAutoApplyQuota(This,path,quota) (This)->lpVtbl->GetAutoApplyQuota(This,path,quota)
#define IFsrmQuotaManagerEx_GetRestrictiveQuota(This,path,quota) (This)->lpVtbl->GetRestrictiveQuota(This,path,quota)
#define IFsrmQuotaManagerEx_EnumQuotas(This,path,options,quotas) (This)->lpVtbl->EnumQuotas(This,path,options,quotas)
#define IFsrmQuotaManagerEx_EnumAutoApplyQuotas(This,path,options,quotas) (This)->lpVtbl->EnumAutoApplyQuotas(This,path,options,quotas)
#define IFsrmQuotaManagerEx_EnumEffectiveQuotas(This,path,options,quotas) (This)->lpVtbl->EnumEffectiveQuotas(This,path,options,quotas)
#define IFsrmQuotaManagerEx_Scan(This,strPath) (This)->lpVtbl->Scan(This,strPath)
#define IFsrmQuotaManagerEx_CreateQuotaCollection(This,collection) (This)->lpVtbl->CreateQuotaCollection(This,collection)
/*** IFsrmQuotaManagerEx methods ***/
#define IFsrmQuotaManagerEx_IsAffectedByQuota(This,path,options,affected) (This)->lpVtbl->IsAffectedByQuota(This,path,options,affected)
#else
/*** IUnknown methods ***/
static inline HRESULT IFsrmQuotaManagerEx_QueryInterface(IFsrmQuotaManagerEx* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IFsrmQuotaManagerEx_AddRef(IFsrmQuotaManagerEx* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IFsrmQuotaManagerEx_Release(IFsrmQuotaManagerEx* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IFsrmQuotaManagerEx_GetTypeInfoCount(IFsrmQuotaManagerEx* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IFsrmQuotaManagerEx_GetTypeInfo(IFsrmQuotaManagerEx* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static inline HRESULT IFsrmQuotaManagerEx_GetIDsOfNames(IFsrmQuotaManagerEx* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static inline HRESULT IFsrmQuotaManagerEx_Invoke(IFsrmQuotaManagerEx* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IFsrmQuotaManager methods ***/
static inline HRESULT IFsrmQuotaManagerEx_get_ActionVariables(IFsrmQuotaManagerEx* This,SAFEARRAY **variables) {
    return This->lpVtbl->get_ActionVariables(This,variables);
}
static inline HRESULT IFsrmQuotaManagerEx_get_ActionVariableDescriptions(IFsrmQuotaManagerEx* This,SAFEARRAY **descriptions) {
    return This->lpVtbl->get_ActionVariableDescriptions(This,descriptions);
}
static inline HRESULT IFsrmQuotaManagerEx_CreateQuota(IFsrmQuotaManagerEx* This,BSTR path,IFsrmQuota **quota) {
    return This->lpVtbl->CreateQuota(This,path,quota);
}
static inline HRESULT IFsrmQuotaManagerEx_CreateAutoApplyQuota(IFsrmQuotaManagerEx* This,BSTR quotaTemplateName,BSTR path,IFsrmAutoApplyQuota **quota) {
    return This->lpVtbl->CreateAutoApplyQuota(This,quotaTemplateName,path,quota);
}
static inline HRESULT IFsrmQuotaManagerEx_GetQuota(IFsrmQuotaManagerEx* This,BSTR path,IFsrmQuota **quota) {
    return This->lpVtbl->GetQuota(This,path,quota);
}
static inline HRESULT IFsrmQuotaManagerEx_GetAutoApplyQuota(IFsrmQuotaManagerEx* This,BSTR path,IFsrmAutoApplyQuota **quota) {
    return This->lpVtbl->GetAutoApplyQuota(This,path,quota);
}
static inline HRESULT IFsrmQuotaManagerEx_GetRestrictiveQuota(IFsrmQuotaManagerEx* This,BSTR path,IFsrmQuota **quota) {
    return This->lpVtbl->GetRestrictiveQuota(This,path,quota);
}
static inline HRESULT IFsrmQuotaManagerEx_EnumQuotas(IFsrmQuotaManagerEx* This,BSTR path,FsrmEnumOptions options,IFsrmCommittableCollection **quotas) {
    return This->lpVtbl->EnumQuotas(This,path,options,quotas);
}
static inline HRESULT IFsrmQuotaManagerEx_EnumAutoApplyQuotas(IFsrmQuotaManagerEx* This,BSTR path,FsrmEnumOptions options,IFsrmCommittableCollection **quotas) {
    return This->lpVtbl->EnumAutoApplyQuotas(This,path,options,quotas);
}
static inline HRESULT IFsrmQuotaManagerEx_EnumEffectiveQuotas(IFsrmQuotaManagerEx* This,BSTR path,FsrmEnumOptions options,IFsrmCommittableCollection **quotas) {
    return This->lpVtbl->EnumEffectiveQuotas(This,path,options,quotas);
}
static inline HRESULT IFsrmQuotaManagerEx_Scan(IFsrmQuotaManagerEx* This,BSTR strPath) {
    return This->lpVtbl->Scan(This,strPath);
}
static inline HRESULT IFsrmQuotaManagerEx_CreateQuotaCollection(IFsrmQuotaManagerEx* This,IFsrmCommittableCollection **collection) {
    return This->lpVtbl->CreateQuotaCollection(This,collection);
}
/*** IFsrmQuotaManagerEx methods ***/
static inline HRESULT IFsrmQuotaManagerEx_IsAffectedByQuota(IFsrmQuotaManagerEx* This,BSTR path,FsrmEnumOptions options,VARIANT_BOOL *affected) {
    return This->lpVtbl->IsAffectedByQuota(This,path,options,affected);
}
#endif
#endif

#endif


#endif  /* __IFsrmQuotaManagerEx_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IFsrmQuotaTemplateImported interface
 */
#ifndef __IFsrmQuotaTemplateImported_INTERFACE_DEFINED__
#define __IFsrmQuotaTemplateImported_INTERFACE_DEFINED__

DEFINE_GUID(IID_IFsrmQuotaTemplateImported, 0x9a2bf113, 0xa329, 0x44cc, 0x80,0x9a, 0x5c,0x00,0xfc,0xe8,0xda,0x40);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9a2bf113-a329-44cc-809a-5c00fce8da40")
IFsrmQuotaTemplateImported : public IFsrmQuotaTemplate
{
    virtual HRESULT STDMETHODCALLTYPE get_OverwriteOnCommit(
        VARIANT_BOOL *overwrite) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_OverwriteOnCommit(
        VARIANT_BOOL overwrite) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IFsrmQuotaTemplateImported, 0x9a2bf113, 0xa329, 0x44cc, 0x80,0x9a, 0x5c,0x00,0xfc,0xe8,0xda,0x40)
#endif
#else
typedef struct IFsrmQuotaTemplateImportedVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IFsrmQuotaTemplateImported *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IFsrmQuotaTemplateImported *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IFsrmQuotaTemplateImported *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IFsrmQuotaTemplateImported *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IFsrmQuotaTemplateImported *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IFsrmQuotaTemplateImported *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IFsrmQuotaTemplateImported *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IFsrmObject methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Id)(
        IFsrmQuotaTemplateImported *This,
        FSRM_OBJECT_ID *id);

    HRESULT (STDMETHODCALLTYPE *get_Description)(
        IFsrmQuotaTemplateImported *This,
        BSTR *description);

    HRESULT (STDMETHODCALLTYPE *put_Description)(
        IFsrmQuotaTemplateImported *This,
        BSTR description);

    HRESULT (STDMETHODCALLTYPE *Delete)(
        IFsrmQuotaTemplateImported *This);

    HRESULT (STDMETHODCALLTYPE *Commit)(
        IFsrmQuotaTemplateImported *This);

    /*** IFsrmQuotaBase methods ***/
    HRESULT (STDMETHODCALLTYPE *get_QuotaLimit)(
        IFsrmQuotaTemplateImported *This,
        VARIANT *quotaLimit);

    HRESULT (STDMETHODCALLTYPE *put_QuotaLimit)(
        IFsrmQuotaTemplateImported *This,
        VARIANT quotaLimit);

    HRESULT (STDMETHODCALLTYPE *get_QuotaFlags)(
        IFsrmQuotaTemplateImported *This,
        LONG *quotaFlags);

    HRESULT (STDMETHODCALLTYPE *put_QuotaFlags)(
        IFsrmQuotaTemplateImported *This,
        LONG quotaFlags);

    HRESULT (STDMETHODCALLTYPE *get_Thresholds)(
        IFsrmQuotaTemplateImported *This,
        SAFEARRAY **thresholds);

    HRESULT (STDMETHODCALLTYPE *AddThreshold)(
        IFsrmQuotaTemplateImported *This,
        FSRM_QUOTA_THRESHOLD threshold);

    HRESULT (STDMETHODCALLTYPE *DeleteThreshold)(
        IFsrmQuotaTemplateImported *This,
        FSRM_QUOTA_THRESHOLD threshold);

    HRESULT (STDMETHODCALLTYPE *ModifyThreshold)(
        IFsrmQuotaTemplateImported *This,
        FSRM_QUOTA_THRESHOLD threshold,
        FSRM_QUOTA_THRESHOLD newThreshold);

    HRESULT (STDMETHODCALLTYPE *CreateThresholdAction)(
        IFsrmQuotaTemplateImported *This,
        FSRM_QUOTA_THRESHOLD threshold,
        FsrmActionType actionType,
        IFsrmAction **action);

    HRESULT (STDMETHODCALLTYPE *EnumThresholdActions)(
        IFsrmQuotaTemplateImported *This,
        FSRM_QUOTA_THRESHOLD threshold,
        IFsrmCollection **actions);

    /*** IFsrmQuotaTemplate methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Name)(
        IFsrmQuotaTemplateImported *This,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *put_Name)(
        IFsrmQuotaTemplateImported *This,
        BSTR name);

    HRESULT (STDMETHODCALLTYPE *CopyTemplate)(
        IFsrmQuotaTemplateImported *This,
        BSTR quotaTemplateName);

    HRESULT (STDMETHODCALLTYPE *CommitAndUpdateDerived)(
        IFsrmQuotaTemplateImported *This,
        FsrmCommitOptions commitOptions,
        FsrmTemplateApplyOptions applyOptions,
        IFsrmDerivedObjectsResult **derivedObjectsResult);

    /*** IFsrmQuotaTemplateImported methods ***/
    HRESULT (STDMETHODCALLTYPE *get_OverwriteOnCommit)(
        IFsrmQuotaTemplateImported *This,
        VARIANT_BOOL *overwrite);

    HRESULT (STDMETHODCALLTYPE *put_OverwriteOnCommit)(
        IFsrmQuotaTemplateImported *This,
        VARIANT_BOOL overwrite);

    END_INTERFACE
} IFsrmQuotaTemplateImportedVtbl;

interface IFsrmQuotaTemplateImported {
    CONST_VTBL IFsrmQuotaTemplateImportedVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IFsrmQuotaTemplateImported_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IFsrmQuotaTemplateImported_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IFsrmQuotaTemplateImported_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IFsrmQuotaTemplateImported_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IFsrmQuotaTemplateImported_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IFsrmQuotaTemplateImported_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IFsrmQuotaTemplateImported_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IFsrmObject methods ***/
#define IFsrmQuotaTemplateImported_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
#define IFsrmQuotaTemplateImported_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
#define IFsrmQuotaTemplateImported_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
#define IFsrmQuotaTemplateImported_Delete(This) (This)->lpVtbl->Delete(This)
#define IFsrmQuotaTemplateImported_Commit(This) (This)->lpVtbl->Commit(This)
/*** IFsrmQuotaBase methods ***/
#define IFsrmQuotaTemplateImported_get_QuotaLimit(This,quotaLimit) (This)->lpVtbl->get_QuotaLimit(This,quotaLimit)
#define IFsrmQuotaTemplateImported_put_QuotaLimit(This,quotaLimit) (This)->lpVtbl->put_QuotaLimit(This,quotaLimit)
#define IFsrmQuotaTemplateImported_get_QuotaFlags(This,quotaFlags) (This)->lpVtbl->get_QuotaFlags(This,quotaFlags)
#define IFsrmQuotaTemplateImported_put_QuotaFlags(This,quotaFlags) (This)->lpVtbl->put_QuotaFlags(This,quotaFlags)
#define IFsrmQuotaTemplateImported_get_Thresholds(This,thresholds) (This)->lpVtbl->get_Thresholds(This,thresholds)
#define IFsrmQuotaTemplateImported_AddThreshold(This,threshold) (This)->lpVtbl->AddThreshold(This,threshold)
#define IFsrmQuotaTemplateImported_DeleteThreshold(This,threshold) (This)->lpVtbl->DeleteThreshold(This,threshold)
#define IFsrmQuotaTemplateImported_ModifyThreshold(This,threshold,newThreshold) (This)->lpVtbl->ModifyThreshold(This,threshold,newThreshold)
#define IFsrmQuotaTemplateImported_CreateThresholdAction(This,threshold,actionType,action) (This)->lpVtbl->CreateThresholdAction(This,threshold,actionType,action)
#define IFsrmQuotaTemplateImported_EnumThresholdActions(This,threshold,actions) (This)->lpVtbl->EnumThresholdActions(This,threshold,actions)
/*** IFsrmQuotaTemplate methods ***/
#define IFsrmQuotaTemplateImported_get_Name(This,name) (This)->lpVtbl->get_Name(This,name)
#define IFsrmQuotaTemplateImported_put_Name(This,name) (This)->lpVtbl->put_Name(This,name)
#define IFsrmQuotaTemplateImported_CopyTemplate(This,quotaTemplateName) (This)->lpVtbl->CopyTemplate(This,quotaTemplateName)
#define IFsrmQuotaTemplateImported_CommitAndUpdateDerived(This,commitOptions,applyOptions,derivedObjectsResult) (This)->lpVtbl->CommitAndUpdateDerived(This,commitOptions,applyOptions,derivedObjectsResult)
/*** IFsrmQuotaTemplateImported methods ***/
#define IFsrmQuotaTemplateImported_get_OverwriteOnCommit(This,overwrite) (This)->lpVtbl->get_OverwriteOnCommit(This,overwrite)
#define IFsrmQuotaTemplateImported_put_OverwriteOnCommit(This,overwrite) (This)->lpVtbl->put_OverwriteOnCommit(This,overwrite)
#else
/*** IUnknown methods ***/
static inline HRESULT IFsrmQuotaTemplateImported_QueryInterface(IFsrmQuotaTemplateImported* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IFsrmQuotaTemplateImported_AddRef(IFsrmQuotaTemplateImported* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IFsrmQuotaTemplateImported_Release(IFsrmQuotaTemplateImported* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IFsrmQuotaTemplateImported_GetTypeInfoCount(IFsrmQuotaTemplateImported* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IFsrmQuotaTemplateImported_GetTypeInfo(IFsrmQuotaTemplateImported* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static inline HRESULT IFsrmQuotaTemplateImported_GetIDsOfNames(IFsrmQuotaTemplateImported* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static inline HRESULT IFsrmQuotaTemplateImported_Invoke(IFsrmQuotaTemplateImported* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IFsrmObject methods ***/
static inline HRESULT IFsrmQuotaTemplateImported_get_Id(IFsrmQuotaTemplateImported* This,FSRM_OBJECT_ID *id) {
    return This->lpVtbl->get_Id(This,id);
}
static inline HRESULT IFsrmQuotaTemplateImported_get_Description(IFsrmQuotaTemplateImported* This,BSTR *description) {
    return This->lpVtbl->get_Description(This,description);
}
static inline HRESULT IFsrmQuotaTemplateImported_put_Description(IFsrmQuotaTemplateImported* This,BSTR description) {
    return This->lpVtbl->put_Description(This,description);
}
static inline HRESULT IFsrmQuotaTemplateImported_Delete(IFsrmQuotaTemplateImported* This) {
    return This->lpVtbl->Delete(This);
}
static inline HRESULT IFsrmQuotaTemplateImported_Commit(IFsrmQuotaTemplateImported* This) {
    return This->lpVtbl->Commit(This);
}
/*** IFsrmQuotaBase methods ***/
static inline HRESULT IFsrmQuotaTemplateImported_get_QuotaLimit(IFsrmQuotaTemplateImported* This,VARIANT *quotaLimit) {
    return This->lpVtbl->get_QuotaLimit(This,quotaLimit);
}
static inline HRESULT IFsrmQuotaTemplateImported_put_QuotaLimit(IFsrmQuotaTemplateImported* This,VARIANT quotaLimit) {
    return This->lpVtbl->put_QuotaLimit(This,quotaLimit);
}
static inline HRESULT IFsrmQuotaTemplateImported_get_QuotaFlags(IFsrmQuotaTemplateImported* This,LONG *quotaFlags) {
    return This->lpVtbl->get_QuotaFlags(This,quotaFlags);
}
static inline HRESULT IFsrmQuotaTemplateImported_put_QuotaFlags(IFsrmQuotaTemplateImported* This,LONG quotaFlags) {
    return This->lpVtbl->put_QuotaFlags(This,quotaFlags);
}
static inline HRESULT IFsrmQuotaTemplateImported_get_Thresholds(IFsrmQuotaTemplateImported* This,SAFEARRAY **thresholds) {
    return This->lpVtbl->get_Thresholds(This,thresholds);
}
static inline HRESULT IFsrmQuotaTemplateImported_AddThreshold(IFsrmQuotaTemplateImported* This,FSRM_QUOTA_THRESHOLD threshold) {
    return This->lpVtbl->AddThreshold(This,threshold);
}
static inline HRESULT IFsrmQuotaTemplateImported_DeleteThreshold(IFsrmQuotaTemplateImported* This,FSRM_QUOTA_THRESHOLD threshold) {
    return This->lpVtbl->DeleteThreshold(This,threshold);
}
static inline HRESULT IFsrmQuotaTemplateImported_ModifyThreshold(IFsrmQuotaTemplateImported* This,FSRM_QUOTA_THRESHOLD threshold,FSRM_QUOTA_THRESHOLD newThreshold) {
    return This->lpVtbl->ModifyThreshold(This,threshold,newThreshold);
}
static inline HRESULT IFsrmQuotaTemplateImported_CreateThresholdAction(IFsrmQuotaTemplateImported* This,FSRM_QUOTA_THRESHOLD threshold,FsrmActionType actionType,IFsrmAction **action) {
    return This->lpVtbl->CreateThresholdAction(This,threshold,actionType,action);
}
static inline HRESULT IFsrmQuotaTemplateImported_EnumThresholdActions(IFsrmQuotaTemplateImported* This,FSRM_QUOTA_THRESHOLD threshold,IFsrmCollection **actions) {
    return This->lpVtbl->EnumThresholdActions(This,threshold,actions);
}
/*** IFsrmQuotaTemplate methods ***/
static inline HRESULT IFsrmQuotaTemplateImported_get_Name(IFsrmQuotaTemplateImported* This,BSTR *name) {
    return This->lpVtbl->get_Name(This,name);
}
static inline HRESULT IFsrmQuotaTemplateImported_put_Name(IFsrmQuotaTemplateImported* This,BSTR name) {
    return This->lpVtbl->put_Name(This,name);
}
static inline HRESULT IFsrmQuotaTemplateImported_CopyTemplate(IFsrmQuotaTemplateImported* This,BSTR quotaTemplateName) {
    return This->lpVtbl->CopyTemplate(This,quotaTemplateName);
}
static inline HRESULT IFsrmQuotaTemplateImported_CommitAndUpdateDerived(IFsrmQuotaTemplateImported* This,FsrmCommitOptions commitOptions,FsrmTemplateApplyOptions applyOptions,IFsrmDerivedObjectsResult **derivedObjectsResult) {
    return This->lpVtbl->CommitAndUpdateDerived(This,commitOptions,applyOptions,derivedObjectsResult);
}
/*** IFsrmQuotaTemplateImported methods ***/
static inline HRESULT IFsrmQuotaTemplateImported_get_OverwriteOnCommit(IFsrmQuotaTemplateImported* This,VARIANT_BOOL *overwrite) {
    return This->lpVtbl->get_OverwriteOnCommit(This,overwrite);
}
static inline HRESULT IFsrmQuotaTemplateImported_put_OverwriteOnCommit(IFsrmQuotaTemplateImported* This,VARIANT_BOOL overwrite) {
    return This->lpVtbl->put_OverwriteOnCommit(This,overwrite);
}
#endif
#endif

#endif


#endif  /* __IFsrmQuotaTemplateImported_INTERFACE_DEFINED__ */

#endif
/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER VARIANT_UserSize     (ULONG *, ULONG, VARIANT *);
unsigned char * __RPC_USER VARIANT_UserMarshal  (ULONG *, unsigned char *, VARIANT *);
unsigned char * __RPC_USER VARIANT_UserUnmarshal(ULONG *, unsigned char *, VARIANT *);
void            __RPC_USER VARIANT_UserFree     (ULONG *, VARIANT *);
ULONG           __RPC_USER BSTR_UserSize     (ULONG *, ULONG, BSTR *);
unsigned char * __RPC_USER BSTR_UserMarshal  (ULONG *, unsigned char *, BSTR *);
unsigned char * __RPC_USER BSTR_UserUnmarshal(ULONG *, unsigned char *, BSTR *);
void            __RPC_USER BSTR_UserFree     (ULONG *, BSTR *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __fsrmquota_h__ */
