diff --git a/mingw-w64-headers/Makefile.am b/mingw-w64-headers/Makefile.am
index 58dec81..51bafc8 100644
--- a/mingw-w64-headers/Makefile.am
+++ b/mingw-w64-headers/Makefile.am
@@ -79,6 +79,9 @@
   include/endpointvolume.idl \
   include/fsrm.idl \
   include/fsrmenums.idl \
+  include/fsrmquota.idl \
+  include/fsrmreports.idl \
+  include/fsrmscreen.idl \
   include/fusion.idl \
   include/fwptypes.idl \
   include/hstring.idl \
diff --git a/mingw-w64-headers/Makefile.in b/mingw-w64-headers/Makefile.in
index b09e933..cec1344 100644
--- a/mingw-w64-headers/Makefile.in
+++ b/mingw-w64-headers/Makefile.in
@@ -303,6 +303,9 @@
 @HAVE_WIDL_TRUE@  include/endpointvolume.idl \
 @HAVE_WIDL_TRUE@  include/fsrm.idl \
 @HAVE_WIDL_TRUE@  include/fsrmenums.idl \
+@HAVE_WIDL_TRUE@  include/fsrmquota.idl \
+@HAVE_WIDL_TRUE@  include/fsrmreports.idl \
+@HAVE_WIDL_TRUE@  include/fsrmscreen.idl \
 @HAVE_WIDL_TRUE@  include/fusion.idl \
 @HAVE_WIDL_TRUE@  include/fwptypes.idl \
 @HAVE_WIDL_TRUE@  include/hstring.idl \
diff --git a/mingw-w64-headers/include/fsrmquota.h b/mingw-w64-headers/include/fsrmquota.h
index 7cc4d95..6a4b70d 100644
--- a/mingw-w64-headers/include/fsrmquota.h
+++ b/mingw-w64-headers/include/fsrmquota.h
@@ -1,861 +1,337 @@
-/**
- * This file has no copyright assigned and is placed in the Public Domain.
- * This file is part of the mingw-w64 runtime package.
- * No warranty is given; refer to the file DISCLAIMER.PD within this package.
- */
-#include <fsrmenums.h>
-#include <fsrm.h>
+/*** Autogenerated by WIDL 1.6 from fsrmquota.idl - Do not edit ***/
 
-#ifndef _INC_FSRMQUOTA
-#define _INC_FSRMQUOTA
-#if (_WIN32_WINNT >= 0x0600)
+#ifndef __REQUIRED_RPCNDR_H_VERSION__
+#define __REQUIRED_RPCNDR_H_VERSION__ 475
+#endif
 
-#ifndef __IFsrmAction_FWD_DEFINED__
-#define __IFsrmAction_FWD_DEFINED__
-typedef struct IFsrmAction IFsrmAction;
-#endif /* __IFsrmAction_FWD_DEFINED__ */
+#include <rpc.h>
+#include <rpcndr.h>
 
-#ifndef __IFsrmActionCommand_FWD_DEFINED__
-#define __IFsrmActionCommand_FWD_DEFINED__
-typedef struct IFsrmActionCommand IFsrmActionCommand;
-#endif /* __IFsrmActionCommand_FWD_DEFINED__ */
+#ifndef COM_NO_WINDOWS_H
+#include <windows.h>
+#include <ole2.h>
+#endif
 
-#ifndef __IFsrmActionEmail_FWD_DEFINED__
-#define __IFsrmActionEmail_FWD_DEFINED__
-typedef struct IFsrmActionEmail IFsrmActionEmail;
-#endif /* __IFsrmActionEmail_FWD_DEFINED__ */
+#ifndef __fsrmquota_h__
+#define __fsrmquota_h__
 
-#ifndef __IFsrmActionEmail2_FWD_DEFINED__
-#define __IFsrmActionEmail2_FWD_DEFINED__
-typedef struct IFsrmActionEmail2 IFsrmActionEmail2;
-#endif /* __IFsrmActionEmail2_FWD_DEFINED__ */
-
-#ifndef __IFsrmActionEventLog_FWD_DEFINED__
-#define __IFsrmActionEventLog_FWD_DEFINED__
-typedef struct IFsrmActionEventLog IFsrmActionEventLog;
-#endif /* __IFsrmActionEventLog_FWD_DEFINED__ */
-
-#ifndef __IFsrmActionReport_FWD_DEFINED__
-#define __IFsrmActionReport_FWD_DEFINED__
-typedef struct IFsrmActionReport IFsrmActionReport;
-#endif /* __IFsrmActionReport_FWD_DEFINED__ */
-
-#ifndef __IFsrmAutoApplyQuota_FWD_DEFINED__
-#define __IFsrmAutoApplyQuota_FWD_DEFINED__
-typedef struct IFsrmAutoApplyQuota IFsrmAutoApplyQuota;
-#endif /* __IFsrmAutoApplyQuota_FWD_DEFINED__ */
-
-#ifndef __IFsrmClassificationManager_FWD_DEFINED__
-#define __IFsrmClassificationManager_FWD_DEFINED__
-typedef struct IFsrmClassificationManager IFsrmClassificationManager;
-#endif /* __IFsrmClassificationManager_FWD_DEFINED__ */
-
-#ifndef __IFsrmClassificationRule_FWD_DEFINED__
-#define __IFsrmClassificationRule_FWD_DEFINED__
-typedef struct IFsrmClassificationRule IFsrmClassificationRule;
-#endif /* __IFsrmClassificationRule_FWD_DEFINED__ */
-
-#ifndef __IFsrmClassifierModuleDefinition_FWD_DEFINED__
-#define __IFsrmClassifierModuleDefinition_FWD_DEFINED__
-typedef struct IFsrmClassifierModuleDefinition IFsrmClassifierModuleDefinition;
-#endif /* __IFsrmClassifierModuleDefinition_FWD_DEFINED__ */
-
-#ifndef __IFsrmClassifierModuleImplementation_FWD_DEFINED__
-#define __IFsrmClassifierModuleImplementation_FWD_DEFINED__
-typedef struct IFsrmClassifierModuleImplementation IFsrmClassifierModuleImplementation;
-#endif /* __IFsrmClassifierModuleImplementation_FWD_DEFINED__ */
-
-#ifndef __IFsrmCollection_FWD_DEFINED__
-#define __IFsrmCollection_FWD_DEFINED__
-typedef struct IFsrmCollection IFsrmCollection;
-#endif /* __IFsrmCollection_FWD_DEFINED__ */
-
-#ifndef __IFsrmCommittableCollection_FWD_DEFINED__
-#define __IFsrmCommittableCollection_FWD_DEFINED__
-typedef struct IFsrmCommittableCollection IFsrmCommittableCollection;
-#endif /* __IFsrmCommittableCollection_FWD_DEFINED__ */
-
-#ifndef __IFsrmDerivedObjectsResult_FWD_DEFINED__
-#define __IFsrmDerivedObjectsResult_FWD_DEFINED__
-typedef struct IFsrmDerivedObjectsResult IFsrmDerivedObjectsResult;
-#endif /* __IFsrmDerivedObjectsResult_FWD_DEFINED__ */
-
-#ifndef __IFsrmExportImport_FWD_DEFINED__
-#define __IFsrmExportImport_FWD_DEFINED__
-typedef struct IFsrmExportImport IFsrmExportImport;
-#endif /* __IFsrmExportImport_FWD_DEFINED__ */
-
-#ifndef __IFsrmFileGroup_FWD_DEFINED__
-#define __IFsrmFileGroup_FWD_DEFINED__
-typedef struct IFsrmFileGroup IFsrmFileGroup;
-#endif /* __IFsrmFileGroup_FWD_DEFINED__ */
-
-#ifndef __IFsrmFileGroupImported_FWD_DEFINED__
-#define __IFsrmFileGroupImported_FWD_DEFINED__
-typedef struct IFsrmFileGroupImported IFsrmFileGroupImported;
-#endif /* __IFsrmFileGroupImported_FWD_DEFINED__ */
-
-#ifndef __IFsrmFileGroupManager_FWD_DEFINED__
-#define __IFsrmFileGroupManager_FWD_DEFINED__
-typedef struct IFsrmFileGroupManager IFsrmFileGroupManager;
-#endif /* __IFsrmFileGroupManager_FWD_DEFINED__ */
-
-#ifndef __IFsrmFileManagementJob_FWD_DEFINED__
-#define __IFsrmFileManagementJob_FWD_DEFINED__
-typedef struct IFsrmFileManagementJob IFsrmFileManagementJob;
-#endif /* __IFsrmFileManagementJob_FWD_DEFINED__ */
-
-#ifndef __IFsrmFileManagementJobManager_FWD_DEFINED__
-#define __IFsrmFileManagementJobManager_FWD_DEFINED__
-typedef struct IFsrmFileManagementJobManager IFsrmFileManagementJobManager;
-#endif /* __IFsrmFileManagementJobManager_FWD_DEFINED__ */
-
-#ifndef __IFsrmFileScreen_FWD_DEFINED__
-#define __IFsrmFileScreen_FWD_DEFINED__
-typedef struct IFsrmFileScreen IFsrmFileScreen;
-#endif /* __IFsrmFileScreen_FWD_DEFINED__ */
-
-#ifndef __IFsrmFileScreenBase_FWD_DEFINED__
-#define __IFsrmFileScreenBase_FWD_DEFINED__
-typedef struct IFsrmFileScreenBase IFsrmFileScreenBase;
-#endif /* __IFsrmFileScreenBase_FWD_DEFINED__ */
-
-#ifndef __IFsrmFileScreenException_FWD_DEFINED__
-#define __IFsrmFileScreenException_FWD_DEFINED__
-typedef struct IFsrmFileScreenException IFsrmFileScreenException;
-#endif /* __IFsrmFileScreenException_FWD_DEFINED__ */
-
-#ifndef __IFsrmFileScreenManager_FWD_DEFINED__
-#define __IFsrmFileScreenManager_FWD_DEFINED__
-typedef struct IFsrmFileScreenManager IFsrmFileScreenManager;
-#endif /* __IFsrmFileScreenManager_FWD_DEFINED__ */
-
-#ifndef __IFsrmFileScreenTemplate_FWD_DEFINED__
-#define __IFsrmFileScreenTemplate_FWD_DEFINED__
-typedef struct IFsrmFileScreenTemplate IFsrmFileScreenTemplate;
-#endif /* __IFsrmFileScreenTemplate_FWD_DEFINED__ */
-
-#ifndef __IFsrmFileScreenTemplateImported_FWD_DEFINED__
-#define __IFsrmFileScreenTemplateImported_FWD_DEFINED__
-typedef struct IFsrmFileScreenTemplateImported IFsrmFileScreenTemplateImported;
-#endif /* __IFsrmFileScreenTemplateImported_FWD_DEFINED__ */
-
-#ifndef __IFsrmFileScreenTemplateManager_FWD_DEFINED__
-#define __IFsrmFileScreenTemplateManager_FWD_DEFINED__
-typedef struct IFsrmFileScreenTemplateManager IFsrmFileScreenTemplateManager;
-#endif /* __IFsrmFileScreenTemplateManager_FWD_DEFINED__ */
-
-#ifndef __IFsrmMutableCollection_FWD_DEFINED__
-#define __IFsrmMutableCollection_FWD_DEFINED__
-typedef struct IFsrmMutableCollection IFsrmMutableCollection;
-#endif /* __IFsrmMutableCollection_FWD_DEFINED__ */
-
-#ifndef __IFsrmObject_FWD_DEFINED__
-#define __IFsrmObject_FWD_DEFINED__
-typedef struct IFsrmObject IFsrmObject;
-#endif /* __IFsrmObject_FWD_DEFINED__ */
-
-#ifndef __IFsrmPathMapper_FWD_DEFINED__
-#define __IFsrmPathMapper_FWD_DEFINED__
-typedef struct IFsrmPathMapper IFsrmPathMapper;
-#endif /* __IFsrmPathMapper_FWD_DEFINED__ */
-
-#ifndef __IFsrmPipelineModuleConnector_FWD_DEFINED__
-#define __IFsrmPipelineModuleConnector_FWD_DEFINED__
-typedef struct IFsrmPipelineModuleConnector IFsrmPipelineModuleConnector;
-#endif /* __IFsrmPipelineModuleConnector_FWD_DEFINED__ */
-
-#ifndef __IFsrmPipelineModuleDefinition_FWD_DEFINED__
-#define __IFsrmPipelineModuleDefinition_FWD_DEFINED__
-typedef struct IFsrmPipelineModuleDefinition IFsrmPipelineModuleDefinition;
-#endif /* __IFsrmPipelineModuleDefinition_FWD_DEFINED__ */
-
-#ifndef __IFsrmPipelineModuleImplementation_FWD_DEFINED__
-#define __IFsrmPipelineModuleImplementation_FWD_DEFINED__
-typedef struct IFsrmPipelineModuleImplementation IFsrmPipelineModuleImplementation;
-#endif /* __IFsrmPipelineModuleImplementation_FWD_DEFINED__ */
-
-#ifndef __IFsrmProperty_FWD_DEFINED__
-#define __IFsrmProperty_FWD_DEFINED__
-typedef struct IFsrmProperty IFsrmProperty;
-#endif /* __IFsrmProperty_FWD_DEFINED__ */
-
-#ifndef __IFsrmPropertyBag_FWD_DEFINED__
-#define __IFsrmPropertyBag_FWD_DEFINED__
-typedef struct IFsrmPropertyBag IFsrmPropertyBag;
-#endif /* __IFsrmPropertyBag_FWD_DEFINED__ */
-
-#ifndef __IFsrmPropertyCondition_FWD_DEFINED__
-#define __IFsrmPropertyCondition_FWD_DEFINED__
-typedef struct IFsrmPropertyCondition IFsrmPropertyCondition;
-#endif /* __IFsrmPropertyCondition_FWD_DEFINED__ */
-
-#ifndef __IFsrmPropertyDefinition_FWD_DEFINED__
-#define __IFsrmPropertyDefinition_FWD_DEFINED__
-typedef struct IFsrmPropertyDefinition IFsrmPropertyDefinition;
-#endif /* __IFsrmPropertyDefinition_FWD_DEFINED__ */
-
-#ifndef __IFsrmQuota_FWD_DEFINED__
-#define __IFsrmQuota_FWD_DEFINED__
-typedef struct IFsrmQuota IFsrmQuota;
-#endif /* __IFsrmQuota_FWD_DEFINED__ */
-
-#ifndef __IFsrmQuotaBase_FWD_DEFINED__
-#define __IFsrmQuotaBase_FWD_DEFINED__
-typedef struct IFsrmQuotaBase IFsrmQuotaBase;
-#endif /* __IFsrmQuotaBase_FWD_DEFINED__ */
+/* Forward declarations */
 
 #ifndef __IFsrmQuotaManager_FWD_DEFINED__
 #define __IFsrmQuotaManager_FWD_DEFINED__
-typedef struct IFsrmQuotaManager IFsrmQuotaManager;
-#endif /* __IFsrmQuotaManager_FWD_DEFINED__ */
-
-#ifndef __IFsrmQuotaManagerEx_FWD_DEFINED__
-#define __IFsrmQuotaManagerEx_FWD_DEFINED__
-typedef struct IFsrmQuotaManagerEx IFsrmQuotaManagerEx;
-#endif /* __IFsrmQuotaManagerEx_FWD_DEFINED__ */
-
-#ifndef __IFsrmQuotaObject_FWD_DEFINED__
-#define __IFsrmQuotaObject_FWD_DEFINED__
-typedef struct IFsrmQuotaObject IFsrmQuotaObject;
-#endif /* __IFsrmQuotaObject_FWD_DEFINED__ */
-
-#ifndef __IFsrmQuotaTemplate_FWD_DEFINED__
-#define __IFsrmQuotaTemplate_FWD_DEFINED__
-typedef struct IFsrmQuotaTemplate IFsrmQuotaTemplate;
-#endif /* __IFsrmQuotaTemplate_FWD_DEFINED__ */
-
-#ifndef __IFsrmQuotaTemplateImported_FWD_DEFINED__
-#define __IFsrmQuotaTemplateImported_FWD_DEFINED__
-typedef struct IFsrmQuotaTemplateImported IFsrmQuotaTemplateImported;
-#endif /* __IFsrmQuotaTemplateImported_FWD_DEFINED__ */
+typedef interface IFsrmQuotaManager IFsrmQuotaManager;
+#endif
 
 #ifndef __IFsrmQuotaTemplateManager_FWD_DEFINED__
 #define __IFsrmQuotaTemplateManager_FWD_DEFINED__
-typedef struct IFsrmQuotaTemplateManager IFsrmQuotaTemplateManager;
-#endif /* __IFsrmQuotaTemplateManager_FWD_DEFINED__ */
-
-#ifndef __IFsrmReport_FWD_DEFINED__
-#define __IFsrmReport_FWD_DEFINED__
-typedef struct IFsrmReport IFsrmReport;
-#endif /* __IFsrmReport_FWD_DEFINED__ */
-
-#ifndef __IFsrmReportJob_FWD_DEFINED__
-#define __IFsrmReportJob_FWD_DEFINED__
-typedef struct IFsrmReportJob IFsrmReportJob;
-#endif /* __IFsrmReportJob_FWD_DEFINED__ */
-
-#ifndef __IFsrmReportManager_FWD_DEFINED__
-#define __IFsrmReportManager_FWD_DEFINED__
-typedef struct IFsrmReportManager IFsrmReportManager;
-#endif /* __IFsrmReportManager_FWD_DEFINED__ */
-
-#ifndef __IFsrmReportScheduler_FWD_DEFINED__
-#define __IFsrmReportScheduler_FWD_DEFINED__
-typedef struct IFsrmReportScheduler IFsrmReportScheduler;
-#endif /* __IFsrmReportScheduler_FWD_DEFINED__ */
-
-#ifndef __IFsrmRule_FWD_DEFINED__
-#define __IFsrmRule_FWD_DEFINED__
-typedef struct IFsrmRule IFsrmRule;
-#endif /* __IFsrmRule_FWD_DEFINED__ */
-
-#ifndef __IFsrmSetting_FWD_DEFINED__
-#define __IFsrmSetting_FWD_DEFINED__
-typedef struct IFsrmSetting IFsrmSetting;
-#endif /* __IFsrmSetting_FWD_DEFINED__ */
-
-#ifndef __IFsrmStorageModuleDefinition_FWD_DEFINED__
-#define __IFsrmStorageModuleDefinition_FWD_DEFINED__
-typedef struct IFsrmStorageModuleDefinition IFsrmStorageModuleDefinition;
-#endif /* __IFsrmStorageModuleDefinition_FWD_DEFINED__ */
-
-#ifndef __IFsrmStorageModuleImplementation_FWD_DEFINED__
-#define __IFsrmStorageModuleImplementation_FWD_DEFINED__
-typedef struct IFsrmStorageModuleImplementation IFsrmStorageModuleImplementation;
-#endif /* __IFsrmStorageModuleImplementation_FWD_DEFINED__ */
-
-#undef  INTERFACE
-#define INTERFACE IFsrmQuotaBase
-#ifdef __GNUC__
-#warning COM interfaces layout in this header has not been verified.
-#warning COM interfaces with incorrect layout may not work at all.
-__MINGW_BROKEN_INTERFACE(INTERFACE)
+typedef interface IFsrmQuotaTemplateManager IFsrmQuotaTemplateManager;
 #endif
-DECLARE_INTERFACE_(IFsrmQuotaBase,IFsrmObject)
+
+#ifndef __IFsrmQuotaBase_FWD_DEFINED__
+#define __IFsrmQuotaBase_FWD_DEFINED__
+typedef interface IFsrmQuotaBase IFsrmQuotaBase;
+#endif
+
+#ifndef __IFsrmQuotaObject_FWD_DEFINED__
+#define __IFsrmQuotaObject_FWD_DEFINED__
+typedef interface IFsrmQuotaObject IFsrmQuotaObject;
+#endif
+
+#ifndef __IFsrmQuotaTemplate_FWD_DEFINED__
+#define __IFsrmQuotaTemplate_FWD_DEFINED__
+typedef interface IFsrmQuotaTemplate IFsrmQuotaTemplate;
+#endif
+
+#ifndef __IFsrmQuota_FWD_DEFINED__
+#define __IFsrmQuota_FWD_DEFINED__
+typedef interface IFsrmQuota IFsrmQuota;
+#endif
+
+#ifndef __IFsrmAutoApplyQuota_FWD_DEFINED__
+#define __IFsrmAutoApplyQuota_FWD_DEFINED__
+typedef interface IFsrmAutoApplyQuota IFsrmAutoApplyQuota;
+#endif
+
+#ifndef __IFsrmQuotaManagerEx_FWD_DEFINED__
+#define __IFsrmQuotaManagerEx_FWD_DEFINED__
+typedef interface IFsrmQuotaManagerEx IFsrmQuotaManagerEx;
+#endif
+
+#ifndef __IFsrmQuotaTemplateImported_FWD_DEFINED__
+#define __IFsrmQuotaTemplateImported_FWD_DEFINED__
+typedef interface IFsrmQuotaTemplateImported IFsrmQuotaTemplateImported;
+#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;
+#endif
+
+#ifndef __IFsrmQuota_FWD_DEFINED__
+#define __IFsrmQuota_FWD_DEFINED__
+typedef interface IFsrmQuota IFsrmQuota;
+#endif
+
+#ifndef __IFsrmQuotaBase_FWD_DEFINED__
+#define __IFsrmQuotaBase_FWD_DEFINED__
+typedef interface IFsrmQuotaBase IFsrmQuotaBase;
+#endif
+
+#ifndef __IFsrmQuotaObject_FWD_DEFINED__
+#define __IFsrmQuotaObject_FWD_DEFINED__
+typedef interface IFsrmQuotaObject IFsrmQuotaObject;
+#endif
+
+#ifndef __IFsrmQuotaManager_FWD_DEFINED__
+#define __IFsrmQuotaManager_FWD_DEFINED__
+typedef interface IFsrmQuotaManager IFsrmQuotaManager;
+#endif
+
+#ifndef __IFsrmQuotaTemplate_FWD_DEFINED__
+#define __IFsrmQuotaTemplate_FWD_DEFINED__
+typedef interface IFsrmQuotaTemplate IFsrmQuotaTemplate;
+#endif
+
+#ifndef __IFsrmQuotaTemplateImported_FWD_DEFINED__
+#define __IFsrmQuotaTemplateImported_FWD_DEFINED__
+typedef interface IFsrmQuotaTemplateImported IFsrmQuotaTemplateImported;
+#endif
+
+#ifndef __IFsrmQuotaTemplateManager_FWD_DEFINED__
+#define __IFsrmQuotaTemplateManager_FWD_DEFINED__
+typedef interface IFsrmQuotaTemplateManager IFsrmQuotaTemplateManager;
+#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 = L"",
+        FsrmEnumOptions options = FsrmEnumOptions_None,
+        IFsrmCommittableCollection **quotas) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EnumAutoApplyQuotas(
+        BSTR path = L"",
+        FsrmEnumOptions options = FsrmEnumOptions_None,
+        IFsrmCommittableCollection **quotas) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EnumEffectiveQuotas(
+        BSTR path,
+        FsrmEnumOptions options = FsrmEnumOptions_None,
+        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 */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFsrmQuotaManager* This,
+        REFIID riid,
+        void **ppvObject);
 
-    /* IDispatch methods */
-    STDMETHOD_(HRESULT,GetTypeInfoCount)(THIS_ unsigned int FAR*  pctinfo) PURE;
-    STDMETHOD_(HRESULT,GetTypeInfo)(THIS_ unsigned int  iTInfo,LCID  lcid,ITypeInfo FAR* FAR*  ppTInfo) PURE;
-    STDMETHOD_(HRESULT,GetIDsOfNames)(THIS_ REFIID  riid,OLECHAR FAR* FAR*  rgszNames,unsigned int  cNames,LCID   lcid,DISPID FAR*  rgDispId) PURE;
-    STDMETHOD_(HRESULT,Invoke)(THIS_ DISPID  dispIdMember,REFIID  riid,LCID  lcid,WORD  wFlags,DISPPARAMS FAR*  pDispParams,VARIANT FAR*  pVarResult,EXCEPINFO FAR*  pExcepInfo,unsigned int FAR*  puArgErr) PURE;
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFsrmQuotaManager* This);
 
-    /* IFsrmObject methods */
-    STDMETHOD_(HRESULT,get_Id)(THIS_ FSRM_OBJECT_ID *id) PURE;
-    STDMETHOD_(HRESULT,get_Description)(THIS_ BSTR *description) PURE;
-    STDMETHOD_(HRESULT,put_Description)(THIS_ BSTR description) PURE;
-    STDMETHOD_(HRESULT,Delete)(THIS) PURE;
-    STDMETHOD_(HRESULT,Commit)(THIS) PURE;
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFsrmQuotaManager* This);
 
-    /* IFsrmQuotaBase methods */
-    STDMETHOD_(HRESULT,get_QuotaLimit)(THIS_ VARIANT *quotaLimit) PURE;
-    STDMETHOD_(HRESULT,put_QuotaLimit)(THIS_ VARIANT quotaLimit) PURE;
-    STDMETHOD_(HRESULT,get_QuotaFlags)(THIS_ __LONG32 *quotaFlags) PURE;
-    STDMETHOD_(HRESULT,put_QuotaFlags)(THIS_ __LONG32 quotaFlags) PURE;
-    STDMETHOD_(HRESULT,get_Thresholds)(THIS_ SAFEARRAY *thresholds) PURE;
-    STDMETHOD_(HRESULT,AddThreshold)(THIS_ FSRM_QUOTA_THRESHOLD threshold) PURE;
-    STDMETHOD_(HRESULT,DeleteThreshold)(THIS_ FSRM_QUOTA_THRESHOLD threshold) PURE;
-    STDMETHOD_(HRESULT,ModifyThreshold)(THIS_ FSRM_QUOTA_THRESHOLD threshold,FSRM_QUOTA_THRESHOLD newThreshold) PURE;
-    STDMETHOD_(HRESULT,CreateThresholdAction)(THIS_ FSRM_QUOTA_THRESHOLD threshold,FsrmActionType actionType,IFsrmAction **action) PURE;
-    STDMETHOD_(HRESULT,EnumThresholdActions)(THIS_ FSRM_QUOTA_THRESHOLD threshold,IFsrmCollection **actions) PURE;
+    /*** 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
-#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)
-#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)
-#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)->lpVtbl->Delete(This)
-#define IFsrmQuotaBase_Commit() (This)->lpVtbl->Commit(This)
-#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)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmQuotaObject
-#ifdef __GNUC__
-#warning COM interfaces layout in this header has not been verified.
-#warning COM interfaces with incorrect layout may not work at all.
-__MINGW_BROKEN_INTERFACE(INTERFACE)
-#endif
-DECLARE_INTERFACE_(IFsrmQuotaObject,IFsrmQuotaBase)
-{
-    BEGIN_INTERFACE
-
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-
-    /* IDispatch methods */
-    STDMETHOD_(HRESULT,GetTypeInfoCount)(THIS_ unsigned int FAR*  pctinfo) PURE;
-    STDMETHOD_(HRESULT,GetTypeInfo)(THIS_ unsigned int  iTInfo,LCID  lcid,ITypeInfo FAR* FAR*  ppTInfo) PURE;
-    STDMETHOD_(HRESULT,GetIDsOfNames)(THIS_ REFIID  riid,OLECHAR FAR* FAR*  rgszNames,unsigned int  cNames,LCID   lcid,DISPID FAR*  rgDispId) PURE;
-    STDMETHOD_(HRESULT,Invoke)(THIS_ DISPID  dispIdMember,REFIID  riid,LCID  lcid,WORD  wFlags,DISPPARAMS FAR*  pDispParams,VARIANT FAR*  pVarResult,EXCEPINFO FAR*  pExcepInfo,unsigned int FAR*  puArgErr) PURE;
-
-    /* IFsrmObject methods */
-    STDMETHOD_(HRESULT,get_Id)(THIS_ FSRM_OBJECT_ID *id) PURE;
-    STDMETHOD_(HRESULT,get_Description)(THIS_ BSTR *description) PURE;
-    STDMETHOD_(HRESULT,put_Description)(THIS_ BSTR description) PURE;
-    STDMETHOD_(HRESULT,Delete)(THIS) PURE;
-    STDMETHOD_(HRESULT,Commit)(THIS) PURE;
-
-    /* IFsrmQuotaBase methods */
-    STDMETHOD_(HRESULT,get_QuotaLimit)(THIS_ VARIANT *quotaLimit) PURE;
-    STDMETHOD_(HRESULT,put_QuotaLimit)(THIS_ VARIANT quotaLimit) PURE;
-    STDMETHOD_(HRESULT,get_QuotaFlags)(THIS_ __LONG32 *quotaFlags) PURE;
-    STDMETHOD_(HRESULT,put_QuotaFlags)(THIS_ __LONG32 quotaFlags) PURE;
-    STDMETHOD_(HRESULT,get_Thresholds)(THIS_ SAFEARRAY *thresholds) PURE;
-    STDMETHOD_(HRESULT,AddThreshold)(THIS_ FSRM_QUOTA_THRESHOLD threshold) PURE;
-    STDMETHOD_(HRESULT,DeleteThreshold)(THIS_ FSRM_QUOTA_THRESHOLD threshold) PURE;
-    STDMETHOD_(HRESULT,ModifyThreshold)(THIS_ FSRM_QUOTA_THRESHOLD threshold,FSRM_QUOTA_THRESHOLD newThreshold) PURE;
-    STDMETHOD_(HRESULT,CreateThresholdAction)(THIS_ FSRM_QUOTA_THRESHOLD threshold,FsrmActionType actionType,IFsrmAction **action) PURE;
-    STDMETHOD_(HRESULT,EnumThresholdActions)(THIS_ FSRM_QUOTA_THRESHOLD threshold,IFsrmCollection **actions) PURE;
-
-    /* IFsrmQuotaObject methods */
-    STDMETHOD_(HRESULT,get_Path)(THIS_ BSTR *path) PURE;
-    STDMETHOD_(HRESULT,get_UserSid)(THIS_ BSTR *userSid) PURE;
-    STDMETHOD_(HRESULT,get_UserAccount)(THIS_ BSTR *userAccount) PURE;
-    STDMETHOD_(HRESULT,get_SourceTemplateName)(THIS_ BSTR *quotaTemplateName) PURE;
-    STDMETHOD_(HRESULT,get_MatchesSourceTemplate)(THIS_ VARIANT_BOOL *matches) PURE;
-    STDMETHOD_(HRESULT,ApplyTemplate)(THIS_ BSTR quotaTemplateName) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#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)
-#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)
-#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)->lpVtbl->Delete(This)
-#define IFsrmQuotaObject_Commit() (This)->lpVtbl->Commit(This)
-#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)
-#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)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmAutoApplyQuota
-#ifdef __GNUC__
-#warning COM interfaces layout in this header has not been verified.
-#warning COM interfaces with incorrect layout may not work at all.
-__MINGW_BROKEN_INTERFACE(INTERFACE)
-#endif
-DECLARE_INTERFACE_(IFsrmAutoApplyQuota,IFsrmQuotaObject)
-{
-    BEGIN_INTERFACE
-
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-
-    /* IDispatch methods */
-    STDMETHOD_(HRESULT,GetTypeInfoCount)(THIS_ unsigned int FAR*  pctinfo) PURE;
-    STDMETHOD_(HRESULT,GetTypeInfo)(THIS_ unsigned int  iTInfo,LCID  lcid,ITypeInfo FAR* FAR*  ppTInfo) PURE;
-    STDMETHOD_(HRESULT,GetIDsOfNames)(THIS_ REFIID  riid,OLECHAR FAR* FAR*  rgszNames,unsigned int  cNames,LCID   lcid,DISPID FAR*  rgDispId) PURE;
-    STDMETHOD_(HRESULT,Invoke)(THIS_ DISPID  dispIdMember,REFIID  riid,LCID  lcid,WORD  wFlags,DISPPARAMS FAR*  pDispParams,VARIANT FAR*  pVarResult,EXCEPINFO FAR*  pExcepInfo,unsigned int FAR*  puArgErr) PURE;
-
-    /* IFsrmObject methods */
-    STDMETHOD_(HRESULT,get_Id)(THIS_ FSRM_OBJECT_ID *id) PURE;
-    STDMETHOD_(HRESULT,get_Description)(THIS_ BSTR *description) PURE;
-    STDMETHOD_(HRESULT,put_Description)(THIS_ BSTR description) PURE;
-    STDMETHOD_(HRESULT,Delete)(THIS) PURE;
-    STDMETHOD_(HRESULT,Commit)(THIS) PURE;
-
-    /* IFsrmQuotaBase methods */
-    STDMETHOD_(HRESULT,get_QuotaLimit)(THIS_ VARIANT *quotaLimit) PURE;
-    STDMETHOD_(HRESULT,put_QuotaLimit)(THIS_ VARIANT quotaLimit) PURE;
-    STDMETHOD_(HRESULT,get_QuotaFlags)(THIS_ __LONG32 *quotaFlags) PURE;
-    STDMETHOD_(HRESULT,put_QuotaFlags)(THIS_ __LONG32 quotaFlags) PURE;
-    STDMETHOD_(HRESULT,get_Thresholds)(THIS_ SAFEARRAY *thresholds) PURE;
-    STDMETHOD_(HRESULT,AddThreshold)(THIS_ FSRM_QUOTA_THRESHOLD threshold) PURE;
-    STDMETHOD_(HRESULT,DeleteThreshold)(THIS_ FSRM_QUOTA_THRESHOLD threshold) PURE;
-    STDMETHOD_(HRESULT,ModifyThreshold)(THIS_ FSRM_QUOTA_THRESHOLD threshold,FSRM_QUOTA_THRESHOLD newThreshold) PURE;
-    STDMETHOD_(HRESULT,CreateThresholdAction)(THIS_ FSRM_QUOTA_THRESHOLD threshold,FsrmActionType actionType,IFsrmAction **action) PURE;
-    STDMETHOD_(HRESULT,EnumThresholdActions)(THIS_ FSRM_QUOTA_THRESHOLD threshold,IFsrmCollection **actions) PURE;
-
-    /* IFsrmQuotaObject methods */
-    STDMETHOD_(HRESULT,get_Path)(THIS_ BSTR *path) PURE;
-    STDMETHOD_(HRESULT,get_UserSid)(THIS_ BSTR *userSid) PURE;
-    STDMETHOD_(HRESULT,get_UserAccount)(THIS_ BSTR *userAccount) PURE;
-    STDMETHOD_(HRESULT,get_SourceTemplateName)(THIS_ BSTR *quotaTemplateName) PURE;
-    STDMETHOD_(HRESULT,get_MatchesSourceTemplate)(THIS_ VARIANT_BOOL *matches) PURE;
-    STDMETHOD_(HRESULT,ApplyTemplate)(THIS_ BSTR quotaTemplateName) PURE;
-
-    /* IFsrmAutoApplyQuota methods */
-    STDMETHOD_(HRESULT,get_ExcludeFolders)(THIS_ SAFEARRAY **folders) PURE;
-    STDMETHOD_(HRESULT,put_ExcludeFolders)(THIS_ SAFEARRAY *folders) PURE;
-    STDMETHOD_(HRESULT,CommitAndUpdateDerived)(THIS_ FsrmCommitOptions commitOptions,FsrmTemplateApplyOptions applyOptions,IFsrmDerivedObjectsResult **derivedObjectsResult) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#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)
-#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)
-#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)->lpVtbl->Delete(This)
-#define IFsrmAutoApplyQuota_Commit() (This)->lpVtbl->Commit(This)
-#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)
-#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)
-#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)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmQuota
-#ifdef __GNUC__
-#warning COM interfaces layout in this header has not been verified.
-#warning COM interfaces with incorrect layout may not work at all.
-__MINGW_BROKEN_INTERFACE(INTERFACE)
-#endif
-DECLARE_INTERFACE_(IFsrmQuota,IFsrmQuotaObject)
-{
-    BEGIN_INTERFACE
-
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-
-    /* IDispatch methods */
-    STDMETHOD_(HRESULT,GetTypeInfoCount)(THIS_ unsigned int FAR*  pctinfo) PURE;
-    STDMETHOD_(HRESULT,GetTypeInfo)(THIS_ unsigned int  iTInfo,LCID  lcid,ITypeInfo FAR* FAR*  ppTInfo) PURE;
-    STDMETHOD_(HRESULT,GetIDsOfNames)(THIS_ REFIID  riid,OLECHAR FAR* FAR*  rgszNames,unsigned int  cNames,LCID   lcid,DISPID FAR*  rgDispId) PURE;
-    STDMETHOD_(HRESULT,Invoke)(THIS_ DISPID  dispIdMember,REFIID  riid,LCID  lcid,WORD  wFlags,DISPPARAMS FAR*  pDispParams,VARIANT FAR*  pVarResult,EXCEPINFO FAR*  pExcepInfo,unsigned int FAR*  puArgErr) PURE;
-
-    /* IFsrmObject methods */
-    STDMETHOD_(HRESULT,get_Id)(THIS_ FSRM_OBJECT_ID *id) PURE;
-    STDMETHOD_(HRESULT,get_Description)(THIS_ BSTR *description) PURE;
-    STDMETHOD_(HRESULT,put_Description)(THIS_ BSTR description) PURE;
-    STDMETHOD_(HRESULT,Delete)(THIS) PURE;
-    STDMETHOD_(HRESULT,Commit)(THIS) PURE;
-
-    /* IFsrmQuotaBase methods */
-    STDMETHOD_(HRESULT,get_QuotaLimit)(THIS_ VARIANT *quotaLimit) PURE;
-    STDMETHOD_(HRESULT,put_QuotaLimit)(THIS_ VARIANT quotaLimit) PURE;
-    STDMETHOD_(HRESULT,get_QuotaFlags)(THIS_ __LONG32 *quotaFlags) PURE;
-    STDMETHOD_(HRESULT,put_QuotaFlags)(THIS_ __LONG32 quotaFlags) PURE;
-    STDMETHOD_(HRESULT,get_Thresholds)(THIS_ SAFEARRAY *thresholds) PURE;
-    STDMETHOD_(HRESULT,AddThreshold)(THIS_ FSRM_QUOTA_THRESHOLD threshold) PURE;
-    STDMETHOD_(HRESULT,DeleteThreshold)(THIS_ FSRM_QUOTA_THRESHOLD threshold) PURE;
-    STDMETHOD_(HRESULT,ModifyThreshold)(THIS_ FSRM_QUOTA_THRESHOLD threshold,FSRM_QUOTA_THRESHOLD newThreshold) PURE;
-    STDMETHOD_(HRESULT,CreateThresholdAction)(THIS_ FSRM_QUOTA_THRESHOLD threshold,FsrmActionType actionType,IFsrmAction **action) PURE;
-    STDMETHOD_(HRESULT,EnumThresholdActions)(THIS_ FSRM_QUOTA_THRESHOLD threshold,IFsrmCollection **actions) PURE;
-
-    /* IFsrmQuota methods */
-    STDMETHOD_(HRESULT,get_QuotaUsed)(THIS_ VARIANT *used) PURE;
-    STDMETHOD_(HRESULT,get_QuotaPeakUsage)(THIS_ VARIANT *peakUsage) PURE;
-    STDMETHOD_(HRESULT,get_QuotaPeakUsageTime)(THIS_ DATE *peakUsageDateTime) PURE;
-    STDMETHOD_(HRESULT,ResetPeakUsage)(THIS) PURE;
-    STDMETHOD_(HRESULT,RefreshUsageProperties)(THIS) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#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)
-#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)
-#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)->lpVtbl->Delete(This)
-#define IFsrmQuota_Commit() (This)->lpVtbl->Commit(This)
-#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)
-#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)
-#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)->lpVtbl->ResetPeakUsage(This)
-#define IFsrmQuota_RefreshUsageProperties() (This)->lpVtbl->RefreshUsageProperties(This)
-#endif /*COBJMACROS*/
-
-
-#undef  INTERFACE
-#define INTERFACE IFsrmQuotaTemplate
-#ifdef __GNUC__
-#warning COM interfaces layout in this header has not been verified.
-#warning COM interfaces with incorrect layout may not work at all.
-__MINGW_BROKEN_INTERFACE(INTERFACE)
-#endif
-DECLARE_INTERFACE_(IFsrmQuotaTemplate,IFsrmQuotaBase)
-{
-    BEGIN_INTERFACE
-
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-
-    /* IDispatch methods */
-    STDMETHOD_(HRESULT,GetTypeInfoCount)(THIS_ unsigned int FAR*  pctinfo) PURE;
-    STDMETHOD_(HRESULT,GetTypeInfo)(THIS_ unsigned int  iTInfo,LCID  lcid,ITypeInfo FAR* FAR*  ppTInfo) PURE;
-    STDMETHOD_(HRESULT,GetIDsOfNames)(THIS_ REFIID  riid,OLECHAR FAR* FAR*  rgszNames,unsigned int  cNames,LCID   lcid,DISPID FAR*  rgDispId) PURE;
-    STDMETHOD_(HRESULT,Invoke)(THIS_ DISPID  dispIdMember,REFIID  riid,LCID  lcid,WORD  wFlags,DISPPARAMS FAR*  pDispParams,VARIANT FAR*  pVarResult,EXCEPINFO FAR*  pExcepInfo,unsigned int FAR*  puArgErr) PURE;
-
-    /* IFsrmObject methods */
-    STDMETHOD_(HRESULT,get_Id)(THIS_ FSRM_OBJECT_ID *id) PURE;
-    STDMETHOD_(HRESULT,get_Description)(THIS_ BSTR *description) PURE;
-    STDMETHOD_(HRESULT,put_Description)(THIS_ BSTR description) PURE;
-    STDMETHOD_(HRESULT,Delete)(THIS) PURE;
-    STDMETHOD_(HRESULT,Commit)(THIS) PURE;
-
-    /* IFsrmQuotaBase methods */
-    STDMETHOD_(HRESULT,get_QuotaLimit)(THIS_ VARIANT *quotaLimit) PURE;
-    STDMETHOD_(HRESULT,put_QuotaLimit)(THIS_ VARIANT quotaLimit) PURE;
-    STDMETHOD_(HRESULT,get_QuotaFlags)(THIS_ __LONG32 *quotaFlags) PURE;
-    STDMETHOD_(HRESULT,put_QuotaFlags)(THIS_ __LONG32 quotaFlags) PURE;
-    STDMETHOD_(HRESULT,get_Thresholds)(THIS_ SAFEARRAY *thresholds) PURE;
-    STDMETHOD_(HRESULT,AddThreshold)(THIS_ FSRM_QUOTA_THRESHOLD threshold) PURE;
-    STDMETHOD_(HRESULT,DeleteThreshold)(THIS_ FSRM_QUOTA_THRESHOLD threshold) PURE;
-    STDMETHOD_(HRESULT,ModifyThreshold)(THIS_ FSRM_QUOTA_THRESHOLD threshold,FSRM_QUOTA_THRESHOLD newThreshold) PURE;
-    STDMETHOD_(HRESULT,CreateThresholdAction)(THIS_ FSRM_QUOTA_THRESHOLD threshold,FsrmActionType actionType,IFsrmAction **action) PURE;
-    STDMETHOD_(HRESULT,EnumThresholdActions)(THIS_ FSRM_QUOTA_THRESHOLD threshold,IFsrmCollection **actions) PURE;
-
-    /* IFsrmQuotaTemplate methods */
-    STDMETHOD_(HRESULT,get_Name)(THIS_ BSTR *name) PURE;
-    STDMETHOD_(HRESULT,put_Name)(THIS_ BSTR name) PURE;
-    STDMETHOD_(HRESULT,CopyTemplate)(THIS_ BSTR quotaTemplateName) PURE;
-    STDMETHOD_(HRESULT,CommitAndUpdateDerived)(THIS_ FsrmCommitOptions commitOptions,FsrmTemplateApplyOptions applyOptions,IFsrmDerivedObjectsResult **derivedObjectsResult) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#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)
-#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)
-#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)->lpVtbl->Delete(This)
-#define IFsrmQuotaTemplate_Commit() (This)->lpVtbl->Commit(This)
-#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)
-#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)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmQuotaTemplateImported
-#ifdef __GNUC__
-#warning COM interfaces layout in this header has not been verified.
-#warning COM interfaces with incorrect layout may not work at all.
-__MINGW_BROKEN_INTERFACE(INTERFACE)
-#endif
-DECLARE_INTERFACE_(IFsrmQuotaTemplateImported,IFsrmQuotaTemplate)
-{
-    BEGIN_INTERFACE
-
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-
-    /* IDispatch methods */
-    STDMETHOD_(HRESULT,GetTypeInfoCount)(THIS_ unsigned int FAR*  pctinfo) PURE;
-    STDMETHOD_(HRESULT,GetTypeInfo)(THIS_ unsigned int  iTInfo,LCID  lcid,ITypeInfo FAR* FAR*  ppTInfo) PURE;
-    STDMETHOD_(HRESULT,GetIDsOfNames)(THIS_ REFIID  riid,OLECHAR FAR* FAR*  rgszNames,unsigned int  cNames,LCID   lcid,DISPID FAR*  rgDispId) PURE;
-    STDMETHOD_(HRESULT,Invoke)(THIS_ DISPID  dispIdMember,REFIID  riid,LCID  lcid,WORD  wFlags,DISPPARAMS FAR*  pDispParams,VARIANT FAR*  pVarResult,EXCEPINFO FAR*  pExcepInfo,unsigned int FAR*  puArgErr) PURE;
-
-    /* IFsrmObject methods */
-    STDMETHOD_(HRESULT,get_Id)(THIS_ FSRM_OBJECT_ID *id) PURE;
-    STDMETHOD_(HRESULT,get_Description)(THIS_ BSTR *description) PURE;
-    STDMETHOD_(HRESULT,put_Description)(THIS_ BSTR description) PURE;
-    STDMETHOD_(HRESULT,Delete)(THIS) PURE;
-    STDMETHOD_(HRESULT,Commit)(THIS) PURE;
-
-    /* IFsrmQuotaBase methods */
-    STDMETHOD_(HRESULT,get_QuotaLimit)(THIS_ VARIANT *quotaLimit) PURE;
-    STDMETHOD_(HRESULT,put_QuotaLimit)(THIS_ VARIANT quotaLimit) PURE;
-    STDMETHOD_(HRESULT,get_QuotaFlags)(THIS_ __LONG32 *quotaFlags) PURE;
-    STDMETHOD_(HRESULT,put_QuotaFlags)(THIS_ __LONG32 quotaFlags) PURE;
-    STDMETHOD_(HRESULT,get_Thresholds)(THIS_ SAFEARRAY *thresholds) PURE;
-    STDMETHOD_(HRESULT,AddThreshold)(THIS_ FSRM_QUOTA_THRESHOLD threshold) PURE;
-    STDMETHOD_(HRESULT,DeleteThreshold)(THIS_ FSRM_QUOTA_THRESHOLD threshold) PURE;
-    STDMETHOD_(HRESULT,ModifyThreshold)(THIS_ FSRM_QUOTA_THRESHOLD threshold,FSRM_QUOTA_THRESHOLD newThreshold) PURE;
-    STDMETHOD_(HRESULT,CreateThresholdAction)(THIS_ FSRM_QUOTA_THRESHOLD threshold,FsrmActionType actionType,IFsrmAction **action) PURE;
-    STDMETHOD_(HRESULT,EnumThresholdActions)(THIS_ FSRM_QUOTA_THRESHOLD threshold,IFsrmCollection **actions) PURE;
-
-    /* IFsrmQuotaTemplate methods */
-    STDMETHOD_(HRESULT,get_Name)(THIS_ BSTR *name) PURE;
-    STDMETHOD_(HRESULT,put_Name)(THIS_ BSTR name) PURE;
-    STDMETHOD_(HRESULT,CopyTemplate)(THIS_ BSTR quotaTemplateName) PURE;
-    STDMETHOD_(HRESULT,CommitAndUpdateDerived)(THIS_ FsrmCommitOptions commitOptions,FsrmTemplateApplyOptions applyOptions,IFsrmDerivedObjectsResult **derivedObjectsResult) PURE;
-
-    /* IFsrmQuotaTemplateImported methods */
-    STDMETHOD_(HRESULT,get_OverwriteOnCommit)(THIS_ VARIANT_BOOL *overwrite) PURE;
-    STDMETHOD_(HRESULT,put_OverwriteOnCommit)(THIS_ VARIANT_BOOL overwrite) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#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)
-#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)
-#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)->lpVtbl->Delete(This)
-#define IFsrmQuotaTemplateImported_Commit() (This)->lpVtbl->Commit(This)
-#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)
-#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)
-#define IFsrmQuotaTemplateImported_get_OverwriteOnCommit(This,overwrite) (This)->lpVtbl->get_OverwriteOnCommit(This,overwrite)
-#define IFsrmQuotaTemplateImported_put_OverwriteOnCommit(This,overwrite) (This)->lpVtbl->put_OverwriteOnCommit(This,overwrite)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmQuotaTemplateManager
-#ifdef __GNUC__
-#warning COM interfaces layout in this header has not been verified.
-#warning COM interfaces with incorrect layout may not work at all.
-__MINGW_BROKEN_INTERFACE(INTERFACE)
-#endif
-DECLARE_INTERFACE_(IFsrmQuotaTemplateManager,IDispatch)
-{
-    BEGIN_INTERFACE
-
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-
-    /* IDispatch methods */
-    STDMETHOD_(HRESULT,GetTypeInfoCount)(THIS_ unsigned int FAR*  pctinfo) PURE;
-    STDMETHOD_(HRESULT,GetTypeInfo)(THIS_ unsigned int  iTInfo,LCID  lcid,ITypeInfo FAR* FAR*  ppTInfo) PURE;
-    STDMETHOD_(HRESULT,GetIDsOfNames)(THIS_ REFIID  riid,OLECHAR FAR* FAR*  rgszNames,unsigned int  cNames,LCID   lcid,DISPID FAR*  rgDispId) PURE;
-    STDMETHOD_(HRESULT,Invoke)(THIS_ DISPID  dispIdMember,REFIID  riid,LCID  lcid,WORD  wFlags,DISPPARAMS FAR*  pDispParams,VARIANT FAR*  pVarResult,EXCEPINFO FAR*  pExcepInfo,unsigned int FAR*  puArgErr) PURE;
-
-    /* IFsrmQuotaTemplateManager methods */
-    STDMETHOD_(HRESULT,CreateTemplate)(THIS_ IFsrmQuotaTemplate **quotaTemplate) PURE;
-    STDMETHOD_(HRESULT,GetTemplate)(THIS_ BSTR name,IFsrmQuotaTemplate **quotaTemplate) PURE;
-    STDMETHOD_(HRESULT,EnumTemplates)(THIS_ FsrmEnumOptions options,IFsrmCommittableCollection **quotaTemplates) PURE;
-    STDMETHOD_(HRESULT,ExportTemplates)(THIS_ VARIANT *quotaTemplateNamesArray,BSTR *serializedQuotaTemplates) PURE;
-    STDMETHOD_(HRESULT,ImportTemplates)(THIS_ BSTR serializedQuotaTemplates,VARIANT *quotaTemplateNamesArray,IFsrmCommittableCollection **quotaTemplates) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#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)
-#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)
-#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)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmQuotaManager
-#ifdef __GNUC__
-#warning COM interfaces layout in this header has not been verified.
-#warning COM interfaces with incorrect layout may not work at all.
-__MINGW_BROKEN_INTERFACE(INTERFACE)
-#endif
-DECLARE_INTERFACE_(IFsrmQuotaManager,IDispatch)
-{
-    BEGIN_INTERFACE
-
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-
-    /* IDispatch methods */
-    STDMETHOD_(HRESULT,GetTypeInfoCount)(THIS_ unsigned int FAR*  pctinfo) PURE;
-    STDMETHOD_(HRESULT,GetTypeInfo)(THIS_ unsigned int  iTInfo,LCID  lcid,ITypeInfo FAR* FAR*  ppTInfo) PURE;
-    STDMETHOD_(HRESULT,GetIDsOfNames)(THIS_ REFIID  riid,OLECHAR FAR* FAR*  rgszNames,unsigned int  cNames,LCID   lcid,DISPID FAR*  rgDispId) PURE;
-    STDMETHOD_(HRESULT,Invoke)(THIS_ DISPID  dispIdMember,REFIID  riid,LCID  lcid,WORD  wFlags,DISPPARAMS FAR*  pDispParams,VARIANT FAR*  pVarResult,EXCEPINFO FAR*  pExcepInfo,unsigned int FAR*  puArgErr) PURE;
-
-    /* IFsrmQuotaManager methods */
-    STDMETHOD_(HRESULT,get_ActionVariables)(THIS_ SAFEARRAY *variables) PURE;
-    STDMETHOD_(HRESULT,get_ActionVariableDescriptions)(THIS_ SAFEARRAY *descriptions) PURE;
-    STDMETHOD_(HRESULT,CreateQuota)(THIS_ BSTR path,IFsrmQuota **quota) PURE;
-    STDMETHOD_(HRESULT,CreateAutoApplyQuota)(THIS_ BSTR quotaTemplateName,BSTR path,IFsrmAutoApplyQuota **quota) PURE;
-    STDMETHOD_(HRESULT,GetQuota)(THIS_ BSTR path,IFsrmQuota **quota) PURE;
-    STDMETHOD_(HRESULT,GetAutoApplyQuota)(THIS_ BSTR path,IFsrmAutoApplyQuota **quota) PURE;
-    STDMETHOD_(HRESULT,GetRestrictiveQuota)(THIS_ BSTR path,IFsrmQuota **quota) PURE;
-    STDMETHOD_(HRESULT,EnumQuotas)(THIS_ BSTR path,FsrmEnumOptions options,IFsrmCommittableCollection **quotas) PURE;
-    STDMETHOD_(HRESULT,EnumAutoApplyQuotas)(THIS_ BSTR path,FsrmEnumOptions options,IFsrmCommittableCollection **quotas) PURE;
-    STDMETHOD_(HRESULT,EnumEffectiveQuotas)(THIS_ BSTR path,FsrmEnumOptions options,IFsrmCommittableCollection **quotas) PURE;
-    STDMETHOD_(HRESULT,Scan)(THIS_ BSTR strPath) PURE;
-    STDMETHOD_(HRESULT,CreateQuotaCollection)(THIS_ IFsrmCommittableCollection **collection) PURE;
-
-    END_INTERFACE
-};
-#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)
@@ -868,57 +344,2330 @@
 #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)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmQuotaManagerEx
-#ifdef __GNUC__
-#warning COM interfaces layout in this header has not been verified.
-#warning COM interfaces with incorrect layout may not work at all.
-__MINGW_BROKEN_INTERFACE(INTERFACE)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IFsrmQuotaManager_QueryInterface(IFsrmQuotaManager* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmQuotaManager_AddRef(IFsrmQuotaManager* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmQuotaManager_Release(IFsrmQuotaManager* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmQuotaManager_GetTypeInfoCount(IFsrmQuotaManager* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmQuotaManager_GetTypeInfo(IFsrmQuotaManager* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE HRESULT IFsrmQuotaManager_get_ActionVariables(IFsrmQuotaManager* This,SAFEARRAY **variables) {
+    return This->lpVtbl->get_ActionVariables(This,variables);
+}
+static FORCEINLINE HRESULT IFsrmQuotaManager_get_ActionVariableDescriptions(IFsrmQuotaManager* This,SAFEARRAY **descriptions) {
+    return This->lpVtbl->get_ActionVariableDescriptions(This,descriptions);
+}
+static FORCEINLINE HRESULT IFsrmQuotaManager_CreateQuota(IFsrmQuotaManager* This,BSTR path,IFsrmQuota **quota) {
+    return This->lpVtbl->CreateQuota(This,path,quota);
+}
+static FORCEINLINE HRESULT IFsrmQuotaManager_CreateAutoApplyQuota(IFsrmQuotaManager* This,BSTR quotaTemplateName,BSTR path,IFsrmAutoApplyQuota **quota) {
+    return This->lpVtbl->CreateAutoApplyQuota(This,quotaTemplateName,path,quota);
+}
+static FORCEINLINE HRESULT IFsrmQuotaManager_GetQuota(IFsrmQuotaManager* This,BSTR path,IFsrmQuota **quota) {
+    return This->lpVtbl->GetQuota(This,path,quota);
+}
+static FORCEINLINE HRESULT IFsrmQuotaManager_GetAutoApplyQuota(IFsrmQuotaManager* This,BSTR path,IFsrmAutoApplyQuota **quota) {
+    return This->lpVtbl->GetAutoApplyQuota(This,path,quota);
+}
+static FORCEINLINE HRESULT IFsrmQuotaManager_GetRestrictiveQuota(IFsrmQuotaManager* This,BSTR path,IFsrmQuota **quota) {
+    return This->lpVtbl->GetRestrictiveQuota(This,path,quota);
+}
+static FORCEINLINE HRESULT IFsrmQuotaManager_EnumQuotas(IFsrmQuotaManager* This,BSTR path,FsrmEnumOptions options,IFsrmCommittableCollection **quotas) {
+    return This->lpVtbl->EnumQuotas(This,path,options,quotas);
+}
+static FORCEINLINE HRESULT IFsrmQuotaManager_EnumAutoApplyQuotas(IFsrmQuotaManager* This,BSTR path,FsrmEnumOptions options,IFsrmCommittableCollection **quotas) {
+    return This->lpVtbl->EnumAutoApplyQuotas(This,path,options,quotas);
+}
+static FORCEINLINE HRESULT IFsrmQuotaManager_EnumEffectiveQuotas(IFsrmQuotaManager* This,BSTR path,FsrmEnumOptions options,IFsrmCommittableCollection **quotas) {
+    return This->lpVtbl->EnumEffectiveQuotas(This,path,options,quotas);
+}
+static FORCEINLINE HRESULT IFsrmQuotaManager_Scan(IFsrmQuotaManager* This,BSTR strPath) {
+    return This->lpVtbl->Scan(This,strPath);
+}
+static FORCEINLINE HRESULT IFsrmQuotaManager_CreateQuotaCollection(IFsrmQuotaManager* This,IFsrmCommittableCollection **collection) {
+    return This->lpVtbl->CreateQuotaCollection(This,collection);
+}
 #endif
-DECLARE_INTERFACE_(IFsrmQuotaManagerEx,IFsrmQuotaManager)
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmQuotaManager_get_ActionVariables_Proxy(
+    IFsrmQuotaManager* This,
+    SAFEARRAY **variables);
+void __RPC_STUB IFsrmQuotaManager_get_ActionVariables_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmQuotaManager_get_ActionVariableDescriptions_Proxy(
+    IFsrmQuotaManager* This,
+    SAFEARRAY **descriptions);
+void __RPC_STUB IFsrmQuotaManager_get_ActionVariableDescriptions_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmQuotaManager_CreateQuota_Proxy(
+    IFsrmQuotaManager* This,
+    BSTR path,
+    IFsrmQuota **quota);
+void __RPC_STUB IFsrmQuotaManager_CreateQuota_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmQuotaManager_CreateAutoApplyQuota_Proxy(
+    IFsrmQuotaManager* This,
+    BSTR quotaTemplateName,
+    BSTR path,
+    IFsrmAutoApplyQuota **quota);
+void __RPC_STUB IFsrmQuotaManager_CreateAutoApplyQuota_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmQuotaManager_GetQuota_Proxy(
+    IFsrmQuotaManager* This,
+    BSTR path,
+    IFsrmQuota **quota);
+void __RPC_STUB IFsrmQuotaManager_GetQuota_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmQuotaManager_GetAutoApplyQuota_Proxy(
+    IFsrmQuotaManager* This,
+    BSTR path,
+    IFsrmAutoApplyQuota **quota);
+void __RPC_STUB IFsrmQuotaManager_GetAutoApplyQuota_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmQuotaManager_GetRestrictiveQuota_Proxy(
+    IFsrmQuotaManager* This,
+    BSTR path,
+    IFsrmQuota **quota);
+void __RPC_STUB IFsrmQuotaManager_GetRestrictiveQuota_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmQuotaManager_EnumQuotas_Proxy(
+    IFsrmQuotaManager* This,
+    BSTR path,
+    FsrmEnumOptions options,
+    IFsrmCommittableCollection **quotas);
+void __RPC_STUB IFsrmQuotaManager_EnumQuotas_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmQuotaManager_EnumAutoApplyQuotas_Proxy(
+    IFsrmQuotaManager* This,
+    BSTR path,
+    FsrmEnumOptions options,
+    IFsrmCommittableCollection **quotas);
+void __RPC_STUB IFsrmQuotaManager_EnumAutoApplyQuotas_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmQuotaManager_EnumEffectiveQuotas_Proxy(
+    IFsrmQuotaManager* This,
+    BSTR path,
+    FsrmEnumOptions options,
+    IFsrmCommittableCollection **quotas);
+void __RPC_STUB IFsrmQuotaManager_EnumEffectiveQuotas_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmQuotaManager_Scan_Proxy(
+    IFsrmQuotaManager* This,
+    BSTR strPath);
+void __RPC_STUB IFsrmQuotaManager_Scan_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmQuotaManager_CreateQuotaCollection_Proxy(
+    IFsrmQuotaManager* This,
+    IFsrmCommittableCollection **collection);
+void __RPC_STUB IFsrmQuotaManager_CreateQuotaCollection_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#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 = L"",
+        IFsrmQuotaTemplate **quotaTemplate) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EnumTemplates(
+        FsrmEnumOptions options = FsrmEnumOptions_None,
+        IFsrmCommittableCollection **quotaTemplates) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ExportTemplates(
+        VARIANT *quotaTemplateNamesArray = 0,
+        BSTR *serializedQuotaTemplates) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ImportTemplates(
+        BSTR serializedQuotaTemplates,
+        VARIANT *quotaTemplateNamesArray = 0,
+        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 */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFsrmQuotaTemplateManager* This,
+        REFIID riid,
+        void **ppvObject);
 
-    /* IDispatch methods */
-    STDMETHOD_(HRESULT,GetTypeInfoCount)(THIS_ unsigned int FAR*  pctinfo) PURE;
-    STDMETHOD_(HRESULT,GetTypeInfo)(THIS_ unsigned int  iTInfo,LCID  lcid,ITypeInfo FAR* FAR*  ppTInfo) PURE;
-    STDMETHOD_(HRESULT,GetIDsOfNames)(THIS_ REFIID  riid,OLECHAR FAR* FAR*  rgszNames,unsigned int  cNames,LCID   lcid,DISPID FAR*  rgDispId) PURE;
-    STDMETHOD_(HRESULT,Invoke)(THIS_ DISPID  dispIdMember,REFIID  riid,LCID  lcid,WORD  wFlags,DISPPARAMS FAR*  pDispParams,VARIANT FAR*  pVarResult,EXCEPINFO FAR*  pExcepInfo,unsigned int FAR*  puArgErr) PURE;
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFsrmQuotaTemplateManager* This);
 
-    /* IFsrmQuotaManager methods */
-    STDMETHOD_(HRESULT,get_ActionVariables)(THIS_ SAFEARRAY *variables) PURE;
-    STDMETHOD_(HRESULT,get_ActionVariableDescriptions)(THIS_ SAFEARRAY *descriptions) PURE;
-    STDMETHOD_(HRESULT,CreateQuota)(THIS_ BSTR path,IFsrmQuota **quota) PURE;
-    STDMETHOD_(HRESULT,CreateAutoApplyQuota)(THIS_ BSTR quotaTemplateName,BSTR path,IFsrmAutoApplyQuota **quota) PURE;
-    STDMETHOD_(HRESULT,GetQuota)(THIS_ BSTR path,IFsrmQuota **quota) PURE;
-    STDMETHOD_(HRESULT,GetAutoApplyQuota)(THIS_ BSTR path,IFsrmAutoApplyQuota **quota) PURE;
-    STDMETHOD_(HRESULT,GetRestrictiveQuota)(THIS_ BSTR path,IFsrmQuota **quota) PURE;
-    STDMETHOD_(HRESULT,EnumQuotas)(THIS_ BSTR path,FsrmEnumOptions options,IFsrmCommittableCollection **quotas) PURE;
-    STDMETHOD_(HRESULT,EnumAutoApplyQuotas)(THIS_ BSTR path,FsrmEnumOptions options,IFsrmCommittableCollection **quotas) PURE;
-    STDMETHOD_(HRESULT,EnumEffectiveQuotas)(THIS_ BSTR path,FsrmEnumOptions options,IFsrmCommittableCollection **quotas) PURE;
-    STDMETHOD_(HRESULT,Scan)(THIS_ BSTR strPath) PURE;
-    STDMETHOD_(HRESULT,CreateQuotaCollection)(THIS_ IFsrmCommittableCollection **collection) PURE;
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFsrmQuotaTemplateManager* This);
 
-    /* IFsrmQuotaManagerEx methods */
-    STDMETHOD_(HRESULT,IsAffectedByQuota)(THIS_ BSTR path,FsrmEnumOptions options,VARIANT_BOOL *affected) PURE;
+    /*** 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 FORCEINLINE HRESULT IFsrmQuotaTemplateManager_QueryInterface(IFsrmQuotaTemplateManager* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmQuotaTemplateManager_AddRef(IFsrmQuotaTemplateManager* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmQuotaTemplateManager_Release(IFsrmQuotaTemplateManager* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmQuotaTemplateManager_GetTypeInfoCount(IFsrmQuotaTemplateManager* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplateManager_GetTypeInfo(IFsrmQuotaTemplateManager* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE HRESULT IFsrmQuotaTemplateManager_CreateTemplate(IFsrmQuotaTemplateManager* This,IFsrmQuotaTemplate **quotaTemplate) {
+    return This->lpVtbl->CreateTemplate(This,quotaTemplate);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplateManager_GetTemplate(IFsrmQuotaTemplateManager* This,BSTR name,IFsrmQuotaTemplate **quotaTemplate) {
+    return This->lpVtbl->GetTemplate(This,name,quotaTemplate);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplateManager_EnumTemplates(IFsrmQuotaTemplateManager* This,FsrmEnumOptions options,IFsrmCommittableCollection **quotaTemplates) {
+    return This->lpVtbl->EnumTemplates(This,options,quotaTemplates);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplateManager_ExportTemplates(IFsrmQuotaTemplateManager* This,VARIANT *quotaTemplateNamesArray,BSTR *serializedQuotaTemplates) {
+    return This->lpVtbl->ExportTemplates(This,quotaTemplateNamesArray,serializedQuotaTemplates);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplateManager_ImportTemplates(IFsrmQuotaTemplateManager* This,BSTR serializedQuotaTemplates,VARIANT *quotaTemplateNamesArray,IFsrmCommittableCollection **quotaTemplates) {
+    return This->lpVtbl->ImportTemplates(This,serializedQuotaTemplates,quotaTemplateNamesArray,quotaTemplates);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmQuotaTemplateManager_CreateTemplate_Proxy(
+    IFsrmQuotaTemplateManager* This,
+    IFsrmQuotaTemplate **quotaTemplate);
+void __RPC_STUB IFsrmQuotaTemplateManager_CreateTemplate_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmQuotaTemplateManager_GetTemplate_Proxy(
+    IFsrmQuotaTemplateManager* This,
+    BSTR name,
+    IFsrmQuotaTemplate **quotaTemplate);
+void __RPC_STUB IFsrmQuotaTemplateManager_GetTemplate_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmQuotaTemplateManager_EnumTemplates_Proxy(
+    IFsrmQuotaTemplateManager* This,
+    FsrmEnumOptions options,
+    IFsrmCommittableCollection **quotaTemplates);
+void __RPC_STUB IFsrmQuotaTemplateManager_EnumTemplates_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmQuotaTemplateManager_ExportTemplates_Proxy(
+    IFsrmQuotaTemplateManager* This,
+    VARIANT *quotaTemplateNamesArray,
+    BSTR *serializedQuotaTemplates);
+void __RPC_STUB IFsrmQuotaTemplateManager_ExportTemplates_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmQuotaTemplateManager_ImportTemplates_Proxy(
+    IFsrmQuotaTemplateManager* This,
+    BSTR serializedQuotaTemplates,
+    VARIANT *quotaTemplateNamesArray,
+    IFsrmCommittableCollection **quotaTemplates);
+void __RPC_STUB IFsrmQuotaTemplateManager_ImportTemplates_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#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 FORCEINLINE HRESULT IFsrmQuotaBase_QueryInterface(IFsrmQuotaBase* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmQuotaBase_AddRef(IFsrmQuotaBase* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmQuotaBase_Release(IFsrmQuotaBase* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmQuotaBase_GetTypeInfoCount(IFsrmQuotaBase* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmQuotaBase_GetTypeInfo(IFsrmQuotaBase* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE HRESULT IFsrmQuotaBase_get_Id(IFsrmQuotaBase* This,FSRM_OBJECT_ID *id) {
+    return This->lpVtbl->get_Id(This,id);
+}
+static FORCEINLINE HRESULT IFsrmQuotaBase_get_Description(IFsrmQuotaBase* This,BSTR *description) {
+    return This->lpVtbl->get_Description(This,description);
+}
+static FORCEINLINE HRESULT IFsrmQuotaBase_put_Description(IFsrmQuotaBase* This,BSTR description) {
+    return This->lpVtbl->put_Description(This,description);
+}
+static FORCEINLINE HRESULT IFsrmQuotaBase_Delete(IFsrmQuotaBase* This) {
+    return This->lpVtbl->Delete(This);
+}
+static FORCEINLINE HRESULT IFsrmQuotaBase_Commit(IFsrmQuotaBase* This) {
+    return This->lpVtbl->Commit(This);
+}
+/*** IFsrmQuotaBase methods ***/
+static FORCEINLINE HRESULT IFsrmQuotaBase_get_QuotaLimit(IFsrmQuotaBase* This,VARIANT *quotaLimit) {
+    return This->lpVtbl->get_QuotaLimit(This,quotaLimit);
+}
+static FORCEINLINE HRESULT IFsrmQuotaBase_put_QuotaLimit(IFsrmQuotaBase* This,VARIANT quotaLimit) {
+    return This->lpVtbl->put_QuotaLimit(This,quotaLimit);
+}
+static FORCEINLINE HRESULT IFsrmQuotaBase_get_QuotaFlags(IFsrmQuotaBase* This,LONG *quotaFlags) {
+    return This->lpVtbl->get_QuotaFlags(This,quotaFlags);
+}
+static FORCEINLINE HRESULT IFsrmQuotaBase_put_QuotaFlags(IFsrmQuotaBase* This,LONG quotaFlags) {
+    return This->lpVtbl->put_QuotaFlags(This,quotaFlags);
+}
+static FORCEINLINE HRESULT IFsrmQuotaBase_get_Thresholds(IFsrmQuotaBase* This,SAFEARRAY **thresholds) {
+    return This->lpVtbl->get_Thresholds(This,thresholds);
+}
+static FORCEINLINE HRESULT IFsrmQuotaBase_AddThreshold(IFsrmQuotaBase* This,FSRM_QUOTA_THRESHOLD threshold) {
+    return This->lpVtbl->AddThreshold(This,threshold);
+}
+static FORCEINLINE HRESULT IFsrmQuotaBase_DeleteThreshold(IFsrmQuotaBase* This,FSRM_QUOTA_THRESHOLD threshold) {
+    return This->lpVtbl->DeleteThreshold(This,threshold);
+}
+static FORCEINLINE HRESULT IFsrmQuotaBase_ModifyThreshold(IFsrmQuotaBase* This,FSRM_QUOTA_THRESHOLD threshold,FSRM_QUOTA_THRESHOLD newThreshold) {
+    return This->lpVtbl->ModifyThreshold(This,threshold,newThreshold);
+}
+static FORCEINLINE HRESULT IFsrmQuotaBase_CreateThresholdAction(IFsrmQuotaBase* This,FSRM_QUOTA_THRESHOLD threshold,FsrmActionType actionType,IFsrmAction **action) {
+    return This->lpVtbl->CreateThresholdAction(This,threshold,actionType,action);
+}
+static FORCEINLINE HRESULT IFsrmQuotaBase_EnumThresholdActions(IFsrmQuotaBase* This,FSRM_QUOTA_THRESHOLD threshold,IFsrmCollection **actions) {
+    return This->lpVtbl->EnumThresholdActions(This,threshold,actions);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmQuotaBase_get_QuotaLimit_Proxy(
+    IFsrmQuotaBase* This,
+    VARIANT *quotaLimit);
+void __RPC_STUB IFsrmQuotaBase_get_QuotaLimit_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmQuotaBase_put_QuotaLimit_Proxy(
+    IFsrmQuotaBase* This,
+    VARIANT quotaLimit);
+void __RPC_STUB IFsrmQuotaBase_put_QuotaLimit_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmQuotaBase_get_QuotaFlags_Proxy(
+    IFsrmQuotaBase* This,
+    LONG *quotaFlags);
+void __RPC_STUB IFsrmQuotaBase_get_QuotaFlags_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmQuotaBase_put_QuotaFlags_Proxy(
+    IFsrmQuotaBase* This,
+    LONG quotaFlags);
+void __RPC_STUB IFsrmQuotaBase_put_QuotaFlags_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmQuotaBase_get_Thresholds_Proxy(
+    IFsrmQuotaBase* This,
+    SAFEARRAY **thresholds);
+void __RPC_STUB IFsrmQuotaBase_get_Thresholds_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmQuotaBase_AddThreshold_Proxy(
+    IFsrmQuotaBase* This,
+    FSRM_QUOTA_THRESHOLD threshold);
+void __RPC_STUB IFsrmQuotaBase_AddThreshold_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmQuotaBase_DeleteThreshold_Proxy(
+    IFsrmQuotaBase* This,
+    FSRM_QUOTA_THRESHOLD threshold);
+void __RPC_STUB IFsrmQuotaBase_DeleteThreshold_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmQuotaBase_ModifyThreshold_Proxy(
+    IFsrmQuotaBase* This,
+    FSRM_QUOTA_THRESHOLD threshold,
+    FSRM_QUOTA_THRESHOLD newThreshold);
+void __RPC_STUB IFsrmQuotaBase_ModifyThreshold_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmQuotaBase_CreateThresholdAction_Proxy(
+    IFsrmQuotaBase* This,
+    FSRM_QUOTA_THRESHOLD threshold,
+    FsrmActionType actionType,
+    IFsrmAction **action);
+void __RPC_STUB IFsrmQuotaBase_CreateThresholdAction_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmQuotaBase_EnumThresholdActions_Proxy(
+    IFsrmQuotaBase* This,
+    FSRM_QUOTA_THRESHOLD threshold,
+    IFsrmCollection **actions);
+void __RPC_STUB IFsrmQuotaBase_EnumThresholdActions_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#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 FORCEINLINE HRESULT IFsrmQuotaObject_QueryInterface(IFsrmQuotaObject* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmQuotaObject_AddRef(IFsrmQuotaObject* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmQuotaObject_Release(IFsrmQuotaObject* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmQuotaObject_GetTypeInfoCount(IFsrmQuotaObject* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmQuotaObject_GetTypeInfo(IFsrmQuotaObject* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE HRESULT IFsrmQuotaObject_get_Id(IFsrmQuotaObject* This,FSRM_OBJECT_ID *id) {
+    return This->lpVtbl->get_Id(This,id);
+}
+static FORCEINLINE HRESULT IFsrmQuotaObject_get_Description(IFsrmQuotaObject* This,BSTR *description) {
+    return This->lpVtbl->get_Description(This,description);
+}
+static FORCEINLINE HRESULT IFsrmQuotaObject_put_Description(IFsrmQuotaObject* This,BSTR description) {
+    return This->lpVtbl->put_Description(This,description);
+}
+static FORCEINLINE HRESULT IFsrmQuotaObject_Delete(IFsrmQuotaObject* This) {
+    return This->lpVtbl->Delete(This);
+}
+static FORCEINLINE HRESULT IFsrmQuotaObject_Commit(IFsrmQuotaObject* This) {
+    return This->lpVtbl->Commit(This);
+}
+/*** IFsrmQuotaBase methods ***/
+static FORCEINLINE HRESULT IFsrmQuotaObject_get_QuotaLimit(IFsrmQuotaObject* This,VARIANT *quotaLimit) {
+    return This->lpVtbl->get_QuotaLimit(This,quotaLimit);
+}
+static FORCEINLINE HRESULT IFsrmQuotaObject_put_QuotaLimit(IFsrmQuotaObject* This,VARIANT quotaLimit) {
+    return This->lpVtbl->put_QuotaLimit(This,quotaLimit);
+}
+static FORCEINLINE HRESULT IFsrmQuotaObject_get_QuotaFlags(IFsrmQuotaObject* This,LONG *quotaFlags) {
+    return This->lpVtbl->get_QuotaFlags(This,quotaFlags);
+}
+static FORCEINLINE HRESULT IFsrmQuotaObject_put_QuotaFlags(IFsrmQuotaObject* This,LONG quotaFlags) {
+    return This->lpVtbl->put_QuotaFlags(This,quotaFlags);
+}
+static FORCEINLINE HRESULT IFsrmQuotaObject_get_Thresholds(IFsrmQuotaObject* This,SAFEARRAY **thresholds) {
+    return This->lpVtbl->get_Thresholds(This,thresholds);
+}
+static FORCEINLINE HRESULT IFsrmQuotaObject_AddThreshold(IFsrmQuotaObject* This,FSRM_QUOTA_THRESHOLD threshold) {
+    return This->lpVtbl->AddThreshold(This,threshold);
+}
+static FORCEINLINE HRESULT IFsrmQuotaObject_DeleteThreshold(IFsrmQuotaObject* This,FSRM_QUOTA_THRESHOLD threshold) {
+    return This->lpVtbl->DeleteThreshold(This,threshold);
+}
+static FORCEINLINE HRESULT IFsrmQuotaObject_ModifyThreshold(IFsrmQuotaObject* This,FSRM_QUOTA_THRESHOLD threshold,FSRM_QUOTA_THRESHOLD newThreshold) {
+    return This->lpVtbl->ModifyThreshold(This,threshold,newThreshold);
+}
+static FORCEINLINE HRESULT IFsrmQuotaObject_CreateThresholdAction(IFsrmQuotaObject* This,FSRM_QUOTA_THRESHOLD threshold,FsrmActionType actionType,IFsrmAction **action) {
+    return This->lpVtbl->CreateThresholdAction(This,threshold,actionType,action);
+}
+static FORCEINLINE HRESULT IFsrmQuotaObject_EnumThresholdActions(IFsrmQuotaObject* This,FSRM_QUOTA_THRESHOLD threshold,IFsrmCollection **actions) {
+    return This->lpVtbl->EnumThresholdActions(This,threshold,actions);
+}
+/*** IFsrmQuotaObject methods ***/
+static FORCEINLINE HRESULT IFsrmQuotaObject_get_Path(IFsrmQuotaObject* This,BSTR *path) {
+    return This->lpVtbl->get_Path(This,path);
+}
+static FORCEINLINE HRESULT IFsrmQuotaObject_get_UserSid(IFsrmQuotaObject* This,BSTR *userSid) {
+    return This->lpVtbl->get_UserSid(This,userSid);
+}
+static FORCEINLINE HRESULT IFsrmQuotaObject_get_UserAccount(IFsrmQuotaObject* This,BSTR *userAccount) {
+    return This->lpVtbl->get_UserAccount(This,userAccount);
+}
+static FORCEINLINE HRESULT IFsrmQuotaObject_get_SourceTemplateName(IFsrmQuotaObject* This,BSTR *quotaTemplateName) {
+    return This->lpVtbl->get_SourceTemplateName(This,quotaTemplateName);
+}
+static FORCEINLINE HRESULT IFsrmQuotaObject_get_MatchesSourceTemplate(IFsrmQuotaObject* This,VARIANT_BOOL *matches) {
+    return This->lpVtbl->get_MatchesSourceTemplate(This,matches);
+}
+static FORCEINLINE HRESULT IFsrmQuotaObject_ApplyTemplate(IFsrmQuotaObject* This,BSTR quotaTemplateName) {
+    return This->lpVtbl->ApplyTemplate(This,quotaTemplateName);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmQuotaObject_get_Path_Proxy(
+    IFsrmQuotaObject* This,
+    BSTR *path);
+void __RPC_STUB IFsrmQuotaObject_get_Path_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmQuotaObject_get_UserSid_Proxy(
+    IFsrmQuotaObject* This,
+    BSTR *userSid);
+void __RPC_STUB IFsrmQuotaObject_get_UserSid_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmQuotaObject_get_UserAccount_Proxy(
+    IFsrmQuotaObject* This,
+    BSTR *userAccount);
+void __RPC_STUB IFsrmQuotaObject_get_UserAccount_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmQuotaObject_get_SourceTemplateName_Proxy(
+    IFsrmQuotaObject* This,
+    BSTR *quotaTemplateName);
+void __RPC_STUB IFsrmQuotaObject_get_SourceTemplateName_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmQuotaObject_get_MatchesSourceTemplate_Proxy(
+    IFsrmQuotaObject* This,
+    VARIANT_BOOL *matches);
+void __RPC_STUB IFsrmQuotaObject_get_MatchesSourceTemplate_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmQuotaObject_ApplyTemplate_Proxy(
+    IFsrmQuotaObject* This,
+    BSTR quotaTemplateName);
+void __RPC_STUB IFsrmQuotaObject_ApplyTemplate_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#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 FORCEINLINE HRESULT IFsrmQuotaTemplate_QueryInterface(IFsrmQuotaTemplate* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmQuotaTemplate_AddRef(IFsrmQuotaTemplate* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmQuotaTemplate_Release(IFsrmQuotaTemplate* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmQuotaTemplate_GetTypeInfoCount(IFsrmQuotaTemplate* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplate_GetTypeInfo(IFsrmQuotaTemplate* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE HRESULT IFsrmQuotaTemplate_get_Id(IFsrmQuotaTemplate* This,FSRM_OBJECT_ID *id) {
+    return This->lpVtbl->get_Id(This,id);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplate_get_Description(IFsrmQuotaTemplate* This,BSTR *description) {
+    return This->lpVtbl->get_Description(This,description);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplate_put_Description(IFsrmQuotaTemplate* This,BSTR description) {
+    return This->lpVtbl->put_Description(This,description);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplate_Delete(IFsrmQuotaTemplate* This) {
+    return This->lpVtbl->Delete(This);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplate_Commit(IFsrmQuotaTemplate* This) {
+    return This->lpVtbl->Commit(This);
+}
+/*** IFsrmQuotaBase methods ***/
+static FORCEINLINE HRESULT IFsrmQuotaTemplate_get_QuotaLimit(IFsrmQuotaTemplate* This,VARIANT *quotaLimit) {
+    return This->lpVtbl->get_QuotaLimit(This,quotaLimit);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplate_put_QuotaLimit(IFsrmQuotaTemplate* This,VARIANT quotaLimit) {
+    return This->lpVtbl->put_QuotaLimit(This,quotaLimit);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplate_get_QuotaFlags(IFsrmQuotaTemplate* This,LONG *quotaFlags) {
+    return This->lpVtbl->get_QuotaFlags(This,quotaFlags);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplate_put_QuotaFlags(IFsrmQuotaTemplate* This,LONG quotaFlags) {
+    return This->lpVtbl->put_QuotaFlags(This,quotaFlags);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplate_get_Thresholds(IFsrmQuotaTemplate* This,SAFEARRAY **thresholds) {
+    return This->lpVtbl->get_Thresholds(This,thresholds);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplate_AddThreshold(IFsrmQuotaTemplate* This,FSRM_QUOTA_THRESHOLD threshold) {
+    return This->lpVtbl->AddThreshold(This,threshold);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplate_DeleteThreshold(IFsrmQuotaTemplate* This,FSRM_QUOTA_THRESHOLD threshold) {
+    return This->lpVtbl->DeleteThreshold(This,threshold);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplate_ModifyThreshold(IFsrmQuotaTemplate* This,FSRM_QUOTA_THRESHOLD threshold,FSRM_QUOTA_THRESHOLD newThreshold) {
+    return This->lpVtbl->ModifyThreshold(This,threshold,newThreshold);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplate_CreateThresholdAction(IFsrmQuotaTemplate* This,FSRM_QUOTA_THRESHOLD threshold,FsrmActionType actionType,IFsrmAction **action) {
+    return This->lpVtbl->CreateThresholdAction(This,threshold,actionType,action);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplate_EnumThresholdActions(IFsrmQuotaTemplate* This,FSRM_QUOTA_THRESHOLD threshold,IFsrmCollection **actions) {
+    return This->lpVtbl->EnumThresholdActions(This,threshold,actions);
+}
+/*** IFsrmQuotaTemplate methods ***/
+static FORCEINLINE HRESULT IFsrmQuotaTemplate_get_Name(IFsrmQuotaTemplate* This,BSTR *name) {
+    return This->lpVtbl->get_Name(This,name);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplate_put_Name(IFsrmQuotaTemplate* This,BSTR name) {
+    return This->lpVtbl->put_Name(This,name);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplate_CopyTemplate(IFsrmQuotaTemplate* This,BSTR quotaTemplateName) {
+    return This->lpVtbl->CopyTemplate(This,quotaTemplateName);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplate_CommitAndUpdateDerived(IFsrmQuotaTemplate* This,FsrmCommitOptions commitOptions,FsrmTemplateApplyOptions applyOptions,IFsrmDerivedObjectsResult **derivedObjectsResult) {
+    return This->lpVtbl->CommitAndUpdateDerived(This,commitOptions,applyOptions,derivedObjectsResult);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmQuotaTemplate_get_Name_Proxy(
+    IFsrmQuotaTemplate* This,
+    BSTR *name);
+void __RPC_STUB IFsrmQuotaTemplate_get_Name_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmQuotaTemplate_put_Name_Proxy(
+    IFsrmQuotaTemplate* This,
+    BSTR name);
+void __RPC_STUB IFsrmQuotaTemplate_put_Name_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmQuotaTemplate_CopyTemplate_Proxy(
+    IFsrmQuotaTemplate* This,
+    BSTR quotaTemplateName);
+void __RPC_STUB IFsrmQuotaTemplate_CopyTemplate_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmQuotaTemplate_CommitAndUpdateDerived_Proxy(
+    IFsrmQuotaTemplate* This,
+    FsrmCommitOptions commitOptions,
+    FsrmTemplateApplyOptions applyOptions,
+    IFsrmDerivedObjectsResult **derivedObjectsResult);
+void __RPC_STUB IFsrmQuotaTemplate_CommitAndUpdateDerived_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#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 FORCEINLINE HRESULT IFsrmQuota_QueryInterface(IFsrmQuota* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmQuota_AddRef(IFsrmQuota* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmQuota_Release(IFsrmQuota* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmQuota_GetTypeInfoCount(IFsrmQuota* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmQuota_GetTypeInfo(IFsrmQuota* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE HRESULT IFsrmQuota_get_Id(IFsrmQuota* This,FSRM_OBJECT_ID *id) {
+    return This->lpVtbl->get_Id(This,id);
+}
+static FORCEINLINE HRESULT IFsrmQuota_get_Description(IFsrmQuota* This,BSTR *description) {
+    return This->lpVtbl->get_Description(This,description);
+}
+static FORCEINLINE HRESULT IFsrmQuota_put_Description(IFsrmQuota* This,BSTR description) {
+    return This->lpVtbl->put_Description(This,description);
+}
+static FORCEINLINE HRESULT IFsrmQuota_Delete(IFsrmQuota* This) {
+    return This->lpVtbl->Delete(This);
+}
+static FORCEINLINE HRESULT IFsrmQuota_Commit(IFsrmQuota* This) {
+    return This->lpVtbl->Commit(This);
+}
+/*** IFsrmQuotaBase methods ***/
+static FORCEINLINE HRESULT IFsrmQuota_get_QuotaLimit(IFsrmQuota* This,VARIANT *quotaLimit) {
+    return This->lpVtbl->get_QuotaLimit(This,quotaLimit);
+}
+static FORCEINLINE HRESULT IFsrmQuota_put_QuotaLimit(IFsrmQuota* This,VARIANT quotaLimit) {
+    return This->lpVtbl->put_QuotaLimit(This,quotaLimit);
+}
+static FORCEINLINE HRESULT IFsrmQuota_get_QuotaFlags(IFsrmQuota* This,LONG *quotaFlags) {
+    return This->lpVtbl->get_QuotaFlags(This,quotaFlags);
+}
+static FORCEINLINE HRESULT IFsrmQuota_put_QuotaFlags(IFsrmQuota* This,LONG quotaFlags) {
+    return This->lpVtbl->put_QuotaFlags(This,quotaFlags);
+}
+static FORCEINLINE HRESULT IFsrmQuota_get_Thresholds(IFsrmQuota* This,SAFEARRAY **thresholds) {
+    return This->lpVtbl->get_Thresholds(This,thresholds);
+}
+static FORCEINLINE HRESULT IFsrmQuota_AddThreshold(IFsrmQuota* This,FSRM_QUOTA_THRESHOLD threshold) {
+    return This->lpVtbl->AddThreshold(This,threshold);
+}
+static FORCEINLINE HRESULT IFsrmQuota_DeleteThreshold(IFsrmQuota* This,FSRM_QUOTA_THRESHOLD threshold) {
+    return This->lpVtbl->DeleteThreshold(This,threshold);
+}
+static FORCEINLINE HRESULT IFsrmQuota_ModifyThreshold(IFsrmQuota* This,FSRM_QUOTA_THRESHOLD threshold,FSRM_QUOTA_THRESHOLD newThreshold) {
+    return This->lpVtbl->ModifyThreshold(This,threshold,newThreshold);
+}
+static FORCEINLINE HRESULT IFsrmQuota_CreateThresholdAction(IFsrmQuota* This,FSRM_QUOTA_THRESHOLD threshold,FsrmActionType actionType,IFsrmAction **action) {
+    return This->lpVtbl->CreateThresholdAction(This,threshold,actionType,action);
+}
+static FORCEINLINE HRESULT IFsrmQuota_EnumThresholdActions(IFsrmQuota* This,FSRM_QUOTA_THRESHOLD threshold,IFsrmCollection **actions) {
+    return This->lpVtbl->EnumThresholdActions(This,threshold,actions);
+}
+/*** IFsrmQuotaObject methods ***/
+static FORCEINLINE HRESULT IFsrmQuota_get_Path(IFsrmQuota* This,BSTR *path) {
+    return This->lpVtbl->get_Path(This,path);
+}
+static FORCEINLINE HRESULT IFsrmQuota_get_UserSid(IFsrmQuota* This,BSTR *userSid) {
+    return This->lpVtbl->get_UserSid(This,userSid);
+}
+static FORCEINLINE HRESULT IFsrmQuota_get_UserAccount(IFsrmQuota* This,BSTR *userAccount) {
+    return This->lpVtbl->get_UserAccount(This,userAccount);
+}
+static FORCEINLINE HRESULT IFsrmQuota_get_SourceTemplateName(IFsrmQuota* This,BSTR *quotaTemplateName) {
+    return This->lpVtbl->get_SourceTemplateName(This,quotaTemplateName);
+}
+static FORCEINLINE HRESULT IFsrmQuota_get_MatchesSourceTemplate(IFsrmQuota* This,VARIANT_BOOL *matches) {
+    return This->lpVtbl->get_MatchesSourceTemplate(This,matches);
+}
+static FORCEINLINE HRESULT IFsrmQuota_ApplyTemplate(IFsrmQuota* This,BSTR quotaTemplateName) {
+    return This->lpVtbl->ApplyTemplate(This,quotaTemplateName);
+}
+/*** IFsrmQuota methods ***/
+static FORCEINLINE HRESULT IFsrmQuota_get_QuotaUsed(IFsrmQuota* This,VARIANT *used) {
+    return This->lpVtbl->get_QuotaUsed(This,used);
+}
+static FORCEINLINE HRESULT IFsrmQuota_get_QuotaPeakUsage(IFsrmQuota* This,VARIANT *peakUsage) {
+    return This->lpVtbl->get_QuotaPeakUsage(This,peakUsage);
+}
+static FORCEINLINE HRESULT IFsrmQuota_get_QuotaPeakUsageTime(IFsrmQuota* This,DATE *peakUsageDateTime) {
+    return This->lpVtbl->get_QuotaPeakUsageTime(This,peakUsageDateTime);
+}
+static FORCEINLINE HRESULT IFsrmQuota_ResetPeakUsage(IFsrmQuota* This) {
+    return This->lpVtbl->ResetPeakUsage(This);
+}
+static FORCEINLINE HRESULT IFsrmQuota_RefreshUsageProperties(IFsrmQuota* This) {
+    return This->lpVtbl->RefreshUsageProperties(This);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmQuota_get_QuotaUsed_Proxy(
+    IFsrmQuota* This,
+    VARIANT *used);
+void __RPC_STUB IFsrmQuota_get_QuotaUsed_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmQuota_get_QuotaPeakUsage_Proxy(
+    IFsrmQuota* This,
+    VARIANT *peakUsage);
+void __RPC_STUB IFsrmQuota_get_QuotaPeakUsage_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmQuota_get_QuotaPeakUsageTime_Proxy(
+    IFsrmQuota* This,
+    DATE *peakUsageDateTime);
+void __RPC_STUB IFsrmQuota_get_QuotaPeakUsageTime_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmQuota_ResetPeakUsage_Proxy(
+    IFsrmQuota* This);
+void __RPC_STUB IFsrmQuota_ResetPeakUsage_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmQuota_RefreshUsageProperties_Proxy(
+    IFsrmQuota* This);
+void __RPC_STUB IFsrmQuota_RefreshUsageProperties_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#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 FORCEINLINE HRESULT IFsrmAutoApplyQuota_QueryInterface(IFsrmAutoApplyQuota* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmAutoApplyQuota_AddRef(IFsrmAutoApplyQuota* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmAutoApplyQuota_Release(IFsrmAutoApplyQuota* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmAutoApplyQuota_GetTypeInfoCount(IFsrmAutoApplyQuota* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmAutoApplyQuota_GetTypeInfo(IFsrmAutoApplyQuota* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE HRESULT IFsrmAutoApplyQuota_get_Id(IFsrmAutoApplyQuota* This,FSRM_OBJECT_ID *id) {
+    return This->lpVtbl->get_Id(This,id);
+}
+static FORCEINLINE HRESULT IFsrmAutoApplyQuota_get_Description(IFsrmAutoApplyQuota* This,BSTR *description) {
+    return This->lpVtbl->get_Description(This,description);
+}
+static FORCEINLINE HRESULT IFsrmAutoApplyQuota_put_Description(IFsrmAutoApplyQuota* This,BSTR description) {
+    return This->lpVtbl->put_Description(This,description);
+}
+static FORCEINLINE HRESULT IFsrmAutoApplyQuota_Delete(IFsrmAutoApplyQuota* This) {
+    return This->lpVtbl->Delete(This);
+}
+static FORCEINLINE HRESULT IFsrmAutoApplyQuota_Commit(IFsrmAutoApplyQuota* This) {
+    return This->lpVtbl->Commit(This);
+}
+/*** IFsrmQuotaBase methods ***/
+static FORCEINLINE HRESULT IFsrmAutoApplyQuota_get_QuotaLimit(IFsrmAutoApplyQuota* This,VARIANT *quotaLimit) {
+    return This->lpVtbl->get_QuotaLimit(This,quotaLimit);
+}
+static FORCEINLINE HRESULT IFsrmAutoApplyQuota_put_QuotaLimit(IFsrmAutoApplyQuota* This,VARIANT quotaLimit) {
+    return This->lpVtbl->put_QuotaLimit(This,quotaLimit);
+}
+static FORCEINLINE HRESULT IFsrmAutoApplyQuota_get_QuotaFlags(IFsrmAutoApplyQuota* This,LONG *quotaFlags) {
+    return This->lpVtbl->get_QuotaFlags(This,quotaFlags);
+}
+static FORCEINLINE HRESULT IFsrmAutoApplyQuota_put_QuotaFlags(IFsrmAutoApplyQuota* This,LONG quotaFlags) {
+    return This->lpVtbl->put_QuotaFlags(This,quotaFlags);
+}
+static FORCEINLINE HRESULT IFsrmAutoApplyQuota_get_Thresholds(IFsrmAutoApplyQuota* This,SAFEARRAY **thresholds) {
+    return This->lpVtbl->get_Thresholds(This,thresholds);
+}
+static FORCEINLINE HRESULT IFsrmAutoApplyQuota_AddThreshold(IFsrmAutoApplyQuota* This,FSRM_QUOTA_THRESHOLD threshold) {
+    return This->lpVtbl->AddThreshold(This,threshold);
+}
+static FORCEINLINE HRESULT IFsrmAutoApplyQuota_DeleteThreshold(IFsrmAutoApplyQuota* This,FSRM_QUOTA_THRESHOLD threshold) {
+    return This->lpVtbl->DeleteThreshold(This,threshold);
+}
+static FORCEINLINE HRESULT IFsrmAutoApplyQuota_ModifyThreshold(IFsrmAutoApplyQuota* This,FSRM_QUOTA_THRESHOLD threshold,FSRM_QUOTA_THRESHOLD newThreshold) {
+    return This->lpVtbl->ModifyThreshold(This,threshold,newThreshold);
+}
+static FORCEINLINE HRESULT IFsrmAutoApplyQuota_CreateThresholdAction(IFsrmAutoApplyQuota* This,FSRM_QUOTA_THRESHOLD threshold,FsrmActionType actionType,IFsrmAction **action) {
+    return This->lpVtbl->CreateThresholdAction(This,threshold,actionType,action);
+}
+static FORCEINLINE HRESULT IFsrmAutoApplyQuota_EnumThresholdActions(IFsrmAutoApplyQuota* This,FSRM_QUOTA_THRESHOLD threshold,IFsrmCollection **actions) {
+    return This->lpVtbl->EnumThresholdActions(This,threshold,actions);
+}
+/*** IFsrmQuotaObject methods ***/
+static FORCEINLINE HRESULT IFsrmAutoApplyQuota_get_Path(IFsrmAutoApplyQuota* This,BSTR *path) {
+    return This->lpVtbl->get_Path(This,path);
+}
+static FORCEINLINE HRESULT IFsrmAutoApplyQuota_get_UserSid(IFsrmAutoApplyQuota* This,BSTR *userSid) {
+    return This->lpVtbl->get_UserSid(This,userSid);
+}
+static FORCEINLINE HRESULT IFsrmAutoApplyQuota_get_UserAccount(IFsrmAutoApplyQuota* This,BSTR *userAccount) {
+    return This->lpVtbl->get_UserAccount(This,userAccount);
+}
+static FORCEINLINE HRESULT IFsrmAutoApplyQuota_get_SourceTemplateName(IFsrmAutoApplyQuota* This,BSTR *quotaTemplateName) {
+    return This->lpVtbl->get_SourceTemplateName(This,quotaTemplateName);
+}
+static FORCEINLINE HRESULT IFsrmAutoApplyQuota_get_MatchesSourceTemplate(IFsrmAutoApplyQuota* This,VARIANT_BOOL *matches) {
+    return This->lpVtbl->get_MatchesSourceTemplate(This,matches);
+}
+static FORCEINLINE HRESULT IFsrmAutoApplyQuota_ApplyTemplate(IFsrmAutoApplyQuota* This,BSTR quotaTemplateName) {
+    return This->lpVtbl->ApplyTemplate(This,quotaTemplateName);
+}
+/*** IFsrmAutoApplyQuota methods ***/
+static FORCEINLINE HRESULT IFsrmAutoApplyQuota_get_ExcludeFolders(IFsrmAutoApplyQuota* This,SAFEARRAY **folders) {
+    return This->lpVtbl->get_ExcludeFolders(This,folders);
+}
+static FORCEINLINE HRESULT IFsrmAutoApplyQuota_put_ExcludeFolders(IFsrmAutoApplyQuota* This,SAFEARRAY *folders) {
+    return This->lpVtbl->put_ExcludeFolders(This,folders);
+}
+static FORCEINLINE HRESULT IFsrmAutoApplyQuota_CommitAndUpdateDerived(IFsrmAutoApplyQuota* This,FsrmCommitOptions commitOptions,FsrmTemplateApplyOptions applyOptions,IFsrmDerivedObjectsResult **derivedObjectsResult) {
+    return This->lpVtbl->CommitAndUpdateDerived(This,commitOptions,applyOptions,derivedObjectsResult);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmAutoApplyQuota_get_ExcludeFolders_Proxy(
+    IFsrmAutoApplyQuota* This,
+    SAFEARRAY **folders);
+void __RPC_STUB IFsrmAutoApplyQuota_get_ExcludeFolders_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmAutoApplyQuota_put_ExcludeFolders_Proxy(
+    IFsrmAutoApplyQuota* This,
+    SAFEARRAY *folders);
+void __RPC_STUB IFsrmAutoApplyQuota_put_ExcludeFolders_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmAutoApplyQuota_CommitAndUpdateDerived_Proxy(
+    IFsrmAutoApplyQuota* This,
+    FsrmCommitOptions commitOptions,
+    FsrmTemplateApplyOptions applyOptions,
+    IFsrmDerivedObjectsResult **derivedObjectsResult);
+void __RPC_STUB IFsrmAutoApplyQuota_CommitAndUpdateDerived_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#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 = FsrmEnumOptions_None,
+        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)
@@ -931,9 +2680,423 @@
 #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)
-#endif /*COBJMACROS*/
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IFsrmQuotaManagerEx_QueryInterface(IFsrmQuotaManagerEx* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmQuotaManagerEx_AddRef(IFsrmQuotaManagerEx* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmQuotaManagerEx_Release(IFsrmQuotaManagerEx* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmQuotaManagerEx_GetTypeInfoCount(IFsrmQuotaManagerEx* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmQuotaManagerEx_GetTypeInfo(IFsrmQuotaManagerEx* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE HRESULT IFsrmQuotaManagerEx_get_ActionVariables(IFsrmQuotaManagerEx* This,SAFEARRAY **variables) {
+    return This->lpVtbl->get_ActionVariables(This,variables);
+}
+static FORCEINLINE HRESULT IFsrmQuotaManagerEx_get_ActionVariableDescriptions(IFsrmQuotaManagerEx* This,SAFEARRAY **descriptions) {
+    return This->lpVtbl->get_ActionVariableDescriptions(This,descriptions);
+}
+static FORCEINLINE HRESULT IFsrmQuotaManagerEx_CreateQuota(IFsrmQuotaManagerEx* This,BSTR path,IFsrmQuota **quota) {
+    return This->lpVtbl->CreateQuota(This,path,quota);
+}
+static FORCEINLINE HRESULT IFsrmQuotaManagerEx_CreateAutoApplyQuota(IFsrmQuotaManagerEx* This,BSTR quotaTemplateName,BSTR path,IFsrmAutoApplyQuota **quota) {
+    return This->lpVtbl->CreateAutoApplyQuota(This,quotaTemplateName,path,quota);
+}
+static FORCEINLINE HRESULT IFsrmQuotaManagerEx_GetQuota(IFsrmQuotaManagerEx* This,BSTR path,IFsrmQuota **quota) {
+    return This->lpVtbl->GetQuota(This,path,quota);
+}
+static FORCEINLINE HRESULT IFsrmQuotaManagerEx_GetAutoApplyQuota(IFsrmQuotaManagerEx* This,BSTR path,IFsrmAutoApplyQuota **quota) {
+    return This->lpVtbl->GetAutoApplyQuota(This,path,quota);
+}
+static FORCEINLINE HRESULT IFsrmQuotaManagerEx_GetRestrictiveQuota(IFsrmQuotaManagerEx* This,BSTR path,IFsrmQuota **quota) {
+    return This->lpVtbl->GetRestrictiveQuota(This,path,quota);
+}
+static FORCEINLINE HRESULT IFsrmQuotaManagerEx_EnumQuotas(IFsrmQuotaManagerEx* This,BSTR path,FsrmEnumOptions options,IFsrmCommittableCollection **quotas) {
+    return This->lpVtbl->EnumQuotas(This,path,options,quotas);
+}
+static FORCEINLINE HRESULT IFsrmQuotaManagerEx_EnumAutoApplyQuotas(IFsrmQuotaManagerEx* This,BSTR path,FsrmEnumOptions options,IFsrmCommittableCollection **quotas) {
+    return This->lpVtbl->EnumAutoApplyQuotas(This,path,options,quotas);
+}
+static FORCEINLINE HRESULT IFsrmQuotaManagerEx_EnumEffectiveQuotas(IFsrmQuotaManagerEx* This,BSTR path,FsrmEnumOptions options,IFsrmCommittableCollection **quotas) {
+    return This->lpVtbl->EnumEffectiveQuotas(This,path,options,quotas);
+}
+static FORCEINLINE HRESULT IFsrmQuotaManagerEx_Scan(IFsrmQuotaManagerEx* This,BSTR strPath) {
+    return This->lpVtbl->Scan(This,strPath);
+}
+static FORCEINLINE HRESULT IFsrmQuotaManagerEx_CreateQuotaCollection(IFsrmQuotaManagerEx* This,IFsrmCommittableCollection **collection) {
+    return This->lpVtbl->CreateQuotaCollection(This,collection);
+}
+/*** IFsrmQuotaManagerEx methods ***/
+static FORCEINLINE HRESULT IFsrmQuotaManagerEx_IsAffectedByQuota(IFsrmQuotaManagerEx* This,BSTR path,FsrmEnumOptions options,VARIANT_BOOL *affected) {
+    return This->lpVtbl->IsAffectedByQuota(This,path,options,affected);
+}
+#endif
+#endif
 
-#endif /*(_WIN32_WINNT >= 0x0600)*/
-#include <fsrmscreen.h>
-#endif /*_INC_FSRMQUOTA*/
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmQuotaManagerEx_IsAffectedByQuota_Proxy(
+    IFsrmQuotaManagerEx* This,
+    BSTR path,
+    FsrmEnumOptions options,
+    VARIANT_BOOL *affected);
+void __RPC_STUB IFsrmQuotaManagerEx_IsAffectedByQuota_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#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 FORCEINLINE HRESULT IFsrmQuotaTemplateImported_QueryInterface(IFsrmQuotaTemplateImported* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmQuotaTemplateImported_AddRef(IFsrmQuotaTemplateImported* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmQuotaTemplateImported_Release(IFsrmQuotaTemplateImported* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmQuotaTemplateImported_GetTypeInfoCount(IFsrmQuotaTemplateImported* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplateImported_GetTypeInfo(IFsrmQuotaTemplateImported* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE HRESULT IFsrmQuotaTemplateImported_get_Id(IFsrmQuotaTemplateImported* This,FSRM_OBJECT_ID *id) {
+    return This->lpVtbl->get_Id(This,id);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplateImported_get_Description(IFsrmQuotaTemplateImported* This,BSTR *description) {
+    return This->lpVtbl->get_Description(This,description);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplateImported_put_Description(IFsrmQuotaTemplateImported* This,BSTR description) {
+    return This->lpVtbl->put_Description(This,description);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplateImported_Delete(IFsrmQuotaTemplateImported* This) {
+    return This->lpVtbl->Delete(This);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplateImported_Commit(IFsrmQuotaTemplateImported* This) {
+    return This->lpVtbl->Commit(This);
+}
+/*** IFsrmQuotaBase methods ***/
+static FORCEINLINE HRESULT IFsrmQuotaTemplateImported_get_QuotaLimit(IFsrmQuotaTemplateImported* This,VARIANT *quotaLimit) {
+    return This->lpVtbl->get_QuotaLimit(This,quotaLimit);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplateImported_put_QuotaLimit(IFsrmQuotaTemplateImported* This,VARIANT quotaLimit) {
+    return This->lpVtbl->put_QuotaLimit(This,quotaLimit);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplateImported_get_QuotaFlags(IFsrmQuotaTemplateImported* This,LONG *quotaFlags) {
+    return This->lpVtbl->get_QuotaFlags(This,quotaFlags);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplateImported_put_QuotaFlags(IFsrmQuotaTemplateImported* This,LONG quotaFlags) {
+    return This->lpVtbl->put_QuotaFlags(This,quotaFlags);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplateImported_get_Thresholds(IFsrmQuotaTemplateImported* This,SAFEARRAY **thresholds) {
+    return This->lpVtbl->get_Thresholds(This,thresholds);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplateImported_AddThreshold(IFsrmQuotaTemplateImported* This,FSRM_QUOTA_THRESHOLD threshold) {
+    return This->lpVtbl->AddThreshold(This,threshold);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplateImported_DeleteThreshold(IFsrmQuotaTemplateImported* This,FSRM_QUOTA_THRESHOLD threshold) {
+    return This->lpVtbl->DeleteThreshold(This,threshold);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplateImported_ModifyThreshold(IFsrmQuotaTemplateImported* This,FSRM_QUOTA_THRESHOLD threshold,FSRM_QUOTA_THRESHOLD newThreshold) {
+    return This->lpVtbl->ModifyThreshold(This,threshold,newThreshold);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplateImported_CreateThresholdAction(IFsrmQuotaTemplateImported* This,FSRM_QUOTA_THRESHOLD threshold,FsrmActionType actionType,IFsrmAction **action) {
+    return This->lpVtbl->CreateThresholdAction(This,threshold,actionType,action);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplateImported_EnumThresholdActions(IFsrmQuotaTemplateImported* This,FSRM_QUOTA_THRESHOLD threshold,IFsrmCollection **actions) {
+    return This->lpVtbl->EnumThresholdActions(This,threshold,actions);
+}
+/*** IFsrmQuotaTemplate methods ***/
+static FORCEINLINE HRESULT IFsrmQuotaTemplateImported_get_Name(IFsrmQuotaTemplateImported* This,BSTR *name) {
+    return This->lpVtbl->get_Name(This,name);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplateImported_put_Name(IFsrmQuotaTemplateImported* This,BSTR name) {
+    return This->lpVtbl->put_Name(This,name);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplateImported_CopyTemplate(IFsrmQuotaTemplateImported* This,BSTR quotaTemplateName) {
+    return This->lpVtbl->CopyTemplate(This,quotaTemplateName);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplateImported_CommitAndUpdateDerived(IFsrmQuotaTemplateImported* This,FsrmCommitOptions commitOptions,FsrmTemplateApplyOptions applyOptions,IFsrmDerivedObjectsResult **derivedObjectsResult) {
+    return This->lpVtbl->CommitAndUpdateDerived(This,commitOptions,applyOptions,derivedObjectsResult);
+}
+/*** IFsrmQuotaTemplateImported methods ***/
+static FORCEINLINE HRESULT IFsrmQuotaTemplateImported_get_OverwriteOnCommit(IFsrmQuotaTemplateImported* This,VARIANT_BOOL *overwrite) {
+    return This->lpVtbl->get_OverwriteOnCommit(This,overwrite);
+}
+static FORCEINLINE HRESULT IFsrmQuotaTemplateImported_put_OverwriteOnCommit(IFsrmQuotaTemplateImported* This,VARIANT_BOOL overwrite) {
+    return This->lpVtbl->put_OverwriteOnCommit(This,overwrite);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmQuotaTemplateImported_get_OverwriteOnCommit_Proxy(
+    IFsrmQuotaTemplateImported* This,
+    VARIANT_BOOL *overwrite);
+void __RPC_STUB IFsrmQuotaTemplateImported_get_OverwriteOnCommit_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmQuotaTemplateImported_put_OverwriteOnCommit_Proxy(
+    IFsrmQuotaTemplateImported* This,
+    VARIANT_BOOL overwrite);
+void __RPC_STUB IFsrmQuotaTemplateImported_put_OverwriteOnCommit_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#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__ */
diff --git a/mingw-w64-headers/include/fsrmquota.idl b/mingw-w64-headers/include/fsrmquota.idl
new file mode 100644
index 0000000..0e5ba7b
--- /dev/null
+++ b/mingw-w64-headers/include/fsrmquota.idl
@@ -0,0 +1,125 @@
+/**
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER within this package.
+ */
+
+
+import "oaidl.idl";
+import "fsrmenums.idl";
+import "fsrm.idl";
+
+cpp_quote("#include <winapifamily.h>")
+cpp_quote("")
+cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)")
+
+interface IFsrmAutoApplyQuota;
+interface IFsrmQuota;
+interface IFsrmQuotaBase;
+interface IFsrmQuotaObject;
+interface IFsrmQuotaManager;
+interface IFsrmQuotaTemplate;
+interface IFsrmQuotaTemplateImported;
+interface IFsrmQuotaTemplateManager;
+
+typedef long FSRM_QUOTA_THRESHOLD;
+
+const DISPID FSRM_DISPID_QUOTA_BASE = FSRM_DISPID_FEATURE_QUOTA | 0x100000;
+const DISPID FSRM_DISPID_QUOTA_OBJECT = FSRM_DISPID_QUOTA_BASE | 0x010000;
+const DISPID FSRM_DISPID_QUOTA = FSRM_DISPID_QUOTA_OBJECT | 0x001000;
+const DISPID FSRM_DISPID_AUTOAPPLYQUOTA = FSRM_DISPID_QUOTA_OBJECT | 0x002000;
+const DISPID FSRM_DISPID_QUOTA_TEMPLATE = FSRM_DISPID_QUOTA_BASE | 0x020000;
+const DISPID FSRM_DISPID_QUOTA_TEMPLATE_IMPORTED = FSRM_DISPID_QUOTA_TEMPLATE | 0x001000;
+const DISPID FSRM_DISPID_QUOTA_MANAGER = FSRM_DISPID_FEATURE_QUOTA | 0x200000;
+const DISPID FSRM_DISPID_QUOTA_TEMPLATE_MANAGER = FSRM_DISPID_FEATURE_QUOTA | 0x300000;
+const DISPID FSRM_DISPID_QUOTA_MANAGER_EX = FSRM_DISPID_FEATURE_QUOTA | 0x400000;
+
+const ULONG FsrmMaxNumberThresholds = 16;
+const ULONG FsrmMinThresholdValue = 1;
+const ULONG FsrmMaxThresholdValue = 250;
+const ULONG FsrmMinQuotaLimit = 1024;
+const ULONG FsrmMaxExcludeFolders = 32;
+
+[object, uuid (8bb68c7d-19d8-4ffb-809e-be4fc1734014), dual, pointer_default (unique)]
+interface IFsrmQuotaManager : IDispatch {
+  [propget, id (FSRM_DISPID_QUOTA_MANAGER | 0x81)] HRESULT ActionVariables ([out, retval] SAFEARRAY (VARIANT) *variables);
+  [propget, id (FSRM_DISPID_QUOTA_MANAGER | 0x82)] HRESULT ActionVariableDescriptions ([out, retval] SAFEARRAY (VARIANT) *descriptions);
+  [id (FSRM_DISPID_QUOTA_MANAGER | 0x1)] HRESULT CreateQuota ([in] BSTR path,[out, retval] IFsrmQuota **quota);
+  [id (FSRM_DISPID_QUOTA_MANAGER | 0x2)] HRESULT CreateAutoApplyQuota ([in] BSTR quotaTemplateName,[in] BSTR path,[out, retval] IFsrmAutoApplyQuota **quota);
+  [id (FSRM_DISPID_QUOTA_MANAGER | 0x3)] HRESULT GetQuota ([in] BSTR path,[out, retval] IFsrmQuota **quota);
+  [id (FSRM_DISPID_QUOTA_MANAGER | 0x4)] HRESULT GetAutoApplyQuota ([in] BSTR path,[out, retval] IFsrmAutoApplyQuota **quota);
+  [id (FSRM_DISPID_QUOTA_MANAGER | 0x5)] HRESULT GetRestrictiveQuota ([in] BSTR path,[out, retval] IFsrmQuota **quota);
+  [id (FSRM_DISPID_QUOTA_MANAGER | 0x6)] HRESULT EnumQuotas ([in, defaultvalue (L"")] BSTR path,[in, defaultvalue (FsrmEnumOptions_None)] FsrmEnumOptions options,[out, retval] IFsrmCommittableCollection **quotas);
+  [id (FSRM_DISPID_QUOTA_MANAGER | 0x7)] HRESULT EnumAutoApplyQuotas ([in, defaultvalue (L"")] BSTR path,[in, defaultvalue (FsrmEnumOptions_None)] FsrmEnumOptions options,[out, retval] IFsrmCommittableCollection **quotas);
+  [id (FSRM_DISPID_QUOTA_MANAGER | 0x8)] HRESULT EnumEffectiveQuotas ([in] BSTR path,[in, defaultvalue (FsrmEnumOptions_None)] FsrmEnumOptions options,[out, retval] IFsrmCommittableCollection **quotas);
+  [id (FSRM_DISPID_QUOTA_MANAGER | 0x9)] HRESULT Scan ([in] BSTR strPath);
+  [id (FSRM_DISPID_QUOTA_MANAGER | 0xa)] HRESULT CreateQuotaCollection ([out, retval] IFsrmCommittableCollection **collection);
+};
+
+[object, uuid (4173ac41-172d-4d52-963c-fdc7e415f717), dual, pointer_default (unique)]
+interface IFsrmQuotaTemplateManager : IDispatch {
+  [id (FSRM_DISPID_QUOTA_TEMPLATE_MANAGER | 0x1)] HRESULT CreateTemplate ([out, retval] IFsrmQuotaTemplate **quotaTemplate);
+  [id (FSRM_DISPID_QUOTA_TEMPLATE_MANAGER | 0x2)] HRESULT GetTemplate ([in, defaultvalue (L"")] BSTR name,[out, retval] IFsrmQuotaTemplate **quotaTemplate);
+  [id (FSRM_DISPID_QUOTA_TEMPLATE_MANAGER | 0x3)] HRESULT EnumTemplates ([in, defaultvalue (FsrmEnumOptions_None)] FsrmEnumOptions options,[out, retval] IFsrmCommittableCollection **quotaTemplates);
+  [id (FSRM_DISPID_QUOTA_TEMPLATE_MANAGER | 0x4)] HRESULT ExportTemplates ([in, defaultvalue (NULL)] VARIANT *quotaTemplateNamesArray,[out, retval] BSTR *serializedQuotaTemplates);
+  [id (FSRM_DISPID_QUOTA_TEMPLATE_MANAGER | 0x5)] HRESULT ImportTemplates ([in] BSTR serializedQuotaTemplates,[in, defaultvalue (NULL)] VARIANT *quotaTemplateNamesArray,[out, retval] IFsrmCommittableCollection **quotaTemplates);
+};
+
+[object, uuid (1568a795-3924-4118-b74b-68d8f0fa5daf), dual, pointer_default (unique)]
+interface IFsrmQuotaBase : IFsrmObject {
+  [propget, id (FSRM_DISPID_QUOTA_BASE | 0x81)] HRESULT QuotaLimit ([out, retval] VARIANT *quotaLimit);
+  [propput, id (FSRM_DISPID_QUOTA_BASE | 0x81)] HRESULT QuotaLimit ([in] VARIANT quotaLimit);
+  [propget, id (FSRM_DISPID_QUOTA_BASE | 0x82)] HRESULT QuotaFlags ([out, retval] long *quotaFlags);
+  [propput, id (FSRM_DISPID_QUOTA_BASE | 0x82)] HRESULT QuotaFlags ([in] long quotaFlags);
+  [propget, id (FSRM_DISPID_QUOTA_BASE | 0x83)] HRESULT Thresholds ([out, retval] SAFEARRAY (VARIANT) *thresholds);
+  [id (FSRM_DISPID_QUOTA_BASE | 0x1)] HRESULT AddThreshold ([in] FSRM_QUOTA_THRESHOLD threshold);
+  [id (FSRM_DISPID_QUOTA_BASE | 0x2)] HRESULT DeleteThreshold ([in] FSRM_QUOTA_THRESHOLD threshold);
+  [id (FSRM_DISPID_QUOTA_BASE | 0x3)] HRESULT ModifyThreshold ([in] FSRM_QUOTA_THRESHOLD threshold,[in] FSRM_QUOTA_THRESHOLD newThreshold);
+  [id (FSRM_DISPID_QUOTA_BASE | 0x4)] HRESULT CreateThresholdAction ([in] FSRM_QUOTA_THRESHOLD threshold,[in] FsrmActionType actionType,[out, retval] IFsrmAction **action);
+  [id (FSRM_DISPID_QUOTA_BASE | 0x5)] HRESULT EnumThresholdActions ([in] FSRM_QUOTA_THRESHOLD threshold,[out, retval] IFsrmCollection **actions);
+}
+
+[object, uuid (42dc3511-61d5-48ae-b6dc-59fc00c0a8d6), dual, pointer_default (unique)]
+interface IFsrmQuotaObject : IFsrmQuotaBase {
+  [propget, id (FSRM_DISPID_QUOTA_OBJECT | 0x81)] HRESULT Path ([out, retval] BSTR *path);
+  [propget, id (FSRM_DISPID_QUOTA_OBJECT | 0x82)] HRESULT UserSid ([out, retval] BSTR *userSid);
+  [propget, id (FSRM_DISPID_QUOTA_OBJECT | 0x83)] HRESULT UserAccount ([out, retval] BSTR *userAccount);
+  [propget, id (FSRM_DISPID_QUOTA_OBJECT | 0x84)] HRESULT SourceTemplateName ([out, retval] BSTR *quotaTemplateName);
+  [propget, id (FSRM_DISPID_QUOTA_OBJECT | 0x85)] HRESULT MatchesSourceTemplate ([out, retval] VARIANT_BOOL *matches);
+  [id (FSRM_DISPID_QUOTA_OBJECT | 0x1)] HRESULT ApplyTemplate ([in] BSTR quotaTemplateName);
+};
+
+[object, uuid (a2efab31-295e-46bb-b976-e86d58b52e8b), dual, pointer_default (unique)]
+interface IFsrmQuotaTemplate : IFsrmQuotaBase {
+  [propget, id (FSRM_DISPID_QUOTA_TEMPLATE | 0x81)] HRESULT Name ([out, retval] BSTR *name);
+  [propput, id (FSRM_DISPID_QUOTA_TEMPLATE | 0x81)] HRESULT Name ([in] BSTR name);
+  [id (FSRM_DISPID_QUOTA_TEMPLATE | 0x1)] HRESULT CopyTemplate ([in] BSTR quotaTemplateName);
+  [id (FSRM_DISPID_QUOTA_TEMPLATE | 0x2)] HRESULT CommitAndUpdateDerived ([in] FsrmCommitOptions commitOptions,[in] FsrmTemplateApplyOptions applyOptions,[out, retval] IFsrmDerivedObjectsResult **derivedObjectsResult);
+};
+
+[object, uuid (377f739d-9647-4b8e-97d2-5ffce6d759cd), dual, pointer_default (unique)]
+interface IFsrmQuota : IFsrmQuotaObject {
+  [propget, id (FSRM_DISPID_QUOTA | 0x81)] HRESULT QuotaUsed ([out, retval] VARIANT *used);
+  [propget, id (FSRM_DISPID_QUOTA | 0x82)] HRESULT QuotaPeakUsage ([out, retval] VARIANT *peakUsage);
+  [propget, id (FSRM_DISPID_QUOTA | 0x83)] HRESULT QuotaPeakUsageTime ([out, retval] DATE *peakUsageDateTime);
+  [id (FSRM_DISPID_QUOTA | 0x1)] HRESULT ResetPeakUsage ();
+  [id (FSRM_DISPID_QUOTA | 0x2)] HRESULT RefreshUsageProperties ();
+};
+
+[object, uuid (f82e5729-6aba-4740-bfc7-c7f58f75fb7b), dual, pointer_default (unique)]
+interface IFsrmAutoApplyQuota : IFsrmQuotaObject {
+  [propget, id (FSRM_DISPID_AUTOAPPLYQUOTA | 0x81)] HRESULT ExcludeFolders ([out, retval] SAFEARRAY (VARIANT) *folders);
+  [propput, id (FSRM_DISPID_AUTOAPPLYQUOTA | 0x81)] HRESULT ExcludeFolders ([in] SAFEARRAY (VARIANT) folders);
+  [id (FSRM_DISPID_AUTOAPPLYQUOTA | 0x1)] HRESULT CommitAndUpdateDerived ([in] FsrmCommitOptions commitOptions,[in] FsrmTemplateApplyOptions applyOptions,[out, retval] IFsrmDerivedObjectsResult **derivedObjectsResult);
+};
+
+[object, uuid (4846cb01-d430-494f-abb4-b1054999fb09), dual, pointer_default (unique)]
+interface IFsrmQuotaManagerEx : IFsrmQuotaManager {
+  [id (FSRM_DISPID_QUOTA_MANAGER_EX | 0x1)] HRESULT IsAffectedByQuota ([in] BSTR path,[in, defaultvalue (FsrmEnumOptions_None)] FsrmEnumOptions options,[out, retval] VARIANT_BOOL *affected);
+};
+
+[object, uuid (9a2bf113-a329-44cc-809a-5c00fce8da40), dual, pointer_default (unique)]
+interface IFsrmQuotaTemplateImported : IFsrmQuotaTemplate {
+  [propget, id (FSRM_DISPID_QUOTA_TEMPLATE_IMPORTED | 0x81)] HRESULT OverwriteOnCommit ([out, retval] VARIANT_BOOL *overwrite);
+  [propput, id (FSRM_DISPID_QUOTA_TEMPLATE_IMPORTED | 0x81)] HRESULT OverwriteOnCommit ([in] VARIANT_BOOL overwrite);
+};
+cpp_quote("#endif")
diff --git a/mingw-w64-headers/include/fsrmreports.h b/mingw-w64-headers/include/fsrmreports.h
index 0f6da46..e05ce61 100644
--- a/mingw-w64-headers/include/fsrmreports.h
+++ b/mingw-w64-headers/include/fsrmreports.h
@@ -1,324 +1,278 @@
-/**
- * This file has no copyright assigned and is placed in the Public Domain.
- * This file is part of the mingw-w64 runtime package.
- * No warranty is given; refer to the file DISCLAIMER.PD within this package.
- */
-#include <fsrmenums.h>
-#include <fsrm.h>
-#include <fsrmquota.h>
-#include <fsrmscreen.h>
+/*** Autogenerated by WIDL 1.6 from fsrmreports.idl - Do not edit ***/
 
-#ifndef _INC_FSRMREPORTS
-#define _INC_FSRMREPORTS
+#ifndef __REQUIRED_RPCNDR_H_VERSION__
+#define __REQUIRED_RPCNDR_H_VERSION__ 475
+#endif
 
-#if (_WIN32_WINNT >= 0x0600)
-#ifndef __IFsrmAction_FWD_DEFINED__
-#define __IFsrmAction_FWD_DEFINED__
-typedef struct IFsrmAction IFsrmAction;
-#endif /* __IFsrmAction_FWD_DEFINED__ */
+#include <rpc.h>
+#include <rpcndr.h>
 
-#ifndef __IFsrmActionCommand_FWD_DEFINED__
-#define __IFsrmActionCommand_FWD_DEFINED__
-typedef struct IFsrmActionCommand IFsrmActionCommand;
-#endif /* __IFsrmActionCommand_FWD_DEFINED__ */
+#ifndef COM_NO_WINDOWS_H
+#include <windows.h>
+#include <ole2.h>
+#endif
 
-#ifndef __IFsrmActionEmail_FWD_DEFINED__
-#define __IFsrmActionEmail_FWD_DEFINED__
-typedef struct IFsrmActionEmail IFsrmActionEmail;
-#endif /* __IFsrmActionEmail_FWD_DEFINED__ */
+#ifndef __fsrmreports_h__
+#define __fsrmreports_h__
 
-#ifndef __IFsrmActionEmail2_FWD_DEFINED__
-#define __IFsrmActionEmail2_FWD_DEFINED__
-typedef struct IFsrmActionEmail2 IFsrmActionEmail2;
-#endif /* __IFsrmActionEmail2_FWD_DEFINED__ */
-
-#ifndef __IFsrmActionEventLog_FWD_DEFINED__
-#define __IFsrmActionEventLog_FWD_DEFINED__
-typedef struct IFsrmActionEventLog IFsrmActionEventLog;
-#endif /* __IFsrmActionEventLog_FWD_DEFINED__ */
-
-#ifndef __IFsrmActionReport_FWD_DEFINED__
-#define __IFsrmActionReport_FWD_DEFINED__
-typedef struct IFsrmActionReport IFsrmActionReport;
-#endif /* __IFsrmActionReport_FWD_DEFINED__ */
-
-#ifndef __IFsrmAutoApplyQuota_FWD_DEFINED__
-#define __IFsrmAutoApplyQuota_FWD_DEFINED__
-typedef struct IFsrmAutoApplyQuota IFsrmAutoApplyQuota;
-#endif /* __IFsrmAutoApplyQuota_FWD_DEFINED__ */
-
-#ifndef __IFsrmClassificationManager_FWD_DEFINED__
-#define __IFsrmClassificationManager_FWD_DEFINED__
-typedef struct IFsrmClassificationManager IFsrmClassificationManager;
-#endif /* __IFsrmClassificationManager_FWD_DEFINED__ */
-
-#ifndef __IFsrmClassificationRule_FWD_DEFINED__
-#define __IFsrmClassificationRule_FWD_DEFINED__
-typedef struct IFsrmClassificationRule IFsrmClassificationRule;
-#endif /* __IFsrmClassificationRule_FWD_DEFINED__ */
-
-#ifndef __IFsrmClassifierModuleDefinition_FWD_DEFINED__
-#define __IFsrmClassifierModuleDefinition_FWD_DEFINED__
-typedef struct IFsrmClassifierModuleDefinition IFsrmClassifierModuleDefinition;
-#endif /* __IFsrmClassifierModuleDefinition_FWD_DEFINED__ */
-
-#ifndef __IFsrmClassifierModuleImplementation_FWD_DEFINED__
-#define __IFsrmClassifierModuleImplementation_FWD_DEFINED__
-typedef struct IFsrmClassifierModuleImplementation IFsrmClassifierModuleImplementation;
-#endif /* __IFsrmClassifierModuleImplementation_FWD_DEFINED__ */
-
-#ifndef __IFsrmCollection_FWD_DEFINED__
-#define __IFsrmCollection_FWD_DEFINED__
-typedef struct IFsrmCollection IFsrmCollection;
-#endif /* __IFsrmCollection_FWD_DEFINED__ */
-
-#ifndef __IFsrmCommittableCollection_FWD_DEFINED__
-#define __IFsrmCommittableCollection_FWD_DEFINED__
-typedef struct IFsrmCommittableCollection IFsrmCommittableCollection;
-#endif /* __IFsrmCommittableCollection_FWD_DEFINED__ */
-
-#ifndef __IFsrmDerivedObjectsResult_FWD_DEFINED__
-#define __IFsrmDerivedObjectsResult_FWD_DEFINED__
-typedef struct IFsrmDerivedObjectsResult IFsrmDerivedObjectsResult;
-#endif /* __IFsrmDerivedObjectsResult_FWD_DEFINED__ */
-
-#ifndef __IFsrmExportImport_FWD_DEFINED__
-#define __IFsrmExportImport_FWD_DEFINED__
-typedef struct IFsrmExportImport IFsrmExportImport;
-#endif /* __IFsrmExportImport_FWD_DEFINED__ */
-
-#ifndef __IFsrmFileGroup_FWD_DEFINED__
-#define __IFsrmFileGroup_FWD_DEFINED__
-typedef struct IFsrmFileGroup IFsrmFileGroup;
-#endif /* __IFsrmFileGroup_FWD_DEFINED__ */
-
-#ifndef __IFsrmFileGroupImported_FWD_DEFINED__
-#define __IFsrmFileGroupImported_FWD_DEFINED__
-typedef struct IFsrmFileGroupImported IFsrmFileGroupImported;
-#endif /* __IFsrmFileGroupImported_FWD_DEFINED__ */
-
-#ifndef __IFsrmFileGroupManager_FWD_DEFINED__
-#define __IFsrmFileGroupManager_FWD_DEFINED__
-typedef struct IFsrmFileGroupManager IFsrmFileGroupManager;
-#endif /* __IFsrmFileGroupManager_FWD_DEFINED__ */
-
-#ifndef __IFsrmFileManagementJob_FWD_DEFINED__
-#define __IFsrmFileManagementJob_FWD_DEFINED__
-typedef struct IFsrmFileManagementJob IFsrmFileManagementJob;
-#endif /* __IFsrmFileManagementJob_FWD_DEFINED__ */
-
-#ifndef __IFsrmFileManagementJobManager_FWD_DEFINED__
-#define __IFsrmFileManagementJobManager_FWD_DEFINED__
-typedef struct IFsrmFileManagementJobManager IFsrmFileManagementJobManager;
-#endif /* __IFsrmFileManagementJobManager_FWD_DEFINED__ */
-
-#ifndef __IFsrmFileScreen_FWD_DEFINED__
-#define __IFsrmFileScreen_FWD_DEFINED__
-typedef struct IFsrmFileScreen IFsrmFileScreen;
-#endif /* __IFsrmFileScreen_FWD_DEFINED__ */
-
-#ifndef __IFsrmFileScreenBase_FWD_DEFINED__
-#define __IFsrmFileScreenBase_FWD_DEFINED__
-typedef struct IFsrmFileScreenBase IFsrmFileScreenBase;
-#endif /* __IFsrmFileScreenBase_FWD_DEFINED__ */
-
-#ifndef __IFsrmFileScreenException_FWD_DEFINED__
-#define __IFsrmFileScreenException_FWD_DEFINED__
-typedef struct IFsrmFileScreenException IFsrmFileScreenException;
-#endif /* __IFsrmFileScreenException_FWD_DEFINED__ */
-
-#ifndef __IFsrmFileScreenManager_FWD_DEFINED__
-#define __IFsrmFileScreenManager_FWD_DEFINED__
-typedef struct IFsrmFileScreenManager IFsrmFileScreenManager;
-#endif /* __IFsrmFileScreenManager_FWD_DEFINED__ */
-
-#ifndef __IFsrmFileScreenTemplate_FWD_DEFINED__
-#define __IFsrmFileScreenTemplate_FWD_DEFINED__
-typedef struct IFsrmFileScreenTemplate IFsrmFileScreenTemplate;
-#endif /* __IFsrmFileScreenTemplate_FWD_DEFINED__ */
-
-#ifndef __IFsrmFileScreenTemplateImported_FWD_DEFINED__
-#define __IFsrmFileScreenTemplateImported_FWD_DEFINED__
-typedef struct IFsrmFileScreenTemplateImported IFsrmFileScreenTemplateImported;
-#endif /* __IFsrmFileScreenTemplateImported_FWD_DEFINED__ */
-
-#ifndef __IFsrmFileScreenTemplateManager_FWD_DEFINED__
-#define __IFsrmFileScreenTemplateManager_FWD_DEFINED__
-typedef struct IFsrmFileScreenTemplateManager IFsrmFileScreenTemplateManager;
-#endif /* __IFsrmFileScreenTemplateManager_FWD_DEFINED__ */
-
-#ifndef __IFsrmMutableCollection_FWD_DEFINED__
-#define __IFsrmMutableCollection_FWD_DEFINED__
-typedef struct IFsrmMutableCollection IFsrmMutableCollection;
-#endif /* __IFsrmMutableCollection_FWD_DEFINED__ */
-
-#ifndef __IFsrmObject_FWD_DEFINED__
-#define __IFsrmObject_FWD_DEFINED__
-typedef struct IFsrmObject IFsrmObject;
-#endif /* __IFsrmObject_FWD_DEFINED__ */
-
-#ifndef __IFsrmPathMapper_FWD_DEFINED__
-#define __IFsrmPathMapper_FWD_DEFINED__
-typedef struct IFsrmPathMapper IFsrmPathMapper;
-#endif /* __IFsrmPathMapper_FWD_DEFINED__ */
-
-#ifndef __IFsrmPipelineModuleConnector_FWD_DEFINED__
-#define __IFsrmPipelineModuleConnector_FWD_DEFINED__
-typedef struct IFsrmPipelineModuleConnector IFsrmPipelineModuleConnector;
-#endif /* __IFsrmPipelineModuleConnector_FWD_DEFINED__ */
-
-#ifndef __IFsrmPipelineModuleDefinition_FWD_DEFINED__
-#define __IFsrmPipelineModuleDefinition_FWD_DEFINED__
-typedef struct IFsrmPipelineModuleDefinition IFsrmPipelineModuleDefinition;
-#endif /* __IFsrmPipelineModuleDefinition_FWD_DEFINED__ */
-
-#ifndef __IFsrmPipelineModuleImplementation_FWD_DEFINED__
-#define __IFsrmPipelineModuleImplementation_FWD_DEFINED__
-typedef struct IFsrmPipelineModuleImplementation IFsrmPipelineModuleImplementation;
-#endif /* __IFsrmPipelineModuleImplementation_FWD_DEFINED__ */
-
-#ifndef __IFsrmProperty_FWD_DEFINED__
-#define __IFsrmProperty_FWD_DEFINED__
-typedef struct IFsrmProperty IFsrmProperty;
-#endif /* __IFsrmProperty_FWD_DEFINED__ */
-
-#ifndef __IFsrmPropertyBag_FWD_DEFINED__
-#define __IFsrmPropertyBag_FWD_DEFINED__
-typedef struct IFsrmPropertyBag IFsrmPropertyBag;
-#endif /* __IFsrmPropertyBag_FWD_DEFINED__ */
-
-#ifndef __IFsrmPropertyCondition_FWD_DEFINED__
-#define __IFsrmPropertyCondition_FWD_DEFINED__
-typedef struct IFsrmPropertyCondition IFsrmPropertyCondition;
-#endif /* __IFsrmPropertyCondition_FWD_DEFINED__ */
-
-#ifndef __IFsrmPropertyDefinition_FWD_DEFINED__
-#define __IFsrmPropertyDefinition_FWD_DEFINED__
-typedef struct IFsrmPropertyDefinition IFsrmPropertyDefinition;
-#endif /* __IFsrmPropertyDefinition_FWD_DEFINED__ */
-
-#ifndef __IFsrmQuota_FWD_DEFINED__
-#define __IFsrmQuota_FWD_DEFINED__
-typedef struct IFsrmQuota IFsrmQuota;
-#endif /* __IFsrmQuota_FWD_DEFINED__ */
-
-#ifndef __IFsrmQuotaBase_FWD_DEFINED__
-#define __IFsrmQuotaBase_FWD_DEFINED__
-typedef struct IFsrmQuotaBase IFsrmQuotaBase;
-#endif /* __IFsrmQuotaBase_FWD_DEFINED__ */
-
-#ifndef __IFsrmQuotaManager_FWD_DEFINED__
-#define __IFsrmQuotaManager_FWD_DEFINED__
-typedef struct IFsrmQuotaManager IFsrmQuotaManager;
-#endif /* __IFsrmQuotaManager_FWD_DEFINED__ */
-
-#ifndef __IFsrmQuotaManagerEx_FWD_DEFINED__
-#define __IFsrmQuotaManagerEx_FWD_DEFINED__
-typedef struct IFsrmQuotaManagerEx IFsrmQuotaManagerEx;
-#endif /* __IFsrmQuotaManagerEx_FWD_DEFINED__ */
-
-#ifndef __IFsrmQuotaObject_FWD_DEFINED__
-#define __IFsrmQuotaObject_FWD_DEFINED__
-typedef struct IFsrmQuotaObject IFsrmQuotaObject;
-#endif /* __IFsrmQuotaObject_FWD_DEFINED__ */
-
-#ifndef __IFsrmQuotaTemplate_FWD_DEFINED__
-#define __IFsrmQuotaTemplate_FWD_DEFINED__
-typedef struct IFsrmQuotaTemplate IFsrmQuotaTemplate;
-#endif /* __IFsrmQuotaTemplate_FWD_DEFINED__ */
-
-#ifndef __IFsrmQuotaTemplateImported_FWD_DEFINED__
-#define __IFsrmQuotaTemplateImported_FWD_DEFINED__
-typedef struct IFsrmQuotaTemplateImported IFsrmQuotaTemplateImported;
-#endif /* __IFsrmQuotaTemplateImported_FWD_DEFINED__ */
-
-#ifndef __IFsrmQuotaTemplateManager_FWD_DEFINED__
-#define __IFsrmQuotaTemplateManager_FWD_DEFINED__
-typedef struct IFsrmQuotaTemplateManager IFsrmQuotaTemplateManager;
-#endif /* __IFsrmQuotaTemplateManager_FWD_DEFINED__ */
+/* Forward declarations */
 
 #ifndef __IFsrmReport_FWD_DEFINED__
 #define __IFsrmReport_FWD_DEFINED__
-typedef struct IFsrmReport IFsrmReport;
-#endif /* __IFsrmReport_FWD_DEFINED__ */
-
-#ifndef __IFsrmReportJob_FWD_DEFINED__
-#define __IFsrmReportJob_FWD_DEFINED__
-typedef struct IFsrmReportJob IFsrmReportJob;
-#endif /* __IFsrmReportJob_FWD_DEFINED__ */
-
-#ifndef __IFsrmReportManager_FWD_DEFINED__
-#define __IFsrmReportManager_FWD_DEFINED__
-typedef struct IFsrmReportManager IFsrmReportManager;
-#endif /* __IFsrmReportManager_FWD_DEFINED__ */
+typedef interface IFsrmReport IFsrmReport;
+#endif
 
 #ifndef __IFsrmReportScheduler_FWD_DEFINED__
 #define __IFsrmReportScheduler_FWD_DEFINED__
-typedef struct IFsrmReportScheduler IFsrmReportScheduler;
-#endif /* __IFsrmReportScheduler_FWD_DEFINED__ */
-
-#ifndef __IFsrmRule_FWD_DEFINED__
-#define __IFsrmRule_FWD_DEFINED__
-typedef struct IFsrmRule IFsrmRule;
-#endif /* __IFsrmRule_FWD_DEFINED__ */
-
-#ifndef __IFsrmSetting_FWD_DEFINED__
-#define __IFsrmSetting_FWD_DEFINED__
-typedef struct IFsrmSetting IFsrmSetting;
-#endif /* __IFsrmSetting_FWD_DEFINED__ */
-
-#ifndef __IFsrmStorageModuleDefinition_FWD_DEFINED__
-#define __IFsrmStorageModuleDefinition_FWD_DEFINED__
-typedef struct IFsrmStorageModuleDefinition IFsrmStorageModuleDefinition;
-#endif /* __IFsrmStorageModuleDefinition_FWD_DEFINED__ */
-
-#ifndef __IFsrmStorageModuleImplementation_FWD_DEFINED__
-#define __IFsrmStorageModuleImplementation_FWD_DEFINED__
-typedef struct IFsrmStorageModuleImplementation IFsrmStorageModuleImplementation;
-#endif /* __IFsrmStorageModuleImplementation_FWD_DEFINED__ */
-
-#undef  INTERFACE
-#define INTERFACE IFsrmReport
-#ifdef __GNUC__
-#warning COM interfaces layout in this header has not been verified.
-#warning COM interfaces with incorrect layout may not work at all.
-__MINGW_BROKEN_INTERFACE(INTERFACE)
+typedef interface IFsrmReportScheduler IFsrmReportScheduler;
 #endif
-DECLARE_INTERFACE_(IFsrmReport,IDispatch)
+
+#ifndef __IFsrmFileManagementJobManager_FWD_DEFINED__
+#define __IFsrmFileManagementJobManager_FWD_DEFINED__
+typedef interface IFsrmFileManagementJobManager IFsrmFileManagementJobManager;
+#endif
+
+#ifndef __IFsrmPropertyCondition_FWD_DEFINED__
+#define __IFsrmPropertyCondition_FWD_DEFINED__
+typedef interface IFsrmPropertyCondition IFsrmPropertyCondition;
+#endif
+
+#ifndef __IFsrmReportManager_FWD_DEFINED__
+#define __IFsrmReportManager_FWD_DEFINED__
+typedef interface IFsrmReportManager IFsrmReportManager;
+#endif
+
+#ifndef __IFsrmReportJob_FWD_DEFINED__
+#define __IFsrmReportJob_FWD_DEFINED__
+typedef interface IFsrmReportJob IFsrmReportJob;
+#endif
+
+#ifndef __IFsrmFileManagementJob_FWD_DEFINED__
+#define __IFsrmFileManagementJob_FWD_DEFINED__
+typedef interface IFsrmFileManagementJob IFsrmFileManagementJob;
+#endif
+
+#ifndef __IFsrmFileCondition_FWD_DEFINED__
+#define __IFsrmFileCondition_FWD_DEFINED__
+typedef interface IFsrmFileCondition IFsrmFileCondition;
+#endif
+
+#ifndef __IFsrmFileConditionProperty_FWD_DEFINED__
+#define __IFsrmFileConditionProperty_FWD_DEFINED__
+typedef interface IFsrmFileConditionProperty IFsrmFileConditionProperty;
+#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 __IFsrmFileManagementJob_FWD_DEFINED__
+#define __IFsrmFileManagementJob_FWD_DEFINED__
+typedef interface IFsrmFileManagementJob IFsrmFileManagementJob;
+#endif
+
+#ifndef __IFsrmFileManagementJobManager_FWD_DEFINED__
+#define __IFsrmFileManagementJobManager_FWD_DEFINED__
+typedef interface IFsrmFileManagementJobManager IFsrmFileManagementJobManager;
+#endif
+
+#ifndef __IFsrmPropertyCondition_FWD_DEFINED__
+#define __IFsrmPropertyCondition_FWD_DEFINED__
+typedef interface IFsrmPropertyCondition IFsrmPropertyCondition;
+#endif
+
+#ifndef __IFsrmReport_FWD_DEFINED__
+#define __IFsrmReport_FWD_DEFINED__
+typedef interface IFsrmReport IFsrmReport;
+#endif
+
+#ifndef __IFsrmReportJob_FWD_DEFINED__
+#define __IFsrmReportJob_FWD_DEFINED__
+typedef interface IFsrmReportJob IFsrmReportJob;
+#endif
+
+#ifndef __IFsrmReportManager_FWD_DEFINED__
+#define __IFsrmReportManager_FWD_DEFINED__
+typedef interface IFsrmReportManager IFsrmReportManager;
+#endif
+
+#define FSRM_DISPID_REPORT_MANAGER (FSRM_DISPID_FEATURE_REPORTS | 0x100000)
+
+#define FSRM_DISPID_REPORT_JOB (FSRM_DISPID_FEATURE_REPORTS | 0x200000)
+
+#define FSRM_DISPID_REPORT (FSRM_DISPID_FEATURE_REPORTS | 0x300000)
+
+#define FSRM_DISPID_REPORT_SCHEDULER (FSRM_DISPID_FEATURE_REPORTS | 0x400000)
+
+#define FSRM_DISPID_FILE_MANAGEMENT_JOB_MANAGER (FSRM_DISPID_FEATURE_REPORTS | 0x500000)
+
+#define FSRM_DISPID_FILE_MANAGEMENT_JOB (FSRM_DISPID_FEATURE_REPORTS | 0x600000)
+
+#define FSRM_DISPID_FILE_MANAGEMENT_NOTIFICATION (FSRM_DISPID_FEATURE_REPORTS | 0x700000)
+
+#define FSRM_DISPID_PROPERTY_CONDITION (FSRM_DISPID_FEATURE_REPORTS | 0x800000)
+
+#define FSRM_DISPID_FILE_CONDITION (FSRM_DISPID_FEATURE_REPORTS | 0x900000)
+
+#define FSRM_DISPID_FILE_CONDITION_PROPERTY (FSRM_DISPID_FEATURE_REPORTS | 0xa00000)
+
+#define FSRM_DISPID_FILE_MANAGEMENT_JOB_2 (FSRM_DISPID_FEATURE_REPORTS | 0xb00000)
+
+/*****************************************************************************
+ * IFsrmReport interface
+ */
+#ifndef __IFsrmReport_INTERFACE_DEFINED__
+#define __IFsrmReport_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IFsrmReport, 0xd8cc81d9, 0x46b8, 0x4fa4, 0xbf,0xa5, 0x4a,0xa9,0xde,0xc9,0xb6,0x38);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("d8cc81d9-46b8-4fa4-bfa5-4aa9dec9b638")
+IFsrmReport : public IDispatch
 {
+    virtual HRESULT STDMETHODCALLTYPE get_Type(
+        FsrmReportType *reportType) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_Name(
+        BSTR *name) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_Name(
+        BSTR name) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_Description(
+        BSTR *description) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_Description(
+        BSTR description) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_LastGeneratedFileNamePrefix(
+        BSTR *prefix) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFilter(
+        FsrmReportFilter filter,
+        VARIANT *filterValue) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetFilter(
+        FsrmReportFilter filter,
+        VARIANT filterValue) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Delete(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IFsrmReport, 0xd8cc81d9, 0x46b8, 0x4fa4, 0xbf,0xa5, 0x4a,0xa9,0xde,0xc9,0xb6,0x38)
+#endif
+#else
+typedef struct IFsrmReportVtbl {
     BEGIN_INTERFACE
 
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFsrmReport* This,
+        REFIID riid,
+        void **ppvObject);
 
-    /* IDispatch methods */
-    STDMETHOD_(HRESULT,GetTypeInfoCount)(THIS_ unsigned int FAR*  pctinfo) PURE;
-    STDMETHOD_(HRESULT,GetTypeInfo)(THIS_ unsigned int  iTInfo,LCID  lcid,ITypeInfo FAR* FAR*  ppTInfo) PURE;
-    STDMETHOD_(HRESULT,GetIDsOfNames)(THIS_ REFIID  riid,OLECHAR FAR* FAR*  rgszNames,unsigned int  cNames,LCID   lcid,DISPID FAR*  rgDispId) PURE;
-    STDMETHOD_(HRESULT,Invoke)(THIS_ DISPID  dispIdMember,REFIID  riid,LCID  lcid,WORD  wFlags,DISPPARAMS FAR*  pDispParams,VARIANT FAR*  pVarResult,EXCEPINFO FAR*  pExcepInfo,unsigned int FAR*  puArgErr) PURE;
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFsrmReport* This);
 
-    /* IFsrmReport methods */
-    STDMETHOD_(HRESULT,get_Type)(THIS_ FsrmReportType *reportType) PURE;
-    STDMETHOD_(HRESULT,get_Name)(THIS_ BSTR *name) PURE;
-    STDMETHOD_(HRESULT,put_Name)(THIS_ BSTR name) PURE;
-    STDMETHOD_(HRESULT,get_Description)(THIS_ BSTR *description) PURE;
-    STDMETHOD_(HRESULT,put_Description)(THIS_ BSTR description) PURE;
-    STDMETHOD_(HRESULT,get_LastGeneratedFileNamePrefix)(THIS_ BSTR *prefix) PURE;
-    STDMETHOD_(HRESULT,GetFilter)(THIS_ FsrmReportFilter filter,VARIANT *filterValue) PURE;
-    STDMETHOD_(HRESULT,Delete)(THIS) PURE;
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFsrmReport* This);
+
+    /*** IDispatch methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
+        IFsrmReport* This,
+        UINT *pctinfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
+        IFsrmReport* This,
+        UINT iTInfo,
+        LCID lcid,
+        ITypeInfo **ppTInfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
+        IFsrmReport* This,
+        REFIID riid,
+        LPOLESTR *rgszNames,
+        UINT cNames,
+        LCID lcid,
+        DISPID *rgDispId);
+
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        IFsrmReport* This,
+        DISPID dispIdMember,
+        REFIID riid,
+        LCID lcid,
+        WORD wFlags,
+        DISPPARAMS *pDispParams,
+        VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo,
+        UINT *puArgErr);
+
+    /*** IFsrmReport methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Type)(
+        IFsrmReport* This,
+        FsrmReportType *reportType);
+
+    HRESULT (STDMETHODCALLTYPE *get_Name)(
+        IFsrmReport* This,
+        BSTR *name);
+
+    HRESULT (STDMETHODCALLTYPE *put_Name)(
+        IFsrmReport* This,
+        BSTR name);
+
+    HRESULT (STDMETHODCALLTYPE *get_Description)(
+        IFsrmReport* This,
+        BSTR *description);
+
+    HRESULT (STDMETHODCALLTYPE *put_Description)(
+        IFsrmReport* This,
+        BSTR description);
+
+    HRESULT (STDMETHODCALLTYPE *get_LastGeneratedFileNamePrefix)(
+        IFsrmReport* This,
+        BSTR *prefix);
+
+    HRESULT (STDMETHODCALLTYPE *GetFilter)(
+        IFsrmReport* This,
+        FsrmReportFilter filter,
+        VARIANT *filterValue);
+
+    HRESULT (STDMETHODCALLTYPE *SetFilter)(
+        IFsrmReport* This,
+        FsrmReportFilter filter,
+        VARIANT filterValue);
+
+    HRESULT (STDMETHODCALLTYPE *Delete)(
+        IFsrmReport* This);
 
     END_INTERFACE
+} IFsrmReportVtbl;
+interface IFsrmReport {
+    CONST_VTBL IFsrmReportVtbl* lpVtbl;
 };
+
 #ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
 #define IFsrmReport_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
 #define IFsrmReport_AddRef(This) (This)->lpVtbl->AddRef(This)
 #define IFsrmReport_Release(This) (This)->lpVtbl->Release(This)
+/*** IDispatch methods ***/
 #define IFsrmReport_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
 #define IFsrmReport_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
 #define IFsrmReport_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
 #define IFsrmReport_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
+/*** IFsrmReport methods ***/
 #define IFsrmReport_get_Type(This,reportType) (This)->lpVtbl->get_Type(This,reportType)
 #define IFsrmReport_get_Name(This,name) (This)->lpVtbl->get_Name(This,name)
 #define IFsrmReport_put_Name(This,name) (This)->lpVtbl->put_Name(This,name)
@@ -326,72 +280,1366 @@
 #define IFsrmReport_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
 #define IFsrmReport_get_LastGeneratedFileNamePrefix(This,prefix) (This)->lpVtbl->get_LastGeneratedFileNamePrefix(This,prefix)
 #define IFsrmReport_GetFilter(This,filter,filterValue) (This)->lpVtbl->GetFilter(This,filter,filterValue)
-#define IFsrmReport_Delete() (This)->lpVtbl->Delete(This)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmReportJob
-#ifdef __GNUC__
-#warning COM interfaces layout in this header has not been verified.
-#warning COM interfaces with incorrect layout may not work at all.
-__MINGW_BROKEN_INTERFACE(INTERFACE)
+#define IFsrmReport_SetFilter(This,filter,filterValue) (This)->lpVtbl->SetFilter(This,filter,filterValue)
+#define IFsrmReport_Delete(This) (This)->lpVtbl->Delete(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IFsrmReport_QueryInterface(IFsrmReport* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmReport_AddRef(IFsrmReport* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmReport_Release(IFsrmReport* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmReport_GetTypeInfoCount(IFsrmReport* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmReport_GetTypeInfo(IFsrmReport* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE HRESULT IFsrmReport_GetIDsOfNames(IFsrmReport* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
+    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
+}
+static FORCEINLINE HRESULT IFsrmReport_Invoke(IFsrmReport* 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);
+}
+/*** IFsrmReport methods ***/
+static FORCEINLINE HRESULT IFsrmReport_get_Type(IFsrmReport* This,FsrmReportType *reportType) {
+    return This->lpVtbl->get_Type(This,reportType);
+}
+static FORCEINLINE HRESULT IFsrmReport_get_Name(IFsrmReport* This,BSTR *name) {
+    return This->lpVtbl->get_Name(This,name);
+}
+static FORCEINLINE HRESULT IFsrmReport_put_Name(IFsrmReport* This,BSTR name) {
+    return This->lpVtbl->put_Name(This,name);
+}
+static FORCEINLINE HRESULT IFsrmReport_get_Description(IFsrmReport* This,BSTR *description) {
+    return This->lpVtbl->get_Description(This,description);
+}
+static FORCEINLINE HRESULT IFsrmReport_put_Description(IFsrmReport* This,BSTR description) {
+    return This->lpVtbl->put_Description(This,description);
+}
+static FORCEINLINE HRESULT IFsrmReport_get_LastGeneratedFileNamePrefix(IFsrmReport* This,BSTR *prefix) {
+    return This->lpVtbl->get_LastGeneratedFileNamePrefix(This,prefix);
+}
+static FORCEINLINE HRESULT IFsrmReport_GetFilter(IFsrmReport* This,FsrmReportFilter filter,VARIANT *filterValue) {
+    return This->lpVtbl->GetFilter(This,filter,filterValue);
+}
+static FORCEINLINE HRESULT IFsrmReport_SetFilter(IFsrmReport* This,FsrmReportFilter filter,VARIANT filterValue) {
+    return This->lpVtbl->SetFilter(This,filter,filterValue);
+}
+static FORCEINLINE HRESULT IFsrmReport_Delete(IFsrmReport* This) {
+    return This->lpVtbl->Delete(This);
+}
 #endif
-DECLARE_INTERFACE_(IFsrmReportJob,IFsrmObject)
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmReport_get_Type_Proxy(
+    IFsrmReport* This,
+    FsrmReportType *reportType);
+void __RPC_STUB IFsrmReport_get_Type_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmReport_get_Name_Proxy(
+    IFsrmReport* This,
+    BSTR *name);
+void __RPC_STUB IFsrmReport_get_Name_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmReport_put_Name_Proxy(
+    IFsrmReport* This,
+    BSTR name);
+void __RPC_STUB IFsrmReport_put_Name_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmReport_get_Description_Proxy(
+    IFsrmReport* This,
+    BSTR *description);
+void __RPC_STUB IFsrmReport_get_Description_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmReport_put_Description_Proxy(
+    IFsrmReport* This,
+    BSTR description);
+void __RPC_STUB IFsrmReport_put_Description_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmReport_get_LastGeneratedFileNamePrefix_Proxy(
+    IFsrmReport* This,
+    BSTR *prefix);
+void __RPC_STUB IFsrmReport_get_LastGeneratedFileNamePrefix_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmReport_GetFilter_Proxy(
+    IFsrmReport* This,
+    FsrmReportFilter filter,
+    VARIANT *filterValue);
+void __RPC_STUB IFsrmReport_GetFilter_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmReport_SetFilter_Proxy(
+    IFsrmReport* This,
+    FsrmReportFilter filter,
+    VARIANT filterValue);
+void __RPC_STUB IFsrmReport_SetFilter_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmReport_Delete_Proxy(
+    IFsrmReport* This);
+void __RPC_STUB IFsrmReport_Delete_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IFsrmReport_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IFsrmReportScheduler interface
+ */
+#ifndef __IFsrmReportScheduler_INTERFACE_DEFINED__
+#define __IFsrmReportScheduler_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IFsrmReportScheduler, 0x6879caf9, 0x6617, 0x4484, 0x87,0x19, 0x71,0xc3,0xd8,0x64,0x5f,0x94);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("6879caf9-6617-4484-8719-71c3d8645f94")
+IFsrmReportScheduler : public IDispatch
 {
+    virtual HRESULT STDMETHODCALLTYPE VerifyNamespaces(
+        VARIANT *namespacesSafeArray) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateScheduleTask(
+        BSTR taskName,
+        VARIANT *namespacesSafeArray,
+        BSTR serializedTask) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ModifyScheduleTask(
+        BSTR taskName,
+        VARIANT *namespacesSafeArray,
+        BSTR serializedTask) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE DeleteScheduleTask(
+        BSTR taskName) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IFsrmReportScheduler, 0x6879caf9, 0x6617, 0x4484, 0x87,0x19, 0x71,0xc3,0xd8,0x64,0x5f,0x94)
+#endif
+#else
+typedef struct IFsrmReportSchedulerVtbl {
     BEGIN_INTERFACE
 
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFsrmReportScheduler* This,
+        REFIID riid,
+        void **ppvObject);
 
-    /* IDispatch methods */
-    STDMETHOD_(HRESULT,GetTypeInfoCount)(THIS_ unsigned int FAR*  pctinfo) PURE;
-    STDMETHOD_(HRESULT,GetTypeInfo)(THIS_ unsigned int  iTInfo,LCID  lcid,ITypeInfo FAR* FAR*  ppTInfo) PURE;
-    STDMETHOD_(HRESULT,GetIDsOfNames)(THIS_ REFIID  riid,OLECHAR FAR* FAR*  rgszNames,unsigned int  cNames,LCID   lcid,DISPID FAR*  rgDispId) PURE;
-    STDMETHOD_(HRESULT,Invoke)(THIS_ DISPID  dispIdMember,REFIID  riid,LCID  lcid,WORD  wFlags,DISPPARAMS FAR*  pDispParams,VARIANT FAR*  pVarResult,EXCEPINFO FAR*  pExcepInfo,unsigned int FAR*  puArgErr) PURE;
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFsrmReportScheduler* This);
 
-    /* IFsrmObject methods */
-    STDMETHOD_(HRESULT,get_Id)(THIS_ FSRM_OBJECT_ID *id) PURE;
-    STDMETHOD_(HRESULT,get_Description)(THIS_ BSTR *description) PURE;
-    STDMETHOD_(HRESULT,put_Description)(THIS_ BSTR description) PURE;
-    STDMETHOD_(HRESULT,Delete)(THIS) PURE;
-    STDMETHOD_(HRESULT,Commit)(THIS) PURE;
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFsrmReportScheduler* This);
 
-    /* IFsrmReportJob methods */
-    STDMETHOD_(HRESULT,get_Task)(THIS_ BSTR *taskName) PURE;
-    STDMETHOD_(HRESULT,put_Task)(THIS_ BSTR taskName) PURE;
-    STDMETHOD_(HRESULT,get_NamespaceRoots)(THIS_ SAFEARRAY *namespaceRoots) PURE;
-    STDMETHOD_(HRESULT,put_NamespaceRoots)(THIS_ SAFEARRAY namespaceRoots) PURE;
-    STDMETHOD_(HRESULT,get_Formats)(THIS_ SAFEARRAY *formats) PURE;
-    STDMETHOD_(HRESULT,put_Formats)(THIS_ SAFEARRAY formats) PURE;
-    STDMETHOD_(HRESULT,get_MailTo)(THIS_ BSTR *mailTo) PURE;
-    STDMETHOD_(HRESULT,put_MailTo)(THIS_ BSTR mailTo) PURE;
-    STDMETHOD_(HRESULT,get_RunningStatus)(THIS_ FsrmReportRunningStatus *runningStatus) PURE;
-    STDMETHOD_(HRESULT,get_LastRun)(THIS_ DATE *lastRun) PURE;
-    STDMETHOD_(HRESULT,get_LastError)(THIS_ BSTR *lastError) PURE;
-    STDMETHOD_(HRESULT,get_LastGeneratedInDirectory)(THIS_ BSTR *path) PURE;
-    STDMETHOD_(HRESULT,EnumReports)(THIS_ IFsrmCollection **reports) PURE;
-    STDMETHOD_(HRESULT,CreateReport)(THIS_ FsrmReportType reportType,IFsrmReport **report) PURE;
-    STDMETHOD_(HRESULT,Run)(THIS_ FsrmReportGenerationContext context) PURE;
-    STDMETHOD_(HRESULT,WaitForCompletion)(THIS_ __LONG32 waitSeconds,VARIANT_BOOL *completed) PURE;
-    STDMETHOD_(HRESULT,Cancel)(THIS) PURE;
+    /*** IDispatch methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
+        IFsrmReportScheduler* This,
+        UINT *pctinfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
+        IFsrmReportScheduler* This,
+        UINT iTInfo,
+        LCID lcid,
+        ITypeInfo **ppTInfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
+        IFsrmReportScheduler* This,
+        REFIID riid,
+        LPOLESTR *rgszNames,
+        UINT cNames,
+        LCID lcid,
+        DISPID *rgDispId);
+
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        IFsrmReportScheduler* This,
+        DISPID dispIdMember,
+        REFIID riid,
+        LCID lcid,
+        WORD wFlags,
+        DISPPARAMS *pDispParams,
+        VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo,
+        UINT *puArgErr);
+
+    /*** IFsrmReportScheduler methods ***/
+    HRESULT (STDMETHODCALLTYPE *VerifyNamespaces)(
+        IFsrmReportScheduler* This,
+        VARIANT *namespacesSafeArray);
+
+    HRESULT (STDMETHODCALLTYPE *CreateScheduleTask)(
+        IFsrmReportScheduler* This,
+        BSTR taskName,
+        VARIANT *namespacesSafeArray,
+        BSTR serializedTask);
+
+    HRESULT (STDMETHODCALLTYPE *ModifyScheduleTask)(
+        IFsrmReportScheduler* This,
+        BSTR taskName,
+        VARIANT *namespacesSafeArray,
+        BSTR serializedTask);
+
+    HRESULT (STDMETHODCALLTYPE *DeleteScheduleTask)(
+        IFsrmReportScheduler* This,
+        BSTR taskName);
 
     END_INTERFACE
+} IFsrmReportSchedulerVtbl;
+interface IFsrmReportScheduler {
+    CONST_VTBL IFsrmReportSchedulerVtbl* lpVtbl;
 };
+
 #ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IFsrmReportScheduler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IFsrmReportScheduler_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IFsrmReportScheduler_Release(This) (This)->lpVtbl->Release(This)
+/*** IDispatch methods ***/
+#define IFsrmReportScheduler_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
+#define IFsrmReportScheduler_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
+#define IFsrmReportScheduler_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
+#define IFsrmReportScheduler_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
+/*** IFsrmReportScheduler methods ***/
+#define IFsrmReportScheduler_VerifyNamespaces(This,namespacesSafeArray) (This)->lpVtbl->VerifyNamespaces(This,namespacesSafeArray)
+#define IFsrmReportScheduler_CreateScheduleTask(This,taskName,namespacesSafeArray,serializedTask) (This)->lpVtbl->CreateScheduleTask(This,taskName,namespacesSafeArray,serializedTask)
+#define IFsrmReportScheduler_ModifyScheduleTask(This,taskName,namespacesSafeArray,serializedTask) (This)->lpVtbl->ModifyScheduleTask(This,taskName,namespacesSafeArray,serializedTask)
+#define IFsrmReportScheduler_DeleteScheduleTask(This,taskName) (This)->lpVtbl->DeleteScheduleTask(This,taskName)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IFsrmReportScheduler_QueryInterface(IFsrmReportScheduler* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmReportScheduler_AddRef(IFsrmReportScheduler* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmReportScheduler_Release(IFsrmReportScheduler* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmReportScheduler_GetTypeInfoCount(IFsrmReportScheduler* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmReportScheduler_GetTypeInfo(IFsrmReportScheduler* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE HRESULT IFsrmReportScheduler_GetIDsOfNames(IFsrmReportScheduler* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
+    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
+}
+static FORCEINLINE HRESULT IFsrmReportScheduler_Invoke(IFsrmReportScheduler* 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);
+}
+/*** IFsrmReportScheduler methods ***/
+static FORCEINLINE HRESULT IFsrmReportScheduler_VerifyNamespaces(IFsrmReportScheduler* This,VARIANT *namespacesSafeArray) {
+    return This->lpVtbl->VerifyNamespaces(This,namespacesSafeArray);
+}
+static FORCEINLINE HRESULT IFsrmReportScheduler_CreateScheduleTask(IFsrmReportScheduler* This,BSTR taskName,VARIANT *namespacesSafeArray,BSTR serializedTask) {
+    return This->lpVtbl->CreateScheduleTask(This,taskName,namespacesSafeArray,serializedTask);
+}
+static FORCEINLINE HRESULT IFsrmReportScheduler_ModifyScheduleTask(IFsrmReportScheduler* This,BSTR taskName,VARIANT *namespacesSafeArray,BSTR serializedTask) {
+    return This->lpVtbl->ModifyScheduleTask(This,taskName,namespacesSafeArray,serializedTask);
+}
+static FORCEINLINE HRESULT IFsrmReportScheduler_DeleteScheduleTask(IFsrmReportScheduler* This,BSTR taskName) {
+    return This->lpVtbl->DeleteScheduleTask(This,taskName);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmReportScheduler_VerifyNamespaces_Proxy(
+    IFsrmReportScheduler* This,
+    VARIANT *namespacesSafeArray);
+void __RPC_STUB IFsrmReportScheduler_VerifyNamespaces_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmReportScheduler_CreateScheduleTask_Proxy(
+    IFsrmReportScheduler* This,
+    BSTR taskName,
+    VARIANT *namespacesSafeArray,
+    BSTR serializedTask);
+void __RPC_STUB IFsrmReportScheduler_CreateScheduleTask_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmReportScheduler_ModifyScheduleTask_Proxy(
+    IFsrmReportScheduler* This,
+    BSTR taskName,
+    VARIANT *namespacesSafeArray,
+    BSTR serializedTask);
+void __RPC_STUB IFsrmReportScheduler_ModifyScheduleTask_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmReportScheduler_DeleteScheduleTask_Proxy(
+    IFsrmReportScheduler* This,
+    BSTR taskName);
+void __RPC_STUB IFsrmReportScheduler_DeleteScheduleTask_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IFsrmReportScheduler_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IFsrmFileManagementJobManager interface
+ */
+#ifndef __IFsrmFileManagementJobManager_INTERFACE_DEFINED__
+#define __IFsrmFileManagementJobManager_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IFsrmFileManagementJobManager, 0xee321ecb, 0xd95e, 0x48e9, 0x90,0x7c, 0xc7,0x68,0x5a,0x01,0x32,0x35);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("ee321ecb-d95e-48e9-907c-c7685a013235")
+IFsrmFileManagementJobManager : public IDispatch
+{
+    virtual HRESULT STDMETHODCALLTYPE get_ActionVariables(
+        SAFEARRAY **variables) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_ActionVariableDescriptions(
+        SAFEARRAY **descriptions) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EnumFileManagementJobs(
+        FsrmEnumOptions options = FsrmEnumOptions_None,
+        IFsrmCollection **fileManagementJobs) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateFileManagementJob(
+        IFsrmFileManagementJob **fileManagementJob) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFileManagementJob(
+        BSTR name,
+        IFsrmFileManagementJob **fileManagementJob) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IFsrmFileManagementJobManager, 0xee321ecb, 0xd95e, 0x48e9, 0x90,0x7c, 0xc7,0x68,0x5a,0x01,0x32,0x35)
+#endif
+#else
+typedef struct IFsrmFileManagementJobManagerVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFsrmFileManagementJobManager* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFsrmFileManagementJobManager* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFsrmFileManagementJobManager* This);
+
+    /*** IDispatch methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
+        IFsrmFileManagementJobManager* This,
+        UINT *pctinfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
+        IFsrmFileManagementJobManager* This,
+        UINT iTInfo,
+        LCID lcid,
+        ITypeInfo **ppTInfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
+        IFsrmFileManagementJobManager* This,
+        REFIID riid,
+        LPOLESTR *rgszNames,
+        UINT cNames,
+        LCID lcid,
+        DISPID *rgDispId);
+
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        IFsrmFileManagementJobManager* This,
+        DISPID dispIdMember,
+        REFIID riid,
+        LCID lcid,
+        WORD wFlags,
+        DISPPARAMS *pDispParams,
+        VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo,
+        UINT *puArgErr);
+
+    /*** IFsrmFileManagementJobManager methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_ActionVariables)(
+        IFsrmFileManagementJobManager* This,
+        SAFEARRAY **variables);
+
+    HRESULT (STDMETHODCALLTYPE *get_ActionVariableDescriptions)(
+        IFsrmFileManagementJobManager* This,
+        SAFEARRAY **descriptions);
+
+    HRESULT (STDMETHODCALLTYPE *EnumFileManagementJobs)(
+        IFsrmFileManagementJobManager* This,
+        FsrmEnumOptions options,
+        IFsrmCollection **fileManagementJobs);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFileManagementJob)(
+        IFsrmFileManagementJobManager* This,
+        IFsrmFileManagementJob **fileManagementJob);
+
+    HRESULT (STDMETHODCALLTYPE *GetFileManagementJob)(
+        IFsrmFileManagementJobManager* This,
+        BSTR name,
+        IFsrmFileManagementJob **fileManagementJob);
+
+    END_INTERFACE
+} IFsrmFileManagementJobManagerVtbl;
+interface IFsrmFileManagementJobManager {
+    CONST_VTBL IFsrmFileManagementJobManagerVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IFsrmFileManagementJobManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IFsrmFileManagementJobManager_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IFsrmFileManagementJobManager_Release(This) (This)->lpVtbl->Release(This)
+/*** IDispatch methods ***/
+#define IFsrmFileManagementJobManager_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
+#define IFsrmFileManagementJobManager_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
+#define IFsrmFileManagementJobManager_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
+#define IFsrmFileManagementJobManager_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
+/*** IFsrmFileManagementJobManager methods ***/
+#define IFsrmFileManagementJobManager_get_ActionVariables(This,variables) (This)->lpVtbl->get_ActionVariables(This,variables)
+#define IFsrmFileManagementJobManager_get_ActionVariableDescriptions(This,descriptions) (This)->lpVtbl->get_ActionVariableDescriptions(This,descriptions)
+#define IFsrmFileManagementJobManager_EnumFileManagementJobs(This,options,fileManagementJobs) (This)->lpVtbl->EnumFileManagementJobs(This,options,fileManagementJobs)
+#define IFsrmFileManagementJobManager_CreateFileManagementJob(This,fileManagementJob) (This)->lpVtbl->CreateFileManagementJob(This,fileManagementJob)
+#define IFsrmFileManagementJobManager_GetFileManagementJob(This,name,fileManagementJob) (This)->lpVtbl->GetFileManagementJob(This,name,fileManagementJob)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IFsrmFileManagementJobManager_QueryInterface(IFsrmFileManagementJobManager* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmFileManagementJobManager_AddRef(IFsrmFileManagementJobManager* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmFileManagementJobManager_Release(IFsrmFileManagementJobManager* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmFileManagementJobManager_GetTypeInfoCount(IFsrmFileManagementJobManager* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJobManager_GetTypeInfo(IFsrmFileManagementJobManager* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJobManager_GetIDsOfNames(IFsrmFileManagementJobManager* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
+    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJobManager_Invoke(IFsrmFileManagementJobManager* 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);
+}
+/*** IFsrmFileManagementJobManager methods ***/
+static FORCEINLINE HRESULT IFsrmFileManagementJobManager_get_ActionVariables(IFsrmFileManagementJobManager* This,SAFEARRAY **variables) {
+    return This->lpVtbl->get_ActionVariables(This,variables);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJobManager_get_ActionVariableDescriptions(IFsrmFileManagementJobManager* This,SAFEARRAY **descriptions) {
+    return This->lpVtbl->get_ActionVariableDescriptions(This,descriptions);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJobManager_EnumFileManagementJobs(IFsrmFileManagementJobManager* This,FsrmEnumOptions options,IFsrmCollection **fileManagementJobs) {
+    return This->lpVtbl->EnumFileManagementJobs(This,options,fileManagementJobs);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJobManager_CreateFileManagementJob(IFsrmFileManagementJobManager* This,IFsrmFileManagementJob **fileManagementJob) {
+    return This->lpVtbl->CreateFileManagementJob(This,fileManagementJob);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJobManager_GetFileManagementJob(IFsrmFileManagementJobManager* This,BSTR name,IFsrmFileManagementJob **fileManagementJob) {
+    return This->lpVtbl->GetFileManagementJob(This,name,fileManagementJob);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJobManager_get_ActionVariables_Proxy(
+    IFsrmFileManagementJobManager* This,
+    SAFEARRAY **variables);
+void __RPC_STUB IFsrmFileManagementJobManager_get_ActionVariables_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJobManager_get_ActionVariableDescriptions_Proxy(
+    IFsrmFileManagementJobManager* This,
+    SAFEARRAY **descriptions);
+void __RPC_STUB IFsrmFileManagementJobManager_get_ActionVariableDescriptions_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJobManager_EnumFileManagementJobs_Proxy(
+    IFsrmFileManagementJobManager* This,
+    FsrmEnumOptions options,
+    IFsrmCollection **fileManagementJobs);
+void __RPC_STUB IFsrmFileManagementJobManager_EnumFileManagementJobs_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJobManager_CreateFileManagementJob_Proxy(
+    IFsrmFileManagementJobManager* This,
+    IFsrmFileManagementJob **fileManagementJob);
+void __RPC_STUB IFsrmFileManagementJobManager_CreateFileManagementJob_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJobManager_GetFileManagementJob_Proxy(
+    IFsrmFileManagementJobManager* This,
+    BSTR name,
+    IFsrmFileManagementJob **fileManagementJob);
+void __RPC_STUB IFsrmFileManagementJobManager_GetFileManagementJob_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IFsrmFileManagementJobManager_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IFsrmPropertyCondition interface
+ */
+#ifndef __IFsrmPropertyCondition_INTERFACE_DEFINED__
+#define __IFsrmPropertyCondition_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IFsrmPropertyCondition, 0x326af66f, 0x2ac0, 0x4f68, 0xbf,0x8c, 0x47,0x59,0xf0,0x54,0xfa,0x29);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("326af66f-2ac0-4f68-bf8c-4759f054fa29")
+IFsrmPropertyCondition : public IDispatch
+{
+    virtual HRESULT STDMETHODCALLTYPE get_Name(
+        BSTR *name) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_Name(
+        BSTR name) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_Type(
+        FsrmPropertyConditionType *type) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_Type(
+        FsrmPropertyConditionType type) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_Value(
+        BSTR *value) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_Value(
+        BSTR value) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Delete(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IFsrmPropertyCondition, 0x326af66f, 0x2ac0, 0x4f68, 0xbf,0x8c, 0x47,0x59,0xf0,0x54,0xfa,0x29)
+#endif
+#else
+typedef struct IFsrmPropertyConditionVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFsrmPropertyCondition* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFsrmPropertyCondition* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFsrmPropertyCondition* This);
+
+    /*** IDispatch methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
+        IFsrmPropertyCondition* This,
+        UINT *pctinfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
+        IFsrmPropertyCondition* This,
+        UINT iTInfo,
+        LCID lcid,
+        ITypeInfo **ppTInfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
+        IFsrmPropertyCondition* This,
+        REFIID riid,
+        LPOLESTR *rgszNames,
+        UINT cNames,
+        LCID lcid,
+        DISPID *rgDispId);
+
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        IFsrmPropertyCondition* This,
+        DISPID dispIdMember,
+        REFIID riid,
+        LCID lcid,
+        WORD wFlags,
+        DISPPARAMS *pDispParams,
+        VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo,
+        UINT *puArgErr);
+
+    /*** IFsrmPropertyCondition methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Name)(
+        IFsrmPropertyCondition* This,
+        BSTR *name);
+
+    HRESULT (STDMETHODCALLTYPE *put_Name)(
+        IFsrmPropertyCondition* This,
+        BSTR name);
+
+    HRESULT (STDMETHODCALLTYPE *get_Type)(
+        IFsrmPropertyCondition* This,
+        FsrmPropertyConditionType *type);
+
+    HRESULT (STDMETHODCALLTYPE *put_Type)(
+        IFsrmPropertyCondition* This,
+        FsrmPropertyConditionType type);
+
+    HRESULT (STDMETHODCALLTYPE *get_Value)(
+        IFsrmPropertyCondition* This,
+        BSTR *value);
+
+    HRESULT (STDMETHODCALLTYPE *put_Value)(
+        IFsrmPropertyCondition* This,
+        BSTR value);
+
+    HRESULT (STDMETHODCALLTYPE *Delete)(
+        IFsrmPropertyCondition* This);
+
+    END_INTERFACE
+} IFsrmPropertyConditionVtbl;
+interface IFsrmPropertyCondition {
+    CONST_VTBL IFsrmPropertyConditionVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IFsrmPropertyCondition_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IFsrmPropertyCondition_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IFsrmPropertyCondition_Release(This) (This)->lpVtbl->Release(This)
+/*** IDispatch methods ***/
+#define IFsrmPropertyCondition_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
+#define IFsrmPropertyCondition_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
+#define IFsrmPropertyCondition_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
+#define IFsrmPropertyCondition_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
+/*** IFsrmPropertyCondition methods ***/
+#define IFsrmPropertyCondition_get_Name(This,name) (This)->lpVtbl->get_Name(This,name)
+#define IFsrmPropertyCondition_put_Name(This,name) (This)->lpVtbl->put_Name(This,name)
+#define IFsrmPropertyCondition_get_Type(This,type) (This)->lpVtbl->get_Type(This,type)
+#define IFsrmPropertyCondition_put_Type(This,type) (This)->lpVtbl->put_Type(This,type)
+#define IFsrmPropertyCondition_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
+#define IFsrmPropertyCondition_put_Value(This,value) (This)->lpVtbl->put_Value(This,value)
+#define IFsrmPropertyCondition_Delete(This) (This)->lpVtbl->Delete(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IFsrmPropertyCondition_QueryInterface(IFsrmPropertyCondition* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmPropertyCondition_AddRef(IFsrmPropertyCondition* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmPropertyCondition_Release(IFsrmPropertyCondition* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmPropertyCondition_GetTypeInfoCount(IFsrmPropertyCondition* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmPropertyCondition_GetTypeInfo(IFsrmPropertyCondition* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE HRESULT IFsrmPropertyCondition_GetIDsOfNames(IFsrmPropertyCondition* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
+    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
+}
+static FORCEINLINE HRESULT IFsrmPropertyCondition_Invoke(IFsrmPropertyCondition* 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);
+}
+/*** IFsrmPropertyCondition methods ***/
+static FORCEINLINE HRESULT IFsrmPropertyCondition_get_Name(IFsrmPropertyCondition* This,BSTR *name) {
+    return This->lpVtbl->get_Name(This,name);
+}
+static FORCEINLINE HRESULT IFsrmPropertyCondition_put_Name(IFsrmPropertyCondition* This,BSTR name) {
+    return This->lpVtbl->put_Name(This,name);
+}
+static FORCEINLINE HRESULT IFsrmPropertyCondition_get_Type(IFsrmPropertyCondition* This,FsrmPropertyConditionType *type) {
+    return This->lpVtbl->get_Type(This,type);
+}
+static FORCEINLINE HRESULT IFsrmPropertyCondition_put_Type(IFsrmPropertyCondition* This,FsrmPropertyConditionType type) {
+    return This->lpVtbl->put_Type(This,type);
+}
+static FORCEINLINE HRESULT IFsrmPropertyCondition_get_Value(IFsrmPropertyCondition* This,BSTR *value) {
+    return This->lpVtbl->get_Value(This,value);
+}
+static FORCEINLINE HRESULT IFsrmPropertyCondition_put_Value(IFsrmPropertyCondition* This,BSTR value) {
+    return This->lpVtbl->put_Value(This,value);
+}
+static FORCEINLINE HRESULT IFsrmPropertyCondition_Delete(IFsrmPropertyCondition* This) {
+    return This->lpVtbl->Delete(This);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmPropertyCondition_get_Name_Proxy(
+    IFsrmPropertyCondition* This,
+    BSTR *name);
+void __RPC_STUB IFsrmPropertyCondition_get_Name_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmPropertyCondition_put_Name_Proxy(
+    IFsrmPropertyCondition* This,
+    BSTR name);
+void __RPC_STUB IFsrmPropertyCondition_put_Name_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmPropertyCondition_get_Type_Proxy(
+    IFsrmPropertyCondition* This,
+    FsrmPropertyConditionType *type);
+void __RPC_STUB IFsrmPropertyCondition_get_Type_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmPropertyCondition_put_Type_Proxy(
+    IFsrmPropertyCondition* This,
+    FsrmPropertyConditionType type);
+void __RPC_STUB IFsrmPropertyCondition_put_Type_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmPropertyCondition_get_Value_Proxy(
+    IFsrmPropertyCondition* This,
+    BSTR *value);
+void __RPC_STUB IFsrmPropertyCondition_get_Value_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmPropertyCondition_put_Value_Proxy(
+    IFsrmPropertyCondition* This,
+    BSTR value);
+void __RPC_STUB IFsrmPropertyCondition_put_Value_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmPropertyCondition_Delete_Proxy(
+    IFsrmPropertyCondition* This);
+void __RPC_STUB IFsrmPropertyCondition_Delete_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IFsrmPropertyCondition_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IFsrmReportManager interface
+ */
+#ifndef __IFsrmReportManager_INTERFACE_DEFINED__
+#define __IFsrmReportManager_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IFsrmReportManager, 0x27b899fe, 0x6ffa, 0x4481, 0xa1,0x84, 0xd3,0xda,0xad,0xe8,0xa0,0x2b);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("27b899fe-6ffa-4481-a184-d3daade8a02b")
+IFsrmReportManager : public IDispatch
+{
+    virtual HRESULT STDMETHODCALLTYPE EnumReportJobs(
+        FsrmEnumOptions options = FsrmEnumOptions_None,
+        IFsrmCollection **reportJobs) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateReportJob(
+        IFsrmReportJob **reportJob) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetReportJob(
+        BSTR taskName,
+        IFsrmReportJob **reportJob) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetOutputDirectory(
+        FsrmReportGenerationContext context,
+        BSTR *path) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetOutputDirectory(
+        FsrmReportGenerationContext context,
+        BSTR path) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE IsFilterValidForReportType(
+        FsrmReportType reportType,
+        FsrmReportFilter filter,
+        VARIANT_BOOL *valid) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetDefaultFilter(
+        FsrmReportType reportType,
+        FsrmReportFilter filter,
+        VARIANT *filterValue) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetDefaultFilter(
+        FsrmReportType reportType,
+        FsrmReportFilter filter,
+        VARIANT filterValue) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetReportSizeLimit(
+        FsrmReportLimit limit,
+        VARIANT *limitValue) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetReportSizeLimit(
+        FsrmReportLimit limit,
+        VARIANT limitValue) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IFsrmReportManager, 0x27b899fe, 0x6ffa, 0x4481, 0xa1,0x84, 0xd3,0xda,0xad,0xe8,0xa0,0x2b)
+#endif
+#else
+typedef struct IFsrmReportManagerVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFsrmReportManager* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFsrmReportManager* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFsrmReportManager* This);
+
+    /*** IDispatch methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
+        IFsrmReportManager* This,
+        UINT *pctinfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
+        IFsrmReportManager* This,
+        UINT iTInfo,
+        LCID lcid,
+        ITypeInfo **ppTInfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
+        IFsrmReportManager* This,
+        REFIID riid,
+        LPOLESTR *rgszNames,
+        UINT cNames,
+        LCID lcid,
+        DISPID *rgDispId);
+
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        IFsrmReportManager* This,
+        DISPID dispIdMember,
+        REFIID riid,
+        LCID lcid,
+        WORD wFlags,
+        DISPPARAMS *pDispParams,
+        VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo,
+        UINT *puArgErr);
+
+    /*** IFsrmReportManager methods ***/
+    HRESULT (STDMETHODCALLTYPE *EnumReportJobs)(
+        IFsrmReportManager* This,
+        FsrmEnumOptions options,
+        IFsrmCollection **reportJobs);
+
+    HRESULT (STDMETHODCALLTYPE *CreateReportJob)(
+        IFsrmReportManager* This,
+        IFsrmReportJob **reportJob);
+
+    HRESULT (STDMETHODCALLTYPE *GetReportJob)(
+        IFsrmReportManager* This,
+        BSTR taskName,
+        IFsrmReportJob **reportJob);
+
+    HRESULT (STDMETHODCALLTYPE *GetOutputDirectory)(
+        IFsrmReportManager* This,
+        FsrmReportGenerationContext context,
+        BSTR *path);
+
+    HRESULT (STDMETHODCALLTYPE *SetOutputDirectory)(
+        IFsrmReportManager* This,
+        FsrmReportGenerationContext context,
+        BSTR path);
+
+    HRESULT (STDMETHODCALLTYPE *IsFilterValidForReportType)(
+        IFsrmReportManager* This,
+        FsrmReportType reportType,
+        FsrmReportFilter filter,
+        VARIANT_BOOL *valid);
+
+    HRESULT (STDMETHODCALLTYPE *GetDefaultFilter)(
+        IFsrmReportManager* This,
+        FsrmReportType reportType,
+        FsrmReportFilter filter,
+        VARIANT *filterValue);
+
+    HRESULT (STDMETHODCALLTYPE *SetDefaultFilter)(
+        IFsrmReportManager* This,
+        FsrmReportType reportType,
+        FsrmReportFilter filter,
+        VARIANT filterValue);
+
+    HRESULT (STDMETHODCALLTYPE *GetReportSizeLimit)(
+        IFsrmReportManager* This,
+        FsrmReportLimit limit,
+        VARIANT *limitValue);
+
+    HRESULT (STDMETHODCALLTYPE *SetReportSizeLimit)(
+        IFsrmReportManager* This,
+        FsrmReportLimit limit,
+        VARIANT limitValue);
+
+    END_INTERFACE
+} IFsrmReportManagerVtbl;
+interface IFsrmReportManager {
+    CONST_VTBL IFsrmReportManagerVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IFsrmReportManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IFsrmReportManager_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IFsrmReportManager_Release(This) (This)->lpVtbl->Release(This)
+/*** IDispatch methods ***/
+#define IFsrmReportManager_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
+#define IFsrmReportManager_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
+#define IFsrmReportManager_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
+#define IFsrmReportManager_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
+/*** IFsrmReportManager methods ***/
+#define IFsrmReportManager_EnumReportJobs(This,options,reportJobs) (This)->lpVtbl->EnumReportJobs(This,options,reportJobs)
+#define IFsrmReportManager_CreateReportJob(This,reportJob) (This)->lpVtbl->CreateReportJob(This,reportJob)
+#define IFsrmReportManager_GetReportJob(This,taskName,reportJob) (This)->lpVtbl->GetReportJob(This,taskName,reportJob)
+#define IFsrmReportManager_GetOutputDirectory(This,context,path) (This)->lpVtbl->GetOutputDirectory(This,context,path)
+#define IFsrmReportManager_SetOutputDirectory(This,context,path) (This)->lpVtbl->SetOutputDirectory(This,context,path)
+#define IFsrmReportManager_IsFilterValidForReportType(This,reportType,filter,valid) (This)->lpVtbl->IsFilterValidForReportType(This,reportType,filter,valid)
+#define IFsrmReportManager_GetDefaultFilter(This,reportType,filter,filterValue) (This)->lpVtbl->GetDefaultFilter(This,reportType,filter,filterValue)
+#define IFsrmReportManager_SetDefaultFilter(This,reportType,filter,filterValue) (This)->lpVtbl->SetDefaultFilter(This,reportType,filter,filterValue)
+#define IFsrmReportManager_GetReportSizeLimit(This,limit,limitValue) (This)->lpVtbl->GetReportSizeLimit(This,limit,limitValue)
+#define IFsrmReportManager_SetReportSizeLimit(This,limit,limitValue) (This)->lpVtbl->SetReportSizeLimit(This,limit,limitValue)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IFsrmReportManager_QueryInterface(IFsrmReportManager* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmReportManager_AddRef(IFsrmReportManager* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmReportManager_Release(IFsrmReportManager* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmReportManager_GetTypeInfoCount(IFsrmReportManager* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmReportManager_GetTypeInfo(IFsrmReportManager* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE HRESULT IFsrmReportManager_GetIDsOfNames(IFsrmReportManager* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
+    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
+}
+static FORCEINLINE HRESULT IFsrmReportManager_Invoke(IFsrmReportManager* 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);
+}
+/*** IFsrmReportManager methods ***/
+static FORCEINLINE HRESULT IFsrmReportManager_EnumReportJobs(IFsrmReportManager* This,FsrmEnumOptions options,IFsrmCollection **reportJobs) {
+    return This->lpVtbl->EnumReportJobs(This,options,reportJobs);
+}
+static FORCEINLINE HRESULT IFsrmReportManager_CreateReportJob(IFsrmReportManager* This,IFsrmReportJob **reportJob) {
+    return This->lpVtbl->CreateReportJob(This,reportJob);
+}
+static FORCEINLINE HRESULT IFsrmReportManager_GetReportJob(IFsrmReportManager* This,BSTR taskName,IFsrmReportJob **reportJob) {
+    return This->lpVtbl->GetReportJob(This,taskName,reportJob);
+}
+static FORCEINLINE HRESULT IFsrmReportManager_GetOutputDirectory(IFsrmReportManager* This,FsrmReportGenerationContext context,BSTR *path) {
+    return This->lpVtbl->GetOutputDirectory(This,context,path);
+}
+static FORCEINLINE HRESULT IFsrmReportManager_SetOutputDirectory(IFsrmReportManager* This,FsrmReportGenerationContext context,BSTR path) {
+    return This->lpVtbl->SetOutputDirectory(This,context,path);
+}
+static FORCEINLINE HRESULT IFsrmReportManager_IsFilterValidForReportType(IFsrmReportManager* This,FsrmReportType reportType,FsrmReportFilter filter,VARIANT_BOOL *valid) {
+    return This->lpVtbl->IsFilterValidForReportType(This,reportType,filter,valid);
+}
+static FORCEINLINE HRESULT IFsrmReportManager_GetDefaultFilter(IFsrmReportManager* This,FsrmReportType reportType,FsrmReportFilter filter,VARIANT *filterValue) {
+    return This->lpVtbl->GetDefaultFilter(This,reportType,filter,filterValue);
+}
+static FORCEINLINE HRESULT IFsrmReportManager_SetDefaultFilter(IFsrmReportManager* This,FsrmReportType reportType,FsrmReportFilter filter,VARIANT filterValue) {
+    return This->lpVtbl->SetDefaultFilter(This,reportType,filter,filterValue);
+}
+static FORCEINLINE HRESULT IFsrmReportManager_GetReportSizeLimit(IFsrmReportManager* This,FsrmReportLimit limit,VARIANT *limitValue) {
+    return This->lpVtbl->GetReportSizeLimit(This,limit,limitValue);
+}
+static FORCEINLINE HRESULT IFsrmReportManager_SetReportSizeLimit(IFsrmReportManager* This,FsrmReportLimit limit,VARIANT limitValue) {
+    return This->lpVtbl->SetReportSizeLimit(This,limit,limitValue);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmReportManager_EnumReportJobs_Proxy(
+    IFsrmReportManager* This,
+    FsrmEnumOptions options,
+    IFsrmCollection **reportJobs);
+void __RPC_STUB IFsrmReportManager_EnumReportJobs_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmReportManager_CreateReportJob_Proxy(
+    IFsrmReportManager* This,
+    IFsrmReportJob **reportJob);
+void __RPC_STUB IFsrmReportManager_CreateReportJob_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmReportManager_GetReportJob_Proxy(
+    IFsrmReportManager* This,
+    BSTR taskName,
+    IFsrmReportJob **reportJob);
+void __RPC_STUB IFsrmReportManager_GetReportJob_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmReportManager_GetOutputDirectory_Proxy(
+    IFsrmReportManager* This,
+    FsrmReportGenerationContext context,
+    BSTR *path);
+void __RPC_STUB IFsrmReportManager_GetOutputDirectory_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmReportManager_SetOutputDirectory_Proxy(
+    IFsrmReportManager* This,
+    FsrmReportGenerationContext context,
+    BSTR path);
+void __RPC_STUB IFsrmReportManager_SetOutputDirectory_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmReportManager_IsFilterValidForReportType_Proxy(
+    IFsrmReportManager* This,
+    FsrmReportType reportType,
+    FsrmReportFilter filter,
+    VARIANT_BOOL *valid);
+void __RPC_STUB IFsrmReportManager_IsFilterValidForReportType_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmReportManager_GetDefaultFilter_Proxy(
+    IFsrmReportManager* This,
+    FsrmReportType reportType,
+    FsrmReportFilter filter,
+    VARIANT *filterValue);
+void __RPC_STUB IFsrmReportManager_GetDefaultFilter_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmReportManager_SetDefaultFilter_Proxy(
+    IFsrmReportManager* This,
+    FsrmReportType reportType,
+    FsrmReportFilter filter,
+    VARIANT filterValue);
+void __RPC_STUB IFsrmReportManager_SetDefaultFilter_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmReportManager_GetReportSizeLimit_Proxy(
+    IFsrmReportManager* This,
+    FsrmReportLimit limit,
+    VARIANT *limitValue);
+void __RPC_STUB IFsrmReportManager_GetReportSizeLimit_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmReportManager_SetReportSizeLimit_Proxy(
+    IFsrmReportManager* This,
+    FsrmReportLimit limit,
+    VARIANT limitValue);
+void __RPC_STUB IFsrmReportManager_SetReportSizeLimit_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IFsrmReportManager_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IFsrmReportJob interface
+ */
+#ifndef __IFsrmReportJob_INTERFACE_DEFINED__
+#define __IFsrmReportJob_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IFsrmReportJob, 0x38e87280, 0x715c, 0x4c7d, 0xa2,0x80, 0xea,0x16,0x51,0xa1,0x9f,0xef);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("38e87280-715c-4c7d-a280-ea1651a19fef")
+IFsrmReportJob : public IFsrmObject
+{
+    virtual HRESULT STDMETHODCALLTYPE get_Task(
+        BSTR *taskName) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_Task(
+        BSTR taskName) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_NamespaceRoots(
+        SAFEARRAY **namespaceRoots) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_NamespaceRoots(
+        SAFEARRAY *namespaceRoots) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_Formats(
+        SAFEARRAY **formats) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_Formats(
+        SAFEARRAY *formats) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_MailTo(
+        BSTR *mailTo) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_MailTo(
+        BSTR mailTo) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_RunningStatus(
+        FsrmReportRunningStatus *runningStatus) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_LastRun(
+        DATE *lastRun) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_LastError(
+        BSTR *lastError) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_LastGeneratedInDirectory(
+        BSTR *path) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EnumReports(
+        IFsrmCollection **reports) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateReport(
+        FsrmReportType reportType,
+        IFsrmReport **report) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Run(
+        FsrmReportGenerationContext context) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE WaitForCompletion(
+        LONG waitSeconds,
+        VARIANT_BOOL *completed) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Cancel(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IFsrmReportJob, 0x38e87280, 0x715c, 0x4c7d, 0xa2,0x80, 0xea,0x16,0x51,0xa1,0x9f,0xef)
+#endif
+#else
+typedef struct IFsrmReportJobVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFsrmReportJob* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFsrmReportJob* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFsrmReportJob* This);
+
+    /*** IDispatch methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
+        IFsrmReportJob* This,
+        UINT *pctinfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
+        IFsrmReportJob* This,
+        UINT iTInfo,
+        LCID lcid,
+        ITypeInfo **ppTInfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
+        IFsrmReportJob* This,
+        REFIID riid,
+        LPOLESTR *rgszNames,
+        UINT cNames,
+        LCID lcid,
+        DISPID *rgDispId);
+
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        IFsrmReportJob* This,
+        DISPID dispIdMember,
+        REFIID riid,
+        LCID lcid,
+        WORD wFlags,
+        DISPPARAMS *pDispParams,
+        VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo,
+        UINT *puArgErr);
+
+    /*** IFsrmObject methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Id)(
+        IFsrmReportJob* This,
+        FSRM_OBJECT_ID *id);
+
+    HRESULT (STDMETHODCALLTYPE *get_Description)(
+        IFsrmReportJob* This,
+        BSTR *description);
+
+    HRESULT (STDMETHODCALLTYPE *put_Description)(
+        IFsrmReportJob* This,
+        BSTR description);
+
+    HRESULT (STDMETHODCALLTYPE *Delete)(
+        IFsrmReportJob* This);
+
+    HRESULT (STDMETHODCALLTYPE *Commit)(
+        IFsrmReportJob* This);
+
+    /*** IFsrmReportJob methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Task)(
+        IFsrmReportJob* This,
+        BSTR *taskName);
+
+    HRESULT (STDMETHODCALLTYPE *put_Task)(
+        IFsrmReportJob* This,
+        BSTR taskName);
+
+    HRESULT (STDMETHODCALLTYPE *get_NamespaceRoots)(
+        IFsrmReportJob* This,
+        SAFEARRAY **namespaceRoots);
+
+    HRESULT (STDMETHODCALLTYPE *put_NamespaceRoots)(
+        IFsrmReportJob* This,
+        SAFEARRAY *namespaceRoots);
+
+    HRESULT (STDMETHODCALLTYPE *get_Formats)(
+        IFsrmReportJob* This,
+        SAFEARRAY **formats);
+
+    HRESULT (STDMETHODCALLTYPE *put_Formats)(
+        IFsrmReportJob* This,
+        SAFEARRAY *formats);
+
+    HRESULT (STDMETHODCALLTYPE *get_MailTo)(
+        IFsrmReportJob* This,
+        BSTR *mailTo);
+
+    HRESULT (STDMETHODCALLTYPE *put_MailTo)(
+        IFsrmReportJob* This,
+        BSTR mailTo);
+
+    HRESULT (STDMETHODCALLTYPE *get_RunningStatus)(
+        IFsrmReportJob* This,
+        FsrmReportRunningStatus *runningStatus);
+
+    HRESULT (STDMETHODCALLTYPE *get_LastRun)(
+        IFsrmReportJob* This,
+        DATE *lastRun);
+
+    HRESULT (STDMETHODCALLTYPE *get_LastError)(
+        IFsrmReportJob* This,
+        BSTR *lastError);
+
+    HRESULT (STDMETHODCALLTYPE *get_LastGeneratedInDirectory)(
+        IFsrmReportJob* This,
+        BSTR *path);
+
+    HRESULT (STDMETHODCALLTYPE *EnumReports)(
+        IFsrmReportJob* This,
+        IFsrmCollection **reports);
+
+    HRESULT (STDMETHODCALLTYPE *CreateReport)(
+        IFsrmReportJob* This,
+        FsrmReportType reportType,
+        IFsrmReport **report);
+
+    HRESULT (STDMETHODCALLTYPE *Run)(
+        IFsrmReportJob* This,
+        FsrmReportGenerationContext context);
+
+    HRESULT (STDMETHODCALLTYPE *WaitForCompletion)(
+        IFsrmReportJob* This,
+        LONG waitSeconds,
+        VARIANT_BOOL *completed);
+
+    HRESULT (STDMETHODCALLTYPE *Cancel)(
+        IFsrmReportJob* This);
+
+    END_INTERFACE
+} IFsrmReportJobVtbl;
+interface IFsrmReportJob {
+    CONST_VTBL IFsrmReportJobVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
 #define IFsrmReportJob_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
 #define IFsrmReportJob_AddRef(This) (This)->lpVtbl->AddRef(This)
 #define IFsrmReportJob_Release(This) (This)->lpVtbl->Release(This)
+/*** IDispatch methods ***/
 #define IFsrmReportJob_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
 #define IFsrmReportJob_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
 #define IFsrmReportJob_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
 #define IFsrmReportJob_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 IFsrmReportJob_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
 #define IFsrmReportJob_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
 #define IFsrmReportJob_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
-#define IFsrmReportJob_Delete() (This)->lpVtbl->Delete(This)
-#define IFsrmReportJob_Commit() (This)->lpVtbl->Commit(This)
+#define IFsrmReportJob_Delete(This) (This)->lpVtbl->Delete(This)
+#define IFsrmReportJob_Commit(This) (This)->lpVtbl->Commit(This)
+/*** IFsrmReportJob methods ***/
 #define IFsrmReportJob_get_Task(This,taskName) (This)->lpVtbl->get_Task(This,taskName)
 #define IFsrmReportJob_put_Task(This,taskName) (This)->lpVtbl->put_Task(This,taskName)
 #define IFsrmReportJob_get_NamespaceRoots(This,namespaceRoots) (This)->lpVtbl->get_NamespaceRoots(This,namespaceRoots)
@@ -408,141 +1656,1835 @@
 #define IFsrmReportJob_CreateReport(This,reportType,report) (This)->lpVtbl->CreateReport(This,reportType,report)
 #define IFsrmReportJob_Run(This,context) (This)->lpVtbl->Run(This,context)
 #define IFsrmReportJob_WaitForCompletion(This,waitSeconds,completed) (This)->lpVtbl->WaitForCompletion(This,waitSeconds,completed)
-#define IFsrmReportJob_Cancel() (This)->lpVtbl->Cancel(This)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmReportManager
-#ifdef __GNUC__
-#warning COM interfaces layout in this header has not been verified.
-#warning COM interfaces with incorrect layout may not work at all.
-__MINGW_BROKEN_INTERFACE(INTERFACE)
+#define IFsrmReportJob_Cancel(This) (This)->lpVtbl->Cancel(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IFsrmReportJob_QueryInterface(IFsrmReportJob* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmReportJob_AddRef(IFsrmReportJob* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmReportJob_Release(IFsrmReportJob* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmReportJob_GetTypeInfoCount(IFsrmReportJob* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmReportJob_GetTypeInfo(IFsrmReportJob* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE HRESULT IFsrmReportJob_GetIDsOfNames(IFsrmReportJob* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
+    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
+}
+static FORCEINLINE HRESULT IFsrmReportJob_Invoke(IFsrmReportJob* 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 FORCEINLINE HRESULT IFsrmReportJob_get_Id(IFsrmReportJob* This,FSRM_OBJECT_ID *id) {
+    return This->lpVtbl->get_Id(This,id);
+}
+static FORCEINLINE HRESULT IFsrmReportJob_get_Description(IFsrmReportJob* This,BSTR *description) {
+    return This->lpVtbl->get_Description(This,description);
+}
+static FORCEINLINE HRESULT IFsrmReportJob_put_Description(IFsrmReportJob* This,BSTR description) {
+    return This->lpVtbl->put_Description(This,description);
+}
+static FORCEINLINE HRESULT IFsrmReportJob_Delete(IFsrmReportJob* This) {
+    return This->lpVtbl->Delete(This);
+}
+static FORCEINLINE HRESULT IFsrmReportJob_Commit(IFsrmReportJob* This) {
+    return This->lpVtbl->Commit(This);
+}
+/*** IFsrmReportJob methods ***/
+static FORCEINLINE HRESULT IFsrmReportJob_get_Task(IFsrmReportJob* This,BSTR *taskName) {
+    return This->lpVtbl->get_Task(This,taskName);
+}
+static FORCEINLINE HRESULT IFsrmReportJob_put_Task(IFsrmReportJob* This,BSTR taskName) {
+    return This->lpVtbl->put_Task(This,taskName);
+}
+static FORCEINLINE HRESULT IFsrmReportJob_get_NamespaceRoots(IFsrmReportJob* This,SAFEARRAY **namespaceRoots) {
+    return This->lpVtbl->get_NamespaceRoots(This,namespaceRoots);
+}
+static FORCEINLINE HRESULT IFsrmReportJob_put_NamespaceRoots(IFsrmReportJob* This,SAFEARRAY *namespaceRoots) {
+    return This->lpVtbl->put_NamespaceRoots(This,namespaceRoots);
+}
+static FORCEINLINE HRESULT IFsrmReportJob_get_Formats(IFsrmReportJob* This,SAFEARRAY **formats) {
+    return This->lpVtbl->get_Formats(This,formats);
+}
+static FORCEINLINE HRESULT IFsrmReportJob_put_Formats(IFsrmReportJob* This,SAFEARRAY *formats) {
+    return This->lpVtbl->put_Formats(This,formats);
+}
+static FORCEINLINE HRESULT IFsrmReportJob_get_MailTo(IFsrmReportJob* This,BSTR *mailTo) {
+    return This->lpVtbl->get_MailTo(This,mailTo);
+}
+static FORCEINLINE HRESULT IFsrmReportJob_put_MailTo(IFsrmReportJob* This,BSTR mailTo) {
+    return This->lpVtbl->put_MailTo(This,mailTo);
+}
+static FORCEINLINE HRESULT IFsrmReportJob_get_RunningStatus(IFsrmReportJob* This,FsrmReportRunningStatus *runningStatus) {
+    return This->lpVtbl->get_RunningStatus(This,runningStatus);
+}
+static FORCEINLINE HRESULT IFsrmReportJob_get_LastRun(IFsrmReportJob* This,DATE *lastRun) {
+    return This->lpVtbl->get_LastRun(This,lastRun);
+}
+static FORCEINLINE HRESULT IFsrmReportJob_get_LastError(IFsrmReportJob* This,BSTR *lastError) {
+    return This->lpVtbl->get_LastError(This,lastError);
+}
+static FORCEINLINE HRESULT IFsrmReportJob_get_LastGeneratedInDirectory(IFsrmReportJob* This,BSTR *path) {
+    return This->lpVtbl->get_LastGeneratedInDirectory(This,path);
+}
+static FORCEINLINE HRESULT IFsrmReportJob_EnumReports(IFsrmReportJob* This,IFsrmCollection **reports) {
+    return This->lpVtbl->EnumReports(This,reports);
+}
+static FORCEINLINE HRESULT IFsrmReportJob_CreateReport(IFsrmReportJob* This,FsrmReportType reportType,IFsrmReport **report) {
+    return This->lpVtbl->CreateReport(This,reportType,report);
+}
+static FORCEINLINE HRESULT IFsrmReportJob_Run(IFsrmReportJob* This,FsrmReportGenerationContext context) {
+    return This->lpVtbl->Run(This,context);
+}
+static FORCEINLINE HRESULT IFsrmReportJob_WaitForCompletion(IFsrmReportJob* This,LONG waitSeconds,VARIANT_BOOL *completed) {
+    return This->lpVtbl->WaitForCompletion(This,waitSeconds,completed);
+}
+static FORCEINLINE HRESULT IFsrmReportJob_Cancel(IFsrmReportJob* This) {
+    return This->lpVtbl->Cancel(This);
+}
 #endif
-DECLARE_INTERFACE_(IFsrmReportManager,IDispatch)
-{
-    BEGIN_INTERFACE
-
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-
-    /* IDispatch methods */
-    STDMETHOD_(HRESULT,GetTypeInfoCount)(THIS_ unsigned int FAR*  pctinfo) PURE;
-    STDMETHOD_(HRESULT,GetTypeInfo)(THIS_ unsigned int  iTInfo,LCID  lcid,ITypeInfo FAR* FAR*  ppTInfo) PURE;
-    STDMETHOD_(HRESULT,GetIDsOfNames)(THIS_ REFIID  riid,OLECHAR FAR* FAR*  rgszNames,unsigned int  cNames,LCID   lcid,DISPID FAR*  rgDispId) PURE;
-    STDMETHOD_(HRESULT,Invoke)(THIS_ DISPID  dispIdMember,REFIID  riid,LCID  lcid,WORD  wFlags,DISPPARAMS FAR*  pDispParams,VARIANT FAR*  pVarResult,EXCEPINFO FAR*  pExcepInfo,unsigned int FAR*  puArgErr) PURE;
-
-    /* IFsrmReportManager methods */
-    STDMETHOD_(HRESULT,EnumReportJobs)(THIS_ FsrmEnumOptions options,IFsrmCollection **reportJobs) PURE;
-    STDMETHOD_(HRESULT,CreateReportJob)(THIS_ IFsrmReportJob **reportJob) PURE;
-    STDMETHOD_(HRESULT,GetReportJob)(THIS_ BSTR taskName,IFsrmReportJob **reportJob) PURE;
-    STDMETHOD_(HRESULT,GetOutputDirectory)(THIS_ FsrmReportGenerationContext context,BSTR *path) PURE;
-    STDMETHOD_(HRESULT,SetOutputDirectory)(THIS_ FsrmReportGenerationContext context,BSTR path) PURE;
-    STDMETHOD_(HRESULT,IsFilterValidForReportType)(THIS_ FsrmReportType reportType,FsrmReportFilter filter,VARIANT_BOOL *valid) PURE;
-    STDMETHOD_(HRESULT,GetDefaultFilter)(THIS_ FsrmReportType reportType,FsrmReportFilter filter,VARIANT *filterValue) PURE;
-    STDMETHOD_(HRESULT,SetDefaultFilter)(THIS_ FsrmReportType reportType,FsrmReportFilter filter,VARIANT filterValue) PURE;
-    STDMETHOD_(HRESULT,GetReportSizeLimit)(THIS_ FsrmReportLimit limit,VARIANT *limitValue) PURE;
-    STDMETHOD_(HRESULT,SetReportSizeLimit)(THIS_ FsrmReportLimit limit,VARIANT limitValue) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IFsrmReportManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IFsrmReportManager_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IFsrmReportManager_Release(This) (This)->lpVtbl->Release(This)
-#define IFsrmReportManager_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
-#define IFsrmReportManager_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
-#define IFsrmReportManager_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
-#define IFsrmReportManager_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
-#define IFsrmReportManager_EnumReportJobs(This,options,reportJobs) (This)->lpVtbl->EnumReportJobs(This,options,reportJobs)
-#define IFsrmReportManager_CreateReportJob(This,reportJob) (This)->lpVtbl->CreateReportJob(This,reportJob)
-#define IFsrmReportManager_GetReportJob(This,taskName,reportJob) (This)->lpVtbl->GetReportJob(This,taskName,reportJob)
-#define IFsrmReportManager_GetOutputDirectory(This,context,path) (This)->lpVtbl->GetOutputDirectory(This,context,path)
-#define IFsrmReportManager_SetOutputDirectory(This,context,path) (This)->lpVtbl->SetOutputDirectory(This,context,path)
-#define IFsrmReportManager_IsFilterValidForReportType(This,reportType,filter,valid) (This)->lpVtbl->IsFilterValidForReportType(This,reportType,filter,valid)
-#define IFsrmReportManager_GetDefaultFilter(This,reportType,filter,filterValue) (This)->lpVtbl->GetDefaultFilter(This,reportType,filter,filterValue)
-#define IFsrmReportManager_SetDefaultFilter(This,reportType,filter,filterValue) (This)->lpVtbl->SetDefaultFilter(This,reportType,filter,filterValue)
-#define IFsrmReportManager_GetReportSizeLimit(This,limit,limitValue) (This)->lpVtbl->GetReportSizeLimit(This,limit,limitValue)
-#define IFsrmReportManager_SetReportSizeLimit(This,limit,limitValue) (This)->lpVtbl->SetReportSizeLimit(This,limit,limitValue)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmReportScheduler
-#ifdef __GNUC__
-#warning COM interfaces layout in this header has not been verified.
-#warning COM interfaces with incorrect layout may not work at all.
-__MINGW_BROKEN_INTERFACE(INTERFACE)
 #endif
-DECLARE_INTERFACE_(IFsrmReportScheduler,IDispatch)
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmReportJob_get_Task_Proxy(
+    IFsrmReportJob* This,
+    BSTR *taskName);
+void __RPC_STUB IFsrmReportJob_get_Task_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmReportJob_put_Task_Proxy(
+    IFsrmReportJob* This,
+    BSTR taskName);
+void __RPC_STUB IFsrmReportJob_put_Task_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmReportJob_get_NamespaceRoots_Proxy(
+    IFsrmReportJob* This,
+    SAFEARRAY **namespaceRoots);
+void __RPC_STUB IFsrmReportJob_get_NamespaceRoots_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmReportJob_put_NamespaceRoots_Proxy(
+    IFsrmReportJob* This,
+    SAFEARRAY *namespaceRoots);
+void __RPC_STUB IFsrmReportJob_put_NamespaceRoots_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmReportJob_get_Formats_Proxy(
+    IFsrmReportJob* This,
+    SAFEARRAY **formats);
+void __RPC_STUB IFsrmReportJob_get_Formats_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmReportJob_put_Formats_Proxy(
+    IFsrmReportJob* This,
+    SAFEARRAY *formats);
+void __RPC_STUB IFsrmReportJob_put_Formats_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmReportJob_get_MailTo_Proxy(
+    IFsrmReportJob* This,
+    BSTR *mailTo);
+void __RPC_STUB IFsrmReportJob_get_MailTo_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmReportJob_put_MailTo_Proxy(
+    IFsrmReportJob* This,
+    BSTR mailTo);
+void __RPC_STUB IFsrmReportJob_put_MailTo_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmReportJob_get_RunningStatus_Proxy(
+    IFsrmReportJob* This,
+    FsrmReportRunningStatus *runningStatus);
+void __RPC_STUB IFsrmReportJob_get_RunningStatus_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmReportJob_get_LastRun_Proxy(
+    IFsrmReportJob* This,
+    DATE *lastRun);
+void __RPC_STUB IFsrmReportJob_get_LastRun_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmReportJob_get_LastError_Proxy(
+    IFsrmReportJob* This,
+    BSTR *lastError);
+void __RPC_STUB IFsrmReportJob_get_LastError_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmReportJob_get_LastGeneratedInDirectory_Proxy(
+    IFsrmReportJob* This,
+    BSTR *path);
+void __RPC_STUB IFsrmReportJob_get_LastGeneratedInDirectory_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmReportJob_EnumReports_Proxy(
+    IFsrmReportJob* This,
+    IFsrmCollection **reports);
+void __RPC_STUB IFsrmReportJob_EnumReports_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmReportJob_CreateReport_Proxy(
+    IFsrmReportJob* This,
+    FsrmReportType reportType,
+    IFsrmReport **report);
+void __RPC_STUB IFsrmReportJob_CreateReport_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmReportJob_Run_Proxy(
+    IFsrmReportJob* This,
+    FsrmReportGenerationContext context);
+void __RPC_STUB IFsrmReportJob_Run_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmReportJob_WaitForCompletion_Proxy(
+    IFsrmReportJob* This,
+    LONG waitSeconds,
+    VARIANT_BOOL *completed);
+void __RPC_STUB IFsrmReportJob_WaitForCompletion_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmReportJob_Cancel_Proxy(
+    IFsrmReportJob* This);
+void __RPC_STUB IFsrmReportJob_Cancel_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IFsrmReportJob_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IFsrmFileManagementJob interface
+ */
+#ifndef __IFsrmFileManagementJob_INTERFACE_DEFINED__
+#define __IFsrmFileManagementJob_INTERFACE_DEFINED__
+
+#define FsrmDaysNotSpecified (-1)
+
+#define FsrmDateNotSpecified ((DATE)-1)
+
+DEFINE_GUID(IID_IFsrmFileManagementJob, 0x0770687e, 0x9f36, 0x4d6f, 0x87,0x78, 0x59,0x9d,0x18,0x84,0x61,0xc9);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("0770687e-9f36-4d6f-8778-599d188461c9")
+IFsrmFileManagementJob : public IFsrmObject
 {
+    virtual HRESULT STDMETHODCALLTYPE get_Name(
+        BSTR *name) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_Name(
+        BSTR name) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_NamespaceRoots(
+        SAFEARRAY **namespaceRoots) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_NamespaceRoots(
+        SAFEARRAY *namespaceRoots) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_Enabled(
+        VARIANT_BOOL *enabled) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_Enabled(
+        VARIANT_BOOL enabled) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_OperationType(
+        FsrmFileManagementType *operationType) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_OperationType(
+        FsrmFileManagementType operationType) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_ExpirationDirectory(
+        BSTR *expirationDirectory) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_ExpirationDirectory(
+        BSTR expirationDirectory) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_CustomAction(
+        IFsrmActionCommand **action) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_Notifications(
+        SAFEARRAY **notifications) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_Logging(
+        LONG *loggingFlags) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_Logging(
+        LONG loggingFlags) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_ReportEnabled(
+        VARIANT_BOOL *reportEnabled) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_ReportEnabled(
+        VARIANT_BOOL reportEnabled) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_Formats(
+        SAFEARRAY **formats) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_Formats(
+        SAFEARRAY *formats) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_MailTo(
+        BSTR *mailTo) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_MailTo(
+        BSTR mailTo) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_DaysSinceFileCreated(
+        LONG *daysSinceCreation) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_DaysSinceFileCreated(
+        LONG daysSinceCreation) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_DaysSinceFileLastAccessed(
+        LONG *daysSinceAccess) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_DaysSinceFileLastAccessed(
+        LONG daysSinceAccess) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_DaysSinceFileLastModified(
+        LONG *daysSinceModify) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_DaysSinceFileLastModified(
+        LONG daysSinceModify) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_PropertyConditions(
+        IFsrmCollection **propertyConditions) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_FromDate(
+        DATE *fromDate) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_FromDate(
+        DATE fromDate) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_Task(
+        BSTR *taskName) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_Task(
+        BSTR taskName) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_Parameters(
+        SAFEARRAY **parameters) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_Parameters(
+        SAFEARRAY *parameters) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_RunningStatus(
+        FsrmReportRunningStatus *runningStatus) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_LastError(
+        BSTR *lastError) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_LastReportPathWithoutExtension(
+        BSTR *path) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_LastRun(
+        DATE *lastRun) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_FileNamePattern(
+        BSTR *fileNamePattern) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_FileNamePattern(
+        BSTR fileNamePattern) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Run(
+        FsrmReportGenerationContext context) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE WaitForCompletion(
+        LONG waitSeconds,
+        VARIANT_BOOL *completed) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Cancel(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AddNotification(
+        LONG days) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE DeleteNotification(
+        LONG days) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ModifyNotification(
+        LONG days,
+        LONG newDays) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateNotificationAction(
+        LONG days,
+        FsrmActionType actionType,
+        IFsrmAction **action) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EnumNotificationActions(
+        LONG days,
+        IFsrmCollection **actions) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreatePropertyCondition(
+        BSTR name,
+        IFsrmPropertyCondition **propertyCondition) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateCustomAction(
+        IFsrmActionCommand **customAction) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IFsrmFileManagementJob, 0x0770687e, 0x9f36, 0x4d6f, 0x87,0x78, 0x59,0x9d,0x18,0x84,0x61,0xc9)
+#endif
+#else
+typedef struct IFsrmFileManagementJobVtbl {
     BEGIN_INTERFACE
 
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFsrmFileManagementJob* This,
+        REFIID riid,
+        void **ppvObject);
 
-    /* IDispatch methods */
-    STDMETHOD_(HRESULT,GetTypeInfoCount)(THIS_ unsigned int FAR*  pctinfo) PURE;
-    STDMETHOD_(HRESULT,GetTypeInfo)(THIS_ unsigned int  iTInfo,LCID  lcid,ITypeInfo FAR* FAR*  ppTInfo) PURE;
-    STDMETHOD_(HRESULT,GetIDsOfNames)(THIS_ REFIID  riid,OLECHAR FAR* FAR*  rgszNames,unsigned int  cNames,LCID   lcid,DISPID FAR*  rgDispId) PURE;
-    STDMETHOD_(HRESULT,Invoke)(THIS_ DISPID  dispIdMember,REFIID  riid,LCID  lcid,WORD  wFlags,DISPPARAMS FAR*  pDispParams,VARIANT FAR*  pVarResult,EXCEPINFO FAR*  pExcepInfo,unsigned int FAR*  puArgErr) PURE;
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFsrmFileManagementJob* This);
 
-    /* IFsrmReportScheduler methods */
-    STDMETHOD_(HRESULT,VerifyNamespaces)(THIS_ VARIANT *namespacesSafeArray) PURE;
-    STDMETHOD_(HRESULT,CreateScheduleTask)(THIS_ BSTR taskName,VARIANT *namespacesSafeArray,BSTR serializedTask) PURE;
-    STDMETHOD_(HRESULT,ModifyScheduleTask)(THIS_ BSTR taskName,VARIANT *namespacesSafeArray,BSTR serializedTask) PURE;
-    STDMETHOD_(HRESULT,DeleteScheduleTask)(THIS_ BSTR taskName) PURE;
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFsrmFileManagementJob* This);
+
+    /*** IDispatch methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
+        IFsrmFileManagementJob* This,
+        UINT *pctinfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
+        IFsrmFileManagementJob* This,
+        UINT iTInfo,
+        LCID lcid,
+        ITypeInfo **ppTInfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
+        IFsrmFileManagementJob* This,
+        REFIID riid,
+        LPOLESTR *rgszNames,
+        UINT cNames,
+        LCID lcid,
+        DISPID *rgDispId);
+
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        IFsrmFileManagementJob* This,
+        DISPID dispIdMember,
+        REFIID riid,
+        LCID lcid,
+        WORD wFlags,
+        DISPPARAMS *pDispParams,
+        VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo,
+        UINT *puArgErr);
+
+    /*** IFsrmObject methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Id)(
+        IFsrmFileManagementJob* This,
+        FSRM_OBJECT_ID *id);
+
+    HRESULT (STDMETHODCALLTYPE *get_Description)(
+        IFsrmFileManagementJob* This,
+        BSTR *description);
+
+    HRESULT (STDMETHODCALLTYPE *put_Description)(
+        IFsrmFileManagementJob* This,
+        BSTR description);
+
+    HRESULT (STDMETHODCALLTYPE *Delete)(
+        IFsrmFileManagementJob* This);
+
+    HRESULT (STDMETHODCALLTYPE *Commit)(
+        IFsrmFileManagementJob* This);
+
+    /*** IFsrmFileManagementJob methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Name)(
+        IFsrmFileManagementJob* This,
+        BSTR *name);
+
+    HRESULT (STDMETHODCALLTYPE *put_Name)(
+        IFsrmFileManagementJob* This,
+        BSTR name);
+
+    HRESULT (STDMETHODCALLTYPE *get_NamespaceRoots)(
+        IFsrmFileManagementJob* This,
+        SAFEARRAY **namespaceRoots);
+
+    HRESULT (STDMETHODCALLTYPE *put_NamespaceRoots)(
+        IFsrmFileManagementJob* This,
+        SAFEARRAY *namespaceRoots);
+
+    HRESULT (STDMETHODCALLTYPE *get_Enabled)(
+        IFsrmFileManagementJob* This,
+        VARIANT_BOOL *enabled);
+
+    HRESULT (STDMETHODCALLTYPE *put_Enabled)(
+        IFsrmFileManagementJob* This,
+        VARIANT_BOOL enabled);
+
+    HRESULT (STDMETHODCALLTYPE *get_OperationType)(
+        IFsrmFileManagementJob* This,
+        FsrmFileManagementType *operationType);
+
+    HRESULT (STDMETHODCALLTYPE *put_OperationType)(
+        IFsrmFileManagementJob* This,
+        FsrmFileManagementType operationType);
+
+    HRESULT (STDMETHODCALLTYPE *get_ExpirationDirectory)(
+        IFsrmFileManagementJob* This,
+        BSTR *expirationDirectory);
+
+    HRESULT (STDMETHODCALLTYPE *put_ExpirationDirectory)(
+        IFsrmFileManagementJob* This,
+        BSTR expirationDirectory);
+
+    HRESULT (STDMETHODCALLTYPE *get_CustomAction)(
+        IFsrmFileManagementJob* This,
+        IFsrmActionCommand **action);
+
+    HRESULT (STDMETHODCALLTYPE *get_Notifications)(
+        IFsrmFileManagementJob* This,
+        SAFEARRAY **notifications);
+
+    HRESULT (STDMETHODCALLTYPE *get_Logging)(
+        IFsrmFileManagementJob* This,
+        LONG *loggingFlags);
+
+    HRESULT (STDMETHODCALLTYPE *put_Logging)(
+        IFsrmFileManagementJob* This,
+        LONG loggingFlags);
+
+    HRESULT (STDMETHODCALLTYPE *get_ReportEnabled)(
+        IFsrmFileManagementJob* This,
+        VARIANT_BOOL *reportEnabled);
+
+    HRESULT (STDMETHODCALLTYPE *put_ReportEnabled)(
+        IFsrmFileManagementJob* This,
+        VARIANT_BOOL reportEnabled);
+
+    HRESULT (STDMETHODCALLTYPE *get_Formats)(
+        IFsrmFileManagementJob* This,
+        SAFEARRAY **formats);
+
+    HRESULT (STDMETHODCALLTYPE *put_Formats)(
+        IFsrmFileManagementJob* This,
+        SAFEARRAY *formats);
+
+    HRESULT (STDMETHODCALLTYPE *get_MailTo)(
+        IFsrmFileManagementJob* This,
+        BSTR *mailTo);
+
+    HRESULT (STDMETHODCALLTYPE *put_MailTo)(
+        IFsrmFileManagementJob* This,
+        BSTR mailTo);
+
+    HRESULT (STDMETHODCALLTYPE *get_DaysSinceFileCreated)(
+        IFsrmFileManagementJob* This,
+        LONG *daysSinceCreation);
+
+    HRESULT (STDMETHODCALLTYPE *put_DaysSinceFileCreated)(
+        IFsrmFileManagementJob* This,
+        LONG daysSinceCreation);
+
+    HRESULT (STDMETHODCALLTYPE *get_DaysSinceFileLastAccessed)(
+        IFsrmFileManagementJob* This,
+        LONG *daysSinceAccess);
+
+    HRESULT (STDMETHODCALLTYPE *put_DaysSinceFileLastAccessed)(
+        IFsrmFileManagementJob* This,
+        LONG daysSinceAccess);
+
+    HRESULT (STDMETHODCALLTYPE *get_DaysSinceFileLastModified)(
+        IFsrmFileManagementJob* This,
+        LONG *daysSinceModify);
+
+    HRESULT (STDMETHODCALLTYPE *put_DaysSinceFileLastModified)(
+        IFsrmFileManagementJob* This,
+        LONG daysSinceModify);
+
+    HRESULT (STDMETHODCALLTYPE *get_PropertyConditions)(
+        IFsrmFileManagementJob* This,
+        IFsrmCollection **propertyConditions);
+
+    HRESULT (STDMETHODCALLTYPE *get_FromDate)(
+        IFsrmFileManagementJob* This,
+        DATE *fromDate);
+
+    HRESULT (STDMETHODCALLTYPE *put_FromDate)(
+        IFsrmFileManagementJob* This,
+        DATE fromDate);
+
+    HRESULT (STDMETHODCALLTYPE *get_Task)(
+        IFsrmFileManagementJob* This,
+        BSTR *taskName);
+
+    HRESULT (STDMETHODCALLTYPE *put_Task)(
+        IFsrmFileManagementJob* This,
+        BSTR taskName);
+
+    HRESULT (STDMETHODCALLTYPE *get_Parameters)(
+        IFsrmFileManagementJob* This,
+        SAFEARRAY **parameters);
+
+    HRESULT (STDMETHODCALLTYPE *put_Parameters)(
+        IFsrmFileManagementJob* This,
+        SAFEARRAY *parameters);
+
+    HRESULT (STDMETHODCALLTYPE *get_RunningStatus)(
+        IFsrmFileManagementJob* This,
+        FsrmReportRunningStatus *runningStatus);
+
+    HRESULT (STDMETHODCALLTYPE *get_LastError)(
+        IFsrmFileManagementJob* This,
+        BSTR *lastError);
+
+    HRESULT (STDMETHODCALLTYPE *get_LastReportPathWithoutExtension)(
+        IFsrmFileManagementJob* This,
+        BSTR *path);
+
+    HRESULT (STDMETHODCALLTYPE *get_LastRun)(
+        IFsrmFileManagementJob* This,
+        DATE *lastRun);
+
+    HRESULT (STDMETHODCALLTYPE *get_FileNamePattern)(
+        IFsrmFileManagementJob* This,
+        BSTR *fileNamePattern);
+
+    HRESULT (STDMETHODCALLTYPE *put_FileNamePattern)(
+        IFsrmFileManagementJob* This,
+        BSTR fileNamePattern);
+
+    HRESULT (STDMETHODCALLTYPE *Run)(
+        IFsrmFileManagementJob* This,
+        FsrmReportGenerationContext context);
+
+    HRESULT (STDMETHODCALLTYPE *WaitForCompletion)(
+        IFsrmFileManagementJob* This,
+        LONG waitSeconds,
+        VARIANT_BOOL *completed);
+
+    HRESULT (STDMETHODCALLTYPE *Cancel)(
+        IFsrmFileManagementJob* This);
+
+    HRESULT (STDMETHODCALLTYPE *AddNotification)(
+        IFsrmFileManagementJob* This,
+        LONG days);
+
+    HRESULT (STDMETHODCALLTYPE *DeleteNotification)(
+        IFsrmFileManagementJob* This,
+        LONG days);
+
+    HRESULT (STDMETHODCALLTYPE *ModifyNotification)(
+        IFsrmFileManagementJob* This,
+        LONG days,
+        LONG newDays);
+
+    HRESULT (STDMETHODCALLTYPE *CreateNotificationAction)(
+        IFsrmFileManagementJob* This,
+        LONG days,
+        FsrmActionType actionType,
+        IFsrmAction **action);
+
+    HRESULT (STDMETHODCALLTYPE *EnumNotificationActions)(
+        IFsrmFileManagementJob* This,
+        LONG days,
+        IFsrmCollection **actions);
+
+    HRESULT (STDMETHODCALLTYPE *CreatePropertyCondition)(
+        IFsrmFileManagementJob* This,
+        BSTR name,
+        IFsrmPropertyCondition **propertyCondition);
+
+    HRESULT (STDMETHODCALLTYPE *CreateCustomAction)(
+        IFsrmFileManagementJob* This,
+        IFsrmActionCommand **customAction);
 
     END_INTERFACE
+} IFsrmFileManagementJobVtbl;
+interface IFsrmFileManagementJob {
+    CONST_VTBL IFsrmFileManagementJobVtbl* lpVtbl;
 };
+
 #ifdef COBJMACROS
-#define IFsrmReportScheduler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IFsrmReportScheduler_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IFsrmReportScheduler_Release(This) (This)->lpVtbl->Release(This)
-#define IFsrmReportScheduler_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
-#define IFsrmReportScheduler_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
-#define IFsrmReportScheduler_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
-#define IFsrmReportScheduler_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
-#define IFsrmReportScheduler_VerifyNamespaces(This,namespacesSafeArray) (This)->lpVtbl->VerifyNamespaces(This,namespacesSafeArray)
-#define IFsrmReportScheduler_CreateScheduleTask(This,taskName,namespacesSafeArray,serializedTask) (This)->lpVtbl->CreateScheduleTask(This,taskName,namespacesSafeArray,serializedTask)
-#define IFsrmReportScheduler_ModifyScheduleTask(This,taskName,namespacesSafeArray,serializedTask) (This)->lpVtbl->ModifyScheduleTask(This,taskName,namespacesSafeArray,serializedTask)
-#define IFsrmReportScheduler_DeleteScheduleTask(This,taskName) (This)->lpVtbl->DeleteScheduleTask(This,taskName)
-#endif /*COBJMACROS*/
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IFsrmFileManagementJob_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IFsrmFileManagementJob_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IFsrmFileManagementJob_Release(This) (This)->lpVtbl->Release(This)
+/*** IDispatch methods ***/
+#define IFsrmFileManagementJob_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
+#define IFsrmFileManagementJob_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
+#define IFsrmFileManagementJob_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
+#define IFsrmFileManagementJob_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 IFsrmFileManagementJob_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
+#define IFsrmFileManagementJob_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
+#define IFsrmFileManagementJob_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
+#define IFsrmFileManagementJob_Delete(This) (This)->lpVtbl->Delete(This)
+#define IFsrmFileManagementJob_Commit(This) (This)->lpVtbl->Commit(This)
+/*** IFsrmFileManagementJob methods ***/
+#define IFsrmFileManagementJob_get_Name(This,name) (This)->lpVtbl->get_Name(This,name)
+#define IFsrmFileManagementJob_put_Name(This,name) (This)->lpVtbl->put_Name(This,name)
+#define IFsrmFileManagementJob_get_NamespaceRoots(This,namespaceRoots) (This)->lpVtbl->get_NamespaceRoots(This,namespaceRoots)
+#define IFsrmFileManagementJob_put_NamespaceRoots(This,namespaceRoots) (This)->lpVtbl->put_NamespaceRoots(This,namespaceRoots)
+#define IFsrmFileManagementJob_get_Enabled(This,enabled) (This)->lpVtbl->get_Enabled(This,enabled)
+#define IFsrmFileManagementJob_put_Enabled(This,enabled) (This)->lpVtbl->put_Enabled(This,enabled)
+#define IFsrmFileManagementJob_get_OperationType(This,operationType) (This)->lpVtbl->get_OperationType(This,operationType)
+#define IFsrmFileManagementJob_put_OperationType(This,operationType) (This)->lpVtbl->put_OperationType(This,operationType)
+#define IFsrmFileManagementJob_get_ExpirationDirectory(This,expirationDirectory) (This)->lpVtbl->get_ExpirationDirectory(This,expirationDirectory)
+#define IFsrmFileManagementJob_put_ExpirationDirectory(This,expirationDirectory) (This)->lpVtbl->put_ExpirationDirectory(This,expirationDirectory)
+#define IFsrmFileManagementJob_get_CustomAction(This,action) (This)->lpVtbl->get_CustomAction(This,action)
+#define IFsrmFileManagementJob_get_Notifications(This,notifications) (This)->lpVtbl->get_Notifications(This,notifications)
+#define IFsrmFileManagementJob_get_Logging(This,loggingFlags) (This)->lpVtbl->get_Logging(This,loggingFlags)
+#define IFsrmFileManagementJob_put_Logging(This,loggingFlags) (This)->lpVtbl->put_Logging(This,loggingFlags)
+#define IFsrmFileManagementJob_get_ReportEnabled(This,reportEnabled) (This)->lpVtbl->get_ReportEnabled(This,reportEnabled)
+#define IFsrmFileManagementJob_put_ReportEnabled(This,reportEnabled) (This)->lpVtbl->put_ReportEnabled(This,reportEnabled)
+#define IFsrmFileManagementJob_get_Formats(This,formats) (This)->lpVtbl->get_Formats(This,formats)
+#define IFsrmFileManagementJob_put_Formats(This,formats) (This)->lpVtbl->put_Formats(This,formats)
+#define IFsrmFileManagementJob_get_MailTo(This,mailTo) (This)->lpVtbl->get_MailTo(This,mailTo)
+#define IFsrmFileManagementJob_put_MailTo(This,mailTo) (This)->lpVtbl->put_MailTo(This,mailTo)
+#define IFsrmFileManagementJob_get_DaysSinceFileCreated(This,daysSinceCreation) (This)->lpVtbl->get_DaysSinceFileCreated(This,daysSinceCreation)
+#define IFsrmFileManagementJob_put_DaysSinceFileCreated(This,daysSinceCreation) (This)->lpVtbl->put_DaysSinceFileCreated(This,daysSinceCreation)
+#define IFsrmFileManagementJob_get_DaysSinceFileLastAccessed(This,daysSinceAccess) (This)->lpVtbl->get_DaysSinceFileLastAccessed(This,daysSinceAccess)
+#define IFsrmFileManagementJob_put_DaysSinceFileLastAccessed(This,daysSinceAccess) (This)->lpVtbl->put_DaysSinceFileLastAccessed(This,daysSinceAccess)
+#define IFsrmFileManagementJob_get_DaysSinceFileLastModified(This,daysSinceModify) (This)->lpVtbl->get_DaysSinceFileLastModified(This,daysSinceModify)
+#define IFsrmFileManagementJob_put_DaysSinceFileLastModified(This,daysSinceModify) (This)->lpVtbl->put_DaysSinceFileLastModified(This,daysSinceModify)
+#define IFsrmFileManagementJob_get_PropertyConditions(This,propertyConditions) (This)->lpVtbl->get_PropertyConditions(This,propertyConditions)
+#define IFsrmFileManagementJob_get_FromDate(This,fromDate) (This)->lpVtbl->get_FromDate(This,fromDate)
+#define IFsrmFileManagementJob_put_FromDate(This,fromDate) (This)->lpVtbl->put_FromDate(This,fromDate)
+#define IFsrmFileManagementJob_get_Task(This,taskName) (This)->lpVtbl->get_Task(This,taskName)
+#define IFsrmFileManagementJob_put_Task(This,taskName) (This)->lpVtbl->put_Task(This,taskName)
+#define IFsrmFileManagementJob_get_Parameters(This,parameters) (This)->lpVtbl->get_Parameters(This,parameters)
+#define IFsrmFileManagementJob_put_Parameters(This,parameters) (This)->lpVtbl->put_Parameters(This,parameters)
+#define IFsrmFileManagementJob_get_RunningStatus(This,runningStatus) (This)->lpVtbl->get_RunningStatus(This,runningStatus)
+#define IFsrmFileManagementJob_get_LastError(This,lastError) (This)->lpVtbl->get_LastError(This,lastError)
+#define IFsrmFileManagementJob_get_LastReportPathWithoutExtension(This,path) (This)->lpVtbl->get_LastReportPathWithoutExtension(This,path)
+#define IFsrmFileManagementJob_get_LastRun(This,lastRun) (This)->lpVtbl->get_LastRun(This,lastRun)
+#define IFsrmFileManagementJob_get_FileNamePattern(This,fileNamePattern) (This)->lpVtbl->get_FileNamePattern(This,fileNamePattern)
+#define IFsrmFileManagementJob_put_FileNamePattern(This,fileNamePattern) (This)->lpVtbl->put_FileNamePattern(This,fileNamePattern)
+#define IFsrmFileManagementJob_Run(This,context) (This)->lpVtbl->Run(This,context)
+#define IFsrmFileManagementJob_WaitForCompletion(This,waitSeconds,completed) (This)->lpVtbl->WaitForCompletion(This,waitSeconds,completed)
+#define IFsrmFileManagementJob_Cancel(This) (This)->lpVtbl->Cancel(This)
+#define IFsrmFileManagementJob_AddNotification(This,days) (This)->lpVtbl->AddNotification(This,days)
+#define IFsrmFileManagementJob_DeleteNotification(This,days) (This)->lpVtbl->DeleteNotification(This,days)
+#define IFsrmFileManagementJob_ModifyNotification(This,days,newDays) (This)->lpVtbl->ModifyNotification(This,days,newDays)
+#define IFsrmFileManagementJob_CreateNotificationAction(This,days,actionType,action) (This)->lpVtbl->CreateNotificationAction(This,days,actionType,action)
+#define IFsrmFileManagementJob_EnumNotificationActions(This,days,actions) (This)->lpVtbl->EnumNotificationActions(This,days,actions)
+#define IFsrmFileManagementJob_CreatePropertyCondition(This,name,propertyCondition) (This)->lpVtbl->CreatePropertyCondition(This,name,propertyCondition)
+#define IFsrmFileManagementJob_CreateCustomAction(This,customAction) (This)->lpVtbl->CreateCustomAction(This,customAction)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IFsrmFileManagementJob_QueryInterface(IFsrmFileManagementJob* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmFileManagementJob_AddRef(IFsrmFileManagementJob* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmFileManagementJob_Release(IFsrmFileManagementJob* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmFileManagementJob_GetTypeInfoCount(IFsrmFileManagementJob* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_GetTypeInfo(IFsrmFileManagementJob* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_GetIDsOfNames(IFsrmFileManagementJob* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
+    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_Invoke(IFsrmFileManagementJob* 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 FORCEINLINE HRESULT IFsrmFileManagementJob_get_Id(IFsrmFileManagementJob* This,FSRM_OBJECT_ID *id) {
+    return This->lpVtbl->get_Id(This,id);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_get_Description(IFsrmFileManagementJob* This,BSTR *description) {
+    return This->lpVtbl->get_Description(This,description);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_put_Description(IFsrmFileManagementJob* This,BSTR description) {
+    return This->lpVtbl->put_Description(This,description);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_Delete(IFsrmFileManagementJob* This) {
+    return This->lpVtbl->Delete(This);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_Commit(IFsrmFileManagementJob* This) {
+    return This->lpVtbl->Commit(This);
+}
+/*** IFsrmFileManagementJob methods ***/
+static FORCEINLINE HRESULT IFsrmFileManagementJob_get_Name(IFsrmFileManagementJob* This,BSTR *name) {
+    return This->lpVtbl->get_Name(This,name);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_put_Name(IFsrmFileManagementJob* This,BSTR name) {
+    return This->lpVtbl->put_Name(This,name);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_get_NamespaceRoots(IFsrmFileManagementJob* This,SAFEARRAY **namespaceRoots) {
+    return This->lpVtbl->get_NamespaceRoots(This,namespaceRoots);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_put_NamespaceRoots(IFsrmFileManagementJob* This,SAFEARRAY *namespaceRoots) {
+    return This->lpVtbl->put_NamespaceRoots(This,namespaceRoots);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_get_Enabled(IFsrmFileManagementJob* This,VARIANT_BOOL *enabled) {
+    return This->lpVtbl->get_Enabled(This,enabled);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_put_Enabled(IFsrmFileManagementJob* This,VARIANT_BOOL enabled) {
+    return This->lpVtbl->put_Enabled(This,enabled);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_get_OperationType(IFsrmFileManagementJob* This,FsrmFileManagementType *operationType) {
+    return This->lpVtbl->get_OperationType(This,operationType);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_put_OperationType(IFsrmFileManagementJob* This,FsrmFileManagementType operationType) {
+    return This->lpVtbl->put_OperationType(This,operationType);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_get_ExpirationDirectory(IFsrmFileManagementJob* This,BSTR *expirationDirectory) {
+    return This->lpVtbl->get_ExpirationDirectory(This,expirationDirectory);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_put_ExpirationDirectory(IFsrmFileManagementJob* This,BSTR expirationDirectory) {
+    return This->lpVtbl->put_ExpirationDirectory(This,expirationDirectory);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_get_CustomAction(IFsrmFileManagementJob* This,IFsrmActionCommand **action) {
+    return This->lpVtbl->get_CustomAction(This,action);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_get_Notifications(IFsrmFileManagementJob* This,SAFEARRAY **notifications) {
+    return This->lpVtbl->get_Notifications(This,notifications);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_get_Logging(IFsrmFileManagementJob* This,LONG *loggingFlags) {
+    return This->lpVtbl->get_Logging(This,loggingFlags);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_put_Logging(IFsrmFileManagementJob* This,LONG loggingFlags) {
+    return This->lpVtbl->put_Logging(This,loggingFlags);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_get_ReportEnabled(IFsrmFileManagementJob* This,VARIANT_BOOL *reportEnabled) {
+    return This->lpVtbl->get_ReportEnabled(This,reportEnabled);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_put_ReportEnabled(IFsrmFileManagementJob* This,VARIANT_BOOL reportEnabled) {
+    return This->lpVtbl->put_ReportEnabled(This,reportEnabled);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_get_Formats(IFsrmFileManagementJob* This,SAFEARRAY **formats) {
+    return This->lpVtbl->get_Formats(This,formats);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_put_Formats(IFsrmFileManagementJob* This,SAFEARRAY *formats) {
+    return This->lpVtbl->put_Formats(This,formats);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_get_MailTo(IFsrmFileManagementJob* This,BSTR *mailTo) {
+    return This->lpVtbl->get_MailTo(This,mailTo);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_put_MailTo(IFsrmFileManagementJob* This,BSTR mailTo) {
+    return This->lpVtbl->put_MailTo(This,mailTo);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_get_DaysSinceFileCreated(IFsrmFileManagementJob* This,LONG *daysSinceCreation) {
+    return This->lpVtbl->get_DaysSinceFileCreated(This,daysSinceCreation);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_put_DaysSinceFileCreated(IFsrmFileManagementJob* This,LONG daysSinceCreation) {
+    return This->lpVtbl->put_DaysSinceFileCreated(This,daysSinceCreation);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_get_DaysSinceFileLastAccessed(IFsrmFileManagementJob* This,LONG *daysSinceAccess) {
+    return This->lpVtbl->get_DaysSinceFileLastAccessed(This,daysSinceAccess);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_put_DaysSinceFileLastAccessed(IFsrmFileManagementJob* This,LONG daysSinceAccess) {
+    return This->lpVtbl->put_DaysSinceFileLastAccessed(This,daysSinceAccess);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_get_DaysSinceFileLastModified(IFsrmFileManagementJob* This,LONG *daysSinceModify) {
+    return This->lpVtbl->get_DaysSinceFileLastModified(This,daysSinceModify);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_put_DaysSinceFileLastModified(IFsrmFileManagementJob* This,LONG daysSinceModify) {
+    return This->lpVtbl->put_DaysSinceFileLastModified(This,daysSinceModify);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_get_PropertyConditions(IFsrmFileManagementJob* This,IFsrmCollection **propertyConditions) {
+    return This->lpVtbl->get_PropertyConditions(This,propertyConditions);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_get_FromDate(IFsrmFileManagementJob* This,DATE *fromDate) {
+    return This->lpVtbl->get_FromDate(This,fromDate);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_put_FromDate(IFsrmFileManagementJob* This,DATE fromDate) {
+    return This->lpVtbl->put_FromDate(This,fromDate);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_get_Task(IFsrmFileManagementJob* This,BSTR *taskName) {
+    return This->lpVtbl->get_Task(This,taskName);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_put_Task(IFsrmFileManagementJob* This,BSTR taskName) {
+    return This->lpVtbl->put_Task(This,taskName);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_get_Parameters(IFsrmFileManagementJob* This,SAFEARRAY **parameters) {
+    return This->lpVtbl->get_Parameters(This,parameters);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_put_Parameters(IFsrmFileManagementJob* This,SAFEARRAY *parameters) {
+    return This->lpVtbl->put_Parameters(This,parameters);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_get_RunningStatus(IFsrmFileManagementJob* This,FsrmReportRunningStatus *runningStatus) {
+    return This->lpVtbl->get_RunningStatus(This,runningStatus);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_get_LastError(IFsrmFileManagementJob* This,BSTR *lastError) {
+    return This->lpVtbl->get_LastError(This,lastError);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_get_LastReportPathWithoutExtension(IFsrmFileManagementJob* This,BSTR *path) {
+    return This->lpVtbl->get_LastReportPathWithoutExtension(This,path);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_get_LastRun(IFsrmFileManagementJob* This,DATE *lastRun) {
+    return This->lpVtbl->get_LastRun(This,lastRun);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_get_FileNamePattern(IFsrmFileManagementJob* This,BSTR *fileNamePattern) {
+    return This->lpVtbl->get_FileNamePattern(This,fileNamePattern);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_put_FileNamePattern(IFsrmFileManagementJob* This,BSTR fileNamePattern) {
+    return This->lpVtbl->put_FileNamePattern(This,fileNamePattern);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_Run(IFsrmFileManagementJob* This,FsrmReportGenerationContext context) {
+    return This->lpVtbl->Run(This,context);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_WaitForCompletion(IFsrmFileManagementJob* This,LONG waitSeconds,VARIANT_BOOL *completed) {
+    return This->lpVtbl->WaitForCompletion(This,waitSeconds,completed);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_Cancel(IFsrmFileManagementJob* This) {
+    return This->lpVtbl->Cancel(This);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_AddNotification(IFsrmFileManagementJob* This,LONG days) {
+    return This->lpVtbl->AddNotification(This,days);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_DeleteNotification(IFsrmFileManagementJob* This,LONG days) {
+    return This->lpVtbl->DeleteNotification(This,days);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_ModifyNotification(IFsrmFileManagementJob* This,LONG days,LONG newDays) {
+    return This->lpVtbl->ModifyNotification(This,days,newDays);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_CreateNotificationAction(IFsrmFileManagementJob* This,LONG days,FsrmActionType actionType,IFsrmAction **action) {
+    return This->lpVtbl->CreateNotificationAction(This,days,actionType,action);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_EnumNotificationActions(IFsrmFileManagementJob* This,LONG days,IFsrmCollection **actions) {
+    return This->lpVtbl->EnumNotificationActions(This,days,actions);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_CreatePropertyCondition(IFsrmFileManagementJob* This,BSTR name,IFsrmPropertyCondition **propertyCondition) {
+    return This->lpVtbl->CreatePropertyCondition(This,name,propertyCondition);
+}
+static FORCEINLINE HRESULT IFsrmFileManagementJob_CreateCustomAction(IFsrmFileManagementJob* This,IFsrmActionCommand **customAction) {
+    return This->lpVtbl->CreateCustomAction(This,customAction);
+}
+#endif
+#endif
 
-#endif /* (_WIN32_WINNT >= 0x0600) */
-#if (_WIN32_WINNT >= 0x0601)
+#endif
 
-#undef  INTERFACE
-#define INTERFACE IFsrmFileManagementJobManager
-DECLARE_INTERFACE_(IFsrmFileManagementJobManager,IDispatch)
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_Name_Proxy(
+    IFsrmFileManagementJob* This,
+    BSTR *name);
+void __RPC_STUB IFsrmFileManagementJob_get_Name_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_put_Name_Proxy(
+    IFsrmFileManagementJob* This,
+    BSTR name);
+void __RPC_STUB IFsrmFileManagementJob_put_Name_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_NamespaceRoots_Proxy(
+    IFsrmFileManagementJob* This,
+    SAFEARRAY **namespaceRoots);
+void __RPC_STUB IFsrmFileManagementJob_get_NamespaceRoots_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_put_NamespaceRoots_Proxy(
+    IFsrmFileManagementJob* This,
+    SAFEARRAY *namespaceRoots);
+void __RPC_STUB IFsrmFileManagementJob_put_NamespaceRoots_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_Enabled_Proxy(
+    IFsrmFileManagementJob* This,
+    VARIANT_BOOL *enabled);
+void __RPC_STUB IFsrmFileManagementJob_get_Enabled_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_put_Enabled_Proxy(
+    IFsrmFileManagementJob* This,
+    VARIANT_BOOL enabled);
+void __RPC_STUB IFsrmFileManagementJob_put_Enabled_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_OperationType_Proxy(
+    IFsrmFileManagementJob* This,
+    FsrmFileManagementType *operationType);
+void __RPC_STUB IFsrmFileManagementJob_get_OperationType_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_put_OperationType_Proxy(
+    IFsrmFileManagementJob* This,
+    FsrmFileManagementType operationType);
+void __RPC_STUB IFsrmFileManagementJob_put_OperationType_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_ExpirationDirectory_Proxy(
+    IFsrmFileManagementJob* This,
+    BSTR *expirationDirectory);
+void __RPC_STUB IFsrmFileManagementJob_get_ExpirationDirectory_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_put_ExpirationDirectory_Proxy(
+    IFsrmFileManagementJob* This,
+    BSTR expirationDirectory);
+void __RPC_STUB IFsrmFileManagementJob_put_ExpirationDirectory_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_CustomAction_Proxy(
+    IFsrmFileManagementJob* This,
+    IFsrmActionCommand **action);
+void __RPC_STUB IFsrmFileManagementJob_get_CustomAction_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_Notifications_Proxy(
+    IFsrmFileManagementJob* This,
+    SAFEARRAY **notifications);
+void __RPC_STUB IFsrmFileManagementJob_get_Notifications_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_Logging_Proxy(
+    IFsrmFileManagementJob* This,
+    LONG *loggingFlags);
+void __RPC_STUB IFsrmFileManagementJob_get_Logging_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_put_Logging_Proxy(
+    IFsrmFileManagementJob* This,
+    LONG loggingFlags);
+void __RPC_STUB IFsrmFileManagementJob_put_Logging_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_ReportEnabled_Proxy(
+    IFsrmFileManagementJob* This,
+    VARIANT_BOOL *reportEnabled);
+void __RPC_STUB IFsrmFileManagementJob_get_ReportEnabled_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_put_ReportEnabled_Proxy(
+    IFsrmFileManagementJob* This,
+    VARIANT_BOOL reportEnabled);
+void __RPC_STUB IFsrmFileManagementJob_put_ReportEnabled_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_Formats_Proxy(
+    IFsrmFileManagementJob* This,
+    SAFEARRAY **formats);
+void __RPC_STUB IFsrmFileManagementJob_get_Formats_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_put_Formats_Proxy(
+    IFsrmFileManagementJob* This,
+    SAFEARRAY *formats);
+void __RPC_STUB IFsrmFileManagementJob_put_Formats_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_MailTo_Proxy(
+    IFsrmFileManagementJob* This,
+    BSTR *mailTo);
+void __RPC_STUB IFsrmFileManagementJob_get_MailTo_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_put_MailTo_Proxy(
+    IFsrmFileManagementJob* This,
+    BSTR mailTo);
+void __RPC_STUB IFsrmFileManagementJob_put_MailTo_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_DaysSinceFileCreated_Proxy(
+    IFsrmFileManagementJob* This,
+    LONG *daysSinceCreation);
+void __RPC_STUB IFsrmFileManagementJob_get_DaysSinceFileCreated_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_put_DaysSinceFileCreated_Proxy(
+    IFsrmFileManagementJob* This,
+    LONG daysSinceCreation);
+void __RPC_STUB IFsrmFileManagementJob_put_DaysSinceFileCreated_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_DaysSinceFileLastAccessed_Proxy(
+    IFsrmFileManagementJob* This,
+    LONG *daysSinceAccess);
+void __RPC_STUB IFsrmFileManagementJob_get_DaysSinceFileLastAccessed_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_put_DaysSinceFileLastAccessed_Proxy(
+    IFsrmFileManagementJob* This,
+    LONG daysSinceAccess);
+void __RPC_STUB IFsrmFileManagementJob_put_DaysSinceFileLastAccessed_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_DaysSinceFileLastModified_Proxy(
+    IFsrmFileManagementJob* This,
+    LONG *daysSinceModify);
+void __RPC_STUB IFsrmFileManagementJob_get_DaysSinceFileLastModified_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_put_DaysSinceFileLastModified_Proxy(
+    IFsrmFileManagementJob* This,
+    LONG daysSinceModify);
+void __RPC_STUB IFsrmFileManagementJob_put_DaysSinceFileLastModified_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_PropertyConditions_Proxy(
+    IFsrmFileManagementJob* This,
+    IFsrmCollection **propertyConditions);
+void __RPC_STUB IFsrmFileManagementJob_get_PropertyConditions_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_FromDate_Proxy(
+    IFsrmFileManagementJob* This,
+    DATE *fromDate);
+void __RPC_STUB IFsrmFileManagementJob_get_FromDate_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_put_FromDate_Proxy(
+    IFsrmFileManagementJob* This,
+    DATE fromDate);
+void __RPC_STUB IFsrmFileManagementJob_put_FromDate_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_Task_Proxy(
+    IFsrmFileManagementJob* This,
+    BSTR *taskName);
+void __RPC_STUB IFsrmFileManagementJob_get_Task_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_put_Task_Proxy(
+    IFsrmFileManagementJob* This,
+    BSTR taskName);
+void __RPC_STUB IFsrmFileManagementJob_put_Task_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_Parameters_Proxy(
+    IFsrmFileManagementJob* This,
+    SAFEARRAY **parameters);
+void __RPC_STUB IFsrmFileManagementJob_get_Parameters_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_put_Parameters_Proxy(
+    IFsrmFileManagementJob* This,
+    SAFEARRAY *parameters);
+void __RPC_STUB IFsrmFileManagementJob_put_Parameters_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_RunningStatus_Proxy(
+    IFsrmFileManagementJob* This,
+    FsrmReportRunningStatus *runningStatus);
+void __RPC_STUB IFsrmFileManagementJob_get_RunningStatus_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_LastError_Proxy(
+    IFsrmFileManagementJob* This,
+    BSTR *lastError);
+void __RPC_STUB IFsrmFileManagementJob_get_LastError_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_LastReportPathWithoutExtension_Proxy(
+    IFsrmFileManagementJob* This,
+    BSTR *path);
+void __RPC_STUB IFsrmFileManagementJob_get_LastReportPathWithoutExtension_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_LastRun_Proxy(
+    IFsrmFileManagementJob* This,
+    DATE *lastRun);
+void __RPC_STUB IFsrmFileManagementJob_get_LastRun_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_get_FileNamePattern_Proxy(
+    IFsrmFileManagementJob* This,
+    BSTR *fileNamePattern);
+void __RPC_STUB IFsrmFileManagementJob_get_FileNamePattern_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_put_FileNamePattern_Proxy(
+    IFsrmFileManagementJob* This,
+    BSTR fileNamePattern);
+void __RPC_STUB IFsrmFileManagementJob_put_FileNamePattern_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_Run_Proxy(
+    IFsrmFileManagementJob* This,
+    FsrmReportGenerationContext context);
+void __RPC_STUB IFsrmFileManagementJob_Run_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_WaitForCompletion_Proxy(
+    IFsrmFileManagementJob* This,
+    LONG waitSeconds,
+    VARIANT_BOOL *completed);
+void __RPC_STUB IFsrmFileManagementJob_WaitForCompletion_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_Cancel_Proxy(
+    IFsrmFileManagementJob* This);
+void __RPC_STUB IFsrmFileManagementJob_Cancel_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_AddNotification_Proxy(
+    IFsrmFileManagementJob* This,
+    LONG days);
+void __RPC_STUB IFsrmFileManagementJob_AddNotification_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_DeleteNotification_Proxy(
+    IFsrmFileManagementJob* This,
+    LONG days);
+void __RPC_STUB IFsrmFileManagementJob_DeleteNotification_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_ModifyNotification_Proxy(
+    IFsrmFileManagementJob* This,
+    LONG days,
+    LONG newDays);
+void __RPC_STUB IFsrmFileManagementJob_ModifyNotification_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_CreateNotificationAction_Proxy(
+    IFsrmFileManagementJob* This,
+    LONG days,
+    FsrmActionType actionType,
+    IFsrmAction **action);
+void __RPC_STUB IFsrmFileManagementJob_CreateNotificationAction_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_EnumNotificationActions_Proxy(
+    IFsrmFileManagementJob* This,
+    LONG days,
+    IFsrmCollection **actions);
+void __RPC_STUB IFsrmFileManagementJob_EnumNotificationActions_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_CreatePropertyCondition_Proxy(
+    IFsrmFileManagementJob* This,
+    BSTR name,
+    IFsrmPropertyCondition **propertyCondition);
+void __RPC_STUB IFsrmFileManagementJob_CreatePropertyCondition_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileManagementJob_CreateCustomAction_Proxy(
+    IFsrmFileManagementJob* This,
+    IFsrmActionCommand **customAction);
+void __RPC_STUB IFsrmFileManagementJob_CreateCustomAction_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IFsrmFileManagementJob_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IFsrmFileCondition interface
+ */
+#ifndef __IFsrmFileCondition_INTERFACE_DEFINED__
+#define __IFsrmFileCondition_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IFsrmFileCondition, 0x70684ffc, 0x691a, 0x4a1a, 0xb9,0x22, 0x97,0x75,0x2e,0x13,0x8c,0xc1);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("70684ffc-691a-4a1a-b922-97752e138cc1")
+IFsrmFileCondition : public IDispatch
 {
+    virtual HRESULT STDMETHODCALLTYPE get_Type(
+        FsrmFileConditionType *pVal) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Delete(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IFsrmFileCondition, 0x70684ffc, 0x691a, 0x4a1a, 0xb9,0x22, 0x97,0x75,0x2e,0x13,0x8c,0xc1)
+#endif
+#else
+typedef struct IFsrmFileConditionVtbl {
     BEGIN_INTERFACE
 
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFsrmFileCondition* This,
+        REFIID riid,
+        void **ppvObject);
 
-    /* IFsrmFileManagementJobManager methods */
-    STDMETHOD_(HRESULT,get_ActionVariables)(THIS_ SAFEARRAY *variables) PURE;
-    STDMETHOD_(HRESULT,get_ActionVariableDescriptions)(THIS_ SAFEARRAY *descriptions) PURE;
-    STDMETHOD_(HRESULT,EnumFileManagementJobs)(THIS_ FsrmEnumOptions options,IFsrmCollection **fileManagementJobs) PURE;
-    STDMETHOD_(HRESULT,CreateFileManagementJob)(THIS_ IFsrmFileManagementJob **fileManagementJob) PURE;
-    STDMETHOD_(HRESULT,GetFileManagementJob)(THIS_ BSTR name,IFsrmFileManagementJob **fileManagementJob) PURE;
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFsrmFileCondition* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFsrmFileCondition* This);
+
+    /*** IDispatch methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
+        IFsrmFileCondition* This,
+        UINT *pctinfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
+        IFsrmFileCondition* This,
+        UINT iTInfo,
+        LCID lcid,
+        ITypeInfo **ppTInfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
+        IFsrmFileCondition* This,
+        REFIID riid,
+        LPOLESTR *rgszNames,
+        UINT cNames,
+        LCID lcid,
+        DISPID *rgDispId);
+
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        IFsrmFileCondition* This,
+        DISPID dispIdMember,
+        REFIID riid,
+        LCID lcid,
+        WORD wFlags,
+        DISPPARAMS *pDispParams,
+        VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo,
+        UINT *puArgErr);
+
+    /*** IFsrmFileCondition methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Type)(
+        IFsrmFileCondition* This,
+        FsrmFileConditionType *pVal);
+
+    HRESULT (STDMETHODCALLTYPE *Delete)(
+        IFsrmFileCondition* This);
 
     END_INTERFACE
+} IFsrmFileConditionVtbl;
+interface IFsrmFileCondition {
+    CONST_VTBL IFsrmFileConditionVtbl* lpVtbl;
 };
+
 #ifdef COBJMACROS
-#define IFsrmFileManagementJobManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IFsrmFileManagementJobManager_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IFsrmFileManagementJobManager_Release(This) (This)->lpVtbl->Release(This)
-#define IFsrmFileManagementJobManager_get_ActionVariables(This,variables) (This)->lpVtbl->get_ActionVariables(This,variables)
-#define IFsrmFileManagementJobManager_get_ActionVariableDescriptions(This,descriptions) (This)->lpVtbl->get_ActionVariableDescriptions(This,descriptions)
-#define IFsrmFileManagementJobManager_EnumFileManagementJobs(This,options,fileManagementJobs) (This)->lpVtbl->EnumFileManagementJobs(This,options,fileManagementJobs)
-#define IFsrmFileManagementJobManager_CreateFileManagementJob(This,fileManagementJob) (This)->lpVtbl->CreateFileManagementJob(This,fileManagementJob)
-#define IFsrmFileManagementJobManager_GetFileManagementJob(This,name,fileManagementJob) (This)->lpVtbl->GetFileManagementJob(This,name,fileManagementJob)
-#endif /*COBJMACROS*/
-#endif /*(_WIN32_WINNT >= 0x0601)*/
-#endif /*_INC_FSRMREPORTS*/
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IFsrmFileCondition_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IFsrmFileCondition_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IFsrmFileCondition_Release(This) (This)->lpVtbl->Release(This)
+/*** IDispatch methods ***/
+#define IFsrmFileCondition_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
+#define IFsrmFileCondition_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
+#define IFsrmFileCondition_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
+#define IFsrmFileCondition_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
+/*** IFsrmFileCondition methods ***/
+#define IFsrmFileCondition_get_Type(This,pVal) (This)->lpVtbl->get_Type(This,pVal)
+#define IFsrmFileCondition_Delete(This) (This)->lpVtbl->Delete(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IFsrmFileCondition_QueryInterface(IFsrmFileCondition* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmFileCondition_AddRef(IFsrmFileCondition* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmFileCondition_Release(IFsrmFileCondition* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmFileCondition_GetTypeInfoCount(IFsrmFileCondition* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmFileCondition_GetTypeInfo(IFsrmFileCondition* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE HRESULT IFsrmFileCondition_GetIDsOfNames(IFsrmFileCondition* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
+    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
+}
+static FORCEINLINE HRESULT IFsrmFileCondition_Invoke(IFsrmFileCondition* 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);
+}
+/*** IFsrmFileCondition methods ***/
+static FORCEINLINE HRESULT IFsrmFileCondition_get_Type(IFsrmFileCondition* This,FsrmFileConditionType *pVal) {
+    return This->lpVtbl->get_Type(This,pVal);
+}
+static FORCEINLINE HRESULT IFsrmFileCondition_Delete(IFsrmFileCondition* This) {
+    return This->lpVtbl->Delete(This);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmFileCondition_get_Type_Proxy(
+    IFsrmFileCondition* This,
+    FsrmFileConditionType *pVal);
+void __RPC_STUB IFsrmFileCondition_get_Type_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileCondition_Delete_Proxy(
+    IFsrmFileCondition* This);
+void __RPC_STUB IFsrmFileCondition_Delete_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IFsrmFileCondition_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IFsrmFileConditionProperty interface
+ */
+#ifndef __IFsrmFileConditionProperty_INTERFACE_DEFINED__
+#define __IFsrmFileConditionProperty_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IFsrmFileConditionProperty, 0x81926775, 0xb981, 0x4479, 0x98,0x8f, 0xda,0x17,0x1d,0x62,0x73,0x60);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("81926775-b981-4479-988f-da171d627360")
+IFsrmFileConditionProperty : public IFsrmFileCondition
+{
+    virtual HRESULT STDMETHODCALLTYPE get_PropertyName(
+        BSTR *pVal) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_PropertyName(
+        BSTR newVal) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_PropertyId(
+        FsrmFileSystemPropertyId *pVal) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_PropertyId(
+        FsrmFileSystemPropertyId newVal) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_Operator(
+        FsrmPropertyConditionType *pVal) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_Operator(
+        FsrmPropertyConditionType newVal) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_ValueType(
+        FsrmPropertyValueType *pVal) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_ValueType(
+        FsrmPropertyValueType newVal) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_Value(
+        VARIANT *pVal) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_Value(
+        VARIANT newVal) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IFsrmFileConditionProperty, 0x81926775, 0xb981, 0x4479, 0x98,0x8f, 0xda,0x17,0x1d,0x62,0x73,0x60)
+#endif
+#else
+typedef struct IFsrmFileConditionPropertyVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFsrmFileConditionProperty* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFsrmFileConditionProperty* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFsrmFileConditionProperty* This);
+
+    /*** IDispatch methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
+        IFsrmFileConditionProperty* This,
+        UINT *pctinfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
+        IFsrmFileConditionProperty* This,
+        UINT iTInfo,
+        LCID lcid,
+        ITypeInfo **ppTInfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
+        IFsrmFileConditionProperty* This,
+        REFIID riid,
+        LPOLESTR *rgszNames,
+        UINT cNames,
+        LCID lcid,
+        DISPID *rgDispId);
+
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        IFsrmFileConditionProperty* This,
+        DISPID dispIdMember,
+        REFIID riid,
+        LCID lcid,
+        WORD wFlags,
+        DISPPARAMS *pDispParams,
+        VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo,
+        UINT *puArgErr);
+
+    /*** IFsrmFileCondition methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Type)(
+        IFsrmFileConditionProperty* This,
+        FsrmFileConditionType *pVal);
+
+    HRESULT (STDMETHODCALLTYPE *Delete)(
+        IFsrmFileConditionProperty* This);
+
+    /*** IFsrmFileConditionProperty methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_PropertyName)(
+        IFsrmFileConditionProperty* This,
+        BSTR *pVal);
+
+    HRESULT (STDMETHODCALLTYPE *put_PropertyName)(
+        IFsrmFileConditionProperty* This,
+        BSTR newVal);
+
+    HRESULT (STDMETHODCALLTYPE *get_PropertyId)(
+        IFsrmFileConditionProperty* This,
+        FsrmFileSystemPropertyId *pVal);
+
+    HRESULT (STDMETHODCALLTYPE *put_PropertyId)(
+        IFsrmFileConditionProperty* This,
+        FsrmFileSystemPropertyId newVal);
+
+    HRESULT (STDMETHODCALLTYPE *get_Operator)(
+        IFsrmFileConditionProperty* This,
+        FsrmPropertyConditionType *pVal);
+
+    HRESULT (STDMETHODCALLTYPE *put_Operator)(
+        IFsrmFileConditionProperty* This,
+        FsrmPropertyConditionType newVal);
+
+    HRESULT (STDMETHODCALLTYPE *get_ValueType)(
+        IFsrmFileConditionProperty* This,
+        FsrmPropertyValueType *pVal);
+
+    HRESULT (STDMETHODCALLTYPE *put_ValueType)(
+        IFsrmFileConditionProperty* This,
+        FsrmPropertyValueType newVal);
+
+    HRESULT (STDMETHODCALLTYPE *get_Value)(
+        IFsrmFileConditionProperty* This,
+        VARIANT *pVal);
+
+    HRESULT (STDMETHODCALLTYPE *put_Value)(
+        IFsrmFileConditionProperty* This,
+        VARIANT newVal);
+
+    END_INTERFACE
+} IFsrmFileConditionPropertyVtbl;
+interface IFsrmFileConditionProperty {
+    CONST_VTBL IFsrmFileConditionPropertyVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IFsrmFileConditionProperty_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IFsrmFileConditionProperty_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IFsrmFileConditionProperty_Release(This) (This)->lpVtbl->Release(This)
+/*** IDispatch methods ***/
+#define IFsrmFileConditionProperty_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
+#define IFsrmFileConditionProperty_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
+#define IFsrmFileConditionProperty_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
+#define IFsrmFileConditionProperty_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
+/*** IFsrmFileCondition methods ***/
+#define IFsrmFileConditionProperty_get_Type(This,pVal) (This)->lpVtbl->get_Type(This,pVal)
+#define IFsrmFileConditionProperty_Delete(This) (This)->lpVtbl->Delete(This)
+/*** IFsrmFileConditionProperty methods ***/
+#define IFsrmFileConditionProperty_get_PropertyName(This,pVal) (This)->lpVtbl->get_PropertyName(This,pVal)
+#define IFsrmFileConditionProperty_put_PropertyName(This,newVal) (This)->lpVtbl->put_PropertyName(This,newVal)
+#define IFsrmFileConditionProperty_get_PropertyId(This,pVal) (This)->lpVtbl->get_PropertyId(This,pVal)
+#define IFsrmFileConditionProperty_put_PropertyId(This,newVal) (This)->lpVtbl->put_PropertyId(This,newVal)
+#define IFsrmFileConditionProperty_get_Operator(This,pVal) (This)->lpVtbl->get_Operator(This,pVal)
+#define IFsrmFileConditionProperty_put_Operator(This,newVal) (This)->lpVtbl->put_Operator(This,newVal)
+#define IFsrmFileConditionProperty_get_ValueType(This,pVal) (This)->lpVtbl->get_ValueType(This,pVal)
+#define IFsrmFileConditionProperty_put_ValueType(This,newVal) (This)->lpVtbl->put_ValueType(This,newVal)
+#define IFsrmFileConditionProperty_get_Value(This,pVal) (This)->lpVtbl->get_Value(This,pVal)
+#define IFsrmFileConditionProperty_put_Value(This,newVal) (This)->lpVtbl->put_Value(This,newVal)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IFsrmFileConditionProperty_QueryInterface(IFsrmFileConditionProperty* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmFileConditionProperty_AddRef(IFsrmFileConditionProperty* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmFileConditionProperty_Release(IFsrmFileConditionProperty* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmFileConditionProperty_GetTypeInfoCount(IFsrmFileConditionProperty* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmFileConditionProperty_GetTypeInfo(IFsrmFileConditionProperty* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE HRESULT IFsrmFileConditionProperty_GetIDsOfNames(IFsrmFileConditionProperty* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
+    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
+}
+static FORCEINLINE HRESULT IFsrmFileConditionProperty_Invoke(IFsrmFileConditionProperty* 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);
+}
+/*** IFsrmFileCondition methods ***/
+static FORCEINLINE HRESULT IFsrmFileConditionProperty_get_Type(IFsrmFileConditionProperty* This,FsrmFileConditionType *pVal) {
+    return This->lpVtbl->get_Type(This,pVal);
+}
+static FORCEINLINE HRESULT IFsrmFileConditionProperty_Delete(IFsrmFileConditionProperty* This) {
+    return This->lpVtbl->Delete(This);
+}
+/*** IFsrmFileConditionProperty methods ***/
+static FORCEINLINE HRESULT IFsrmFileConditionProperty_get_PropertyName(IFsrmFileConditionProperty* This,BSTR *pVal) {
+    return This->lpVtbl->get_PropertyName(This,pVal);
+}
+static FORCEINLINE HRESULT IFsrmFileConditionProperty_put_PropertyName(IFsrmFileConditionProperty* This,BSTR newVal) {
+    return This->lpVtbl->put_PropertyName(This,newVal);
+}
+static FORCEINLINE HRESULT IFsrmFileConditionProperty_get_PropertyId(IFsrmFileConditionProperty* This,FsrmFileSystemPropertyId *pVal) {
+    return This->lpVtbl->get_PropertyId(This,pVal);
+}
+static FORCEINLINE HRESULT IFsrmFileConditionProperty_put_PropertyId(IFsrmFileConditionProperty* This,FsrmFileSystemPropertyId newVal) {
+    return This->lpVtbl->put_PropertyId(This,newVal);
+}
+static FORCEINLINE HRESULT IFsrmFileConditionProperty_get_Operator(IFsrmFileConditionProperty* This,FsrmPropertyConditionType *pVal) {
+    return This->lpVtbl->get_Operator(This,pVal);
+}
+static FORCEINLINE HRESULT IFsrmFileConditionProperty_put_Operator(IFsrmFileConditionProperty* This,FsrmPropertyConditionType newVal) {
+    return This->lpVtbl->put_Operator(This,newVal);
+}
+static FORCEINLINE HRESULT IFsrmFileConditionProperty_get_ValueType(IFsrmFileConditionProperty* This,FsrmPropertyValueType *pVal) {
+    return This->lpVtbl->get_ValueType(This,pVal);
+}
+static FORCEINLINE HRESULT IFsrmFileConditionProperty_put_ValueType(IFsrmFileConditionProperty* This,FsrmPropertyValueType newVal) {
+    return This->lpVtbl->put_ValueType(This,newVal);
+}
+static FORCEINLINE HRESULT IFsrmFileConditionProperty_get_Value(IFsrmFileConditionProperty* This,VARIANT *pVal) {
+    return This->lpVtbl->get_Value(This,pVal);
+}
+static FORCEINLINE HRESULT IFsrmFileConditionProperty_put_Value(IFsrmFileConditionProperty* This,VARIANT newVal) {
+    return This->lpVtbl->put_Value(This,newVal);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmFileConditionProperty_get_PropertyName_Proxy(
+    IFsrmFileConditionProperty* This,
+    BSTR *pVal);
+void __RPC_STUB IFsrmFileConditionProperty_get_PropertyName_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileConditionProperty_put_PropertyName_Proxy(
+    IFsrmFileConditionProperty* This,
+    BSTR newVal);
+void __RPC_STUB IFsrmFileConditionProperty_put_PropertyName_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileConditionProperty_get_PropertyId_Proxy(
+    IFsrmFileConditionProperty* This,
+    FsrmFileSystemPropertyId *pVal);
+void __RPC_STUB IFsrmFileConditionProperty_get_PropertyId_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileConditionProperty_put_PropertyId_Proxy(
+    IFsrmFileConditionProperty* This,
+    FsrmFileSystemPropertyId newVal);
+void __RPC_STUB IFsrmFileConditionProperty_put_PropertyId_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileConditionProperty_get_Operator_Proxy(
+    IFsrmFileConditionProperty* This,
+    FsrmPropertyConditionType *pVal);
+void __RPC_STUB IFsrmFileConditionProperty_get_Operator_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileConditionProperty_put_Operator_Proxy(
+    IFsrmFileConditionProperty* This,
+    FsrmPropertyConditionType newVal);
+void __RPC_STUB IFsrmFileConditionProperty_put_Operator_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileConditionProperty_get_ValueType_Proxy(
+    IFsrmFileConditionProperty* This,
+    FsrmPropertyValueType *pVal);
+void __RPC_STUB IFsrmFileConditionProperty_get_ValueType_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileConditionProperty_put_ValueType_Proxy(
+    IFsrmFileConditionProperty* This,
+    FsrmPropertyValueType newVal);
+void __RPC_STUB IFsrmFileConditionProperty_put_ValueType_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileConditionProperty_get_Value_Proxy(
+    IFsrmFileConditionProperty* This,
+    VARIANT *pVal);
+void __RPC_STUB IFsrmFileConditionProperty_get_Value_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileConditionProperty_put_Value_Proxy(
+    IFsrmFileConditionProperty* This,
+    VARIANT newVal);
+void __RPC_STUB IFsrmFileConditionProperty_put_Value_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IFsrmFileConditionProperty_INTERFACE_DEFINED__ */
+
+#endif
+/* Begin additional prototypes for all interfaces */
+
+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 *);
+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 *);
+
+/* End additional prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __fsrmreports_h__ */
diff --git a/mingw-w64-headers/include/fsrmreports.idl b/mingw-w64-headers/include/fsrmreports.idl
new file mode 100644
index 0000000..fae8faa
--- /dev/null
+++ b/mingw-w64-headers/include/fsrmreports.idl
@@ -0,0 +1,184 @@
+/**
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER within this package.
+ */
+
+import "oaidl.idl";
+import "fsrmenums.idl";
+import "fsrm.idl";
+
+cpp_quote("#include <winapifamily.h>")
+cpp_quote("")
+cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)")
+
+interface IFsrmFileManagementJob;
+interface IFsrmFileManagementJobManager;
+interface IFsrmPropertyCondition;
+interface IFsrmReport;
+interface IFsrmReportJob;
+interface IFsrmReportManager;
+
+const DISPID FSRM_DISPID_REPORT_MANAGER = FSRM_DISPID_FEATURE_REPORTS | 0x100000;
+const DISPID FSRM_DISPID_REPORT_JOB = FSRM_DISPID_FEATURE_REPORTS | 0x200000;
+const DISPID FSRM_DISPID_REPORT = FSRM_DISPID_FEATURE_REPORTS | 0x300000;
+const DISPID FSRM_DISPID_REPORT_SCHEDULER = FSRM_DISPID_FEATURE_REPORTS | 0x400000;
+const DISPID FSRM_DISPID_FILE_MANAGEMENT_JOB_MANAGER = FSRM_DISPID_FEATURE_REPORTS | 0x500000;
+const DISPID FSRM_DISPID_FILE_MANAGEMENT_JOB = FSRM_DISPID_FEATURE_REPORTS | 0x600000;
+const DISPID FSRM_DISPID_FILE_MANAGEMENT_NOTIFICATION = FSRM_DISPID_FEATURE_REPORTS | 0x700000;
+const DISPID FSRM_DISPID_PROPERTY_CONDITION = FSRM_DISPID_FEATURE_REPORTS | 0x800000;
+const DISPID FSRM_DISPID_FILE_CONDITION = FSRM_DISPID_FEATURE_REPORTS | 0x900000;
+const DISPID FSRM_DISPID_FILE_CONDITION_PROPERTY = FSRM_DISPID_FEATURE_REPORTS | 0xa00000;
+const DISPID FSRM_DISPID_FILE_MANAGEMENT_JOB_2 = FSRM_DISPID_FEATURE_REPORTS | 0xb00000;
+
+[odl, uuid (d8cc81d9-46b8-4fa4-bfa5-4aa9dec9b638), version (1.0), dual, oleautomation]
+interface IFsrmReport : IDispatch {
+  [propget, id (FSRM_DISPID_REPORT | 0x81)] HRESULT Type ([out, retval] FsrmReportType *reportType);
+  [propget, id (FSRM_DISPID_REPORT | 0x82)] HRESULT Name ([out, retval] BSTR *name);
+  [propput, id (FSRM_DISPID_REPORT | 0x82)] HRESULT Name ([in] BSTR name);
+  [propget, id (FSRM_DISPID_REPORT | 0x83)] HRESULT Description ([out, retval] BSTR *description);
+  [propput, id (FSRM_DISPID_REPORT | 0x83)] HRESULT Description ([in] BSTR description);
+  [propget, id (FSRM_DISPID_REPORT | 0x84)] HRESULT LastGeneratedFileNamePrefix ([out, retval] BSTR *prefix);
+  [id (FSRM_DISPID_REPORT | 0x1)] HRESULT GetFilter ([in] FsrmReportFilter filter,[out, retval] VARIANT *filterValue);
+  [id (FSRM_DISPID_REPORT | 0x2)] HRESULT SetFilter ([in] FsrmReportFilter filter,[in] VARIANT filterValue);
+  [id (FSRM_DISPID_REPORT | 0x3)] HRESULT Delete ();
+};
+
+[odl, uuid (6879caf9-6617-4484-8719-71c3d8645f94), version (1.0), dual, oleautomation]
+interface IFsrmReportScheduler : IDispatch {
+  [id (FSRM_DISPID_REPORT_SCHEDULER | 0x1)] HRESULT VerifyNamespaces ([in] VARIANT *namespacesSafeArray);
+  [id (FSRM_DISPID_REPORT_SCHEDULER | 0x2)] HRESULT CreateScheduleTask ([in] BSTR taskName,[in] VARIANT *namespacesSafeArray,[in] BSTR serializedTask);
+  [id (FSRM_DISPID_REPORT_SCHEDULER | 0x3)] HRESULT ModifyScheduleTask ([in] BSTR taskName,[in] VARIANT *namespacesSafeArray,[in] BSTR serializedTask);
+  [id (FSRM_DISPID_REPORT_SCHEDULER | 0x4)] HRESULT DeleteScheduleTask ([in] BSTR taskName);
+};
+
+[odl, uuid (ee321ecb-d95e-48e9-907c-c7685a013235), version (1.0), dual, oleautomation]
+interface IFsrmFileManagementJobManager : IDispatch {
+  [propget, id (FSRM_DISPID_FILE_MANAGEMENT_JOB_MANAGER | 0x81)] HRESULT ActionVariables ([out, retval] SAFEARRAY (VARIANT) *variables);
+  [propget, id (FSRM_DISPID_FILE_MANAGEMENT_JOB_MANAGER | 0x82)] HRESULT ActionVariableDescriptions ([out, retval] SAFEARRAY (VARIANT) *descriptions);
+  [id (FSRM_DISPID_FILE_MANAGEMENT_JOB_MANAGER | 0x1)] HRESULT EnumFileManagementJobs ([in, defaultvalue (FsrmEnumOptions_None)] FsrmEnumOptions options,[out, retval] IFsrmCollection **fileManagementJobs);
+  [id (FSRM_DISPID_FILE_MANAGEMENT_JOB_MANAGER | 0x2)] HRESULT CreateFileManagementJob ([out, retval] IFsrmFileManagementJob **fileManagementJob);
+  [id (FSRM_DISPID_FILE_MANAGEMENT_JOB_MANAGER | 0x3)] HRESULT GetFileManagementJob ([in] BSTR name,[out, retval] IFsrmFileManagementJob **fileManagementJob);
+};
+
+[odl, uuid (326af66f-2ac0-4f68-bf8c-4759f054fa29), version (1.0), dual, oleautomation]
+interface IFsrmPropertyCondition : IDispatch {
+  [propget, id (FSRM_DISPID_PROPERTY_CONDITION | 0x81)] HRESULT Name ([out, retval] BSTR *name);
+  [propput, id (FSRM_DISPID_PROPERTY_CONDITION | 0x81)] HRESULT Name ([in] BSTR name);
+  [propget, id (FSRM_DISPID_PROPERTY_CONDITION | 0x82)] HRESULT Type ([out, retval] FsrmPropertyConditionType *type);
+  [propput, id (FSRM_DISPID_PROPERTY_CONDITION | 0x82)] HRESULT Type ([in] FsrmPropertyConditionType type);
+  [propget, id (FSRM_DISPID_PROPERTY_CONDITION | 0x83)] HRESULT Value ([out, retval] BSTR *value);
+  [propput, id (FSRM_DISPID_PROPERTY_CONDITION | 0x83)] HRESULT Value ([in] BSTR value);
+  [id (FSRM_DISPID_PROPERTY_CONDITION | 0x1)] HRESULT Delete ();
+};
+
+[odl, uuid (27b899fe-6ffa-4481-a184-d3daade8a02b), version (1.0), dual, oleautomation]
+interface IFsrmReportManager : IDispatch {
+  [id (FSRM_DISPID_REPORT_MANAGER | 0x1)] HRESULT EnumReportJobs ([in, defaultvalue (FsrmEnumOptions_None)] FsrmEnumOptions options,[out, retval] IFsrmCollection **reportJobs);
+  [id (FSRM_DISPID_REPORT_MANAGER | 0x2)] HRESULT CreateReportJob ([out, retval] IFsrmReportJob **reportJob);
+  [id (FSRM_DISPID_REPORT_MANAGER | 0x3)] HRESULT GetReportJob ([in] BSTR taskName,[out, retval] IFsrmReportJob **reportJob);
+  [id (FSRM_DISPID_REPORT_MANAGER | 0x4)] HRESULT GetOutputDirectory ([in] FsrmReportGenerationContext context,[out, retval] BSTR *path);
+  [id (FSRM_DISPID_REPORT_MANAGER | 0x5)] HRESULT SetOutputDirectory ([in] FsrmReportGenerationContext context,[in] BSTR path);
+  [id (FSRM_DISPID_REPORT_MANAGER | 0x6)] HRESULT IsFilterValidForReportType ([in] FsrmReportType reportType,[in] FsrmReportFilter filter,[out, retval] VARIANT_BOOL *valid);
+  [id (FSRM_DISPID_REPORT_MANAGER | 0x7)] HRESULT GetDefaultFilter ([in] FsrmReportType reportType,[in] FsrmReportFilter filter,[out, retval] VARIANT *filterValue);
+  [id (FSRM_DISPID_REPORT_MANAGER | 0x8)] HRESULT SetDefaultFilter ([in] FsrmReportType reportType,[in] FsrmReportFilter filter,[in] VARIANT filterValue);
+  [id (FSRM_DISPID_REPORT_MANAGER | 0x9)] HRESULT GetReportSizeLimit ([in] FsrmReportLimit limit,[out, retval] VARIANT *limitValue);
+  [id (FSRM_DISPID_REPORT_MANAGER | 0xa)] HRESULT SetReportSizeLimit ([in] FsrmReportLimit limit,[in] VARIANT limitValue);
+};
+
+[odl, uuid (38e87280-715c-4c7d-a280-ea1651a19fef), version (1.0), dual, oleautomation]
+interface IFsrmReportJob : IFsrmObject {
+  [propget, id (FSRM_DISPID_REPORT_JOB | 0x81)] HRESULT Task ([out, retval] BSTR *taskName);
+  [propput, id (FSRM_DISPID_REPORT_JOB | 0x81)] HRESULT Task ([in] BSTR taskName);
+  [propget, id (FSRM_DISPID_REPORT_JOB | 0x82)] HRESULT NamespaceRoots ([out, retval] SAFEARRAY (VARIANT) *namespaceRoots);
+  [propput, id (FSRM_DISPID_REPORT_JOB | 0x82)] HRESULT NamespaceRoots ([in] SAFEARRAY (VARIANT) namespaceRoots);
+  [propget, id (FSRM_DISPID_REPORT_JOB | 0x83)] HRESULT Formats ([out, retval] SAFEARRAY (VARIANT) *formats);
+  [propput, id (FSRM_DISPID_REPORT_JOB | 0x83)] HRESULT Formats ([in] SAFEARRAY (VARIANT) formats);
+  [propget, id (FSRM_DISPID_REPORT_JOB | 0x84)] HRESULT MailTo ([out, retval] BSTR *mailTo);
+  [propput, id (FSRM_DISPID_REPORT_JOB | 0x84)] HRESULT MailTo ([in] BSTR mailTo);
+  [propget, id (FSRM_DISPID_REPORT_JOB | 0x85)] HRESULT RunningStatus ([out, retval] FsrmReportRunningStatus *runningStatus);
+  [propget, id (FSRM_DISPID_REPORT_JOB | 0x86)] HRESULT LastRun ([out, retval] DATE *lastRun);
+  [propget, id (FSRM_DISPID_REPORT_JOB | 0x87)] HRESULT LastError ([out, retval] BSTR *lastError);
+  [propget, id (FSRM_DISPID_REPORT_JOB | 0x88)] HRESULT LastGeneratedInDirectory ([out, retval] BSTR *path);
+  [id (FSRM_DISPID_REPORT_JOB | 0x01)] HRESULT EnumReports ([out, retval] IFsrmCollection **reports);
+  [id (FSRM_DISPID_REPORT_JOB | 0x02)] HRESULT CreateReport ([in] FsrmReportType reportType,[out, retval] IFsrmReport **report);
+  [id (FSRM_DISPID_REPORT_JOB | 0x03)] HRESULT Run ([in] FsrmReportGenerationContext context);
+  [id (FSRM_DISPID_REPORT_JOB | 0x04)] HRESULT WaitForCompletion ([in] long waitSeconds,[out, retval] VARIANT_BOOL *completed);
+  [id (FSRM_DISPID_REPORT_JOB | 0x05)] HRESULT Cancel ();
+};
+
+[odl, uuid (0770687e-9f36-4d6f-8778-599d188461c9), version (1.0), dual, oleautomation]
+interface IFsrmFileManagementJob : IFsrmObject {
+  const LONG FsrmDaysNotSpecified = -1;
+  const DATE FsrmDateNotSpecified = ((DATE) -1);
+
+  [propget, id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x81)] HRESULT Name ([out, retval] BSTR *name);
+  [propput, id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x81)] HRESULT Name ([in] BSTR name);
+  [propget, id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x82)] HRESULT NamespaceRoots ([out, retval] SAFEARRAY (VARIANT) *namespaceRoots);
+  [propput, id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x82)] HRESULT NamespaceRoots ([in] SAFEARRAY (VARIANT) namespaceRoots);
+  [propget, id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x83)] HRESULT Enabled ([out, retval] VARIANT_BOOL *enabled);
+  [propput, id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x83)] HRESULT Enabled ([in] VARIANT_BOOL enabled);
+  [propget, id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x84)] HRESULT OperationType ([out, retval] FsrmFileManagementType *operationType);
+  [propput, id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x84)] HRESULT OperationType ([in] FsrmFileManagementType operationType);
+  [propget, id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x85)] HRESULT ExpirationDirectory ([out, retval] BSTR *expirationDirectory);
+  [propput, id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x85)] HRESULT ExpirationDirectory ([in] BSTR expirationDirectory);
+  [propget, id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x86)] HRESULT CustomAction ([out, retval] IFsrmActionCommand **action);
+  [propget, id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x87)] HRESULT Notifications ([out, retval] SAFEARRAY (VARIANT) *notifications);
+  [propget, id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x88)] HRESULT Logging ([out, retval] long *loggingFlags);
+  [propput, id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x88)] HRESULT Logging ([in] long loggingFlags);
+  [propget, id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x89)] HRESULT ReportEnabled ([out, retval] VARIANT_BOOL *reportEnabled);
+  [propput, id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x89)] HRESULT ReportEnabled ([in] VARIANT_BOOL reportEnabled);
+  [propget, id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x8a)] HRESULT Formats ([out, retval] SAFEARRAY (VARIANT) *formats);
+  [propput, id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x8a)] HRESULT Formats ([in] SAFEARRAY (VARIANT) formats);
+  [propget, id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x8b)] HRESULT MailTo ([out, retval] BSTR *mailTo);
+  [propput, id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x8b)] HRESULT MailTo ([in] BSTR mailTo);
+  [propget, id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x8c)] HRESULT DaysSinceFileCreated ([out, retval] long *daysSinceCreation);
+  [propput, id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x8c)] HRESULT DaysSinceFileCreated ([in] long daysSinceCreation);
+  [propget, id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x8d)] HRESULT DaysSinceFileLastAccessed ([out, retval] long *daysSinceAccess);
+  [propput, id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x8d)] HRESULT DaysSinceFileLastAccessed ([in] long daysSinceAccess);
+  [propget, id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x8e)] HRESULT DaysSinceFileLastModified ([out, retval] long *daysSinceModify);
+  [propput, id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x8e)] HRESULT DaysSinceFileLastModified ([in] long daysSinceModify);
+  [propget, id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x8f)] HRESULT PropertyConditions ([out, retval] IFsrmCollection **propertyConditions);
+  [propget, id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x90)] HRESULT FromDate ([out, retval] DATE *fromDate);
+  [propput, id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x90)] HRESULT FromDate ([in] DATE fromDate);
+  [propget, id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x91)] HRESULT Task ([out, retval] BSTR *taskName);
+  [propput, id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x91)] HRESULT Task ([in] BSTR taskName);
+  [propget, id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x92)] HRESULT Parameters ([out, retval] SAFEARRAY (VARIANT) *parameters);
+  [propput, id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x92)] HRESULT Parameters ([in] SAFEARRAY (VARIANT) parameters);
+  [propget, id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x93)] HRESULT RunningStatus ([out, retval] FsrmReportRunningStatus *runningStatus);
+  [propget, id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x94)] HRESULT LastError ([out, retval] BSTR *lastError);
+  [propget, id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x95)] HRESULT LastReportPathWithoutExtension ([out, retval] BSTR *path);
+  [propget, id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x96)] HRESULT LastRun ([out, retval] DATE *lastRun);
+  [propget, id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x97)] HRESULT FileNamePattern ([out, retval] BSTR *fileNamePattern);
+  [propput, id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x97)] HRESULT FileNamePattern ([in] BSTR fileNamePattern);
+  [id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x1)] HRESULT Run ([in] FsrmReportGenerationContext context);
+  [id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x2)] HRESULT WaitForCompletion ([in] long waitSeconds,[out, retval] VARIANT_BOOL *completed);
+  [id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x3)] HRESULT Cancel ();
+  [id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x4)] HRESULT AddNotification ([in] long days);
+  [id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x5)] HRESULT DeleteNotification ([in] long days);
+  [id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x6)] HRESULT ModifyNotification ([in] long days,[in] long newDays);
+  [id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x7)] HRESULT CreateNotificationAction ([in] long days,[in] FsrmActionType actionType,[out, retval] IFsrmAction **action);
+  [id (FSRM_DISPID_FILE_MANAGEMENT_JOB | 0x8)] HRESULT EnumNotificationActions ([in] long days,[out, retval] IFsrmCollection **actions);
+  [id (FSRM_DISPID_FILE_MANAGEMENT_JOB_MANAGER | 0x9)] HRESULT CreatePropertyCondition ([in] BSTR name,[out, retval] IFsrmPropertyCondition **propertyCondition);
+  [id (FSRM_DISPID_FILE_MANAGEMENT_JOB_MANAGER | 0xa)] HRESULT CreateCustomAction ([out, retval] IFsrmActionCommand **customAction);
+};
+
+[odl, uuid (70684ffc-691a-4a1a-B922-97752e138cc1), version (1.0), dual, oleautomation]
+interface IFsrmFileCondition : IDispatch {
+  [propget, id (FSRM_DISPID_FILE_CONDITION | 0x81)] HRESULT Type ([out, retval] FsrmFileConditionType *pVal);
+  [id (FSRM_DISPID_FILE_CONDITION | 0x1)] HRESULT Delete ();
+};
+
+[odl, uuid (81926775-B981-4479-988f-da171d627360), version (1.0), dual, oleautomation]
+interface IFsrmFileConditionProperty : IFsrmFileCondition {
+  [propget, id (FSRM_DISPID_FILE_CONDITION_PROPERTY | 0x81)] HRESULT PropertyName ([out, retval] BSTR *pVal);
+  [propput, id (FSRM_DISPID_FILE_CONDITION_PROPERTY | 0x81)] HRESULT PropertyName ([in] BSTR newVal);
+  [propget, id (FSRM_DISPID_FILE_CONDITION_PROPERTY | 0x82)] HRESULT PropertyId ([out, retval] FsrmFileSystemPropertyId *pVal);
+  [propput, id (FSRM_DISPID_FILE_CONDITION_PROPERTY | 0x82)] HRESULT PropertyId ([in] FsrmFileSystemPropertyId newVal);
+  [propget, id (FSRM_DISPID_FILE_CONDITION_PROPERTY | 0x83)] HRESULT Operator ([out, retval] FsrmPropertyConditionType *pVal);
+  [propput, id (FSRM_DISPID_FILE_CONDITION_PROPERTY | 0x83)] HRESULT Operator ([in] FsrmPropertyConditionType newVal);
+  [propget, id (FSRM_DISPID_FILE_CONDITION_PROPERTY | 0x84)] HRESULT ValueType ([out, retval] FsrmPropertyValueType *pVal);
+  [propput, id (FSRM_DISPID_FILE_CONDITION_PROPERTY | 0x84)] HRESULT ValueType ([in] FsrmPropertyValueType newVal);
+  [propget, id (FSRM_DISPID_FILE_CONDITION_PROPERTY | 0x85)] HRESULT Value ([out, retval] VARIANT *pVal);
+  [propput, id (FSRM_DISPID_FILE_CONDITION_PROPERTY | 0x85)] HRESULT Value ([in] VARIANT newVal);
+};
+cpp_quote("#endif")
diff --git a/mingw-w64-headers/include/fsrmscreen.h b/mingw-w64-headers/include/fsrmscreen.h
index 0977899..e5b3d98 100644
--- a/mingw-w64-headers/include/fsrmscreen.h
+++ b/mingw-w64-headers/include/fsrmscreen.h
@@ -1,615 +1,537 @@
-/**
- * This file has no copyright assigned and is placed in the Public Domain.
- * This file is part of the mingw-w64 runtime package.
- * No warranty is given; refer to the file DISCLAIMER.PD within this package.
- */
-#include <fsrmenums.h>
-#include <fsrm.h>
-#include <fsrmquota.h>
+/*** Autogenerated by WIDL 1.6 from fsrmscreen.idl - Do not edit ***/
 
-#ifndef _INC_FSRMSCREEN
-#define _INC_FSRMSCREEN
-#if (_WIN32_WINNT >= 0x0600)
+#ifndef __REQUIRED_RPCNDR_H_VERSION__
+#define __REQUIRED_RPCNDR_H_VERSION__ 475
+#endif
 
-#ifndef __IFsrmAction_FWD_DEFINED__
-#define __IFsrmAction_FWD_DEFINED__
-typedef struct IFsrmAction IFsrmAction;
-#endif /* __IFsrmAction_FWD_DEFINED__ */
+#include <rpc.h>
+#include <rpcndr.h>
 
-#ifndef __IFsrmActionCommand_FWD_DEFINED__
-#define __IFsrmActionCommand_FWD_DEFINED__
-typedef struct IFsrmActionCommand IFsrmActionCommand;
-#endif /* __IFsrmActionCommand_FWD_DEFINED__ */
+#ifndef COM_NO_WINDOWS_H
+#include <windows.h>
+#include <ole2.h>
+#endif
 
-#ifndef __IFsrmActionEmail_FWD_DEFINED__
-#define __IFsrmActionEmail_FWD_DEFINED__
-typedef struct IFsrmActionEmail IFsrmActionEmail;
-#endif /* __IFsrmActionEmail_FWD_DEFINED__ */
+#ifndef __fsrmscreen_h__
+#define __fsrmscreen_h__
 
-#ifndef __IFsrmActionEmail2_FWD_DEFINED__
-#define __IFsrmActionEmail2_FWD_DEFINED__
-typedef struct IFsrmActionEmail2 IFsrmActionEmail2;
-#endif /* __IFsrmActionEmail2_FWD_DEFINED__ */
-
-#ifndef __IFsrmActionEventLog_FWD_DEFINED__
-#define __IFsrmActionEventLog_FWD_DEFINED__
-typedef struct IFsrmActionEventLog IFsrmActionEventLog;
-#endif /* __IFsrmActionEventLog_FWD_DEFINED__ */
-
-#ifndef __IFsrmActionReport_FWD_DEFINED__
-#define __IFsrmActionReport_FWD_DEFINED__
-typedef struct IFsrmActionReport IFsrmActionReport;
-#endif /* __IFsrmActionReport_FWD_DEFINED__ */
-
-#ifndef __IFsrmAutoApplyQuota_FWD_DEFINED__
-#define __IFsrmAutoApplyQuota_FWD_DEFINED__
-typedef struct IFsrmAutoApplyQuota IFsrmAutoApplyQuota;
-#endif /* __IFsrmAutoApplyQuota_FWD_DEFINED__ */
-
-#ifndef __IFsrmClassificationManager_FWD_DEFINED__
-#define __IFsrmClassificationManager_FWD_DEFINED__
-typedef struct IFsrmClassificationManager IFsrmClassificationManager;
-#endif /* __IFsrmClassificationManager_FWD_DEFINED__ */
-
-#ifndef __IFsrmClassificationRule_FWD_DEFINED__
-#define __IFsrmClassificationRule_FWD_DEFINED__
-typedef struct IFsrmClassificationRule IFsrmClassificationRule;
-#endif /* __IFsrmClassificationRule_FWD_DEFINED__ */
-
-#ifndef __IFsrmClassifierModuleDefinition_FWD_DEFINED__
-#define __IFsrmClassifierModuleDefinition_FWD_DEFINED__
-typedef struct IFsrmClassifierModuleDefinition IFsrmClassifierModuleDefinition;
-#endif /* __IFsrmClassifierModuleDefinition_FWD_DEFINED__ */
-
-#ifndef __IFsrmClassifierModuleImplementation_FWD_DEFINED__
-#define __IFsrmClassifierModuleImplementation_FWD_DEFINED__
-typedef struct IFsrmClassifierModuleImplementation IFsrmClassifierModuleImplementation;
-#endif /* __IFsrmClassifierModuleImplementation_FWD_DEFINED__ */
-
-#ifndef __IFsrmCollection_FWD_DEFINED__
-#define __IFsrmCollection_FWD_DEFINED__
-typedef struct IFsrmCollection IFsrmCollection;
-#endif /* __IFsrmCollection_FWD_DEFINED__ */
-
-#ifndef __IFsrmCommittableCollection_FWD_DEFINED__
-#define __IFsrmCommittableCollection_FWD_DEFINED__
-typedef struct IFsrmCommittableCollection IFsrmCommittableCollection;
-#endif /* __IFsrmCommittableCollection_FWD_DEFINED__ */
-
-#ifndef __IFsrmDerivedObjectsResult_FWD_DEFINED__
-#define __IFsrmDerivedObjectsResult_FWD_DEFINED__
-typedef struct IFsrmDerivedObjectsResult IFsrmDerivedObjectsResult;
-#endif /* __IFsrmDerivedObjectsResult_FWD_DEFINED__ */
-
-#ifndef __IFsrmExportImport_FWD_DEFINED__
-#define __IFsrmExportImport_FWD_DEFINED__
-typedef struct IFsrmExportImport IFsrmExportImport;
-#endif /* __IFsrmExportImport_FWD_DEFINED__ */
-
-#ifndef __IFsrmFileGroup_FWD_DEFINED__
-#define __IFsrmFileGroup_FWD_DEFINED__
-typedef struct IFsrmFileGroup IFsrmFileGroup;
-#endif /* __IFsrmFileGroup_FWD_DEFINED__ */
-
-#ifndef __IFsrmFileGroupImported_FWD_DEFINED__
-#define __IFsrmFileGroupImported_FWD_DEFINED__
-typedef struct IFsrmFileGroupImported IFsrmFileGroupImported;
-#endif /* __IFsrmFileGroupImported_FWD_DEFINED__ */
+/* Forward declarations */
 
 #ifndef __IFsrmFileGroupManager_FWD_DEFINED__
 #define __IFsrmFileGroupManager_FWD_DEFINED__
-typedef struct IFsrmFileGroupManager IFsrmFileGroupManager;
-#endif /* __IFsrmFileGroupManager_FWD_DEFINED__ */
-
-#ifndef __IFsrmFileManagementJob_FWD_DEFINED__
-#define __IFsrmFileManagementJob_FWD_DEFINED__
-typedef struct IFsrmFileManagementJob IFsrmFileManagementJob;
-#endif /* __IFsrmFileManagementJob_FWD_DEFINED__ */
-
-#ifndef __IFsrmFileManagementJobManager_FWD_DEFINED__
-#define __IFsrmFileManagementJobManager_FWD_DEFINED__
-typedef struct IFsrmFileManagementJobManager IFsrmFileManagementJobManager;
-#endif /* __IFsrmFileManagementJobManager_FWD_DEFINED__ */
-
-#ifndef __IFsrmFileScreen_FWD_DEFINED__
-#define __IFsrmFileScreen_FWD_DEFINED__
-typedef struct IFsrmFileScreen IFsrmFileScreen;
-#endif /* __IFsrmFileScreen_FWD_DEFINED__ */
-
-#ifndef __IFsrmFileScreenBase_FWD_DEFINED__
-#define __IFsrmFileScreenBase_FWD_DEFINED__
-typedef struct IFsrmFileScreenBase IFsrmFileScreenBase;
-#endif /* __IFsrmFileScreenBase_FWD_DEFINED__ */
-
-#ifndef __IFsrmFileScreenException_FWD_DEFINED__
-#define __IFsrmFileScreenException_FWD_DEFINED__
-typedef struct IFsrmFileScreenException IFsrmFileScreenException;
-#endif /* __IFsrmFileScreenException_FWD_DEFINED__ */
+typedef interface IFsrmFileGroupManager IFsrmFileGroupManager;
+#endif
 
 #ifndef __IFsrmFileScreenManager_FWD_DEFINED__
 #define __IFsrmFileScreenManager_FWD_DEFINED__
-typedef struct IFsrmFileScreenManager IFsrmFileScreenManager;
-#endif /* __IFsrmFileScreenManager_FWD_DEFINED__ */
-
-#ifndef __IFsrmFileScreenTemplate_FWD_DEFINED__
-#define __IFsrmFileScreenTemplate_FWD_DEFINED__
-typedef struct IFsrmFileScreenTemplate IFsrmFileScreenTemplate;
-#endif /* __IFsrmFileScreenTemplate_FWD_DEFINED__ */
-
-#ifndef __IFsrmFileScreenTemplateImported_FWD_DEFINED__
-#define __IFsrmFileScreenTemplateImported_FWD_DEFINED__
-typedef struct IFsrmFileScreenTemplateImported IFsrmFileScreenTemplateImported;
-#endif /* __IFsrmFileScreenTemplateImported_FWD_DEFINED__ */
+typedef interface IFsrmFileScreenManager IFsrmFileScreenManager;
+#endif
 
 #ifndef __IFsrmFileScreenTemplateManager_FWD_DEFINED__
 #define __IFsrmFileScreenTemplateManager_FWD_DEFINED__
-typedef struct IFsrmFileScreenTemplateManager IFsrmFileScreenTemplateManager;
-#endif /* __IFsrmFileScreenTemplateManager_FWD_DEFINED__ */
-
-#ifndef __IFsrmMutableCollection_FWD_DEFINED__
-#define __IFsrmMutableCollection_FWD_DEFINED__
-typedef struct IFsrmMutableCollection IFsrmMutableCollection;
-#endif /* __IFsrmMutableCollection_FWD_DEFINED__ */
-
-#ifndef __IFsrmObject_FWD_DEFINED__
-#define __IFsrmObject_FWD_DEFINED__
-typedef struct IFsrmObject IFsrmObject;
-#endif /* __IFsrmObject_FWD_DEFINED__ */
-
-#ifndef __IFsrmPathMapper_FWD_DEFINED__
-#define __IFsrmPathMapper_FWD_DEFINED__
-typedef struct IFsrmPathMapper IFsrmPathMapper;
-#endif /* __IFsrmPathMapper_FWD_DEFINED__ */
-
-#ifndef __IFsrmPipelineModuleConnector_FWD_DEFINED__
-#define __IFsrmPipelineModuleConnector_FWD_DEFINED__
-typedef struct IFsrmPipelineModuleConnector IFsrmPipelineModuleConnector;
-#endif /* __IFsrmPipelineModuleConnector_FWD_DEFINED__ */
-
-#ifndef __IFsrmPipelineModuleDefinition_FWD_DEFINED__
-#define __IFsrmPipelineModuleDefinition_FWD_DEFINED__
-typedef struct IFsrmPipelineModuleDefinition IFsrmPipelineModuleDefinition;
-#endif /* __IFsrmPipelineModuleDefinition_FWD_DEFINED__ */
-
-#ifndef __IFsrmPipelineModuleImplementation_FWD_DEFINED__
-#define __IFsrmPipelineModuleImplementation_FWD_DEFINED__
-typedef struct IFsrmPipelineModuleImplementation IFsrmPipelineModuleImplementation;
-#endif /* __IFsrmPipelineModuleImplementation_FWD_DEFINED__ */
-
-#ifndef __IFsrmProperty_FWD_DEFINED__
-#define __IFsrmProperty_FWD_DEFINED__
-typedef struct IFsrmProperty IFsrmProperty;
-#endif /* __IFsrmProperty_FWD_DEFINED__ */
-
-#ifndef __IFsrmPropertyBag_FWD_DEFINED__
-#define __IFsrmPropertyBag_FWD_DEFINED__
-typedef struct IFsrmPropertyBag IFsrmPropertyBag;
-#endif /* __IFsrmPropertyBag_FWD_DEFINED__ */
-
-#ifndef __IFsrmPropertyCondition_FWD_DEFINED__
-#define __IFsrmPropertyCondition_FWD_DEFINED__
-typedef struct IFsrmPropertyCondition IFsrmPropertyCondition;
-#endif /* __IFsrmPropertyCondition_FWD_DEFINED__ */
-
-#ifndef __IFsrmPropertyDefinition_FWD_DEFINED__
-#define __IFsrmPropertyDefinition_FWD_DEFINED__
-typedef struct IFsrmPropertyDefinition IFsrmPropertyDefinition;
-#endif /* __IFsrmPropertyDefinition_FWD_DEFINED__ */
-
-#ifndef __IFsrmQuota_FWD_DEFINED__
-#define __IFsrmQuota_FWD_DEFINED__
-typedef struct IFsrmQuota IFsrmQuota;
-#endif /* __IFsrmQuota_FWD_DEFINED__ */
-
-#ifndef __IFsrmQuotaBase_FWD_DEFINED__
-#define __IFsrmQuotaBase_FWD_DEFINED__
-typedef struct IFsrmQuotaBase IFsrmQuotaBase;
-#endif /* __IFsrmQuotaBase_FWD_DEFINED__ */
-
-#ifndef __IFsrmQuotaManager_FWD_DEFINED__
-#define __IFsrmQuotaManager_FWD_DEFINED__
-typedef struct IFsrmQuotaManager IFsrmQuotaManager;
-#endif /* __IFsrmQuotaManager_FWD_DEFINED__ */
-
-#ifndef __IFsrmQuotaManagerEx_FWD_DEFINED__
-#define __IFsrmQuotaManagerEx_FWD_DEFINED__
-typedef struct IFsrmQuotaManagerEx IFsrmQuotaManagerEx;
-#endif /* __IFsrmQuotaManagerEx_FWD_DEFINED__ */
-
-#ifndef __IFsrmQuotaObject_FWD_DEFINED__
-#define __IFsrmQuotaObject_FWD_DEFINED__
-typedef struct IFsrmQuotaObject IFsrmQuotaObject;
-#endif /* __IFsrmQuotaObject_FWD_DEFINED__ */
-
-#ifndef __IFsrmQuotaTemplate_FWD_DEFINED__
-#define __IFsrmQuotaTemplate_FWD_DEFINED__
-typedef struct IFsrmQuotaTemplate IFsrmQuotaTemplate;
-#endif /* __IFsrmQuotaTemplate_FWD_DEFINED__ */
-
-#ifndef __IFsrmQuotaTemplateImported_FWD_DEFINED__
-#define __IFsrmQuotaTemplateImported_FWD_DEFINED__
-typedef struct IFsrmQuotaTemplateImported IFsrmQuotaTemplateImported;
-#endif /* __IFsrmQuotaTemplateImported_FWD_DEFINED__ */
-
-#ifndef __IFsrmQuotaTemplateManager_FWD_DEFINED__
-#define __IFsrmQuotaTemplateManager_FWD_DEFINED__
-typedef struct IFsrmQuotaTemplateManager IFsrmQuotaTemplateManager;
-#endif /* __IFsrmQuotaTemplateManager_FWD_DEFINED__ */
-
-#ifndef __IFsrmReport_FWD_DEFINED__
-#define __IFsrmReport_FWD_DEFINED__
-typedef struct IFsrmReport IFsrmReport;
-#endif /* __IFsrmReport_FWD_DEFINED__ */
-
-#ifndef __IFsrmReportJob_FWD_DEFINED__
-#define __IFsrmReportJob_FWD_DEFINED__
-typedef struct IFsrmReportJob IFsrmReportJob;
-#endif /* __IFsrmReportJob_FWD_DEFINED__ */
-
-#ifndef __IFsrmReportManager_FWD_DEFINED__
-#define __IFsrmReportManager_FWD_DEFINED__
-typedef struct IFsrmReportManager IFsrmReportManager;
-#endif /* __IFsrmReportManager_FWD_DEFINED__ */
-
-#ifndef __IFsrmReportScheduler_FWD_DEFINED__
-#define __IFsrmReportScheduler_FWD_DEFINED__
-typedef struct IFsrmReportScheduler IFsrmReportScheduler;
-#endif /* __IFsrmReportScheduler_FWD_DEFINED__ */
-
-#ifndef __IFsrmRule_FWD_DEFINED__
-#define __IFsrmRule_FWD_DEFINED__
-typedef struct IFsrmRule IFsrmRule;
-#endif /* __IFsrmRule_FWD_DEFINED__ */
-
-#ifndef __IFsrmSetting_FWD_DEFINED__
-#define __IFsrmSetting_FWD_DEFINED__
-typedef struct IFsrmSetting IFsrmSetting;
-#endif /* __IFsrmSetting_FWD_DEFINED__ */
-
-#ifndef __IFsrmStorageModuleDefinition_FWD_DEFINED__
-#define __IFsrmStorageModuleDefinition_FWD_DEFINED__
-typedef struct IFsrmStorageModuleDefinition IFsrmStorageModuleDefinition;
-#endif /* __IFsrmStorageModuleDefinition_FWD_DEFINED__ */
-
-#ifndef __IFsrmStorageModuleImplementation_FWD_DEFINED__
-#define __IFsrmStorageModuleImplementation_FWD_DEFINED__
-typedef struct IFsrmStorageModuleImplementation IFsrmStorageModuleImplementation;
-#endif /* __IFsrmStorageModuleImplementation_FWD_DEFINED__ */
-
-#undef  INTERFACE
-#define INTERFACE IFsrmFileGroup
-#ifdef __GNUC__
-#warning COM interfaces layout in this header has not been verified.
-#warning COM interfaces with incorrect layout may not work at all.
-__MINGW_BROKEN_INTERFACE(INTERFACE)
+typedef interface IFsrmFileScreenTemplateManager IFsrmFileScreenTemplateManager;
 #endif
-DECLARE_INTERFACE_(IFsrmFileGroup,IFsrmObject)
+
+#ifndef __IFsrmFileGroup_FWD_DEFINED__
+#define __IFsrmFileGroup_FWD_DEFINED__
+typedef interface IFsrmFileGroup IFsrmFileGroup;
+#endif
+
+#ifndef __IFsrmFileScreenBase_FWD_DEFINED__
+#define __IFsrmFileScreenBase_FWD_DEFINED__
+typedef interface IFsrmFileScreenBase IFsrmFileScreenBase;
+#endif
+
+#ifndef __IFsrmFileScreenException_FWD_DEFINED__
+#define __IFsrmFileScreenException_FWD_DEFINED__
+typedef interface IFsrmFileScreenException IFsrmFileScreenException;
+#endif
+
+#ifndef __IFsrmFileScreen_FWD_DEFINED__
+#define __IFsrmFileScreen_FWD_DEFINED__
+typedef interface IFsrmFileScreen IFsrmFileScreen;
+#endif
+
+#ifndef __IFsrmFileGroupImported_FWD_DEFINED__
+#define __IFsrmFileGroupImported_FWD_DEFINED__
+typedef interface IFsrmFileGroupImported IFsrmFileGroupImported;
+#endif
+
+#ifndef __IFsrmFileScreenTemplate_FWD_DEFINED__
+#define __IFsrmFileScreenTemplate_FWD_DEFINED__
+typedef interface IFsrmFileScreenTemplate IFsrmFileScreenTemplate;
+#endif
+
+#ifndef __IFsrmFileScreenTemplateImported_FWD_DEFINED__
+#define __IFsrmFileScreenTemplateImported_FWD_DEFINED__
+typedef interface IFsrmFileScreenTemplateImported IFsrmFileScreenTemplateImported;
+#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 __IFsrmFileGroup_FWD_DEFINED__
+#define __IFsrmFileGroup_FWD_DEFINED__
+typedef interface IFsrmFileGroup IFsrmFileGroup;
+#endif
+
+#ifndef __IFsrmFileGroupImported_FWD_DEFINED__
+#define __IFsrmFileGroupImported_FWD_DEFINED__
+typedef interface IFsrmFileGroupImported IFsrmFileGroupImported;
+#endif
+
+#ifndef __IFsrmFileGroupManager_FWD_DEFINED__
+#define __IFsrmFileGroupManager_FWD_DEFINED__
+typedef interface IFsrmFileGroupManager IFsrmFileGroupManager;
+#endif
+
+#ifndef __IFsrmFileScreen_FWD_DEFINED__
+#define __IFsrmFileScreen_FWD_DEFINED__
+typedef interface IFsrmFileScreen IFsrmFileScreen;
+#endif
+
+#ifndef __IFsrmFileScreenBase_FWD_DEFINED__
+#define __IFsrmFileScreenBase_FWD_DEFINED__
+typedef interface IFsrmFileScreenBase IFsrmFileScreenBase;
+#endif
+
+#ifndef __IFsrmFileScreenException_FWD_DEFINED__
+#define __IFsrmFileScreenException_FWD_DEFINED__
+typedef interface IFsrmFileScreenException IFsrmFileScreenException;
+#endif
+
+#ifndef __IFsrmFileScreenManager_FWD_DEFINED__
+#define __IFsrmFileScreenManager_FWD_DEFINED__
+typedef interface IFsrmFileScreenManager IFsrmFileScreenManager;
+#endif
+
+#ifndef __IFsrmFileScreenTemplate_FWD_DEFINED__
+#define __IFsrmFileScreenTemplate_FWD_DEFINED__
+typedef interface IFsrmFileScreenTemplate IFsrmFileScreenTemplate;
+#endif
+
+#ifndef __IFsrmFileScreenTemplateImported_FWD_DEFINED__
+#define __IFsrmFileScreenTemplateImported_FWD_DEFINED__
+typedef interface IFsrmFileScreenTemplateImported IFsrmFileScreenTemplateImported;
+#endif
+
+#ifndef __IFsrmFileScreenTemplateManager_FWD_DEFINED__
+#define __IFsrmFileScreenTemplateManager_FWD_DEFINED__
+typedef interface IFsrmFileScreenTemplateManager IFsrmFileScreenTemplateManager;
+#endif
+
+#define FSRM_DISPID_FILEGROUP (FSRM_DISPID_FEATURE_FILESCREEN | 0x100000)
+
+#define FSRM_DISPID_FILEGROUP_IMPORTED (FSRM_DISPID_FILEGROUP | 0x10000)
+
+#define FSRM_DISPID_FILEGROUP_MANAGER (FSRM_DISPID_FEATURE_FILESCREEN | 0x200000)
+
+#define FSRM_DISPID_FILESCREEN_BASE (FSRM_DISPID_FEATURE_FILESCREEN | 0x300000)
+
+#define FSRM_DISPID_FILESCREEN (FSRM_DISPID_FILESCREEN_BASE | 0x10000)
+
+#define FSRM_DISPID_FILESCREEN_TEMPLATE (FSRM_DISPID_FILESCREEN_BASE | 0x20000)
+
+#define FSRM_DISPID_FILESCREEN_TEMPLATE_IMPORTED (FSRM_DISPID_FILESCREEN_TEMPLATE | 0x1000)
+
+#define FSRM_DISPID_FILESCREEN_EXCEPTION (FSRM_DISPID_FEATURE_FILESCREEN | 0x400000)
+
+#define FSRM_DISPID_FILESCREEN_MANAGER (FSRM_DISPID_FEATURE_FILESCREEN | 0x500000)
+
+#define FSRM_DISPID_FILESCREEN_TEMPLATE_MANAGER (FSRM_DISPID_FEATURE_FILESCREEN | 0x600000)
+
+/*****************************************************************************
+ * IFsrmFileGroupManager interface
+ */
+#ifndef __IFsrmFileGroupManager_INTERFACE_DEFINED__
+#define __IFsrmFileGroupManager_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IFsrmFileGroupManager, 0x426677d5, 0x018c, 0x485c, 0x8a,0x51, 0x20,0xb8,0x6d,0x00,0xbd,0xc4);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("426677d5-018c-485c-8a51-20b86d00bdc4")
+IFsrmFileGroupManager : public IDispatch
 {
+    virtual HRESULT STDMETHODCALLTYPE CreateFileGroup(
+        IFsrmFileGroup **fileGroup) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFileGroup(
+        BSTR name,
+        IFsrmFileGroup **fileGroup) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EnumFileGroups(
+        FsrmEnumOptions options = FsrmEnumOptions_None,
+        IFsrmCommittableCollection **fileGroups) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ExportFileGroups(
+        VARIANT *fileGroupNamesArray = 0,
+        BSTR *serializedFileGroups) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ImportFileGroups(
+        BSTR serializedFileGroups,
+        VARIANT *fileGroupNamesArray = 0,
+        IFsrmCommittableCollection **fileGroups) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IFsrmFileGroupManager, 0x426677d5, 0x018c, 0x485c, 0x8a,0x51, 0x20,0xb8,0x6d,0x00,0xbd,0xc4)
+#endif
+#else
+typedef struct IFsrmFileGroupManagerVtbl {
     BEGIN_INTERFACE
 
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFsrmFileGroupManager* This,
+        REFIID riid,
+        void **ppvObject);
 
-    /* IDispatch methods */
-    STDMETHOD_(HRESULT,GetTypeInfoCount)(THIS_ unsigned int FAR*  pctinfo) PURE;
-    STDMETHOD_(HRESULT,GetTypeInfo)(THIS_ unsigned int  iTInfo,LCID  lcid,ITypeInfo FAR* FAR*  ppTInfo) PURE;
-    STDMETHOD_(HRESULT,GetIDsOfNames)(THIS_ REFIID  riid,OLECHAR FAR* FAR*  rgszNames,unsigned int  cNames,LCID   lcid,DISPID FAR*  rgDispId) PURE;
-    STDMETHOD_(HRESULT,Invoke)(THIS_ DISPID  dispIdMember,REFIID  riid,LCID  lcid,WORD  wFlags,DISPPARAMS FAR*  pDispParams,VARIANT FAR*  pVarResult,EXCEPINFO FAR*  pExcepInfo,unsigned int FAR*  puArgErr) PURE;
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFsrmFileGroupManager* This);
 
-    /* IFsrmObject methods */
-    STDMETHOD_(HRESULT,get_Id)(THIS_ FSRM_OBJECT_ID *id) PURE;
-    STDMETHOD_(HRESULT,get_Description)(THIS_ BSTR *description) PURE;
-    STDMETHOD_(HRESULT,put_Description)(THIS_ BSTR description) PURE;
-    STDMETHOD_(HRESULT,Delete)(THIS) PURE;
-    STDMETHOD_(HRESULT,Commit)(THIS) PURE;
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFsrmFileGroupManager* This);
 
-    /* IFsrmFileGroup methods */
-    STDMETHOD_(HRESULT,get_Name)(THIS_ BSTR *name) PURE;
-    STDMETHOD_(HRESULT,put_Name)(THIS_ BSTR name) PURE;
-    STDMETHOD_(HRESULT,get_Members)(THIS_ IFsrmMutableCollection **members) PURE;
-    STDMETHOD_(HRESULT,put_Members)(THIS_ IFsrmMutableCollection *members) PURE;
-    STDMETHOD_(HRESULT,get_NonMembers)(THIS_ IFsrmMutableCollection **nonMembers) PURE;
-    STDMETHOD_(HRESULT,put_NonMembers)(THIS_ IFsrmMutableCollection *nonMembers) PURE;
+    /*** IDispatch methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
+        IFsrmFileGroupManager* This,
+        UINT *pctinfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
+        IFsrmFileGroupManager* This,
+        UINT iTInfo,
+        LCID lcid,
+        ITypeInfo **ppTInfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
+        IFsrmFileGroupManager* This,
+        REFIID riid,
+        LPOLESTR *rgszNames,
+        UINT cNames,
+        LCID lcid,
+        DISPID *rgDispId);
+
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        IFsrmFileGroupManager* This,
+        DISPID dispIdMember,
+        REFIID riid,
+        LCID lcid,
+        WORD wFlags,
+        DISPPARAMS *pDispParams,
+        VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo,
+        UINT *puArgErr);
+
+    /*** IFsrmFileGroupManager methods ***/
+    HRESULT (STDMETHODCALLTYPE *CreateFileGroup)(
+        IFsrmFileGroupManager* This,
+        IFsrmFileGroup **fileGroup);
+
+    HRESULT (STDMETHODCALLTYPE *GetFileGroup)(
+        IFsrmFileGroupManager* This,
+        BSTR name,
+        IFsrmFileGroup **fileGroup);
+
+    HRESULT (STDMETHODCALLTYPE *EnumFileGroups)(
+        IFsrmFileGroupManager* This,
+        FsrmEnumOptions options,
+        IFsrmCommittableCollection **fileGroups);
+
+    HRESULT (STDMETHODCALLTYPE *ExportFileGroups)(
+        IFsrmFileGroupManager* This,
+        VARIANT *fileGroupNamesArray,
+        BSTR *serializedFileGroups);
+
+    HRESULT (STDMETHODCALLTYPE *ImportFileGroups)(
+        IFsrmFileGroupManager* This,
+        BSTR serializedFileGroups,
+        VARIANT *fileGroupNamesArray,
+        IFsrmCommittableCollection **fileGroups);
 
     END_INTERFACE
+} IFsrmFileGroupManagerVtbl;
+interface IFsrmFileGroupManager {
+    CONST_VTBL IFsrmFileGroupManagerVtbl* lpVtbl;
 };
+
 #ifdef COBJMACROS
-#define IFsrmFileGroup_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IFsrmFileGroup_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IFsrmFileGroup_Release(This) (This)->lpVtbl->Release(This)
-#define IFsrmFileGroup_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
-#define IFsrmFileGroup_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
-#define IFsrmFileGroup_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
-#define IFsrmFileGroup_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
-#define IFsrmFileGroup_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
-#define IFsrmFileGroup_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
-#define IFsrmFileGroup_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
-#define IFsrmFileGroup_Delete() (This)->lpVtbl->Delete(This)
-#define IFsrmFileGroup_Commit() (This)->lpVtbl->Commit(This)
-#define IFsrmFileGroup_get_Name(This,name) (This)->lpVtbl->get_Name(This,name)
-#define IFsrmFileGroup_put_Name(This,name) (This)->lpVtbl->put_Name(This,name)
-#define IFsrmFileGroup_get_Members(This,members) (This)->lpVtbl->get_Members(This,members)
-#define IFsrmFileGroup_put_Members(This,members) (This)->lpVtbl->put_Members(This,members)
-#define IFsrmFileGroup_get_NonMembers(This,nonMembers) (This)->lpVtbl->get_NonMembers(This,nonMembers)
-#define IFsrmFileGroup_put_NonMembers(This,nonMembers) (This)->lpVtbl->put_NonMembers(This,nonMembers)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmFileGroupImported
-#ifdef __GNUC__
-#warning COM interfaces layout in this header has not been verified.
-#warning COM interfaces with incorrect layout may not work at all.
-__MINGW_BROKEN_INTERFACE(INTERFACE)
-#endif
-DECLARE_INTERFACE_(IFsrmFileGroupImported,IFsrmFileGroup)
-{
-    BEGIN_INTERFACE
-
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-
-    /* IDispatch methods */
-    STDMETHOD_(HRESULT,GetTypeInfoCount)(THIS_ unsigned int FAR*  pctinfo) PURE;
-    STDMETHOD_(HRESULT,GetTypeInfo)(THIS_ unsigned int  iTInfo,LCID  lcid,ITypeInfo FAR* FAR*  ppTInfo) PURE;
-    STDMETHOD_(HRESULT,GetIDsOfNames)(THIS_ REFIID  riid,OLECHAR FAR* FAR*  rgszNames,unsigned int  cNames,LCID   lcid,DISPID FAR*  rgDispId) PURE;
-    STDMETHOD_(HRESULT,Invoke)(THIS_ DISPID  dispIdMember,REFIID  riid,LCID  lcid,WORD  wFlags,DISPPARAMS FAR*  pDispParams,VARIANT FAR*  pVarResult,EXCEPINFO FAR*  pExcepInfo,unsigned int FAR*  puArgErr) PURE;
-
-    /* IFsrmObject methods */
-    STDMETHOD_(HRESULT,get_Id)(THIS_ FSRM_OBJECT_ID *id) PURE;
-    STDMETHOD_(HRESULT,get_Description)(THIS_ BSTR *description) PURE;
-    STDMETHOD_(HRESULT,put_Description)(THIS_ BSTR description) PURE;
-    STDMETHOD_(HRESULT,Delete)(THIS) PURE;
-    STDMETHOD_(HRESULT,Commit)(THIS) PURE;
-
-    /* IFsrmFileGroup methods */
-    STDMETHOD_(HRESULT,get_Name)(THIS_ BSTR *name) PURE;
-    STDMETHOD_(HRESULT,put_Name)(THIS_ BSTR name) PURE;
-    STDMETHOD_(HRESULT,get_Members)(THIS_ IFsrmMutableCollection **members) PURE;
-    STDMETHOD_(HRESULT,put_Members)(THIS_ IFsrmMutableCollection *members) PURE;
-    STDMETHOD_(HRESULT,get_NonMembers)(THIS_ IFsrmMutableCollection **nonMembers) PURE;
-    STDMETHOD_(HRESULT,put_NonMembers)(THIS_ IFsrmMutableCollection *nonMembers) PURE;
-
-    /* IFsrmFileGroupImported methods */
-    STDMETHOD_(HRESULT,get_OverwriteOnCommit)(THIS_ VARIANT_BOOL *overwrite) PURE;
-    STDMETHOD_(HRESULT,put_OverwriteOnCommit)(THIS_ VARIANT_BOOL overwrite) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IFsrmFileGroupImported_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IFsrmFileGroupImported_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IFsrmFileGroupImported_Release(This) (This)->lpVtbl->Release(This)
-#define IFsrmFileGroupImported_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
-#define IFsrmFileGroupImported_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
-#define IFsrmFileGroupImported_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
-#define IFsrmFileGroupImported_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
-#define IFsrmFileGroupImported_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
-#define IFsrmFileGroupImported_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
-#define IFsrmFileGroupImported_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
-#define IFsrmFileGroupImported_Delete() (This)->lpVtbl->Delete(This)
-#define IFsrmFileGroupImported_Commit() (This)->lpVtbl->Commit(This)
-#define IFsrmFileGroupImported_get_Name(This,name) (This)->lpVtbl->get_Name(This,name)
-#define IFsrmFileGroupImported_put_Name(This,name) (This)->lpVtbl->put_Name(This,name)
-#define IFsrmFileGroupImported_get_Members(This,members) (This)->lpVtbl->get_Members(This,members)
-#define IFsrmFileGroupImported_put_Members(This,members) (This)->lpVtbl->put_Members(This,members)
-#define IFsrmFileGroupImported_get_NonMembers(This,nonMembers) (This)->lpVtbl->get_NonMembers(This,nonMembers)
-#define IFsrmFileGroupImported_put_NonMembers(This,nonMembers) (This)->lpVtbl->put_NonMembers(This,nonMembers)
-#define IFsrmFileGroupImported_get_OverwriteOnCommit(This,overwrite) (This)->lpVtbl->get_OverwriteOnCommit(This,overwrite)
-#define IFsrmFileGroupImported_put_OverwriteOnCommit(This,overwrite) (This)->lpVtbl->put_OverwriteOnCommit(This,overwrite)
-#endif /*COBJMACROS*/
-
-
-#undef  INTERFACE
-#define INTERFACE IFsrmFileGroupManager
-#ifdef __GNUC__
-#warning COM interfaces layout in this header has not been verified.
-#warning COM interfaces with incorrect layout may not work at all.
-__MINGW_BROKEN_INTERFACE(INTERFACE)
-#endif
-DECLARE_INTERFACE_(IFsrmFileGroupManager,IDispatch)
-{
-    BEGIN_INTERFACE
-
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-
-    /* IDispatch methods */
-    STDMETHOD_(HRESULT,GetTypeInfoCount)(THIS_ unsigned int FAR*  pctinfo) PURE;
-    STDMETHOD_(HRESULT,GetTypeInfo)(THIS_ unsigned int  iTInfo,LCID  lcid,ITypeInfo FAR* FAR*  ppTInfo) PURE;
-    STDMETHOD_(HRESULT,GetIDsOfNames)(THIS_ REFIID  riid,OLECHAR FAR* FAR*  rgszNames,unsigned int  cNames,LCID   lcid,DISPID FAR*  rgDispId) PURE;
-    STDMETHOD_(HRESULT,Invoke)(THIS_ DISPID  dispIdMember,REFIID  riid,LCID  lcid,WORD  wFlags,DISPPARAMS FAR*  pDispParams,VARIANT FAR*  pVarResult,EXCEPINFO FAR*  pExcepInfo,unsigned int FAR*  puArgErr) PURE;
-
-    /* IFsrmFileGroupManager methods */
-    STDMETHOD_(HRESULT,CreateFileGroup)(THIS_ IFsrmFileGroup **fileGroup) PURE;
-    STDMETHOD_(HRESULT,GetFileGroup)(THIS_ BSTR name,IFsrmFileGroup **fileGroup) PURE;
-    STDMETHOD_(HRESULT,EnumFileGroups)(THIS_ FsrmEnumOptions options,IFsrmCommittableCollection **fileGroups) PURE;
-    STDMETHOD_(HRESULT,ExportFileGroups)(THIS_ VARIANT *fileGroupNamesArray,BSTR *serializedFileGroups) PURE;
-    STDMETHOD_(HRESULT,ImportFileGroups)(THIS_ BSTR serializedFileGroups,VARIANT *fileGroupNamesArray,IFsrmCommittableCollection **fileGroups) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
 #define IFsrmFileGroupManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
 #define IFsrmFileGroupManager_AddRef(This) (This)->lpVtbl->AddRef(This)
 #define IFsrmFileGroupManager_Release(This) (This)->lpVtbl->Release(This)
+/*** IDispatch methods ***/
 #define IFsrmFileGroupManager_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
 #define IFsrmFileGroupManager_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
 #define IFsrmFileGroupManager_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
 #define IFsrmFileGroupManager_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
+/*** IFsrmFileGroupManager methods ***/
 #define IFsrmFileGroupManager_CreateFileGroup(This,fileGroup) (This)->lpVtbl->CreateFileGroup(This,fileGroup)
 #define IFsrmFileGroupManager_GetFileGroup(This,name,fileGroup) (This)->lpVtbl->GetFileGroup(This,name,fileGroup)
 #define IFsrmFileGroupManager_EnumFileGroups(This,options,fileGroups) (This)->lpVtbl->EnumFileGroups(This,options,fileGroups)
 #define IFsrmFileGroupManager_ExportFileGroups(This,fileGroupNamesArray,serializedFileGroups) (This)->lpVtbl->ExportFileGroups(This,fileGroupNamesArray,serializedFileGroups)
 #define IFsrmFileGroupManager_ImportFileGroups(This,serializedFileGroups,fileGroupNamesArray,fileGroups) (This)->lpVtbl->ImportFileGroups(This,serializedFileGroups,fileGroupNamesArray,fileGroups)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmFileScreenBase
-#ifdef __GNUC__
-#warning COM interfaces layout in this header has not been verified.
-#warning COM interfaces with incorrect layout may not work at all.
-__MINGW_BROKEN_INTERFACE(INTERFACE)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IFsrmFileGroupManager_QueryInterface(IFsrmFileGroupManager* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmFileGroupManager_AddRef(IFsrmFileGroupManager* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmFileGroupManager_Release(IFsrmFileGroupManager* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmFileGroupManager_GetTypeInfoCount(IFsrmFileGroupManager* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmFileGroupManager_GetTypeInfo(IFsrmFileGroupManager* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE HRESULT IFsrmFileGroupManager_GetIDsOfNames(IFsrmFileGroupManager* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
+    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
+}
+static FORCEINLINE HRESULT IFsrmFileGroupManager_Invoke(IFsrmFileGroupManager* 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);
+}
+/*** IFsrmFileGroupManager methods ***/
+static FORCEINLINE HRESULT IFsrmFileGroupManager_CreateFileGroup(IFsrmFileGroupManager* This,IFsrmFileGroup **fileGroup) {
+    return This->lpVtbl->CreateFileGroup(This,fileGroup);
+}
+static FORCEINLINE HRESULT IFsrmFileGroupManager_GetFileGroup(IFsrmFileGroupManager* This,BSTR name,IFsrmFileGroup **fileGroup) {
+    return This->lpVtbl->GetFileGroup(This,name,fileGroup);
+}
+static FORCEINLINE HRESULT IFsrmFileGroupManager_EnumFileGroups(IFsrmFileGroupManager* This,FsrmEnumOptions options,IFsrmCommittableCollection **fileGroups) {
+    return This->lpVtbl->EnumFileGroups(This,options,fileGroups);
+}
+static FORCEINLINE HRESULT IFsrmFileGroupManager_ExportFileGroups(IFsrmFileGroupManager* This,VARIANT *fileGroupNamesArray,BSTR *serializedFileGroups) {
+    return This->lpVtbl->ExportFileGroups(This,fileGroupNamesArray,serializedFileGroups);
+}
+static FORCEINLINE HRESULT IFsrmFileGroupManager_ImportFileGroups(IFsrmFileGroupManager* This,BSTR serializedFileGroups,VARIANT *fileGroupNamesArray,IFsrmCommittableCollection **fileGroups) {
+    return This->lpVtbl->ImportFileGroups(This,serializedFileGroups,fileGroupNamesArray,fileGroups);
+}
 #endif
-DECLARE_INTERFACE_(IFsrmFileScreenBase,IFsrmObject)
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmFileGroupManager_CreateFileGroup_Proxy(
+    IFsrmFileGroupManager* This,
+    IFsrmFileGroup **fileGroup);
+void __RPC_STUB IFsrmFileGroupManager_CreateFileGroup_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileGroupManager_GetFileGroup_Proxy(
+    IFsrmFileGroupManager* This,
+    BSTR name,
+    IFsrmFileGroup **fileGroup);
+void __RPC_STUB IFsrmFileGroupManager_GetFileGroup_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileGroupManager_EnumFileGroups_Proxy(
+    IFsrmFileGroupManager* This,
+    FsrmEnumOptions options,
+    IFsrmCommittableCollection **fileGroups);
+void __RPC_STUB IFsrmFileGroupManager_EnumFileGroups_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileGroupManager_ExportFileGroups_Proxy(
+    IFsrmFileGroupManager* This,
+    VARIANT *fileGroupNamesArray,
+    BSTR *serializedFileGroups);
+void __RPC_STUB IFsrmFileGroupManager_ExportFileGroups_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileGroupManager_ImportFileGroups_Proxy(
+    IFsrmFileGroupManager* This,
+    BSTR serializedFileGroups,
+    VARIANT *fileGroupNamesArray,
+    IFsrmCommittableCollection **fileGroups);
+void __RPC_STUB IFsrmFileGroupManager_ImportFileGroups_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IFsrmFileGroupManager_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IFsrmFileScreenManager interface
+ */
+#ifndef __IFsrmFileScreenManager_INTERFACE_DEFINED__
+#define __IFsrmFileScreenManager_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IFsrmFileScreenManager, 0xff4fa04e, 0x5a94, 0x4bda, 0xa3,0xa0, 0xd5,0xb4,0xd3,0xc5,0x2e,0xba);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("ff4fa04e-5a94-4bda-a3a0-d5b4d3c52eba")
+IFsrmFileScreenManager : public IDispatch
 {
+    virtual HRESULT STDMETHODCALLTYPE get_ActionVariables(
+        SAFEARRAY **variables) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_ActionVariableDescriptions(
+        SAFEARRAY **descriptions) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateFileScreen(
+        BSTR path,
+        IFsrmFileScreen **fileScreen) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFileScreen(
+        BSTR path,
+        IFsrmFileScreen **fileScreen) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EnumFileScreens(
+        BSTR path = L"",
+        FsrmEnumOptions options = FsrmEnumOptions_None,
+        IFsrmCommittableCollection **fileScreens) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateFileScreenException(
+        BSTR path,
+        IFsrmFileScreenException **fileScreenException) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFileScreenException(
+        BSTR path,
+        IFsrmFileScreenException **fileScreenException) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EnumFileScreenExceptions(
+        BSTR path = L"",
+        FsrmEnumOptions options = FsrmEnumOptions_None,
+        IFsrmCommittableCollection **fileScreenExceptions) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateFileScreenCollection(
+        IFsrmCommittableCollection **collection) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IFsrmFileScreenManager, 0xff4fa04e, 0x5a94, 0x4bda, 0xa3,0xa0, 0xd5,0xb4,0xd3,0xc5,0x2e,0xba)
+#endif
+#else
+typedef struct IFsrmFileScreenManagerVtbl {
     BEGIN_INTERFACE
 
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFsrmFileScreenManager* This,
+        REFIID riid,
+        void **ppvObject);
 
-    /* IDispatch methods */
-    STDMETHOD_(HRESULT,GetTypeInfoCount)(THIS_ unsigned int FAR*  pctinfo) PURE;
-    STDMETHOD_(HRESULT,GetTypeInfo)(THIS_ unsigned int  iTInfo,LCID  lcid,ITypeInfo FAR* FAR*  ppTInfo) PURE;
-    STDMETHOD_(HRESULT,GetIDsOfNames)(THIS_ REFIID  riid,OLECHAR FAR* FAR*  rgszNames,unsigned int  cNames,LCID   lcid,DISPID FAR*  rgDispId) PURE;
-    STDMETHOD_(HRESULT,Invoke)(THIS_ DISPID  dispIdMember,REFIID  riid,LCID  lcid,WORD  wFlags,DISPPARAMS FAR*  pDispParams,VARIANT FAR*  pVarResult,EXCEPINFO FAR*  pExcepInfo,unsigned int FAR*  puArgErr) PURE;
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFsrmFileScreenManager* This);
 
-    /* IFsrmObject methods */
-    STDMETHOD_(HRESULT,get_Id)(THIS_ FSRM_OBJECT_ID *id) PURE;
-    STDMETHOD_(HRESULT,get_Description)(THIS_ BSTR *description) PURE;
-    STDMETHOD_(HRESULT,put_Description)(THIS_ BSTR description) PURE;
-    STDMETHOD_(HRESULT,Delete)(THIS) PURE;
-    STDMETHOD_(HRESULT,Commit)(THIS) PURE;
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFsrmFileScreenManager* This);
 
-    /* IFsrmFileScreenBase methods */
-    STDMETHOD_(HRESULT,get_BlockedFileGroups)(THIS_ IFsrmMutableCollection **blockList) PURE;
-    STDMETHOD_(HRESULT,put_BlockedFileGroups)(THIS_ IFsrmMutableCollection *blockList) PURE;
-    STDMETHOD_(HRESULT,get_FileScreenFlags)(THIS_ __LONG32 *fileScreenFlags) PURE;
-    STDMETHOD_(HRESULT,put_FileScreenFlags)(THIS_ __LONG32 fileScreenFlags) PURE;
-    STDMETHOD_(HRESULT,get_UserSid)(THIS_ BSTR *userSid) PURE;
-    STDMETHOD_(HRESULT,get_UserAccount)(THIS_ BSTR *userAccount) PURE;
-    STDMETHOD_(HRESULT,CreateAction)(THIS_ FsrmActionType actionType,IFsrmAction **action) PURE;
-    STDMETHOD_(HRESULT,EnumActions)(THIS_ IFsrmCollection **actions) PURE;
+    /*** IDispatch methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
+        IFsrmFileScreenManager* This,
+        UINT *pctinfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
+        IFsrmFileScreenManager* This,
+        UINT iTInfo,
+        LCID lcid,
+        ITypeInfo **ppTInfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
+        IFsrmFileScreenManager* This,
+        REFIID riid,
+        LPOLESTR *rgszNames,
+        UINT cNames,
+        LCID lcid,
+        DISPID *rgDispId);
+
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        IFsrmFileScreenManager* This,
+        DISPID dispIdMember,
+        REFIID riid,
+        LCID lcid,
+        WORD wFlags,
+        DISPPARAMS *pDispParams,
+        VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo,
+        UINT *puArgErr);
+
+    /*** IFsrmFileScreenManager methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_ActionVariables)(
+        IFsrmFileScreenManager* This,
+        SAFEARRAY **variables);
+
+    HRESULT (STDMETHODCALLTYPE *get_ActionVariableDescriptions)(
+        IFsrmFileScreenManager* This,
+        SAFEARRAY **descriptions);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFileScreen)(
+        IFsrmFileScreenManager* This,
+        BSTR path,
+        IFsrmFileScreen **fileScreen);
+
+    HRESULT (STDMETHODCALLTYPE *GetFileScreen)(
+        IFsrmFileScreenManager* This,
+        BSTR path,
+        IFsrmFileScreen **fileScreen);
+
+    HRESULT (STDMETHODCALLTYPE *EnumFileScreens)(
+        IFsrmFileScreenManager* This,
+        BSTR path,
+        FsrmEnumOptions options,
+        IFsrmCommittableCollection **fileScreens);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFileScreenException)(
+        IFsrmFileScreenManager* This,
+        BSTR path,
+        IFsrmFileScreenException **fileScreenException);
+
+    HRESULT (STDMETHODCALLTYPE *GetFileScreenException)(
+        IFsrmFileScreenManager* This,
+        BSTR path,
+        IFsrmFileScreenException **fileScreenException);
+
+    HRESULT (STDMETHODCALLTYPE *EnumFileScreenExceptions)(
+        IFsrmFileScreenManager* This,
+        BSTR path,
+        FsrmEnumOptions options,
+        IFsrmCommittableCollection **fileScreenExceptions);
+
+    HRESULT (STDMETHODCALLTYPE *CreateFileScreenCollection)(
+        IFsrmFileScreenManager* This,
+        IFsrmCommittableCollection **collection);
 
     END_INTERFACE
+} IFsrmFileScreenManagerVtbl;
+interface IFsrmFileScreenManager {
+    CONST_VTBL IFsrmFileScreenManagerVtbl* lpVtbl;
 };
+
 #ifdef COBJMACROS
-#define IFsrmFileScreenBase_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IFsrmFileScreenBase_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IFsrmFileScreenBase_Release(This) (This)->lpVtbl->Release(This)
-#define IFsrmFileScreenBase_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
-#define IFsrmFileScreenBase_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
-#define IFsrmFileScreenBase_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
-#define IFsrmFileScreenBase_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
-#define IFsrmFileScreenBase_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
-#define IFsrmFileScreenBase_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
-#define IFsrmFileScreenBase_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
-#define IFsrmFileScreenBase_Delete() (This)->lpVtbl->Delete(This)
-#define IFsrmFileScreenBase_Commit() (This)->lpVtbl->Commit(This)
-#define IFsrmFileScreenBase_get_BlockedFileGroups(This,blockList) (This)->lpVtbl->get_BlockedFileGroups(This,blockList)
-#define IFsrmFileScreenBase_put_BlockedFileGroups(This,blockList) (This)->lpVtbl->put_BlockedFileGroups(This,blockList)
-#define IFsrmFileScreenBase_get_FileScreenFlags(This,fileScreenFlags) (This)->lpVtbl->get_FileScreenFlags(This,fileScreenFlags)
-#define IFsrmFileScreenBase_put_FileScreenFlags(This,fileScreenFlags) (This)->lpVtbl->put_FileScreenFlags(This,fileScreenFlags)
-#define IFsrmFileScreenBase_get_UserSid(This,userSid) (This)->lpVtbl->get_UserSid(This,userSid)
-#define IFsrmFileScreenBase_get_UserAccount(This,userAccount) (This)->lpVtbl->get_UserAccount(This,userAccount)
-#define IFsrmFileScreenBase_CreateAction(This,actionType,action) (This)->lpVtbl->CreateAction(This,actionType,action)
-#define IFsrmFileScreenBase_EnumActions(This,actions) (This)->lpVtbl->EnumActions(This,actions)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmFileScreenException
-#ifdef __GNUC__
-#warning COM interfaces layout in this header has not been verified.
-#warning COM interfaces with incorrect layout may not work at all.
-__MINGW_BROKEN_INTERFACE(INTERFACE)
-#endif
-DECLARE_INTERFACE_(IFsrmFileScreenException,IFsrmObject)
-{
-    BEGIN_INTERFACE
-
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-
-    /* IDispatch methods */
-    STDMETHOD_(HRESULT,GetTypeInfoCount)(THIS_ unsigned int FAR*  pctinfo) PURE;
-    STDMETHOD_(HRESULT,GetTypeInfo)(THIS_ unsigned int  iTInfo,LCID  lcid,ITypeInfo FAR* FAR*  ppTInfo) PURE;
-    STDMETHOD_(HRESULT,GetIDsOfNames)(THIS_ REFIID  riid,OLECHAR FAR* FAR*  rgszNames,unsigned int  cNames,LCID   lcid,DISPID FAR*  rgDispId) PURE;
-    STDMETHOD_(HRESULT,Invoke)(THIS_ DISPID  dispIdMember,REFIID  riid,LCID  lcid,WORD  wFlags,DISPPARAMS FAR*  pDispParams,VARIANT FAR*  pVarResult,EXCEPINFO FAR*  pExcepInfo,unsigned int FAR*  puArgErr) PURE;
-
-    /* IFsrmObject methods */
-    STDMETHOD_(HRESULT,get_Id)(THIS_ FSRM_OBJECT_ID *id) PURE;
-    STDMETHOD_(HRESULT,get_Description)(THIS_ BSTR *description) PURE;
-    STDMETHOD_(HRESULT,put_Description)(THIS_ BSTR description) PURE;
-    STDMETHOD_(HRESULT,Delete)(THIS) PURE;
-    STDMETHOD_(HRESULT,Commit)(THIS) PURE;
-
-    /* IFsrmFileScreenException methods */
-    STDMETHOD_(HRESULT,get_Path)(THIS_ BSTR *path) PURE;
-    STDMETHOD_(HRESULT,get_AllowedFileGroups)(THIS_ IFsrmMutableCollection **allowList) PURE;
-    STDMETHOD_(HRESULT,put_AllowedFileGroups)(THIS_ IFsrmMutableCollection *allowList) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IFsrmFileScreenException_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IFsrmFileScreenException_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IFsrmFileScreenException_Release(This) (This)->lpVtbl->Release(This)
-#define IFsrmFileScreenException_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
-#define IFsrmFileScreenException_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
-#define IFsrmFileScreenException_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
-#define IFsrmFileScreenException_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
-#define IFsrmFileScreenException_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
-#define IFsrmFileScreenException_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
-#define IFsrmFileScreenException_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
-#define IFsrmFileScreenException_Delete() (This)->lpVtbl->Delete(This)
-#define IFsrmFileScreenException_Commit() (This)->lpVtbl->Commit(This)
-#define IFsrmFileScreenException_get_Path(This,path) (This)->lpVtbl->get_Path(This,path)
-#define IFsrmFileScreenException_get_AllowedFileGroups(This,allowList) (This)->lpVtbl->get_AllowedFileGroups(This,allowList)
-#define IFsrmFileScreenException_put_AllowedFileGroups(This,allowList) (This)->lpVtbl->put_AllowedFileGroups(This,allowList)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmFileScreenManager
-#ifdef __GNUC__
-#warning COM interfaces layout in this header has not been verified.
-#warning COM interfaces with incorrect layout may not work at all.
-__MINGW_BROKEN_INTERFACE(INTERFACE)
-#endif
-DECLARE_INTERFACE_(IFsrmFileScreenManager,IDispatch)
-{
-    BEGIN_INTERFACE
-
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-
-    /* IDispatch methods */
-    STDMETHOD_(HRESULT,GetTypeInfoCount)(THIS_ unsigned int FAR*  pctinfo) PURE;
-    STDMETHOD_(HRESULT,GetTypeInfo)(THIS_ unsigned int  iTInfo,LCID  lcid,ITypeInfo FAR* FAR*  ppTInfo) PURE;
-    STDMETHOD_(HRESULT,GetIDsOfNames)(THIS_ REFIID  riid,OLECHAR FAR* FAR*  rgszNames,unsigned int  cNames,LCID   lcid,DISPID FAR*  rgDispId) PURE;
-    STDMETHOD_(HRESULT,Invoke)(THIS_ DISPID  dispIdMember,REFIID  riid,LCID  lcid,WORD  wFlags,DISPPARAMS FAR*  pDispParams,VARIANT FAR*  pVarResult,EXCEPINFO FAR*  pExcepInfo,unsigned int FAR*  puArgErr) PURE;
-
-    /* IFsrmFileScreenManager methods */
-    STDMETHOD_(HRESULT,get_ActionVariables)(THIS_ SAFEARRAY *variables) PURE;
-    STDMETHOD_(HRESULT,get_ActionVariableDescriptions)(THIS_ SAFEARRAY *descriptions) PURE;
-    STDMETHOD_(HRESULT,CreateFileScreen)(THIS_ BSTR path,IFsrmFileScreen **fileScreen) PURE;
-    STDMETHOD_(HRESULT,GetFileScreen)(THIS_ BSTR path,IFsrmFileScreen **fileScreen) PURE;
-    STDMETHOD_(HRESULT,EnumFileScreens)(THIS_ BSTR path,FsrmEnumOptions options,IFsrmCommittableCollection **fileScreens) PURE;
-    STDMETHOD_(HRESULT,CreateFileScreenException)(THIS_ BSTR path,IFsrmFileScreenException **fileScreenException) PURE;
-    STDMETHOD_(HRESULT,GetFileScreenException)(THIS_ BSTR path,IFsrmFileScreenException **fileScreenException) PURE;
-    STDMETHOD_(HRESULT,EnumFileScreenExceptions)(THIS_ BSTR path,FsrmEnumOptions options,IFsrmCommittableCollection **fileScreenExceptions) PURE;
-    STDMETHOD_(HRESULT,CreateFileScreenCollection)(THIS_ IFsrmCommittableCollection **collection) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
 #define IFsrmFileScreenManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
 #define IFsrmFileScreenManager_AddRef(This) (This)->lpVtbl->AddRef(This)
 #define IFsrmFileScreenManager_Release(This) (This)->lpVtbl->Release(This)
+/*** IDispatch methods ***/
 #define IFsrmFileScreenManager_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
 #define IFsrmFileScreenManager_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
 #define IFsrmFileScreenManager_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
 #define IFsrmFileScreenManager_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
+/*** IFsrmFileScreenManager methods ***/
 #define IFsrmFileScreenManager_get_ActionVariables(This,variables) (This)->lpVtbl->get_ActionVariables(This,variables)
 #define IFsrmFileScreenManager_get_ActionVariableDescriptions(This,descriptions) (This)->lpVtbl->get_ActionVariableDescriptions(This,descriptions)
 #define IFsrmFileScreenManager_CreateFileScreen(This,path,fileScreen) (This)->lpVtbl->CreateFileScreen(This,path,fileScreen)
@@ -619,282 +541,2267 @@
 #define IFsrmFileScreenManager_GetFileScreenException(This,path,fileScreenException) (This)->lpVtbl->GetFileScreenException(This,path,fileScreenException)
 #define IFsrmFileScreenManager_EnumFileScreenExceptions(This,path,options,fileScreenExceptions) (This)->lpVtbl->EnumFileScreenExceptions(This,path,options,fileScreenExceptions)
 #define IFsrmFileScreenManager_CreateFileScreenCollection(This,collection) (This)->lpVtbl->CreateFileScreenCollection(This,collection)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmFileScreenTemplate
-#ifdef __GNUC__
-#warning COM interfaces layout in this header has not been verified.
-#warning COM interfaces with incorrect layout may not work at all.
-__MINGW_BROKEN_INTERFACE(INTERFACE)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IFsrmFileScreenManager_QueryInterface(IFsrmFileScreenManager* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmFileScreenManager_AddRef(IFsrmFileScreenManager* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmFileScreenManager_Release(IFsrmFileScreenManager* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmFileScreenManager_GetTypeInfoCount(IFsrmFileScreenManager* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenManager_GetTypeInfo(IFsrmFileScreenManager* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenManager_GetIDsOfNames(IFsrmFileScreenManager* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
+    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenManager_Invoke(IFsrmFileScreenManager* 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);
+}
+/*** IFsrmFileScreenManager methods ***/
+static FORCEINLINE HRESULT IFsrmFileScreenManager_get_ActionVariables(IFsrmFileScreenManager* This,SAFEARRAY **variables) {
+    return This->lpVtbl->get_ActionVariables(This,variables);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenManager_get_ActionVariableDescriptions(IFsrmFileScreenManager* This,SAFEARRAY **descriptions) {
+    return This->lpVtbl->get_ActionVariableDescriptions(This,descriptions);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenManager_CreateFileScreen(IFsrmFileScreenManager* This,BSTR path,IFsrmFileScreen **fileScreen) {
+    return This->lpVtbl->CreateFileScreen(This,path,fileScreen);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenManager_GetFileScreen(IFsrmFileScreenManager* This,BSTR path,IFsrmFileScreen **fileScreen) {
+    return This->lpVtbl->GetFileScreen(This,path,fileScreen);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenManager_EnumFileScreens(IFsrmFileScreenManager* This,BSTR path,FsrmEnumOptions options,IFsrmCommittableCollection **fileScreens) {
+    return This->lpVtbl->EnumFileScreens(This,path,options,fileScreens);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenManager_CreateFileScreenException(IFsrmFileScreenManager* This,BSTR path,IFsrmFileScreenException **fileScreenException) {
+    return This->lpVtbl->CreateFileScreenException(This,path,fileScreenException);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenManager_GetFileScreenException(IFsrmFileScreenManager* This,BSTR path,IFsrmFileScreenException **fileScreenException) {
+    return This->lpVtbl->GetFileScreenException(This,path,fileScreenException);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenManager_EnumFileScreenExceptions(IFsrmFileScreenManager* This,BSTR path,FsrmEnumOptions options,IFsrmCommittableCollection **fileScreenExceptions) {
+    return This->lpVtbl->EnumFileScreenExceptions(This,path,options,fileScreenExceptions);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenManager_CreateFileScreenCollection(IFsrmFileScreenManager* This,IFsrmCommittableCollection **collection) {
+    return This->lpVtbl->CreateFileScreenCollection(This,collection);
+}
 #endif
-DECLARE_INTERFACE_(IFsrmFileScreenTemplate,IFsrmFileScreenBase)
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmFileScreenManager_get_ActionVariables_Proxy(
+    IFsrmFileScreenManager* This,
+    SAFEARRAY **variables);
+void __RPC_STUB IFsrmFileScreenManager_get_ActionVariables_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileScreenManager_get_ActionVariableDescriptions_Proxy(
+    IFsrmFileScreenManager* This,
+    SAFEARRAY **descriptions);
+void __RPC_STUB IFsrmFileScreenManager_get_ActionVariableDescriptions_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileScreenManager_CreateFileScreen_Proxy(
+    IFsrmFileScreenManager* This,
+    BSTR path,
+    IFsrmFileScreen **fileScreen);
+void __RPC_STUB IFsrmFileScreenManager_CreateFileScreen_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileScreenManager_GetFileScreen_Proxy(
+    IFsrmFileScreenManager* This,
+    BSTR path,
+    IFsrmFileScreen **fileScreen);
+void __RPC_STUB IFsrmFileScreenManager_GetFileScreen_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileScreenManager_EnumFileScreens_Proxy(
+    IFsrmFileScreenManager* This,
+    BSTR path,
+    FsrmEnumOptions options,
+    IFsrmCommittableCollection **fileScreens);
+void __RPC_STUB IFsrmFileScreenManager_EnumFileScreens_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileScreenManager_CreateFileScreenException_Proxy(
+    IFsrmFileScreenManager* This,
+    BSTR path,
+    IFsrmFileScreenException **fileScreenException);
+void __RPC_STUB IFsrmFileScreenManager_CreateFileScreenException_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileScreenManager_GetFileScreenException_Proxy(
+    IFsrmFileScreenManager* This,
+    BSTR path,
+    IFsrmFileScreenException **fileScreenException);
+void __RPC_STUB IFsrmFileScreenManager_GetFileScreenException_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileScreenManager_EnumFileScreenExceptions_Proxy(
+    IFsrmFileScreenManager* This,
+    BSTR path,
+    FsrmEnumOptions options,
+    IFsrmCommittableCollection **fileScreenExceptions);
+void __RPC_STUB IFsrmFileScreenManager_EnumFileScreenExceptions_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileScreenManager_CreateFileScreenCollection_Proxy(
+    IFsrmFileScreenManager* This,
+    IFsrmCommittableCollection **collection);
+void __RPC_STUB IFsrmFileScreenManager_CreateFileScreenCollection_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IFsrmFileScreenManager_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IFsrmFileScreenTemplateManager interface
+ */
+#ifndef __IFsrmFileScreenTemplateManager_INTERFACE_DEFINED__
+#define __IFsrmFileScreenTemplateManager_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IFsrmFileScreenTemplateManager, 0xcfe36cba, 0x1949, 0x4e74, 0xa1,0x4f, 0xf1,0xd5,0x80,0xce,0xaf,0x13);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("cfe36cba-1949-4e74-a14f-f1d580ceaf13")
+IFsrmFileScreenTemplateManager : public IDispatch
 {
+    virtual HRESULT STDMETHODCALLTYPE CreateTemplate(
+        IFsrmFileScreenTemplate **fileScreenTemplate) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetTemplate(
+        BSTR name,
+        IFsrmFileScreenTemplate **fileScreenTemplate) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EnumTemplates(
+        FsrmEnumOptions options = FsrmEnumOptions_None,
+        IFsrmCommittableCollection **fileScreenTemplates) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ExportTemplates(
+        VARIANT *fileScreenTemplateNamesArray = 0,
+        BSTR *serializedFileScreenTemplates) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ImportTemplates(
+        BSTR serializedFileScreenTemplates,
+        VARIANT *fileScreenTemplateNamesArray = 0,
+        IFsrmCommittableCollection **fileScreenTemplates) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IFsrmFileScreenTemplateManager, 0xcfe36cba, 0x1949, 0x4e74, 0xa1,0x4f, 0xf1,0xd5,0x80,0xce,0xaf,0x13)
+#endif
+#else
+typedef struct IFsrmFileScreenTemplateManagerVtbl {
     BEGIN_INTERFACE
 
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFsrmFileScreenTemplateManager* This,
+        REFIID riid,
+        void **ppvObject);
 
-    /* IDispatch methods */
-    STDMETHOD_(HRESULT,GetTypeInfoCount)(THIS_ unsigned int FAR*  pctinfo) PURE;
-    STDMETHOD_(HRESULT,GetTypeInfo)(THIS_ unsigned int  iTInfo,LCID  lcid,ITypeInfo FAR* FAR*  ppTInfo) PURE;
-    STDMETHOD_(HRESULT,GetIDsOfNames)(THIS_ REFIID  riid,OLECHAR FAR* FAR*  rgszNames,unsigned int  cNames,LCID   lcid,DISPID FAR*  rgDispId) PURE;
-    STDMETHOD_(HRESULT,Invoke)(THIS_ DISPID  dispIdMember,REFIID  riid,LCID  lcid,WORD  wFlags,DISPPARAMS FAR*  pDispParams,VARIANT FAR*  pVarResult,EXCEPINFO FAR*  pExcepInfo,unsigned int FAR*  puArgErr) PURE;
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFsrmFileScreenTemplateManager* This);
 
-    /* IFsrmObject methods */
-    STDMETHOD_(HRESULT,get_Id)(THIS_ FSRM_OBJECT_ID *id) PURE;
-    STDMETHOD_(HRESULT,get_Description)(THIS_ BSTR *description) PURE;
-    STDMETHOD_(HRESULT,put_Description)(THIS_ BSTR description) PURE;
-    STDMETHOD_(HRESULT,Delete)(THIS) PURE;
-    STDMETHOD_(HRESULT,Commit)(THIS) PURE;
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFsrmFileScreenTemplateManager* This);
 
-    /* IFsrmFileScreenBase methods */
-    STDMETHOD_(HRESULT,get_BlockedFileGroups)(THIS_ IFsrmMutableCollection **blockList) PURE;
-    STDMETHOD_(HRESULT,put_BlockedFileGroups)(THIS_ IFsrmMutableCollection *blockList) PURE;
-    STDMETHOD_(HRESULT,get_FileScreenFlags)(THIS_ __LONG32 *fileScreenFlags) PURE;
-    STDMETHOD_(HRESULT,put_FileScreenFlags)(THIS_ __LONG32 fileScreenFlags) PURE;
-    STDMETHOD_(HRESULT,get_UserSid)(THIS_ BSTR *userSid) PURE;
-    STDMETHOD_(HRESULT,get_UserAccount)(THIS_ BSTR *userAccount) PURE;
-    STDMETHOD_(HRESULT,CreateAction)(THIS_ FsrmActionType actionType,IFsrmAction **action) PURE;
-    STDMETHOD_(HRESULT,EnumActions)(THIS_ IFsrmCollection **actions) PURE;
+    /*** IDispatch methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
+        IFsrmFileScreenTemplateManager* This,
+        UINT *pctinfo);
 
-    /* IFsrmFileScreenTemplate methods */
-    STDMETHOD_(HRESULT,get_Name)(THIS_ BSTR *name) PURE;
-    STDMETHOD_(HRESULT,put_Name)(THIS_ BSTR name) PURE;
-    STDMETHOD_(HRESULT,CopyTemplate)(THIS_ BSTR fileScreenTemplateName) PURE;
-    STDMETHOD_(HRESULT,CommitAndUpdateDerived)(THIS_ FsrmCommitOptions commitOptions,FsrmTemplateApplyOptions applyOptions,IFsrmDerivedObjectsResult **derivedObjectsResult) PURE;
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
+        IFsrmFileScreenTemplateManager* This,
+        UINT iTInfo,
+        LCID lcid,
+        ITypeInfo **ppTInfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
+        IFsrmFileScreenTemplateManager* This,
+        REFIID riid,
+        LPOLESTR *rgszNames,
+        UINT cNames,
+        LCID lcid,
+        DISPID *rgDispId);
+
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        IFsrmFileScreenTemplateManager* This,
+        DISPID dispIdMember,
+        REFIID riid,
+        LCID lcid,
+        WORD wFlags,
+        DISPPARAMS *pDispParams,
+        VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo,
+        UINT *puArgErr);
+
+    /*** IFsrmFileScreenTemplateManager methods ***/
+    HRESULT (STDMETHODCALLTYPE *CreateTemplate)(
+        IFsrmFileScreenTemplateManager* This,
+        IFsrmFileScreenTemplate **fileScreenTemplate);
+
+    HRESULT (STDMETHODCALLTYPE *GetTemplate)(
+        IFsrmFileScreenTemplateManager* This,
+        BSTR name,
+        IFsrmFileScreenTemplate **fileScreenTemplate);
+
+    HRESULT (STDMETHODCALLTYPE *EnumTemplates)(
+        IFsrmFileScreenTemplateManager* This,
+        FsrmEnumOptions options,
+        IFsrmCommittableCollection **fileScreenTemplates);
+
+    HRESULT (STDMETHODCALLTYPE *ExportTemplates)(
+        IFsrmFileScreenTemplateManager* This,
+        VARIANT *fileScreenTemplateNamesArray,
+        BSTR *serializedFileScreenTemplates);
+
+    HRESULT (STDMETHODCALLTYPE *ImportTemplates)(
+        IFsrmFileScreenTemplateManager* This,
+        BSTR serializedFileScreenTemplates,
+        VARIANT *fileScreenTemplateNamesArray,
+        IFsrmCommittableCollection **fileScreenTemplates);
 
     END_INTERFACE
+} IFsrmFileScreenTemplateManagerVtbl;
+interface IFsrmFileScreenTemplateManager {
+    CONST_VTBL IFsrmFileScreenTemplateManagerVtbl* lpVtbl;
 };
+
 #ifdef COBJMACROS
-#define IFsrmFileScreenTemplate_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IFsrmFileScreenTemplate_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IFsrmFileScreenTemplate_Release(This) (This)->lpVtbl->Release(This)
-#define IFsrmFileScreenTemplate_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
-#define IFsrmFileScreenTemplate_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
-#define IFsrmFileScreenTemplate_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
-#define IFsrmFileScreenTemplate_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
-#define IFsrmFileScreenTemplate_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
-#define IFsrmFileScreenTemplate_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
-#define IFsrmFileScreenTemplate_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
-#define IFsrmFileScreenTemplate_Delete() (This)->lpVtbl->Delete(This)
-#define IFsrmFileScreenTemplate_Commit() (This)->lpVtbl->Commit(This)
-#define IFsrmFileScreenTemplate_get_BlockedFileGroups(This,blockList) (This)->lpVtbl->get_BlockedFileGroups(This,blockList)
-#define IFsrmFileScreenTemplate_put_BlockedFileGroups(This,blockList) (This)->lpVtbl->put_BlockedFileGroups(This,blockList)
-#define IFsrmFileScreenTemplate_get_FileScreenFlags(This,fileScreenFlags) (This)->lpVtbl->get_FileScreenFlags(This,fileScreenFlags)
-#define IFsrmFileScreenTemplate_put_FileScreenFlags(This,fileScreenFlags) (This)->lpVtbl->put_FileScreenFlags(This,fileScreenFlags)
-#define IFsrmFileScreenTemplate_get_UserSid(This,userSid) (This)->lpVtbl->get_UserSid(This,userSid)
-#define IFsrmFileScreenTemplate_get_UserAccount(This,userAccount) (This)->lpVtbl->get_UserAccount(This,userAccount)
-#define IFsrmFileScreenTemplate_CreateAction(This,actionType,action) (This)->lpVtbl->CreateAction(This,actionType,action)
-#define IFsrmFileScreenTemplate_EnumActions(This,actions) (This)->lpVtbl->EnumActions(This,actions)
-#define IFsrmFileScreenTemplate_get_Name(This,name) (This)->lpVtbl->get_Name(This,name)
-#define IFsrmFileScreenTemplate_put_Name(This,name) (This)->lpVtbl->put_Name(This,name)
-#define IFsrmFileScreenTemplate_CopyTemplate(This,fileScreenTemplateName) (This)->lpVtbl->CopyTemplate(This,fileScreenTemplateName)
-#define IFsrmFileScreenTemplate_CommitAndUpdateDerived(This,commitOptions,applyOptions,derivedObjectsResult) (This)->lpVtbl->CommitAndUpdateDerived(This,commitOptions,applyOptions,derivedObjectsResult)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmFileScreenTemplateImported
-#ifdef __GNUC__
-#warning COM interfaces layout in this header has not been verified.
-#warning COM interfaces with incorrect layout may not work at all.
-__MINGW_BROKEN_INTERFACE(INTERFACE)
-#endif
-DECLARE_INTERFACE_(IFsrmFileScreenTemplateImported,IFsrmFileScreenTemplate)
-{
-    BEGIN_INTERFACE
-
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-
-    /* IDispatch methods */
-    STDMETHOD_(HRESULT,GetTypeInfoCount)(THIS_ unsigned int FAR*  pctinfo) PURE;
-    STDMETHOD_(HRESULT,GetTypeInfo)(THIS_ unsigned int  iTInfo,LCID  lcid,ITypeInfo FAR* FAR*  ppTInfo) PURE;
-    STDMETHOD_(HRESULT,GetIDsOfNames)(THIS_ REFIID  riid,OLECHAR FAR* FAR*  rgszNames,unsigned int  cNames,LCID   lcid,DISPID FAR*  rgDispId) PURE;
-    STDMETHOD_(HRESULT,Invoke)(THIS_ DISPID  dispIdMember,REFIID  riid,LCID  lcid,WORD  wFlags,DISPPARAMS FAR*  pDispParams,VARIANT FAR*  pVarResult,EXCEPINFO FAR*  pExcepInfo,unsigned int FAR*  puArgErr) PURE;
-
-    /* IFsrmObject methods */
-    STDMETHOD_(HRESULT,get_Id)(THIS_ FSRM_OBJECT_ID *id) PURE;
-    STDMETHOD_(HRESULT,get_Description)(THIS_ BSTR *description) PURE;
-    STDMETHOD_(HRESULT,put_Description)(THIS_ BSTR description) PURE;
-    STDMETHOD_(HRESULT,Delete)(THIS) PURE;
-    STDMETHOD_(HRESULT,Commit)(THIS) PURE;
-
-    /* IFsrmFileScreenBase methods */
-    STDMETHOD_(HRESULT,get_BlockedFileGroups)(THIS_ IFsrmMutableCollection **blockList) PURE;
-    STDMETHOD_(HRESULT,put_BlockedFileGroups)(THIS_ IFsrmMutableCollection *blockList) PURE;
-    STDMETHOD_(HRESULT,get_FileScreenFlags)(THIS_ __LONG32 *fileScreenFlags) PURE;
-    STDMETHOD_(HRESULT,put_FileScreenFlags)(THIS_ __LONG32 fileScreenFlags) PURE;
-    STDMETHOD_(HRESULT,get_UserSid)(THIS_ BSTR *userSid) PURE;
-    STDMETHOD_(HRESULT,get_UserAccount)(THIS_ BSTR *userAccount) PURE;
-    STDMETHOD_(HRESULT,CreateAction)(THIS_ FsrmActionType actionType,IFsrmAction **action) PURE;
-    STDMETHOD_(HRESULT,EnumActions)(THIS_ IFsrmCollection **actions) PURE;
-
-    /* IFsrmFileScreenTemplate methods */
-    STDMETHOD_(HRESULT,get_Name)(THIS_ BSTR *name) PURE;
-    STDMETHOD_(HRESULT,put_Name)(THIS_ BSTR name) PURE;
-    STDMETHOD_(HRESULT,CopyTemplate)(THIS_ BSTR fileScreenTemplateName) PURE;
-    STDMETHOD_(HRESULT,CommitAndUpdateDerived)(THIS_ FsrmCommitOptions commitOptions,FsrmTemplateApplyOptions applyOptions,IFsrmDerivedObjectsResult **derivedObjectsResult) PURE;
-
-    /* IFsrmFileScreenTemplateImported methods */
-    STDMETHOD_(HRESULT,get_OverwriteOnCommit)(THIS_ VARIANT_BOOL *overwrite) PURE;
-    STDMETHOD_(HRESULT,put_OverwriteOnCommit)(THIS_ VARIANT_BOOL overwrite) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IFsrmFileScreenTemplateImported_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IFsrmFileScreenTemplateImported_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IFsrmFileScreenTemplateImported_Release(This) (This)->lpVtbl->Release(This)
-#define IFsrmFileScreenTemplateImported_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
-#define IFsrmFileScreenTemplateImported_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
-#define IFsrmFileScreenTemplateImported_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
-#define IFsrmFileScreenTemplateImported_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
-#define IFsrmFileScreenTemplateImported_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
-#define IFsrmFileScreenTemplateImported_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
-#define IFsrmFileScreenTemplateImported_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
-#define IFsrmFileScreenTemplateImported_Delete() (This)->lpVtbl->Delete(This)
-#define IFsrmFileScreenTemplateImported_Commit() (This)->lpVtbl->Commit(This)
-#define IFsrmFileScreenTemplateImported_get_BlockedFileGroups(This,blockList) (This)->lpVtbl->get_BlockedFileGroups(This,blockList)
-#define IFsrmFileScreenTemplateImported_put_BlockedFileGroups(This,blockList) (This)->lpVtbl->put_BlockedFileGroups(This,blockList)
-#define IFsrmFileScreenTemplateImported_get_FileScreenFlags(This,fileScreenFlags) (This)->lpVtbl->get_FileScreenFlags(This,fileScreenFlags)
-#define IFsrmFileScreenTemplateImported_put_FileScreenFlags(This,fileScreenFlags) (This)->lpVtbl->put_FileScreenFlags(This,fileScreenFlags)
-#define IFsrmFileScreenTemplateImported_get_UserSid(This,userSid) (This)->lpVtbl->get_UserSid(This,userSid)
-#define IFsrmFileScreenTemplateImported_get_UserAccount(This,userAccount) (This)->lpVtbl->get_UserAccount(This,userAccount)
-#define IFsrmFileScreenTemplateImported_CreateAction(This,actionType,action) (This)->lpVtbl->CreateAction(This,actionType,action)
-#define IFsrmFileScreenTemplateImported_EnumActions(This,actions) (This)->lpVtbl->EnumActions(This,actions)
-#define IFsrmFileScreenTemplateImported_get_Name(This,name) (This)->lpVtbl->get_Name(This,name)
-#define IFsrmFileScreenTemplateImported_put_Name(This,name) (This)->lpVtbl->put_Name(This,name)
-#define IFsrmFileScreenTemplateImported_CopyTemplate(This,fileScreenTemplateName) (This)->lpVtbl->CopyTemplate(This,fileScreenTemplateName)
-#define IFsrmFileScreenTemplateImported_CommitAndUpdateDerived(This,commitOptions,applyOptions,derivedObjectsResult) (This)->lpVtbl->CommitAndUpdateDerived(This,commitOptions,applyOptions,derivedObjectsResult)
-#define IFsrmFileScreenTemplateImported_get_OverwriteOnCommit(This,overwrite) (This)->lpVtbl->get_OverwriteOnCommit(This,overwrite)
-#define IFsrmFileScreenTemplateImported_put_OverwriteOnCommit(This,overwrite) (This)->lpVtbl->put_OverwriteOnCommit(This,overwrite)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmFileScreenTemplateManager
-#ifdef __GNUC__
-#warning COM interfaces layout in this header has not been verified.
-#warning COM interfaces with incorrect layout may not work at all.
-__MINGW_BROKEN_INTERFACE(INTERFACE)
-#endif
-DECLARE_INTERFACE_(IFsrmFileScreenTemplateManager,IDispatch)
-{
-    BEGIN_INTERFACE
-
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
-
-    /* IDispatch methods */
-    STDMETHOD_(HRESULT,GetTypeInfoCount)(THIS_ unsigned int FAR*  pctinfo) PURE;
-    STDMETHOD_(HRESULT,GetTypeInfo)(THIS_ unsigned int  iTInfo,LCID  lcid,ITypeInfo FAR* FAR*  ppTInfo) PURE;
-    STDMETHOD_(HRESULT,GetIDsOfNames)(THIS_ REFIID  riid,OLECHAR FAR* FAR*  rgszNames,unsigned int  cNames,LCID   lcid,DISPID FAR*  rgDispId) PURE;
-    STDMETHOD_(HRESULT,Invoke)(THIS_ DISPID  dispIdMember,REFIID  riid,LCID  lcid,WORD  wFlags,DISPPARAMS FAR*  pDispParams,VARIANT FAR*  pVarResult,EXCEPINFO FAR*  pExcepInfo,unsigned int FAR*  puArgErr) PURE;
-
-    /* IFsrmFileScreenTemplateManager methods */
-    STDMETHOD_(HRESULT,CreateTemplate)(THIS_ IFsrmFileScreenTemplate **fileScreenTemplate) PURE;
-    STDMETHOD_(HRESULT,GetTemplate)(THIS_ BSTR name,IFsrmFileScreenTemplate **fileScreenTemplate) PURE;
-    STDMETHOD_(HRESULT,EnumTemplates)(THIS_ FsrmEnumOptions options,IFsrmCommittableCollection **fileScreenTemplates) PURE;
-    STDMETHOD_(HRESULT,ExportTemplates)(THIS_ VARIANT *fileScreenTemplateNamesArray,BSTR *serializedFileScreenTemplates) PURE;
-    STDMETHOD_(HRESULT,ImportTemplates)(THIS_ BSTR serializedFileScreenTemplates,VARIANT *fileScreenTemplateNamesArray,IFsrmCommittableCollection **fileScreenTemplates) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
 #define IFsrmFileScreenTemplateManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
 #define IFsrmFileScreenTemplateManager_AddRef(This) (This)->lpVtbl->AddRef(This)
 #define IFsrmFileScreenTemplateManager_Release(This) (This)->lpVtbl->Release(This)
-#define IFsrmFileScreenTemplateImported_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
-#define IFsrmFileScreenTemplateImported_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
-#define IFsrmFileScreenTemplateImported_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
-#define IFsrmFileScreenTemplateImported_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
+/*** IDispatch methods ***/
+#define IFsrmFileScreenTemplateManager_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
+#define IFsrmFileScreenTemplateManager_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
+#define IFsrmFileScreenTemplateManager_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
+#define IFsrmFileScreenTemplateManager_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
+/*** IFsrmFileScreenTemplateManager methods ***/
 #define IFsrmFileScreenTemplateManager_CreateTemplate(This,fileScreenTemplate) (This)->lpVtbl->CreateTemplate(This,fileScreenTemplate)
 #define IFsrmFileScreenTemplateManager_GetTemplate(This,name,fileScreenTemplate) (This)->lpVtbl->GetTemplate(This,name,fileScreenTemplate)
 #define IFsrmFileScreenTemplateManager_EnumTemplates(This,options,fileScreenTemplates) (This)->lpVtbl->EnumTemplates(This,options,fileScreenTemplates)
 #define IFsrmFileScreenTemplateManager_ExportTemplates(This,fileScreenTemplateNamesArray,serializedFileScreenTemplates) (This)->lpVtbl->ExportTemplates(This,fileScreenTemplateNamesArray,serializedFileScreenTemplates)
 #define IFsrmFileScreenTemplateManager_ImportTemplates(This,serializedFileScreenTemplates,fileScreenTemplateNamesArray,fileScreenTemplates) (This)->lpVtbl->ImportTemplates(This,serializedFileScreenTemplates,fileScreenTemplateNamesArray,fileScreenTemplates)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmFileScreen
-#ifdef __GNUC__
-#warning COM interfaces layout in this header has not been verified.
-#warning COM interfaces with incorrect layout may not work at all.
-__MINGW_BROKEN_INTERFACE(INTERFACE)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IFsrmFileScreenTemplateManager_QueryInterface(IFsrmFileScreenTemplateManager* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmFileScreenTemplateManager_AddRef(IFsrmFileScreenTemplateManager* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmFileScreenTemplateManager_Release(IFsrmFileScreenTemplateManager* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmFileScreenTemplateManager_GetTypeInfoCount(IFsrmFileScreenTemplateManager* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenTemplateManager_GetTypeInfo(IFsrmFileScreenTemplateManager* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenTemplateManager_GetIDsOfNames(IFsrmFileScreenTemplateManager* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
+    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenTemplateManager_Invoke(IFsrmFileScreenTemplateManager* 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);
+}
+/*** IFsrmFileScreenTemplateManager methods ***/
+static FORCEINLINE HRESULT IFsrmFileScreenTemplateManager_CreateTemplate(IFsrmFileScreenTemplateManager* This,IFsrmFileScreenTemplate **fileScreenTemplate) {
+    return This->lpVtbl->CreateTemplate(This,fileScreenTemplate);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenTemplateManager_GetTemplate(IFsrmFileScreenTemplateManager* This,BSTR name,IFsrmFileScreenTemplate **fileScreenTemplate) {
+    return This->lpVtbl->GetTemplate(This,name,fileScreenTemplate);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenTemplateManager_EnumTemplates(IFsrmFileScreenTemplateManager* This,FsrmEnumOptions options,IFsrmCommittableCollection **fileScreenTemplates) {
+    return This->lpVtbl->EnumTemplates(This,options,fileScreenTemplates);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenTemplateManager_ExportTemplates(IFsrmFileScreenTemplateManager* This,VARIANT *fileScreenTemplateNamesArray,BSTR *serializedFileScreenTemplates) {
+    return This->lpVtbl->ExportTemplates(This,fileScreenTemplateNamesArray,serializedFileScreenTemplates);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenTemplateManager_ImportTemplates(IFsrmFileScreenTemplateManager* This,BSTR serializedFileScreenTemplates,VARIANT *fileScreenTemplateNamesArray,IFsrmCommittableCollection **fileScreenTemplates) {
+    return This->lpVtbl->ImportTemplates(This,serializedFileScreenTemplates,fileScreenTemplateNamesArray,fileScreenTemplates);
+}
 #endif
-DECLARE_INTERFACE_(IFsrmFileScreen,IFsrmFileScreenBase)
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmFileScreenTemplateManager_CreateTemplate_Proxy(
+    IFsrmFileScreenTemplateManager* This,
+    IFsrmFileScreenTemplate **fileScreenTemplate);
+void __RPC_STUB IFsrmFileScreenTemplateManager_CreateTemplate_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileScreenTemplateManager_GetTemplate_Proxy(
+    IFsrmFileScreenTemplateManager* This,
+    BSTR name,
+    IFsrmFileScreenTemplate **fileScreenTemplate);
+void __RPC_STUB IFsrmFileScreenTemplateManager_GetTemplate_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileScreenTemplateManager_EnumTemplates_Proxy(
+    IFsrmFileScreenTemplateManager* This,
+    FsrmEnumOptions options,
+    IFsrmCommittableCollection **fileScreenTemplates);
+void __RPC_STUB IFsrmFileScreenTemplateManager_EnumTemplates_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileScreenTemplateManager_ExportTemplates_Proxy(
+    IFsrmFileScreenTemplateManager* This,
+    VARIANT *fileScreenTemplateNamesArray,
+    BSTR *serializedFileScreenTemplates);
+void __RPC_STUB IFsrmFileScreenTemplateManager_ExportTemplates_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileScreenTemplateManager_ImportTemplates_Proxy(
+    IFsrmFileScreenTemplateManager* This,
+    BSTR serializedFileScreenTemplates,
+    VARIANT *fileScreenTemplateNamesArray,
+    IFsrmCommittableCollection **fileScreenTemplates);
+void __RPC_STUB IFsrmFileScreenTemplateManager_ImportTemplates_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IFsrmFileScreenTemplateManager_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IFsrmFileGroup interface
+ */
+#ifndef __IFsrmFileGroup_INTERFACE_DEFINED__
+#define __IFsrmFileGroup_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IFsrmFileGroup, 0x8dd04909, 0x0e34, 0x4d55, 0xaf,0xaa, 0x89,0xe1,0xf1,0xa1,0xbb,0xb9);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("8dd04909-0e34-4d55-afaa-89e1f1a1bbb9")
+IFsrmFileGroup : public IFsrmObject
 {
+    virtual HRESULT STDMETHODCALLTYPE get_Name(
+        BSTR *name) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_Name(
+        BSTR name) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_Members(
+        IFsrmMutableCollection **members) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_Members(
+        IFsrmMutableCollection *members) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_NonMembers(
+        IFsrmMutableCollection **nonMembers) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_NonMembers(
+        IFsrmMutableCollection *nonMembers) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IFsrmFileGroup, 0x8dd04909, 0x0e34, 0x4d55, 0xaf,0xaa, 0x89,0xe1,0xf1,0xa1,0xbb,0xb9)
+#endif
+#else
+typedef struct IFsrmFileGroupVtbl {
     BEGIN_INTERFACE
 
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFsrmFileGroup* This,
+        REFIID riid,
+        void **ppvObject);
 
-    /* IDispatch methods */
-    STDMETHOD_(HRESULT,GetTypeInfoCount)(THIS_ unsigned int FAR*  pctinfo) PURE;
-    STDMETHOD_(HRESULT,GetTypeInfo)(THIS_ unsigned int  iTInfo,LCID  lcid,ITypeInfo FAR* FAR*  ppTInfo) PURE;
-    STDMETHOD_(HRESULT,GetIDsOfNames)(THIS_ REFIID  riid,OLECHAR FAR* FAR*  rgszNames,unsigned int  cNames,LCID   lcid,DISPID FAR*  rgDispId) PURE;
-    STDMETHOD_(HRESULT,Invoke)(THIS_ DISPID  dispIdMember,REFIID  riid,LCID  lcid,WORD  wFlags,DISPPARAMS FAR*  pDispParams,VARIANT FAR*  pVarResult,EXCEPINFO FAR*  pExcepInfo,unsigned int FAR*  puArgErr) PURE;
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFsrmFileGroup* This);
 
-    /* IFsrmObject methods */
-    STDMETHOD_(HRESULT,get_Id)(THIS_ FSRM_OBJECT_ID *id) PURE;
-    STDMETHOD_(HRESULT,get_Description)(THIS_ BSTR *description) PURE;
-    STDMETHOD_(HRESULT,put_Description)(THIS_ BSTR description) PURE;
-    STDMETHOD_(HRESULT,Delete)(THIS) PURE;
-    STDMETHOD_(HRESULT,Commit)(THIS) PURE;
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFsrmFileGroup* This);
 
-    /* IFsrmFileScreenBase methods */
-    STDMETHOD_(HRESULT,get_BlockedFileGroups)(THIS_ IFsrmMutableCollection **blockList) PURE;
-    STDMETHOD_(HRESULT,put_BlockedFileGroups)(THIS_ IFsrmMutableCollection *blockList) PURE;
-    STDMETHOD_(HRESULT,get_FileScreenFlags)(THIS_ __LONG32 *fileScreenFlags) PURE;
-    STDMETHOD_(HRESULT,put_FileScreenFlags)(THIS_ __LONG32 fileScreenFlags) PURE;
-    STDMETHOD_(HRESULT,get_UserSid)(THIS_ BSTR *userSid) PURE;
-    STDMETHOD_(HRESULT,get_UserAccount)(THIS_ BSTR *userAccount) PURE;
-    STDMETHOD_(HRESULT,CreateAction)(THIS_ FsrmActionType actionType,IFsrmAction **action) PURE;
-    STDMETHOD_(HRESULT,EnumActions)(THIS_ IFsrmCollection **actions) PURE;
+    /*** IDispatch methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
+        IFsrmFileGroup* This,
+        UINT *pctinfo);
 
-    /* IFsrmFileScreen methods */
-    STDMETHOD_(HRESULT,get_Path)(THIS_ BSTR *path) PURE;
-    STDMETHOD_(HRESULT,get_SourceTemplateName)(THIS_ BSTR *fileScreenTemplateName) PURE;
-    STDMETHOD_(HRESULT,get_MatchesSourceTemplate)(THIS_ VARIANT_BOOL *matches) PURE;
-    STDMETHOD_(HRESULT,ApplyTemplate)(THIS_ BSTR fileScreenTemplateName) PURE;
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
+        IFsrmFileGroup* This,
+        UINT iTInfo,
+        LCID lcid,
+        ITypeInfo **ppTInfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
+        IFsrmFileGroup* This,
+        REFIID riid,
+        LPOLESTR *rgszNames,
+        UINT cNames,
+        LCID lcid,
+        DISPID *rgDispId);
+
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        IFsrmFileGroup* This,
+        DISPID dispIdMember,
+        REFIID riid,
+        LCID lcid,
+        WORD wFlags,
+        DISPPARAMS *pDispParams,
+        VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo,
+        UINT *puArgErr);
+
+    /*** IFsrmObject methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Id)(
+        IFsrmFileGroup* This,
+        FSRM_OBJECT_ID *id);
+
+    HRESULT (STDMETHODCALLTYPE *get_Description)(
+        IFsrmFileGroup* This,
+        BSTR *description);
+
+    HRESULT (STDMETHODCALLTYPE *put_Description)(
+        IFsrmFileGroup* This,
+        BSTR description);
+
+    HRESULT (STDMETHODCALLTYPE *Delete)(
+        IFsrmFileGroup* This);
+
+    HRESULT (STDMETHODCALLTYPE *Commit)(
+        IFsrmFileGroup* This);
+
+    /*** IFsrmFileGroup methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Name)(
+        IFsrmFileGroup* This,
+        BSTR *name);
+
+    HRESULT (STDMETHODCALLTYPE *put_Name)(
+        IFsrmFileGroup* This,
+        BSTR name);
+
+    HRESULT (STDMETHODCALLTYPE *get_Members)(
+        IFsrmFileGroup* This,
+        IFsrmMutableCollection **members);
+
+    HRESULT (STDMETHODCALLTYPE *put_Members)(
+        IFsrmFileGroup* This,
+        IFsrmMutableCollection *members);
+
+    HRESULT (STDMETHODCALLTYPE *get_NonMembers)(
+        IFsrmFileGroup* This,
+        IFsrmMutableCollection **nonMembers);
+
+    HRESULT (STDMETHODCALLTYPE *put_NonMembers)(
+        IFsrmFileGroup* This,
+        IFsrmMutableCollection *nonMembers);
 
     END_INTERFACE
+} IFsrmFileGroupVtbl;
+interface IFsrmFileGroup {
+    CONST_VTBL IFsrmFileGroupVtbl* lpVtbl;
 };
+
 #ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IFsrmFileGroup_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IFsrmFileGroup_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IFsrmFileGroup_Release(This) (This)->lpVtbl->Release(This)
+/*** IDispatch methods ***/
+#define IFsrmFileGroup_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
+#define IFsrmFileGroup_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
+#define IFsrmFileGroup_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
+#define IFsrmFileGroup_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 IFsrmFileGroup_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
+#define IFsrmFileGroup_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
+#define IFsrmFileGroup_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
+#define IFsrmFileGroup_Delete(This) (This)->lpVtbl->Delete(This)
+#define IFsrmFileGroup_Commit(This) (This)->lpVtbl->Commit(This)
+/*** IFsrmFileGroup methods ***/
+#define IFsrmFileGroup_get_Name(This,name) (This)->lpVtbl->get_Name(This,name)
+#define IFsrmFileGroup_put_Name(This,name) (This)->lpVtbl->put_Name(This,name)
+#define IFsrmFileGroup_get_Members(This,members) (This)->lpVtbl->get_Members(This,members)
+#define IFsrmFileGroup_put_Members(This,members) (This)->lpVtbl->put_Members(This,members)
+#define IFsrmFileGroup_get_NonMembers(This,nonMembers) (This)->lpVtbl->get_NonMembers(This,nonMembers)
+#define IFsrmFileGroup_put_NonMembers(This,nonMembers) (This)->lpVtbl->put_NonMembers(This,nonMembers)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IFsrmFileGroup_QueryInterface(IFsrmFileGroup* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmFileGroup_AddRef(IFsrmFileGroup* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmFileGroup_Release(IFsrmFileGroup* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmFileGroup_GetTypeInfoCount(IFsrmFileGroup* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmFileGroup_GetTypeInfo(IFsrmFileGroup* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE HRESULT IFsrmFileGroup_GetIDsOfNames(IFsrmFileGroup* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
+    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
+}
+static FORCEINLINE HRESULT IFsrmFileGroup_Invoke(IFsrmFileGroup* 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 FORCEINLINE HRESULT IFsrmFileGroup_get_Id(IFsrmFileGroup* This,FSRM_OBJECT_ID *id) {
+    return This->lpVtbl->get_Id(This,id);
+}
+static FORCEINLINE HRESULT IFsrmFileGroup_get_Description(IFsrmFileGroup* This,BSTR *description) {
+    return This->lpVtbl->get_Description(This,description);
+}
+static FORCEINLINE HRESULT IFsrmFileGroup_put_Description(IFsrmFileGroup* This,BSTR description) {
+    return This->lpVtbl->put_Description(This,description);
+}
+static FORCEINLINE HRESULT IFsrmFileGroup_Delete(IFsrmFileGroup* This) {
+    return This->lpVtbl->Delete(This);
+}
+static FORCEINLINE HRESULT IFsrmFileGroup_Commit(IFsrmFileGroup* This) {
+    return This->lpVtbl->Commit(This);
+}
+/*** IFsrmFileGroup methods ***/
+static FORCEINLINE HRESULT IFsrmFileGroup_get_Name(IFsrmFileGroup* This,BSTR *name) {
+    return This->lpVtbl->get_Name(This,name);
+}
+static FORCEINLINE HRESULT IFsrmFileGroup_put_Name(IFsrmFileGroup* This,BSTR name) {
+    return This->lpVtbl->put_Name(This,name);
+}
+static FORCEINLINE HRESULT IFsrmFileGroup_get_Members(IFsrmFileGroup* This,IFsrmMutableCollection **members) {
+    return This->lpVtbl->get_Members(This,members);
+}
+static FORCEINLINE HRESULT IFsrmFileGroup_put_Members(IFsrmFileGroup* This,IFsrmMutableCollection *members) {
+    return This->lpVtbl->put_Members(This,members);
+}
+static FORCEINLINE HRESULT IFsrmFileGroup_get_NonMembers(IFsrmFileGroup* This,IFsrmMutableCollection **nonMembers) {
+    return This->lpVtbl->get_NonMembers(This,nonMembers);
+}
+static FORCEINLINE HRESULT IFsrmFileGroup_put_NonMembers(IFsrmFileGroup* This,IFsrmMutableCollection *nonMembers) {
+    return This->lpVtbl->put_NonMembers(This,nonMembers);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmFileGroup_get_Name_Proxy(
+    IFsrmFileGroup* This,
+    BSTR *name);
+void __RPC_STUB IFsrmFileGroup_get_Name_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileGroup_put_Name_Proxy(
+    IFsrmFileGroup* This,
+    BSTR name);
+void __RPC_STUB IFsrmFileGroup_put_Name_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileGroup_get_Members_Proxy(
+    IFsrmFileGroup* This,
+    IFsrmMutableCollection **members);
+void __RPC_STUB IFsrmFileGroup_get_Members_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileGroup_put_Members_Proxy(
+    IFsrmFileGroup* This,
+    IFsrmMutableCollection *members);
+void __RPC_STUB IFsrmFileGroup_put_Members_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileGroup_get_NonMembers_Proxy(
+    IFsrmFileGroup* This,
+    IFsrmMutableCollection **nonMembers);
+void __RPC_STUB IFsrmFileGroup_get_NonMembers_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileGroup_put_NonMembers_Proxy(
+    IFsrmFileGroup* This,
+    IFsrmMutableCollection *nonMembers);
+void __RPC_STUB IFsrmFileGroup_put_NonMembers_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IFsrmFileGroup_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IFsrmFileScreenBase interface
+ */
+#ifndef __IFsrmFileScreenBase_INTERFACE_DEFINED__
+#define __IFsrmFileScreenBase_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IFsrmFileScreenBase, 0xf3637e80, 0x5b22, 0x4a2b, 0xa6,0x37, 0xbb,0xb6,0x42,0xb4,0x1c,0xfc);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("f3637e80-5b22-4a2b-a637-bbb642b41cfc")
+IFsrmFileScreenBase : public IFsrmObject
+{
+    virtual HRESULT STDMETHODCALLTYPE get_BlockedFileGroups(
+        IFsrmMutableCollection **blockList) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_BlockedFileGroups(
+        IFsrmMutableCollection *blockList) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_FileScreenFlags(
+        LONG *fileScreenFlags) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_FileScreenFlags(
+        LONG fileScreenFlags) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateAction(
+        FsrmActionType actionType,
+        IFsrmAction **action) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EnumActions(
+        IFsrmCollection **actions) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IFsrmFileScreenBase, 0xf3637e80, 0x5b22, 0x4a2b, 0xa6,0x37, 0xbb,0xb6,0x42,0xb4,0x1c,0xfc)
+#endif
+#else
+typedef struct IFsrmFileScreenBaseVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFsrmFileScreenBase* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFsrmFileScreenBase* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFsrmFileScreenBase* This);
+
+    /*** IDispatch methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
+        IFsrmFileScreenBase* This,
+        UINT *pctinfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
+        IFsrmFileScreenBase* This,
+        UINT iTInfo,
+        LCID lcid,
+        ITypeInfo **ppTInfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
+        IFsrmFileScreenBase* This,
+        REFIID riid,
+        LPOLESTR *rgszNames,
+        UINT cNames,
+        LCID lcid,
+        DISPID *rgDispId);
+
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        IFsrmFileScreenBase* This,
+        DISPID dispIdMember,
+        REFIID riid,
+        LCID lcid,
+        WORD wFlags,
+        DISPPARAMS *pDispParams,
+        VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo,
+        UINT *puArgErr);
+
+    /*** IFsrmObject methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Id)(
+        IFsrmFileScreenBase* This,
+        FSRM_OBJECT_ID *id);
+
+    HRESULT (STDMETHODCALLTYPE *get_Description)(
+        IFsrmFileScreenBase* This,
+        BSTR *description);
+
+    HRESULT (STDMETHODCALLTYPE *put_Description)(
+        IFsrmFileScreenBase* This,
+        BSTR description);
+
+    HRESULT (STDMETHODCALLTYPE *Delete)(
+        IFsrmFileScreenBase* This);
+
+    HRESULT (STDMETHODCALLTYPE *Commit)(
+        IFsrmFileScreenBase* This);
+
+    /*** IFsrmFileScreenBase methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_BlockedFileGroups)(
+        IFsrmFileScreenBase* This,
+        IFsrmMutableCollection **blockList);
+
+    HRESULT (STDMETHODCALLTYPE *put_BlockedFileGroups)(
+        IFsrmFileScreenBase* This,
+        IFsrmMutableCollection *blockList);
+
+    HRESULT (STDMETHODCALLTYPE *get_FileScreenFlags)(
+        IFsrmFileScreenBase* This,
+        LONG *fileScreenFlags);
+
+    HRESULT (STDMETHODCALLTYPE *put_FileScreenFlags)(
+        IFsrmFileScreenBase* This,
+        LONG fileScreenFlags);
+
+    HRESULT (STDMETHODCALLTYPE *CreateAction)(
+        IFsrmFileScreenBase* This,
+        FsrmActionType actionType,
+        IFsrmAction **action);
+
+    HRESULT (STDMETHODCALLTYPE *EnumActions)(
+        IFsrmFileScreenBase* This,
+        IFsrmCollection **actions);
+
+    END_INTERFACE
+} IFsrmFileScreenBaseVtbl;
+interface IFsrmFileScreenBase {
+    CONST_VTBL IFsrmFileScreenBaseVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IFsrmFileScreenBase_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IFsrmFileScreenBase_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IFsrmFileScreenBase_Release(This) (This)->lpVtbl->Release(This)
+/*** IDispatch methods ***/
+#define IFsrmFileScreenBase_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
+#define IFsrmFileScreenBase_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
+#define IFsrmFileScreenBase_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
+#define IFsrmFileScreenBase_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 IFsrmFileScreenBase_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
+#define IFsrmFileScreenBase_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
+#define IFsrmFileScreenBase_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
+#define IFsrmFileScreenBase_Delete(This) (This)->lpVtbl->Delete(This)
+#define IFsrmFileScreenBase_Commit(This) (This)->lpVtbl->Commit(This)
+/*** IFsrmFileScreenBase methods ***/
+#define IFsrmFileScreenBase_get_BlockedFileGroups(This,blockList) (This)->lpVtbl->get_BlockedFileGroups(This,blockList)
+#define IFsrmFileScreenBase_put_BlockedFileGroups(This,blockList) (This)->lpVtbl->put_BlockedFileGroups(This,blockList)
+#define IFsrmFileScreenBase_get_FileScreenFlags(This,fileScreenFlags) (This)->lpVtbl->get_FileScreenFlags(This,fileScreenFlags)
+#define IFsrmFileScreenBase_put_FileScreenFlags(This,fileScreenFlags) (This)->lpVtbl->put_FileScreenFlags(This,fileScreenFlags)
+#define IFsrmFileScreenBase_CreateAction(This,actionType,action) (This)->lpVtbl->CreateAction(This,actionType,action)
+#define IFsrmFileScreenBase_EnumActions(This,actions) (This)->lpVtbl->EnumActions(This,actions)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IFsrmFileScreenBase_QueryInterface(IFsrmFileScreenBase* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmFileScreenBase_AddRef(IFsrmFileScreenBase* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmFileScreenBase_Release(IFsrmFileScreenBase* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmFileScreenBase_GetTypeInfoCount(IFsrmFileScreenBase* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenBase_GetTypeInfo(IFsrmFileScreenBase* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenBase_GetIDsOfNames(IFsrmFileScreenBase* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
+    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenBase_Invoke(IFsrmFileScreenBase* 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 FORCEINLINE HRESULT IFsrmFileScreenBase_get_Id(IFsrmFileScreenBase* This,FSRM_OBJECT_ID *id) {
+    return This->lpVtbl->get_Id(This,id);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenBase_get_Description(IFsrmFileScreenBase* This,BSTR *description) {
+    return This->lpVtbl->get_Description(This,description);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenBase_put_Description(IFsrmFileScreenBase* This,BSTR description) {
+    return This->lpVtbl->put_Description(This,description);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenBase_Delete(IFsrmFileScreenBase* This) {
+    return This->lpVtbl->Delete(This);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenBase_Commit(IFsrmFileScreenBase* This) {
+    return This->lpVtbl->Commit(This);
+}
+/*** IFsrmFileScreenBase methods ***/
+static FORCEINLINE HRESULT IFsrmFileScreenBase_get_BlockedFileGroups(IFsrmFileScreenBase* This,IFsrmMutableCollection **blockList) {
+    return This->lpVtbl->get_BlockedFileGroups(This,blockList);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenBase_put_BlockedFileGroups(IFsrmFileScreenBase* This,IFsrmMutableCollection *blockList) {
+    return This->lpVtbl->put_BlockedFileGroups(This,blockList);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenBase_get_FileScreenFlags(IFsrmFileScreenBase* This,LONG *fileScreenFlags) {
+    return This->lpVtbl->get_FileScreenFlags(This,fileScreenFlags);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenBase_put_FileScreenFlags(IFsrmFileScreenBase* This,LONG fileScreenFlags) {
+    return This->lpVtbl->put_FileScreenFlags(This,fileScreenFlags);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenBase_CreateAction(IFsrmFileScreenBase* This,FsrmActionType actionType,IFsrmAction **action) {
+    return This->lpVtbl->CreateAction(This,actionType,action);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenBase_EnumActions(IFsrmFileScreenBase* This,IFsrmCollection **actions) {
+    return This->lpVtbl->EnumActions(This,actions);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmFileScreenBase_get_BlockedFileGroups_Proxy(
+    IFsrmFileScreenBase* This,
+    IFsrmMutableCollection **blockList);
+void __RPC_STUB IFsrmFileScreenBase_get_BlockedFileGroups_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileScreenBase_put_BlockedFileGroups_Proxy(
+    IFsrmFileScreenBase* This,
+    IFsrmMutableCollection *blockList);
+void __RPC_STUB IFsrmFileScreenBase_put_BlockedFileGroups_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileScreenBase_get_FileScreenFlags_Proxy(
+    IFsrmFileScreenBase* This,
+    LONG *fileScreenFlags);
+void __RPC_STUB IFsrmFileScreenBase_get_FileScreenFlags_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileScreenBase_put_FileScreenFlags_Proxy(
+    IFsrmFileScreenBase* This,
+    LONG fileScreenFlags);
+void __RPC_STUB IFsrmFileScreenBase_put_FileScreenFlags_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileScreenBase_CreateAction_Proxy(
+    IFsrmFileScreenBase* This,
+    FsrmActionType actionType,
+    IFsrmAction **action);
+void __RPC_STUB IFsrmFileScreenBase_CreateAction_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileScreenBase_EnumActions_Proxy(
+    IFsrmFileScreenBase* This,
+    IFsrmCollection **actions);
+void __RPC_STUB IFsrmFileScreenBase_EnumActions_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IFsrmFileScreenBase_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IFsrmFileScreenException interface
+ */
+#ifndef __IFsrmFileScreenException_INTERFACE_DEFINED__
+#define __IFsrmFileScreenException_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IFsrmFileScreenException, 0xbee7ce02, 0xdf77, 0x4515, 0x93,0x89, 0x78,0xf0,0x1c,0x5a,0xfc,0x1a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("bee7ce02-df77-4515-9389-78f01c5afc1a")
+IFsrmFileScreenException : public IFsrmObject
+{
+    virtual HRESULT STDMETHODCALLTYPE get_Path(
+        BSTR *path) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_AllowedFileGroups(
+        IFsrmMutableCollection **allowList) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_AllowedFileGroups(
+        IFsrmMutableCollection *allowList) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IFsrmFileScreenException, 0xbee7ce02, 0xdf77, 0x4515, 0x93,0x89, 0x78,0xf0,0x1c,0x5a,0xfc,0x1a)
+#endif
+#else
+typedef struct IFsrmFileScreenExceptionVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFsrmFileScreenException* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFsrmFileScreenException* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFsrmFileScreenException* This);
+
+    /*** IDispatch methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
+        IFsrmFileScreenException* This,
+        UINT *pctinfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
+        IFsrmFileScreenException* This,
+        UINT iTInfo,
+        LCID lcid,
+        ITypeInfo **ppTInfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
+        IFsrmFileScreenException* This,
+        REFIID riid,
+        LPOLESTR *rgszNames,
+        UINT cNames,
+        LCID lcid,
+        DISPID *rgDispId);
+
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        IFsrmFileScreenException* This,
+        DISPID dispIdMember,
+        REFIID riid,
+        LCID lcid,
+        WORD wFlags,
+        DISPPARAMS *pDispParams,
+        VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo,
+        UINT *puArgErr);
+
+    /*** IFsrmObject methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Id)(
+        IFsrmFileScreenException* This,
+        FSRM_OBJECT_ID *id);
+
+    HRESULT (STDMETHODCALLTYPE *get_Description)(
+        IFsrmFileScreenException* This,
+        BSTR *description);
+
+    HRESULT (STDMETHODCALLTYPE *put_Description)(
+        IFsrmFileScreenException* This,
+        BSTR description);
+
+    HRESULT (STDMETHODCALLTYPE *Delete)(
+        IFsrmFileScreenException* This);
+
+    HRESULT (STDMETHODCALLTYPE *Commit)(
+        IFsrmFileScreenException* This);
+
+    /*** IFsrmFileScreenException methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Path)(
+        IFsrmFileScreenException* This,
+        BSTR *path);
+
+    HRESULT (STDMETHODCALLTYPE *get_AllowedFileGroups)(
+        IFsrmFileScreenException* This,
+        IFsrmMutableCollection **allowList);
+
+    HRESULT (STDMETHODCALLTYPE *put_AllowedFileGroups)(
+        IFsrmFileScreenException* This,
+        IFsrmMutableCollection *allowList);
+
+    END_INTERFACE
+} IFsrmFileScreenExceptionVtbl;
+interface IFsrmFileScreenException {
+    CONST_VTBL IFsrmFileScreenExceptionVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IFsrmFileScreenException_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IFsrmFileScreenException_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IFsrmFileScreenException_Release(This) (This)->lpVtbl->Release(This)
+/*** IDispatch methods ***/
+#define IFsrmFileScreenException_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
+#define IFsrmFileScreenException_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
+#define IFsrmFileScreenException_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
+#define IFsrmFileScreenException_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 IFsrmFileScreenException_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
+#define IFsrmFileScreenException_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
+#define IFsrmFileScreenException_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
+#define IFsrmFileScreenException_Delete(This) (This)->lpVtbl->Delete(This)
+#define IFsrmFileScreenException_Commit(This) (This)->lpVtbl->Commit(This)
+/*** IFsrmFileScreenException methods ***/
+#define IFsrmFileScreenException_get_Path(This,path) (This)->lpVtbl->get_Path(This,path)
+#define IFsrmFileScreenException_get_AllowedFileGroups(This,allowList) (This)->lpVtbl->get_AllowedFileGroups(This,allowList)
+#define IFsrmFileScreenException_put_AllowedFileGroups(This,allowList) (This)->lpVtbl->put_AllowedFileGroups(This,allowList)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IFsrmFileScreenException_QueryInterface(IFsrmFileScreenException* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmFileScreenException_AddRef(IFsrmFileScreenException* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmFileScreenException_Release(IFsrmFileScreenException* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmFileScreenException_GetTypeInfoCount(IFsrmFileScreenException* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenException_GetTypeInfo(IFsrmFileScreenException* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenException_GetIDsOfNames(IFsrmFileScreenException* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
+    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenException_Invoke(IFsrmFileScreenException* 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 FORCEINLINE HRESULT IFsrmFileScreenException_get_Id(IFsrmFileScreenException* This,FSRM_OBJECT_ID *id) {
+    return This->lpVtbl->get_Id(This,id);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenException_get_Description(IFsrmFileScreenException* This,BSTR *description) {
+    return This->lpVtbl->get_Description(This,description);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenException_put_Description(IFsrmFileScreenException* This,BSTR description) {
+    return This->lpVtbl->put_Description(This,description);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenException_Delete(IFsrmFileScreenException* This) {
+    return This->lpVtbl->Delete(This);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenException_Commit(IFsrmFileScreenException* This) {
+    return This->lpVtbl->Commit(This);
+}
+/*** IFsrmFileScreenException methods ***/
+static FORCEINLINE HRESULT IFsrmFileScreenException_get_Path(IFsrmFileScreenException* This,BSTR *path) {
+    return This->lpVtbl->get_Path(This,path);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenException_get_AllowedFileGroups(IFsrmFileScreenException* This,IFsrmMutableCollection **allowList) {
+    return This->lpVtbl->get_AllowedFileGroups(This,allowList);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenException_put_AllowedFileGroups(IFsrmFileScreenException* This,IFsrmMutableCollection *allowList) {
+    return This->lpVtbl->put_AllowedFileGroups(This,allowList);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmFileScreenException_get_Path_Proxy(
+    IFsrmFileScreenException* This,
+    BSTR *path);
+void __RPC_STUB IFsrmFileScreenException_get_Path_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileScreenException_get_AllowedFileGroups_Proxy(
+    IFsrmFileScreenException* This,
+    IFsrmMutableCollection **allowList);
+void __RPC_STUB IFsrmFileScreenException_get_AllowedFileGroups_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileScreenException_put_AllowedFileGroups_Proxy(
+    IFsrmFileScreenException* This,
+    IFsrmMutableCollection *allowList);
+void __RPC_STUB IFsrmFileScreenException_put_AllowedFileGroups_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IFsrmFileScreenException_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IFsrmFileScreen interface
+ */
+#ifndef __IFsrmFileScreen_INTERFACE_DEFINED__
+#define __IFsrmFileScreen_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IFsrmFileScreen, 0x5f6325d3, 0xce88, 0x4733, 0x84,0xc1, 0x2d,0x6a,0xef,0xc5,0xea,0x07);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("5f6325d3-ce88-4733-84c1-2d6aefc5ea07")
+IFsrmFileScreen : public IFsrmFileScreenBase
+{
+    virtual HRESULT STDMETHODCALLTYPE get_Path(
+        BSTR *path) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_SourceTemplateName(
+        BSTR *fileScreenTemplateName) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_MatchesSourceTemplate(
+        VARIANT_BOOL *matches) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_UserSid(
+        BSTR *userSid) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_UserAccount(
+        BSTR *userAccount) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ApplyTemplate(
+        BSTR fileScreenTemplateName) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IFsrmFileScreen, 0x5f6325d3, 0xce88, 0x4733, 0x84,0xc1, 0x2d,0x6a,0xef,0xc5,0xea,0x07)
+#endif
+#else
+typedef struct IFsrmFileScreenVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFsrmFileScreen* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFsrmFileScreen* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFsrmFileScreen* This);
+
+    /*** IDispatch methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
+        IFsrmFileScreen* This,
+        UINT *pctinfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
+        IFsrmFileScreen* This,
+        UINT iTInfo,
+        LCID lcid,
+        ITypeInfo **ppTInfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
+        IFsrmFileScreen* This,
+        REFIID riid,
+        LPOLESTR *rgszNames,
+        UINT cNames,
+        LCID lcid,
+        DISPID *rgDispId);
+
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        IFsrmFileScreen* This,
+        DISPID dispIdMember,
+        REFIID riid,
+        LCID lcid,
+        WORD wFlags,
+        DISPPARAMS *pDispParams,
+        VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo,
+        UINT *puArgErr);
+
+    /*** IFsrmObject methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Id)(
+        IFsrmFileScreen* This,
+        FSRM_OBJECT_ID *id);
+
+    HRESULT (STDMETHODCALLTYPE *get_Description)(
+        IFsrmFileScreen* This,
+        BSTR *description);
+
+    HRESULT (STDMETHODCALLTYPE *put_Description)(
+        IFsrmFileScreen* This,
+        BSTR description);
+
+    HRESULT (STDMETHODCALLTYPE *Delete)(
+        IFsrmFileScreen* This);
+
+    HRESULT (STDMETHODCALLTYPE *Commit)(
+        IFsrmFileScreen* This);
+
+    /*** IFsrmFileScreenBase methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_BlockedFileGroups)(
+        IFsrmFileScreen* This,
+        IFsrmMutableCollection **blockList);
+
+    HRESULT (STDMETHODCALLTYPE *put_BlockedFileGroups)(
+        IFsrmFileScreen* This,
+        IFsrmMutableCollection *blockList);
+
+    HRESULT (STDMETHODCALLTYPE *get_FileScreenFlags)(
+        IFsrmFileScreen* This,
+        LONG *fileScreenFlags);
+
+    HRESULT (STDMETHODCALLTYPE *put_FileScreenFlags)(
+        IFsrmFileScreen* This,
+        LONG fileScreenFlags);
+
+    HRESULT (STDMETHODCALLTYPE *CreateAction)(
+        IFsrmFileScreen* This,
+        FsrmActionType actionType,
+        IFsrmAction **action);
+
+    HRESULT (STDMETHODCALLTYPE *EnumActions)(
+        IFsrmFileScreen* This,
+        IFsrmCollection **actions);
+
+    /*** IFsrmFileScreen methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Path)(
+        IFsrmFileScreen* This,
+        BSTR *path);
+
+    HRESULT (STDMETHODCALLTYPE *get_SourceTemplateName)(
+        IFsrmFileScreen* This,
+        BSTR *fileScreenTemplateName);
+
+    HRESULT (STDMETHODCALLTYPE *get_MatchesSourceTemplate)(
+        IFsrmFileScreen* This,
+        VARIANT_BOOL *matches);
+
+    HRESULT (STDMETHODCALLTYPE *get_UserSid)(
+        IFsrmFileScreen* This,
+        BSTR *userSid);
+
+    HRESULT (STDMETHODCALLTYPE *get_UserAccount)(
+        IFsrmFileScreen* This,
+        BSTR *userAccount);
+
+    HRESULT (STDMETHODCALLTYPE *ApplyTemplate)(
+        IFsrmFileScreen* This,
+        BSTR fileScreenTemplateName);
+
+    END_INTERFACE
+} IFsrmFileScreenVtbl;
+interface IFsrmFileScreen {
+    CONST_VTBL IFsrmFileScreenVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
 #define IFsrmFileScreen_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
 #define IFsrmFileScreen_AddRef(This) (This)->lpVtbl->AddRef(This)
 #define IFsrmFileScreen_Release(This) (This)->lpVtbl->Release(This)
+/*** IDispatch methods ***/
 #define IFsrmFileScreen_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
 #define IFsrmFileScreen_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
 #define IFsrmFileScreen_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
 #define IFsrmFileScreen_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 IFsrmFileScreen_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
 #define IFsrmFileScreen_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
 #define IFsrmFileScreen_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
-#define IFsrmFileScreen_Delete() (This)->lpVtbl->Delete(This)
-#define IFsrmFileScreen_Commit() (This)->lpVtbl->Commit(This)
+#define IFsrmFileScreen_Delete(This) (This)->lpVtbl->Delete(This)
+#define IFsrmFileScreen_Commit(This) (This)->lpVtbl->Commit(This)
+/*** IFsrmFileScreenBase methods ***/
 #define IFsrmFileScreen_get_BlockedFileGroups(This,blockList) (This)->lpVtbl->get_BlockedFileGroups(This,blockList)
 #define IFsrmFileScreen_put_BlockedFileGroups(This,blockList) (This)->lpVtbl->put_BlockedFileGroups(This,blockList)
 #define IFsrmFileScreen_get_FileScreenFlags(This,fileScreenFlags) (This)->lpVtbl->get_FileScreenFlags(This,fileScreenFlags)
 #define IFsrmFileScreen_put_FileScreenFlags(This,fileScreenFlags) (This)->lpVtbl->put_FileScreenFlags(This,fileScreenFlags)
-#define IFsrmFileScreen_get_UserSid(This,userSid) (This)->lpVtbl->get_UserSid(This,userSid)
-#define IFsrmFileScreen_get_UserAccount(This,userAccount) (This)->lpVtbl->get_UserAccount(This,userAccount)
 #define IFsrmFileScreen_CreateAction(This,actionType,action) (This)->lpVtbl->CreateAction(This,actionType,action)
 #define IFsrmFileScreen_EnumActions(This,actions) (This)->lpVtbl->EnumActions(This,actions)
+/*** IFsrmFileScreen methods ***/
 #define IFsrmFileScreen_get_Path(This,path) (This)->lpVtbl->get_Path(This,path)
 #define IFsrmFileScreen_get_SourceTemplateName(This,fileScreenTemplateName) (This)->lpVtbl->get_SourceTemplateName(This,fileScreenTemplateName)
 #define IFsrmFileScreen_get_MatchesSourceTemplate(This,matches) (This)->lpVtbl->get_MatchesSourceTemplate(This,matches)
+#define IFsrmFileScreen_get_UserSid(This,userSid) (This)->lpVtbl->get_UserSid(This,userSid)
+#define IFsrmFileScreen_get_UserAccount(This,userAccount) (This)->lpVtbl->get_UserAccount(This,userAccount)
 #define IFsrmFileScreen_ApplyTemplate(This,fileScreenTemplateName) (This)->lpVtbl->ApplyTemplate(This,fileScreenTemplateName)
-#endif /*COBJMACROS*/
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IFsrmFileScreen_QueryInterface(IFsrmFileScreen* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmFileScreen_AddRef(IFsrmFileScreen* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmFileScreen_Release(IFsrmFileScreen* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmFileScreen_GetTypeInfoCount(IFsrmFileScreen* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmFileScreen_GetTypeInfo(IFsrmFileScreen* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE HRESULT IFsrmFileScreen_GetIDsOfNames(IFsrmFileScreen* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
+    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
+}
+static FORCEINLINE HRESULT IFsrmFileScreen_Invoke(IFsrmFileScreen* 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 FORCEINLINE HRESULT IFsrmFileScreen_get_Id(IFsrmFileScreen* This,FSRM_OBJECT_ID *id) {
+    return This->lpVtbl->get_Id(This,id);
+}
+static FORCEINLINE HRESULT IFsrmFileScreen_get_Description(IFsrmFileScreen* This,BSTR *description) {
+    return This->lpVtbl->get_Description(This,description);
+}
+static FORCEINLINE HRESULT IFsrmFileScreen_put_Description(IFsrmFileScreen* This,BSTR description) {
+    return This->lpVtbl->put_Description(This,description);
+}
+static FORCEINLINE HRESULT IFsrmFileScreen_Delete(IFsrmFileScreen* This) {
+    return This->lpVtbl->Delete(This);
+}
+static FORCEINLINE HRESULT IFsrmFileScreen_Commit(IFsrmFileScreen* This) {
+    return This->lpVtbl->Commit(This);
+}
+/*** IFsrmFileScreenBase methods ***/
+static FORCEINLINE HRESULT IFsrmFileScreen_get_BlockedFileGroups(IFsrmFileScreen* This,IFsrmMutableCollection **blockList) {
+    return This->lpVtbl->get_BlockedFileGroups(This,blockList);
+}
+static FORCEINLINE HRESULT IFsrmFileScreen_put_BlockedFileGroups(IFsrmFileScreen* This,IFsrmMutableCollection *blockList) {
+    return This->lpVtbl->put_BlockedFileGroups(This,blockList);
+}
+static FORCEINLINE HRESULT IFsrmFileScreen_get_FileScreenFlags(IFsrmFileScreen* This,LONG *fileScreenFlags) {
+    return This->lpVtbl->get_FileScreenFlags(This,fileScreenFlags);
+}
+static FORCEINLINE HRESULT IFsrmFileScreen_put_FileScreenFlags(IFsrmFileScreen* This,LONG fileScreenFlags) {
+    return This->lpVtbl->put_FileScreenFlags(This,fileScreenFlags);
+}
+static FORCEINLINE HRESULT IFsrmFileScreen_CreateAction(IFsrmFileScreen* This,FsrmActionType actionType,IFsrmAction **action) {
+    return This->lpVtbl->CreateAction(This,actionType,action);
+}
+static FORCEINLINE HRESULT IFsrmFileScreen_EnumActions(IFsrmFileScreen* This,IFsrmCollection **actions) {
+    return This->lpVtbl->EnumActions(This,actions);
+}
+/*** IFsrmFileScreen methods ***/
+static FORCEINLINE HRESULT IFsrmFileScreen_get_Path(IFsrmFileScreen* This,BSTR *path) {
+    return This->lpVtbl->get_Path(This,path);
+}
+static FORCEINLINE HRESULT IFsrmFileScreen_get_SourceTemplateName(IFsrmFileScreen* This,BSTR *fileScreenTemplateName) {
+    return This->lpVtbl->get_SourceTemplateName(This,fileScreenTemplateName);
+}
+static FORCEINLINE HRESULT IFsrmFileScreen_get_MatchesSourceTemplate(IFsrmFileScreen* This,VARIANT_BOOL *matches) {
+    return This->lpVtbl->get_MatchesSourceTemplate(This,matches);
+}
+static FORCEINLINE HRESULT IFsrmFileScreen_get_UserSid(IFsrmFileScreen* This,BSTR *userSid) {
+    return This->lpVtbl->get_UserSid(This,userSid);
+}
+static FORCEINLINE HRESULT IFsrmFileScreen_get_UserAccount(IFsrmFileScreen* This,BSTR *userAccount) {
+    return This->lpVtbl->get_UserAccount(This,userAccount);
+}
+static FORCEINLINE HRESULT IFsrmFileScreen_ApplyTemplate(IFsrmFileScreen* This,BSTR fileScreenTemplateName) {
+    return This->lpVtbl->ApplyTemplate(This,fileScreenTemplateName);
+}
+#endif
+#endif
 
-#endif /*(_WIN32_WINNT >= 0x0600)*/
-#include <fsrmreports.h>
-#endif /*_INC_FSRMSCREEN*/
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmFileScreen_get_Path_Proxy(
+    IFsrmFileScreen* This,
+    BSTR *path);
+void __RPC_STUB IFsrmFileScreen_get_Path_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileScreen_get_SourceTemplateName_Proxy(
+    IFsrmFileScreen* This,
+    BSTR *fileScreenTemplateName);
+void __RPC_STUB IFsrmFileScreen_get_SourceTemplateName_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileScreen_get_MatchesSourceTemplate_Proxy(
+    IFsrmFileScreen* This,
+    VARIANT_BOOL *matches);
+void __RPC_STUB IFsrmFileScreen_get_MatchesSourceTemplate_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileScreen_get_UserSid_Proxy(
+    IFsrmFileScreen* This,
+    BSTR *userSid);
+void __RPC_STUB IFsrmFileScreen_get_UserSid_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileScreen_get_UserAccount_Proxy(
+    IFsrmFileScreen* This,
+    BSTR *userAccount);
+void __RPC_STUB IFsrmFileScreen_get_UserAccount_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileScreen_ApplyTemplate_Proxy(
+    IFsrmFileScreen* This,
+    BSTR fileScreenTemplateName);
+void __RPC_STUB IFsrmFileScreen_ApplyTemplate_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IFsrmFileScreen_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IFsrmFileGroupImported interface
+ */
+#ifndef __IFsrmFileGroupImported_INTERFACE_DEFINED__
+#define __IFsrmFileGroupImported_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IFsrmFileGroupImported, 0xad55f10b, 0x5f11, 0x4be7, 0x94,0xef, 0xd9,0xee,0x2e,0x47,0x0d,0xed);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("ad55f10b-5f11-4be7-94ef-d9ee2e470ded")
+IFsrmFileGroupImported : public IFsrmFileGroup
+{
+    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(IFsrmFileGroupImported, 0xad55f10b, 0x5f11, 0x4be7, 0x94,0xef, 0xd9,0xee,0x2e,0x47,0x0d,0xed)
+#endif
+#else
+typedef struct IFsrmFileGroupImportedVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFsrmFileGroupImported* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFsrmFileGroupImported* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFsrmFileGroupImported* This);
+
+    /*** IDispatch methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
+        IFsrmFileGroupImported* This,
+        UINT *pctinfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
+        IFsrmFileGroupImported* This,
+        UINT iTInfo,
+        LCID lcid,
+        ITypeInfo **ppTInfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
+        IFsrmFileGroupImported* This,
+        REFIID riid,
+        LPOLESTR *rgszNames,
+        UINT cNames,
+        LCID lcid,
+        DISPID *rgDispId);
+
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        IFsrmFileGroupImported* This,
+        DISPID dispIdMember,
+        REFIID riid,
+        LCID lcid,
+        WORD wFlags,
+        DISPPARAMS *pDispParams,
+        VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo,
+        UINT *puArgErr);
+
+    /*** IFsrmObject methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Id)(
+        IFsrmFileGroupImported* This,
+        FSRM_OBJECT_ID *id);
+
+    HRESULT (STDMETHODCALLTYPE *get_Description)(
+        IFsrmFileGroupImported* This,
+        BSTR *description);
+
+    HRESULT (STDMETHODCALLTYPE *put_Description)(
+        IFsrmFileGroupImported* This,
+        BSTR description);
+
+    HRESULT (STDMETHODCALLTYPE *Delete)(
+        IFsrmFileGroupImported* This);
+
+    HRESULT (STDMETHODCALLTYPE *Commit)(
+        IFsrmFileGroupImported* This);
+
+    /*** IFsrmFileGroup methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Name)(
+        IFsrmFileGroupImported* This,
+        BSTR *name);
+
+    HRESULT (STDMETHODCALLTYPE *put_Name)(
+        IFsrmFileGroupImported* This,
+        BSTR name);
+
+    HRESULT (STDMETHODCALLTYPE *get_Members)(
+        IFsrmFileGroupImported* This,
+        IFsrmMutableCollection **members);
+
+    HRESULT (STDMETHODCALLTYPE *put_Members)(
+        IFsrmFileGroupImported* This,
+        IFsrmMutableCollection *members);
+
+    HRESULT (STDMETHODCALLTYPE *get_NonMembers)(
+        IFsrmFileGroupImported* This,
+        IFsrmMutableCollection **nonMembers);
+
+    HRESULT (STDMETHODCALLTYPE *put_NonMembers)(
+        IFsrmFileGroupImported* This,
+        IFsrmMutableCollection *nonMembers);
+
+    /*** IFsrmFileGroupImported methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_OverwriteOnCommit)(
+        IFsrmFileGroupImported* This,
+        VARIANT_BOOL *overwrite);
+
+    HRESULT (STDMETHODCALLTYPE *put_OverwriteOnCommit)(
+        IFsrmFileGroupImported* This,
+        VARIANT_BOOL overwrite);
+
+    END_INTERFACE
+} IFsrmFileGroupImportedVtbl;
+interface IFsrmFileGroupImported {
+    CONST_VTBL IFsrmFileGroupImportedVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IFsrmFileGroupImported_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IFsrmFileGroupImported_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IFsrmFileGroupImported_Release(This) (This)->lpVtbl->Release(This)
+/*** IDispatch methods ***/
+#define IFsrmFileGroupImported_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
+#define IFsrmFileGroupImported_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
+#define IFsrmFileGroupImported_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
+#define IFsrmFileGroupImported_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 IFsrmFileGroupImported_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
+#define IFsrmFileGroupImported_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
+#define IFsrmFileGroupImported_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
+#define IFsrmFileGroupImported_Delete(This) (This)->lpVtbl->Delete(This)
+#define IFsrmFileGroupImported_Commit(This) (This)->lpVtbl->Commit(This)
+/*** IFsrmFileGroup methods ***/
+#define IFsrmFileGroupImported_get_Name(This,name) (This)->lpVtbl->get_Name(This,name)
+#define IFsrmFileGroupImported_put_Name(This,name) (This)->lpVtbl->put_Name(This,name)
+#define IFsrmFileGroupImported_get_Members(This,members) (This)->lpVtbl->get_Members(This,members)
+#define IFsrmFileGroupImported_put_Members(This,members) (This)->lpVtbl->put_Members(This,members)
+#define IFsrmFileGroupImported_get_NonMembers(This,nonMembers) (This)->lpVtbl->get_NonMembers(This,nonMembers)
+#define IFsrmFileGroupImported_put_NonMembers(This,nonMembers) (This)->lpVtbl->put_NonMembers(This,nonMembers)
+/*** IFsrmFileGroupImported methods ***/
+#define IFsrmFileGroupImported_get_OverwriteOnCommit(This,overwrite) (This)->lpVtbl->get_OverwriteOnCommit(This,overwrite)
+#define IFsrmFileGroupImported_put_OverwriteOnCommit(This,overwrite) (This)->lpVtbl->put_OverwriteOnCommit(This,overwrite)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IFsrmFileGroupImported_QueryInterface(IFsrmFileGroupImported* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmFileGroupImported_AddRef(IFsrmFileGroupImported* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmFileGroupImported_Release(IFsrmFileGroupImported* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmFileGroupImported_GetTypeInfoCount(IFsrmFileGroupImported* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmFileGroupImported_GetTypeInfo(IFsrmFileGroupImported* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE HRESULT IFsrmFileGroupImported_GetIDsOfNames(IFsrmFileGroupImported* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
+    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
+}
+static FORCEINLINE HRESULT IFsrmFileGroupImported_Invoke(IFsrmFileGroupImported* 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 FORCEINLINE HRESULT IFsrmFileGroupImported_get_Id(IFsrmFileGroupImported* This,FSRM_OBJECT_ID *id) {
+    return This->lpVtbl->get_Id(This,id);
+}
+static FORCEINLINE HRESULT IFsrmFileGroupImported_get_Description(IFsrmFileGroupImported* This,BSTR *description) {
+    return This->lpVtbl->get_Description(This,description);
+}
+static FORCEINLINE HRESULT IFsrmFileGroupImported_put_Description(IFsrmFileGroupImported* This,BSTR description) {
+    return This->lpVtbl->put_Description(This,description);
+}
+static FORCEINLINE HRESULT IFsrmFileGroupImported_Delete(IFsrmFileGroupImported* This) {
+    return This->lpVtbl->Delete(This);
+}
+static FORCEINLINE HRESULT IFsrmFileGroupImported_Commit(IFsrmFileGroupImported* This) {
+    return This->lpVtbl->Commit(This);
+}
+/*** IFsrmFileGroup methods ***/
+static FORCEINLINE HRESULT IFsrmFileGroupImported_get_Name(IFsrmFileGroupImported* This,BSTR *name) {
+    return This->lpVtbl->get_Name(This,name);
+}
+static FORCEINLINE HRESULT IFsrmFileGroupImported_put_Name(IFsrmFileGroupImported* This,BSTR name) {
+    return This->lpVtbl->put_Name(This,name);
+}
+static FORCEINLINE HRESULT IFsrmFileGroupImported_get_Members(IFsrmFileGroupImported* This,IFsrmMutableCollection **members) {
+    return This->lpVtbl->get_Members(This,members);
+}
+static FORCEINLINE HRESULT IFsrmFileGroupImported_put_Members(IFsrmFileGroupImported* This,IFsrmMutableCollection *members) {
+    return This->lpVtbl->put_Members(This,members);
+}
+static FORCEINLINE HRESULT IFsrmFileGroupImported_get_NonMembers(IFsrmFileGroupImported* This,IFsrmMutableCollection **nonMembers) {
+    return This->lpVtbl->get_NonMembers(This,nonMembers);
+}
+static FORCEINLINE HRESULT IFsrmFileGroupImported_put_NonMembers(IFsrmFileGroupImported* This,IFsrmMutableCollection *nonMembers) {
+    return This->lpVtbl->put_NonMembers(This,nonMembers);
+}
+/*** IFsrmFileGroupImported methods ***/
+static FORCEINLINE HRESULT IFsrmFileGroupImported_get_OverwriteOnCommit(IFsrmFileGroupImported* This,VARIANT_BOOL *overwrite) {
+    return This->lpVtbl->get_OverwriteOnCommit(This,overwrite);
+}
+static FORCEINLINE HRESULT IFsrmFileGroupImported_put_OverwriteOnCommit(IFsrmFileGroupImported* This,VARIANT_BOOL overwrite) {
+    return This->lpVtbl->put_OverwriteOnCommit(This,overwrite);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmFileGroupImported_get_OverwriteOnCommit_Proxy(
+    IFsrmFileGroupImported* This,
+    VARIANT_BOOL *overwrite);
+void __RPC_STUB IFsrmFileGroupImported_get_OverwriteOnCommit_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileGroupImported_put_OverwriteOnCommit_Proxy(
+    IFsrmFileGroupImported* This,
+    VARIANT_BOOL overwrite);
+void __RPC_STUB IFsrmFileGroupImported_put_OverwriteOnCommit_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IFsrmFileGroupImported_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IFsrmFileScreenTemplate interface
+ */
+#ifndef __IFsrmFileScreenTemplate_INTERFACE_DEFINED__
+#define __IFsrmFileScreenTemplate_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IFsrmFileScreenTemplate, 0x205bebf8, 0xdd93, 0x452a, 0x95,0xa6, 0x32,0xb5,0x66,0xb3,0x58,0x28);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("205bebf8-dd93-452a-95a6-32b566b35828")
+IFsrmFileScreenTemplate : public IFsrmFileScreenBase
+{
+    virtual HRESULT STDMETHODCALLTYPE get_Name(
+        BSTR *name) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_Name(
+        BSTR name) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CopyTemplate(
+        BSTR fileScreenTemplateName) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CommitAndUpdateDerived(
+        FsrmCommitOptions commitOptions,
+        FsrmTemplateApplyOptions applyOptions,
+        IFsrmDerivedObjectsResult **derivedObjectsResult) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IFsrmFileScreenTemplate, 0x205bebf8, 0xdd93, 0x452a, 0x95,0xa6, 0x32,0xb5,0x66,0xb3,0x58,0x28)
+#endif
+#else
+typedef struct IFsrmFileScreenTemplateVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFsrmFileScreenTemplate* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFsrmFileScreenTemplate* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFsrmFileScreenTemplate* This);
+
+    /*** IDispatch methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
+        IFsrmFileScreenTemplate* This,
+        UINT *pctinfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
+        IFsrmFileScreenTemplate* This,
+        UINT iTInfo,
+        LCID lcid,
+        ITypeInfo **ppTInfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
+        IFsrmFileScreenTemplate* This,
+        REFIID riid,
+        LPOLESTR *rgszNames,
+        UINT cNames,
+        LCID lcid,
+        DISPID *rgDispId);
+
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        IFsrmFileScreenTemplate* This,
+        DISPID dispIdMember,
+        REFIID riid,
+        LCID lcid,
+        WORD wFlags,
+        DISPPARAMS *pDispParams,
+        VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo,
+        UINT *puArgErr);
+
+    /*** IFsrmObject methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Id)(
+        IFsrmFileScreenTemplate* This,
+        FSRM_OBJECT_ID *id);
+
+    HRESULT (STDMETHODCALLTYPE *get_Description)(
+        IFsrmFileScreenTemplate* This,
+        BSTR *description);
+
+    HRESULT (STDMETHODCALLTYPE *put_Description)(
+        IFsrmFileScreenTemplate* This,
+        BSTR description);
+
+    HRESULT (STDMETHODCALLTYPE *Delete)(
+        IFsrmFileScreenTemplate* This);
+
+    HRESULT (STDMETHODCALLTYPE *Commit)(
+        IFsrmFileScreenTemplate* This);
+
+    /*** IFsrmFileScreenBase methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_BlockedFileGroups)(
+        IFsrmFileScreenTemplate* This,
+        IFsrmMutableCollection **blockList);
+
+    HRESULT (STDMETHODCALLTYPE *put_BlockedFileGroups)(
+        IFsrmFileScreenTemplate* This,
+        IFsrmMutableCollection *blockList);
+
+    HRESULT (STDMETHODCALLTYPE *get_FileScreenFlags)(
+        IFsrmFileScreenTemplate* This,
+        LONG *fileScreenFlags);
+
+    HRESULT (STDMETHODCALLTYPE *put_FileScreenFlags)(
+        IFsrmFileScreenTemplate* This,
+        LONG fileScreenFlags);
+
+    HRESULT (STDMETHODCALLTYPE *CreateAction)(
+        IFsrmFileScreenTemplate* This,
+        FsrmActionType actionType,
+        IFsrmAction **action);
+
+    HRESULT (STDMETHODCALLTYPE *EnumActions)(
+        IFsrmFileScreenTemplate* This,
+        IFsrmCollection **actions);
+
+    /*** IFsrmFileScreenTemplate methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Name)(
+        IFsrmFileScreenTemplate* This,
+        BSTR *name);
+
+    HRESULT (STDMETHODCALLTYPE *put_Name)(
+        IFsrmFileScreenTemplate* This,
+        BSTR name);
+
+    HRESULT (STDMETHODCALLTYPE *CopyTemplate)(
+        IFsrmFileScreenTemplate* This,
+        BSTR fileScreenTemplateName);
+
+    HRESULT (STDMETHODCALLTYPE *CommitAndUpdateDerived)(
+        IFsrmFileScreenTemplate* This,
+        FsrmCommitOptions commitOptions,
+        FsrmTemplateApplyOptions applyOptions,
+        IFsrmDerivedObjectsResult **derivedObjectsResult);
+
+    END_INTERFACE
+} IFsrmFileScreenTemplateVtbl;
+interface IFsrmFileScreenTemplate {
+    CONST_VTBL IFsrmFileScreenTemplateVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IFsrmFileScreenTemplate_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IFsrmFileScreenTemplate_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IFsrmFileScreenTemplate_Release(This) (This)->lpVtbl->Release(This)
+/*** IDispatch methods ***/
+#define IFsrmFileScreenTemplate_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
+#define IFsrmFileScreenTemplate_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
+#define IFsrmFileScreenTemplate_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
+#define IFsrmFileScreenTemplate_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 IFsrmFileScreenTemplate_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
+#define IFsrmFileScreenTemplate_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
+#define IFsrmFileScreenTemplate_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
+#define IFsrmFileScreenTemplate_Delete(This) (This)->lpVtbl->Delete(This)
+#define IFsrmFileScreenTemplate_Commit(This) (This)->lpVtbl->Commit(This)
+/*** IFsrmFileScreenBase methods ***/
+#define IFsrmFileScreenTemplate_get_BlockedFileGroups(This,blockList) (This)->lpVtbl->get_BlockedFileGroups(This,blockList)
+#define IFsrmFileScreenTemplate_put_BlockedFileGroups(This,blockList) (This)->lpVtbl->put_BlockedFileGroups(This,blockList)
+#define IFsrmFileScreenTemplate_get_FileScreenFlags(This,fileScreenFlags) (This)->lpVtbl->get_FileScreenFlags(This,fileScreenFlags)
+#define IFsrmFileScreenTemplate_put_FileScreenFlags(This,fileScreenFlags) (This)->lpVtbl->put_FileScreenFlags(This,fileScreenFlags)
+#define IFsrmFileScreenTemplate_CreateAction(This,actionType,action) (This)->lpVtbl->CreateAction(This,actionType,action)
+#define IFsrmFileScreenTemplate_EnumActions(This,actions) (This)->lpVtbl->EnumActions(This,actions)
+/*** IFsrmFileScreenTemplate methods ***/
+#define IFsrmFileScreenTemplate_get_Name(This,name) (This)->lpVtbl->get_Name(This,name)
+#define IFsrmFileScreenTemplate_put_Name(This,name) (This)->lpVtbl->put_Name(This,name)
+#define IFsrmFileScreenTemplate_CopyTemplate(This,fileScreenTemplateName) (This)->lpVtbl->CopyTemplate(This,fileScreenTemplateName)
+#define IFsrmFileScreenTemplate_CommitAndUpdateDerived(This,commitOptions,applyOptions,derivedObjectsResult) (This)->lpVtbl->CommitAndUpdateDerived(This,commitOptions,applyOptions,derivedObjectsResult)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IFsrmFileScreenTemplate_QueryInterface(IFsrmFileScreenTemplate* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmFileScreenTemplate_AddRef(IFsrmFileScreenTemplate* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmFileScreenTemplate_Release(IFsrmFileScreenTemplate* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmFileScreenTemplate_GetTypeInfoCount(IFsrmFileScreenTemplate* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenTemplate_GetTypeInfo(IFsrmFileScreenTemplate* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenTemplate_GetIDsOfNames(IFsrmFileScreenTemplate* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
+    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenTemplate_Invoke(IFsrmFileScreenTemplate* 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 FORCEINLINE HRESULT IFsrmFileScreenTemplate_get_Id(IFsrmFileScreenTemplate* This,FSRM_OBJECT_ID *id) {
+    return This->lpVtbl->get_Id(This,id);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenTemplate_get_Description(IFsrmFileScreenTemplate* This,BSTR *description) {
+    return This->lpVtbl->get_Description(This,description);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenTemplate_put_Description(IFsrmFileScreenTemplate* This,BSTR description) {
+    return This->lpVtbl->put_Description(This,description);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenTemplate_Delete(IFsrmFileScreenTemplate* This) {
+    return This->lpVtbl->Delete(This);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenTemplate_Commit(IFsrmFileScreenTemplate* This) {
+    return This->lpVtbl->Commit(This);
+}
+/*** IFsrmFileScreenBase methods ***/
+static FORCEINLINE HRESULT IFsrmFileScreenTemplate_get_BlockedFileGroups(IFsrmFileScreenTemplate* This,IFsrmMutableCollection **blockList) {
+    return This->lpVtbl->get_BlockedFileGroups(This,blockList);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenTemplate_put_BlockedFileGroups(IFsrmFileScreenTemplate* This,IFsrmMutableCollection *blockList) {
+    return This->lpVtbl->put_BlockedFileGroups(This,blockList);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenTemplate_get_FileScreenFlags(IFsrmFileScreenTemplate* This,LONG *fileScreenFlags) {
+    return This->lpVtbl->get_FileScreenFlags(This,fileScreenFlags);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenTemplate_put_FileScreenFlags(IFsrmFileScreenTemplate* This,LONG fileScreenFlags) {
+    return This->lpVtbl->put_FileScreenFlags(This,fileScreenFlags);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenTemplate_CreateAction(IFsrmFileScreenTemplate* This,FsrmActionType actionType,IFsrmAction **action) {
+    return This->lpVtbl->CreateAction(This,actionType,action);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenTemplate_EnumActions(IFsrmFileScreenTemplate* This,IFsrmCollection **actions) {
+    return This->lpVtbl->EnumActions(This,actions);
+}
+/*** IFsrmFileScreenTemplate methods ***/
+static FORCEINLINE HRESULT IFsrmFileScreenTemplate_get_Name(IFsrmFileScreenTemplate* This,BSTR *name) {
+    return This->lpVtbl->get_Name(This,name);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenTemplate_put_Name(IFsrmFileScreenTemplate* This,BSTR name) {
+    return This->lpVtbl->put_Name(This,name);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenTemplate_CopyTemplate(IFsrmFileScreenTemplate* This,BSTR fileScreenTemplateName) {
+    return This->lpVtbl->CopyTemplate(This,fileScreenTemplateName);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenTemplate_CommitAndUpdateDerived(IFsrmFileScreenTemplate* This,FsrmCommitOptions commitOptions,FsrmTemplateApplyOptions applyOptions,IFsrmDerivedObjectsResult **derivedObjectsResult) {
+    return This->lpVtbl->CommitAndUpdateDerived(This,commitOptions,applyOptions,derivedObjectsResult);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmFileScreenTemplate_get_Name_Proxy(
+    IFsrmFileScreenTemplate* This,
+    BSTR *name);
+void __RPC_STUB IFsrmFileScreenTemplate_get_Name_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileScreenTemplate_put_Name_Proxy(
+    IFsrmFileScreenTemplate* This,
+    BSTR name);
+void __RPC_STUB IFsrmFileScreenTemplate_put_Name_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileScreenTemplate_CopyTemplate_Proxy(
+    IFsrmFileScreenTemplate* This,
+    BSTR fileScreenTemplateName);
+void __RPC_STUB IFsrmFileScreenTemplate_CopyTemplate_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileScreenTemplate_CommitAndUpdateDerived_Proxy(
+    IFsrmFileScreenTemplate* This,
+    FsrmCommitOptions commitOptions,
+    FsrmTemplateApplyOptions applyOptions,
+    IFsrmDerivedObjectsResult **derivedObjectsResult);
+void __RPC_STUB IFsrmFileScreenTemplate_CommitAndUpdateDerived_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IFsrmFileScreenTemplate_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IFsrmFileScreenTemplateImported interface
+ */
+#ifndef __IFsrmFileScreenTemplateImported_INTERFACE_DEFINED__
+#define __IFsrmFileScreenTemplateImported_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IFsrmFileScreenTemplateImported, 0xe1010359, 0x3e5d, 0x4ecd, 0x9f,0xe4, 0xef,0x48,0x62,0x2f,0xdf,0x30);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("e1010359-3e5d-4ecd-9fe4-ef48622fdf30")
+IFsrmFileScreenTemplateImported : public IFsrmFileScreenTemplate
+{
+    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(IFsrmFileScreenTemplateImported, 0xe1010359, 0x3e5d, 0x4ecd, 0x9f,0xe4, 0xef,0x48,0x62,0x2f,0xdf,0x30)
+#endif
+#else
+typedef struct IFsrmFileScreenTemplateImportedVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFsrmFileScreenTemplateImported* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFsrmFileScreenTemplateImported* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFsrmFileScreenTemplateImported* This);
+
+    /*** IDispatch methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
+        IFsrmFileScreenTemplateImported* This,
+        UINT *pctinfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
+        IFsrmFileScreenTemplateImported* This,
+        UINT iTInfo,
+        LCID lcid,
+        ITypeInfo **ppTInfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
+        IFsrmFileScreenTemplateImported* This,
+        REFIID riid,
+        LPOLESTR *rgszNames,
+        UINT cNames,
+        LCID lcid,
+        DISPID *rgDispId);
+
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        IFsrmFileScreenTemplateImported* This,
+        DISPID dispIdMember,
+        REFIID riid,
+        LCID lcid,
+        WORD wFlags,
+        DISPPARAMS *pDispParams,
+        VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo,
+        UINT *puArgErr);
+
+    /*** IFsrmObject methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Id)(
+        IFsrmFileScreenTemplateImported* This,
+        FSRM_OBJECT_ID *id);
+
+    HRESULT (STDMETHODCALLTYPE *get_Description)(
+        IFsrmFileScreenTemplateImported* This,
+        BSTR *description);
+
+    HRESULT (STDMETHODCALLTYPE *put_Description)(
+        IFsrmFileScreenTemplateImported* This,
+        BSTR description);
+
+    HRESULT (STDMETHODCALLTYPE *Delete)(
+        IFsrmFileScreenTemplateImported* This);
+
+    HRESULT (STDMETHODCALLTYPE *Commit)(
+        IFsrmFileScreenTemplateImported* This);
+
+    /*** IFsrmFileScreenBase methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_BlockedFileGroups)(
+        IFsrmFileScreenTemplateImported* This,
+        IFsrmMutableCollection **blockList);
+
+    HRESULT (STDMETHODCALLTYPE *put_BlockedFileGroups)(
+        IFsrmFileScreenTemplateImported* This,
+        IFsrmMutableCollection *blockList);
+
+    HRESULT (STDMETHODCALLTYPE *get_FileScreenFlags)(
+        IFsrmFileScreenTemplateImported* This,
+        LONG *fileScreenFlags);
+
+    HRESULT (STDMETHODCALLTYPE *put_FileScreenFlags)(
+        IFsrmFileScreenTemplateImported* This,
+        LONG fileScreenFlags);
+
+    HRESULT (STDMETHODCALLTYPE *CreateAction)(
+        IFsrmFileScreenTemplateImported* This,
+        FsrmActionType actionType,
+        IFsrmAction **action);
+
+    HRESULT (STDMETHODCALLTYPE *EnumActions)(
+        IFsrmFileScreenTemplateImported* This,
+        IFsrmCollection **actions);
+
+    /*** IFsrmFileScreenTemplate methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Name)(
+        IFsrmFileScreenTemplateImported* This,
+        BSTR *name);
+
+    HRESULT (STDMETHODCALLTYPE *put_Name)(
+        IFsrmFileScreenTemplateImported* This,
+        BSTR name);
+
+    HRESULT (STDMETHODCALLTYPE *CopyTemplate)(
+        IFsrmFileScreenTemplateImported* This,
+        BSTR fileScreenTemplateName);
+
+    HRESULT (STDMETHODCALLTYPE *CommitAndUpdateDerived)(
+        IFsrmFileScreenTemplateImported* This,
+        FsrmCommitOptions commitOptions,
+        FsrmTemplateApplyOptions applyOptions,
+        IFsrmDerivedObjectsResult **derivedObjectsResult);
+
+    /*** IFsrmFileScreenTemplateImported methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_OverwriteOnCommit)(
+        IFsrmFileScreenTemplateImported* This,
+        VARIANT_BOOL *overwrite);
+
+    HRESULT (STDMETHODCALLTYPE *put_OverwriteOnCommit)(
+        IFsrmFileScreenTemplateImported* This,
+        VARIANT_BOOL overwrite);
+
+    END_INTERFACE
+} IFsrmFileScreenTemplateImportedVtbl;
+interface IFsrmFileScreenTemplateImported {
+    CONST_VTBL IFsrmFileScreenTemplateImportedVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IFsrmFileScreenTemplateImported_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IFsrmFileScreenTemplateImported_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IFsrmFileScreenTemplateImported_Release(This) (This)->lpVtbl->Release(This)
+/*** IDispatch methods ***/
+#define IFsrmFileScreenTemplateImported_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
+#define IFsrmFileScreenTemplateImported_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
+#define IFsrmFileScreenTemplateImported_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
+#define IFsrmFileScreenTemplateImported_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 IFsrmFileScreenTemplateImported_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
+#define IFsrmFileScreenTemplateImported_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
+#define IFsrmFileScreenTemplateImported_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
+#define IFsrmFileScreenTemplateImported_Delete(This) (This)->lpVtbl->Delete(This)
+#define IFsrmFileScreenTemplateImported_Commit(This) (This)->lpVtbl->Commit(This)
+/*** IFsrmFileScreenBase methods ***/
+#define IFsrmFileScreenTemplateImported_get_BlockedFileGroups(This,blockList) (This)->lpVtbl->get_BlockedFileGroups(This,blockList)
+#define IFsrmFileScreenTemplateImported_put_BlockedFileGroups(This,blockList) (This)->lpVtbl->put_BlockedFileGroups(This,blockList)
+#define IFsrmFileScreenTemplateImported_get_FileScreenFlags(This,fileScreenFlags) (This)->lpVtbl->get_FileScreenFlags(This,fileScreenFlags)
+#define IFsrmFileScreenTemplateImported_put_FileScreenFlags(This,fileScreenFlags) (This)->lpVtbl->put_FileScreenFlags(This,fileScreenFlags)
+#define IFsrmFileScreenTemplateImported_CreateAction(This,actionType,action) (This)->lpVtbl->CreateAction(This,actionType,action)
+#define IFsrmFileScreenTemplateImported_EnumActions(This,actions) (This)->lpVtbl->EnumActions(This,actions)
+/*** IFsrmFileScreenTemplate methods ***/
+#define IFsrmFileScreenTemplateImported_get_Name(This,name) (This)->lpVtbl->get_Name(This,name)
+#define IFsrmFileScreenTemplateImported_put_Name(This,name) (This)->lpVtbl->put_Name(This,name)
+#define IFsrmFileScreenTemplateImported_CopyTemplate(This,fileScreenTemplateName) (This)->lpVtbl->CopyTemplate(This,fileScreenTemplateName)
+#define IFsrmFileScreenTemplateImported_CommitAndUpdateDerived(This,commitOptions,applyOptions,derivedObjectsResult) (This)->lpVtbl->CommitAndUpdateDerived(This,commitOptions,applyOptions,derivedObjectsResult)
+/*** IFsrmFileScreenTemplateImported methods ***/
+#define IFsrmFileScreenTemplateImported_get_OverwriteOnCommit(This,overwrite) (This)->lpVtbl->get_OverwriteOnCommit(This,overwrite)
+#define IFsrmFileScreenTemplateImported_put_OverwriteOnCommit(This,overwrite) (This)->lpVtbl->put_OverwriteOnCommit(This,overwrite)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IFsrmFileScreenTemplateImported_QueryInterface(IFsrmFileScreenTemplateImported* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmFileScreenTemplateImported_AddRef(IFsrmFileScreenTemplateImported* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmFileScreenTemplateImported_Release(IFsrmFileScreenTemplateImported* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmFileScreenTemplateImported_GetTypeInfoCount(IFsrmFileScreenTemplateImported* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenTemplateImported_GetTypeInfo(IFsrmFileScreenTemplateImported* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenTemplateImported_GetIDsOfNames(IFsrmFileScreenTemplateImported* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
+    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenTemplateImported_Invoke(IFsrmFileScreenTemplateImported* 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 FORCEINLINE HRESULT IFsrmFileScreenTemplateImported_get_Id(IFsrmFileScreenTemplateImported* This,FSRM_OBJECT_ID *id) {
+    return This->lpVtbl->get_Id(This,id);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenTemplateImported_get_Description(IFsrmFileScreenTemplateImported* This,BSTR *description) {
+    return This->lpVtbl->get_Description(This,description);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenTemplateImported_put_Description(IFsrmFileScreenTemplateImported* This,BSTR description) {
+    return This->lpVtbl->put_Description(This,description);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenTemplateImported_Delete(IFsrmFileScreenTemplateImported* This) {
+    return This->lpVtbl->Delete(This);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenTemplateImported_Commit(IFsrmFileScreenTemplateImported* This) {
+    return This->lpVtbl->Commit(This);
+}
+/*** IFsrmFileScreenBase methods ***/
+static FORCEINLINE HRESULT IFsrmFileScreenTemplateImported_get_BlockedFileGroups(IFsrmFileScreenTemplateImported* This,IFsrmMutableCollection **blockList) {
+    return This->lpVtbl->get_BlockedFileGroups(This,blockList);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenTemplateImported_put_BlockedFileGroups(IFsrmFileScreenTemplateImported* This,IFsrmMutableCollection *blockList) {
+    return This->lpVtbl->put_BlockedFileGroups(This,blockList);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenTemplateImported_get_FileScreenFlags(IFsrmFileScreenTemplateImported* This,LONG *fileScreenFlags) {
+    return This->lpVtbl->get_FileScreenFlags(This,fileScreenFlags);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenTemplateImported_put_FileScreenFlags(IFsrmFileScreenTemplateImported* This,LONG fileScreenFlags) {
+    return This->lpVtbl->put_FileScreenFlags(This,fileScreenFlags);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenTemplateImported_CreateAction(IFsrmFileScreenTemplateImported* This,FsrmActionType actionType,IFsrmAction **action) {
+    return This->lpVtbl->CreateAction(This,actionType,action);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenTemplateImported_EnumActions(IFsrmFileScreenTemplateImported* This,IFsrmCollection **actions) {
+    return This->lpVtbl->EnumActions(This,actions);
+}
+/*** IFsrmFileScreenTemplate methods ***/
+static FORCEINLINE HRESULT IFsrmFileScreenTemplateImported_get_Name(IFsrmFileScreenTemplateImported* This,BSTR *name) {
+    return This->lpVtbl->get_Name(This,name);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenTemplateImported_put_Name(IFsrmFileScreenTemplateImported* This,BSTR name) {
+    return This->lpVtbl->put_Name(This,name);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenTemplateImported_CopyTemplate(IFsrmFileScreenTemplateImported* This,BSTR fileScreenTemplateName) {
+    return This->lpVtbl->CopyTemplate(This,fileScreenTemplateName);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenTemplateImported_CommitAndUpdateDerived(IFsrmFileScreenTemplateImported* This,FsrmCommitOptions commitOptions,FsrmTemplateApplyOptions applyOptions,IFsrmDerivedObjectsResult **derivedObjectsResult) {
+    return This->lpVtbl->CommitAndUpdateDerived(This,commitOptions,applyOptions,derivedObjectsResult);
+}
+/*** IFsrmFileScreenTemplateImported methods ***/
+static FORCEINLINE HRESULT IFsrmFileScreenTemplateImported_get_OverwriteOnCommit(IFsrmFileScreenTemplateImported* This,VARIANT_BOOL *overwrite) {
+    return This->lpVtbl->get_OverwriteOnCommit(This,overwrite);
+}
+static FORCEINLINE HRESULT IFsrmFileScreenTemplateImported_put_OverwriteOnCommit(IFsrmFileScreenTemplateImported* This,VARIANT_BOOL overwrite) {
+    return This->lpVtbl->put_OverwriteOnCommit(This,overwrite);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmFileScreenTemplateImported_get_OverwriteOnCommit_Proxy(
+    IFsrmFileScreenTemplateImported* This,
+    VARIANT_BOOL *overwrite);
+void __RPC_STUB IFsrmFileScreenTemplateImported_get_OverwriteOnCommit_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmFileScreenTemplateImported_put_OverwriteOnCommit_Proxy(
+    IFsrmFileScreenTemplateImported* This,
+    VARIANT_BOOL overwrite);
+void __RPC_STUB IFsrmFileScreenTemplateImported_put_OverwriteOnCommit_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IFsrmFileScreenTemplateImported_INTERFACE_DEFINED__ */
+
+#endif
+/* Begin additional prototypes for all interfaces */
+
+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 *);
+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 *);
+
+/* End additional prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __fsrmscreen_h__ */
diff --git a/mingw-w64-headers/include/fsrmscreen.idl b/mingw-w64-headers/include/fsrmscreen.idl
new file mode 100644
index 0000000..c199a53
--- /dev/null
+++ b/mingw-w64-headers/include/fsrmscreen.idl
@@ -0,0 +1,123 @@
+/**
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER within this package.
+ */
+
+import "oaidl.idl";
+import "fsrmenums.idl";
+import "fsrm.idl";
+
+cpp_quote("#include <winapifamily.h>")
+cpp_quote("")
+cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)")
+
+interface IFsrmFileGroup;
+interface IFsrmFileGroupImported;
+interface IFsrmFileGroupManager;
+interface IFsrmFileScreen;
+interface IFsrmFileScreenBase;
+interface IFsrmFileScreenException;
+interface IFsrmFileScreenManager;
+interface IFsrmFileScreenTemplate;
+interface IFsrmFileScreenTemplateImported;
+interface IFsrmFileScreenTemplateManager;
+
+const DISPID FSRM_DISPID_FILEGROUP = FSRM_DISPID_FEATURE_FILESCREEN | 0x100000;
+const DISPID FSRM_DISPID_FILEGROUP_IMPORTED = FSRM_DISPID_FILEGROUP | 0x10000;
+const DISPID FSRM_DISPID_FILEGROUP_MANAGER = FSRM_DISPID_FEATURE_FILESCREEN | 0x200000;
+const DISPID FSRM_DISPID_FILESCREEN_BASE = FSRM_DISPID_FEATURE_FILESCREEN | 0x300000;
+const DISPID FSRM_DISPID_FILESCREEN = FSRM_DISPID_FILESCREEN_BASE | 0x10000;
+const DISPID FSRM_DISPID_FILESCREEN_TEMPLATE = FSRM_DISPID_FILESCREEN_BASE | 0x20000;
+const DISPID FSRM_DISPID_FILESCREEN_TEMPLATE_IMPORTED = FSRM_DISPID_FILESCREEN_TEMPLATE | 0x1000;
+const DISPID FSRM_DISPID_FILESCREEN_EXCEPTION = FSRM_DISPID_FEATURE_FILESCREEN | 0x400000;
+const DISPID FSRM_DISPID_FILESCREEN_MANAGER = FSRM_DISPID_FEATURE_FILESCREEN | 0x500000;
+const DISPID FSRM_DISPID_FILESCREEN_TEMPLATE_MANAGER = FSRM_DISPID_FEATURE_FILESCREEN | 0x600000;
+
+[object, uuid (426677d5-018c-485c-8a51-20b86d00bdc4), dual, pointer_default (unique)]
+interface IFsrmFileGroupManager : IDispatch {
+  [id (FSRM_DISPID_FILEGROUP_MANAGER | 0x1)] HRESULT CreateFileGroup ([out, retval] IFsrmFileGroup **fileGroup);
+  [id (FSRM_DISPID_FILEGROUP_MANAGER | 0x2)] HRESULT GetFileGroup ([in] BSTR name,[out, retval] IFsrmFileGroup **fileGroup);
+  [id (FSRM_DISPID_FILEGROUP_MANAGER | 0x3)] HRESULT EnumFileGroups ([in, defaultvalue (FsrmEnumOptions_None)] FsrmEnumOptions options,[out, retval] IFsrmCommittableCollection **fileGroups);
+  [id (FSRM_DISPID_FILEGROUP_MANAGER | 0x4)] HRESULT ExportFileGroups ([in, defaultvalue (NULL)] VARIANT *fileGroupNamesArray,[out, retval] BSTR *serializedFileGroups);
+  [id (FSRM_DISPID_FILEGROUP_MANAGER | 0x5)] HRESULT ImportFileGroups ([in] BSTR serializedFileGroups,[in, defaultvalue (NULL)] VARIANT *fileGroupNamesArray,[out, retval] IFsrmCommittableCollection **fileGroups);
+};
+
+[object, uuid (ff4fa04e-5a94-4bda-a3a0-d5b4d3c52eba), dual, pointer_default (unique)]
+interface IFsrmFileScreenManager : IDispatch {
+  [propget, id (FSRM_DISPID_FILESCREEN_MANAGER | 0x81)] HRESULT ActionVariables ([out, retval] SAFEARRAY (VARIANT) *variables);
+  [propget, id (FSRM_DISPID_FILESCREEN_MANAGER | 0x82)] HRESULT ActionVariableDescriptions ([out, retval] SAFEARRAY (VARIANT) *descriptions);
+  [id (FSRM_DISPID_FILESCREEN_MANAGER | 0x1)] HRESULT CreateFileScreen ([in] BSTR path,[out, retval] IFsrmFileScreen **fileScreen);
+  [id (FSRM_DISPID_FILESCREEN_MANAGER | 0x2)] HRESULT GetFileScreen ([in] BSTR path,[out, retval] IFsrmFileScreen **fileScreen);
+  [id (FSRM_DISPID_FILESCREEN_MANAGER | 0x3)] HRESULT EnumFileScreens ([in, defaultvalue (L"")] BSTR path,[in, defaultvalue (FsrmEnumOptions_None)] FsrmEnumOptions options,[out, retval] IFsrmCommittableCollection **fileScreens);
+  [id (FSRM_DISPID_FILESCREEN_MANAGER | 0x4)] HRESULT CreateFileScreenException ([in] BSTR path,[out, retval] IFsrmFileScreenException **fileScreenException);
+  [id (FSRM_DISPID_FILESCREEN_MANAGER | 0x5)] HRESULT GetFileScreenException ([in] BSTR path,[out, retval] IFsrmFileScreenException **fileScreenException);
+  [id (FSRM_DISPID_FILESCREEN_MANAGER | 0x6)] HRESULT EnumFileScreenExceptions ([in, defaultvalue (L"")] BSTR path,[in, defaultvalue (FsrmEnumOptions_None)] FsrmEnumOptions options,[out, retval] IFsrmCommittableCollection **fileScreenExceptions);
+  [id (FSRM_DISPID_FILESCREEN_MANAGER | 0x7)] HRESULT CreateFileScreenCollection ([out, retval] IFsrmCommittableCollection **collection);
+};
+
+[object, uuid (cfe36cba-1949-4e74-a14f-f1d580ceaf13), dual, pointer_default (unique)]
+interface IFsrmFileScreenTemplateManager : IDispatch {
+  [id (FSRM_DISPID_FILESCREEN_TEMPLATE_MANAGER | 0x1)] HRESULT CreateTemplate ([out, retval] IFsrmFileScreenTemplate **fileScreenTemplate);
+  [id (FSRM_DISPID_FILESCREEN_TEMPLATE_MANAGER | 0x2)] HRESULT GetTemplate ([in] BSTR name,[out, retval] IFsrmFileScreenTemplate **fileScreenTemplate);
+  [id (FSRM_DISPID_FILESCREEN_TEMPLATE_MANAGER | 0x3)] HRESULT EnumTemplates ([in, defaultvalue (FsrmEnumOptions_None)] FsrmEnumOptions options,[out, retval] IFsrmCommittableCollection **fileScreenTemplates);
+  [id (FSRM_DISPID_FILESCREEN_TEMPLATE_MANAGER | 0x4)] HRESULT ExportTemplates ([in, defaultvalue (NULL)] VARIANT *fileScreenTemplateNamesArray,[out, retval] BSTR *serializedFileScreenTemplates);
+  [id (FSRM_DISPID_FILESCREEN_TEMPLATE_MANAGER | 0x5)] HRESULT ImportTemplates ([in] BSTR serializedFileScreenTemplates,[in, defaultvalue (NULL)] VARIANT *fileScreenTemplateNamesArray,[out, retval] IFsrmCommittableCollection **fileScreenTemplates);
+};
+
+[object, uuid (8dd04909-0e34-4d55-afaa-89e1f1a1bbb9), dual, pointer_default (unique)]
+interface IFsrmFileGroup : IFsrmObject {
+  [propget, id (FSRM_DISPID_FILEGROUP | 0x81)] HRESULT Name ([out, retval] BSTR *name);
+  [propput, id (FSRM_DISPID_FILEGROUP | 0x81)] HRESULT Name ([in] BSTR name);
+  [propget, id (FSRM_DISPID_FILEGROUP | 0x82)] HRESULT Members ([out, retval] IFsrmMutableCollection **members);
+  [propput, id (FSRM_DISPID_FILEGROUP | 0x82)] HRESULT Members ([in] IFsrmMutableCollection *members);
+  [propget, id (FSRM_DISPID_FILEGROUP | 0x83)] HRESULT NonMembers ([out, retval] IFsrmMutableCollection **nonMembers);
+  [propput, id (FSRM_DISPID_FILEGROUP | 0x83)] HRESULT NonMembers ([in] IFsrmMutableCollection *nonMembers);
+};
+
+[object, uuid (f3637e80-5b22-4a2b-a637-bbb642b41cfc), dual, pointer_default (unique)]
+interface IFsrmFileScreenBase : IFsrmObject {
+  [propget, id (FSRM_DISPID_FILESCREEN_BASE | 0x81)] HRESULT BlockedFileGroups ([out, retval] IFsrmMutableCollection **blockList);
+  [propput, id (FSRM_DISPID_FILESCREEN_BASE | 0x81)] HRESULT BlockedFileGroups ([in] IFsrmMutableCollection *blockList);
+  [propget, id (FSRM_DISPID_FILESCREEN_BASE | 0x82)] HRESULT FileScreenFlags ([out, retval] long *fileScreenFlags);
+  [propput, id (FSRM_DISPID_FILESCREEN_BASE | 0x82)] HRESULT FileScreenFlags ([in] long fileScreenFlags);
+  [id (FSRM_DISPID_FILESCREEN_BASE | 0x1)] HRESULT CreateAction ([in] FsrmActionType actionType,[out, retval] IFsrmAction **action);
+  [id (FSRM_DISPID_FILESCREEN_BASE | 0x2)] HRESULT EnumActions ([out, retval] IFsrmCollection **actions);
+};
+
+[object, uuid (bee7ce02-df77-4515-9389-78f01c5afc1a), dual, pointer_default (unique)]
+interface IFsrmFileScreenException : IFsrmObject {
+  [propget, id (FSRM_DISPID_FILESCREEN_EXCEPTION | 0x81)] HRESULT Path ([out, retval] BSTR *path);
+  [propget, id (FSRM_DISPID_FILESCREEN_EXCEPTION | 0x82)] HRESULT AllowedFileGroups ([out, retval] IFsrmMutableCollection **allowList);
+  [propput, id (FSRM_DISPID_FILESCREEN_EXCEPTION | 0x82)] HRESULT AllowedFileGroups ([in] IFsrmMutableCollection *allowList);
+};
+
+[object, uuid (5f6325d3-ce88-4733-84c1-2d6aefc5ea07), dual, pointer_default (unique)]
+interface IFsrmFileScreen : IFsrmFileScreenBase {
+  [propget, id (FSRM_DISPID_FILESCREEN | 0x81)] HRESULT Path ([out, retval] BSTR *path);
+  [propget, id (FSRM_DISPID_FILESCREEN | 0x82)] HRESULT SourceTemplateName ([out, retval] BSTR *fileScreenTemplateName);
+  [propget, id (FSRM_DISPID_FILESCREEN | 0x83)] HRESULT MatchesSourceTemplate ([out, retval] VARIANT_BOOL *matches);
+  [propget, id (FSRM_DISPID_FILESCREEN | 0x84)] HRESULT UserSid ([out, retval] BSTR *userSid);
+  [propget, id (FSRM_DISPID_FILESCREEN | 0x85)] HRESULT UserAccount ([out, retval] BSTR *userAccount);
+  [id (FSRM_DISPID_FILESCREEN | 0x1)] HRESULT ApplyTemplate ([in] BSTR fileScreenTemplateName);
+};
+
+[object, uuid (ad55f10b-5f11-4be7-94ef-d9ee2e470ded), dual, pointer_default (unique)]
+interface IFsrmFileGroupImported : IFsrmFileGroup {
+  [propget, id (FSRM_DISPID_FILEGROUP_IMPORTED | 0x81)] HRESULT OverwriteOnCommit ([out, retval] VARIANT_BOOL *overwrite);
+  [propput, id (FSRM_DISPID_FILEGROUP_IMPORTED | 0x81)] HRESULT OverwriteOnCommit ([in] VARIANT_BOOL overwrite);
+};
+
+[object, uuid (205bebf8-dd93-452a-95a6-32b566b35828), dual, pointer_default (unique)]
+interface IFsrmFileScreenTemplate : IFsrmFileScreenBase {
+  [propget, id (FSRM_DISPID_FILESCREEN_TEMPLATE | 0x81)] HRESULT Name ([out, retval] BSTR *name);
+  [propput, id (FSRM_DISPID_FILESCREEN_TEMPLATE | 0x81)] HRESULT Name ([in] BSTR name);
+  [id (FSRM_DISPID_FILESCREEN_TEMPLATE | 0x1)] HRESULT CopyTemplate ([in] BSTR fileScreenTemplateName);
+  [id (FSRM_DISPID_FILESCREEN_TEMPLATE | 0x2)] HRESULT CommitAndUpdateDerived ([in] FsrmCommitOptions commitOptions,[in] FsrmTemplateApplyOptions applyOptions,[out, retval] IFsrmDerivedObjectsResult **derivedObjectsResult);
+};
+
+[object, uuid (e1010359-3e5d-4ecd-9fe4-ef48622fdf30), dual, pointer_default (unique)]
+interface IFsrmFileScreenTemplateImported : IFsrmFileScreenTemplate {
+  [propget, id (FSRM_DISPID_FILESCREEN_TEMPLATE_IMPORTED | 0x81)] HRESULT OverwriteOnCommit ([out, retval] VARIANT_BOOL *overwrite);
+  [propput, id (FSRM_DISPID_FILESCREEN_TEMPLATE_IMPORTED | 0x81)] HRESULT OverwriteOnCommit ([in] VARIANT_BOOL overwrite);
+};
+cpp_quote("#endif")
