diff --git a/mingw-w64-headers/Makefile.am b/mingw-w64-headers/Makefile.am
index ed4ba5e..62dab90 100644
--- a/mingw-w64-headers/Makefile.am
+++ b/mingw-w64-headers/Makefile.am
@@ -75,6 +75,8 @@
   include/downloadmgr.idl \
   include/dxva2api.idl \
   include/endpointvolume.idl \
+  include/fsrm.idl \
+  include/fsrmenums.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 00caf8d..683b02e 100644
--- a/mingw-w64-headers/Makefile.in
+++ b/mingw-w64-headers/Makefile.in
@@ -299,6 +299,8 @@
 @HAVE_WIDL_TRUE@  include/downloadmgr.idl \
 @HAVE_WIDL_TRUE@  include/dxva2api.idl \
 @HAVE_WIDL_TRUE@  include/endpointvolume.idl \
+@HAVE_WIDL_TRUE@  include/fsrm.idl \
+@HAVE_WIDL_TRUE@  include/fsrmenums.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/fsrm.h b/mingw-w64-headers/include/fsrm.h
index 4fc8663..d5abab4 100644
--- a/mingw-w64-headers/include/fsrm.h
+++ b/mingw-w64-headers/include/fsrm.h
@@ -1,403 +1,1020 @@
-/**
- * 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.
- */
-#ifndef _INC_FSRM
-#define _INC_FSRM
-#if (_WIN32_WINNT >= 0x0600)
-#include <fsrmenums.h>
+/*** Autogenerated by WIDL 1.6 from fsrm.idl - Do not edit ***/
 
-#ifndef __IFsrmAction_FWD_DEFINED__
-#define __IFsrmAction_FWD_DEFINED__
-typedef struct IFsrmAction IFsrmAction;
-#endif /* __IFsrmAction_FWD_DEFINED__ */
+#ifndef __REQUIRED_RPCNDR_H_VERSION__
+#define __REQUIRED_RPCNDR_H_VERSION__ 475
+#endif
 
-#ifndef __IFsrmActionCommand_FWD_DEFINED__
-#define __IFsrmActionCommand_FWD_DEFINED__
-typedef struct IFsrmActionCommand IFsrmActionCommand;
-#endif /* __IFsrmActionCommand_FWD_DEFINED__ */
+#include <rpc.h>
+#include <rpcndr.h>
 
-#ifndef __IFsrmActionEmail_FWD_DEFINED__
-#define __IFsrmActionEmail_FWD_DEFINED__
-typedef struct IFsrmActionEmail IFsrmActionEmail;
-#endif /* __IFsrmActionEmail_FWD_DEFINED__ */
+#ifndef COM_NO_WINDOWS_H
+#include <windows.h>
+#include <ole2.h>
+#endif
 
-#ifndef __IFsrmActionEmail2_FWD_DEFINED__
-#define __IFsrmActionEmail2_FWD_DEFINED__
-typedef struct IFsrmActionEmail2 IFsrmActionEmail2;
-#endif /* __IFsrmActionEmail2_FWD_DEFINED__ */
+#ifndef __fsrm_h__
+#define __fsrm_h__
 
-#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__ */
+/* Forward declarations */
 
 #ifndef __IFsrmCommittableCollection_FWD_DEFINED__
 #define __IFsrmCommittableCollection_FWD_DEFINED__
-typedef struct IFsrmCommittableCollection IFsrmCommittableCollection;
-#endif /* __IFsrmCommittableCollection_FWD_DEFINED__ */
+typedef interface IFsrmCommittableCollection IFsrmCommittableCollection;
+#endif
+
+#ifndef __IFsrmAccessDeniedRemediationClient_FWD_DEFINED__
+#define __IFsrmAccessDeniedRemediationClient_FWD_DEFINED__
+typedef interface IFsrmAccessDeniedRemediationClient IFsrmAccessDeniedRemediationClient;
+#endif
+
+#ifndef __IFsrmAction_FWD_DEFINED__
+#define __IFsrmAction_FWD_DEFINED__
+typedef interface IFsrmAction IFsrmAction;
+#endif
+
+#ifndef __IFsrmActionCommand_FWD_DEFINED__
+#define __IFsrmActionCommand_FWD_DEFINED__
+typedef interface IFsrmActionCommand IFsrmActionCommand;
+#endif
+
+#ifndef __IFsrmActionEventLog_FWD_DEFINED__
+#define __IFsrmActionEventLog_FWD_DEFINED__
+typedef interface IFsrmActionEventLog IFsrmActionEventLog;
+#endif
+
+#ifndef __IFsrmActionReport_FWD_DEFINED__
+#define __IFsrmActionReport_FWD_DEFINED__
+typedef interface IFsrmActionReport IFsrmActionReport;
+#endif
+
+#ifndef __IFsrmCollection_FWD_DEFINED__
+#define __IFsrmCollection_FWD_DEFINED__
+typedef interface IFsrmCollection IFsrmCollection;
+#endif
 
 #ifndef __IFsrmDerivedObjectsResult_FWD_DEFINED__
 #define __IFsrmDerivedObjectsResult_FWD_DEFINED__
-typedef struct IFsrmDerivedObjectsResult IFsrmDerivedObjectsResult;
-#endif /* __IFsrmDerivedObjectsResult_FWD_DEFINED__ */
+typedef interface IFsrmDerivedObjectsResult IFsrmDerivedObjectsResult;
+#endif
 
 #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__ */
+typedef interface IFsrmExportImport IFsrmExportImport;
+#endif
 
 #ifndef __IFsrmObject_FWD_DEFINED__
 #define __IFsrmObject_FWD_DEFINED__
-typedef struct IFsrmObject IFsrmObject;
-#endif /* __IFsrmObject_FWD_DEFINED__ */
+typedef interface IFsrmObject IFsrmObject;
+#endif
 
 #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__ */
+typedef interface IFsrmPathMapper IFsrmPathMapper;
+#endif
 
 #ifndef __IFsrmSetting_FWD_DEFINED__
 #define __IFsrmSetting_FWD_DEFINED__
-typedef struct IFsrmSetting IFsrmSetting;
-#endif /* __IFsrmSetting_FWD_DEFINED__ */
+typedef interface IFsrmSetting IFsrmSetting;
+#endif
 
-#ifndef __IFsrmStorageModuleDefinition_FWD_DEFINED__
-#define __IFsrmStorageModuleDefinition_FWD_DEFINED__
-typedef struct IFsrmStorageModuleDefinition IFsrmStorageModuleDefinition;
-#endif /* __IFsrmStorageModuleDefinition_FWD_DEFINED__ */
+#ifndef __IFsrmActionEmail_FWD_DEFINED__
+#define __IFsrmActionEmail_FWD_DEFINED__
+typedef interface IFsrmActionEmail IFsrmActionEmail;
+#endif
 
-#ifndef __IFsrmStorageModuleImplementation_FWD_DEFINED__
-#define __IFsrmStorageModuleImplementation_FWD_DEFINED__
-typedef struct IFsrmStorageModuleImplementation IFsrmStorageModuleImplementation;
-#endif /* __IFsrmStorageModuleImplementation_FWD_DEFINED__ */
+#ifndef __IFsrmActionEmail2_FWD_DEFINED__
+#define __IFsrmActionEmail2_FWD_DEFINED__
+typedef interface IFsrmActionEmail2 IFsrmActionEmail2;
+#endif
+
+#ifndef __IFsrmMutableCollection_FWD_DEFINED__
+#define __IFsrmMutableCollection_FWD_DEFINED__
+typedef interface IFsrmMutableCollection IFsrmMutableCollection;
+#endif
+
+/* Headers for imported files */
+
+#include <oaidl.h>
+#include <fsrmenums.h>
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-#define FsrmNeverModified  0x0000000000000000
-#define FsrmAlwaysModified 0xFFFFFFFFFFFFFFFF
+#include <winapifamily.h>
 
-typedef GUID FSRM_OBJECT_ID;
-typedef __LONG32 FSRM_QUOTA_THRESHOLD;
-
-typedef enum _FsrmGetFilePropertyOptions {
-  FsrmGetFilePropertyOptions_None               = 0x00000000,
-  FsrmGetFilePropertyOptions_NoRuleEvaluation   = 0x00000001 
-} FsrmGetFilePropertyOptions;
-
-#ifdef __cplusplus
-}
+#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
+#ifndef __IFsrmObject_FWD_DEFINED__
+#define __IFsrmObject_FWD_DEFINED__
+typedef interface IFsrmObject IFsrmObject;
 #endif
 
-#undef  INTERFACE
-#define INTERFACE IFsrmAction
-#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)
+#ifndef __IFsrmCollection_FWD_DEFINED__
+#define __IFsrmCollection_FWD_DEFINED__
+typedef interface IFsrmCollection IFsrmCollection;
 #endif
-DECLARE_INTERFACE_(IFsrmAction,IDispatch)
+
+#ifndef __IFsrmMutableCollection_FWD_DEFINED__
+#define __IFsrmMutableCollection_FWD_DEFINED__
+typedef interface IFsrmMutableCollection IFsrmMutableCollection;
+#endif
+
+#ifndef __IFsrmCommittableCollection_FWD_DEFINED__
+#define __IFsrmCommittableCollection_FWD_DEFINED__
+typedef interface IFsrmCommittableCollection IFsrmCommittableCollection;
+#endif
+
+#ifndef __IFsrmAction_FWD_DEFINED__
+#define __IFsrmAction_FWD_DEFINED__
+typedef interface IFsrmAction IFsrmAction;
+#endif
+
+#ifndef __IFsrmActionEmail_FWD_DEFINED__
+#define __IFsrmActionEmail_FWD_DEFINED__
+typedef interface IFsrmActionEmail IFsrmActionEmail;
+#endif
+
+#ifndef __IFsrmActionReport_FWD_DEFINED__
+#define __IFsrmActionReport_FWD_DEFINED__
+typedef interface IFsrmActionReport IFsrmActionReport;
+#endif
+
+#ifndef __IFsrmActionEventLog_FWD_DEFINED__
+#define __IFsrmActionEventLog_FWD_DEFINED__
+typedef interface IFsrmActionEventLog IFsrmActionEventLog;
+#endif
+
+#ifndef __IFsrmActionCommand_FWD_DEFINED__
+#define __IFsrmActionCommand_FWD_DEFINED__
+typedef interface IFsrmActionCommand IFsrmActionCommand;
+#endif
+
+#ifndef __IFsrmSetting_FWD_DEFINED__
+#define __IFsrmSetting_FWD_DEFINED__
+typedef interface IFsrmSetting IFsrmSetting;
+#endif
+
+#ifndef __IFsrmPathMapper_FWD_DEFINED__
+#define __IFsrmPathMapper_FWD_DEFINED__
+typedef interface IFsrmPathMapper IFsrmPathMapper;
+#endif
+
+#ifndef __IFsrmExportImport_FWD_DEFINED__
+#define __IFsrmExportImport_FWD_DEFINED__
+typedef interface IFsrmExportImport IFsrmExportImport;
+#endif
+
+#define FSRM_DISPID_FEATURE_MASK (0xf000000)
+
+#define FSRM_DISPID_INTERFACE_A_MASK (0xf00000)
+
+#define FSRM_DISPID_INTERFACE_B_MASK (0xf0000)
+
+#define FSRM_DISPID_INTERFACE_C_MASK (0xf000)
+
+#define FSRM_DISPID_INTERFACE_D_MASK (0xf00)
+
+#define FSRM_DISPID_INTERFACE_MASK (0xffff00)
+
+#define FSRM_DISPID_IS_PROPERTY (0x80)
+
+#define FSRM_DISPID_METHOD_NUM_MASK (0x7f)
+
+#define FSRM_DISPID_METHOD_MASK (0xff)
+
+#define FSRM_DISPID_FEATURE_GENERAL (0x1000000)
+
+#define FSRM_DISPID_FEATURE_QUOTA (0x2000000)
+
+#define FSRM_DISPID_FEATURE_FILESCREEN (0x3000000)
+
+#define FSRM_DISPID_FEATURE_REPORTS (0x4000000)
+
+#define FSRM_DISPID_FEATURE_CLASSIFICATION (0x5000000)
+
+#define FSRM_DISPID_FEATURE_PIPELINE (0x6000000)
+
+#define FSRM_DISPID_OBJECT (FSRM_DISPID_FEATURE_GENERAL | 0x100000)
+
+#define FSRM_DISPID_COLLECTION (FSRM_DISPID_FEATURE_GENERAL | 0x200000)
+
+#define FSRM_DISPID_COLLECTION_MUTABLE (FSRM_DISPID_COLLECTION | 0x10000)
+
+#define FSRM_DISPID_COLLECTION_COMMITTABLE (FSRM_DISPID_COLLECTION_MUTABLE | 0x1000)
+
+#define FSRM_DISPID_ACTION (FSRM_DISPID_FEATURE_GENERAL | 0x300000)
+
+#define FSRM_DISPID_ACTION_EMAIL (FSRM_DISPID_ACTION | 0x10000)
+
+#define FSRM_DISPID_ACTION_REPORT (FSRM_DISPID_ACTION | 0x20000)
+
+#define FSRM_DISPID_ACTION_EVENTLOG (FSRM_DISPID_ACTION | 0x30000)
+
+#define FSRM_DISPID_ACTION_COMMAND (FSRM_DISPID_ACTION | 0x40000)
+
+#define FSRM_DISPID_ACTION_EMAIL2 (FSRM_DISPID_ACTION | 0x50000)
+
+#define FSRM_DISPID_SETTING (FSRM_DISPID_FEATURE_GENERAL | 0x400000)
+
+#define FSRM_DISPID_PATHMAPPER (FSRM_DISPID_FEATURE_GENERAL | 0x500000)
+
+#define FSRM_DISPID_EXPORTIMPORT (FSRM_DISPID_FEATURE_GENERAL | 0x600000)
+
+#define FSRM_DISPID_DERIVEDOBJECTSRESULT (FSRM_DISPID_FEATURE_GENERAL | 0x700000)
+
+#define FSRM_DISPID_ADR (FSRM_DISPID_FEATURE_GENERAL | 0x800000)
+
+/*****************************************************************************
+ * IFsrmCommittableCollection interface
+ */
+#ifndef __IFsrmCommittableCollection_INTERFACE_DEFINED__
+#define __IFsrmCommittableCollection_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IFsrmCommittableCollection, 0x96deb3b5, 0x8b91, 0x4a2a, 0x9d,0x93, 0x80,0xa3,0x5d,0x8a,0xa8,0x47);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("96deb3b5-8b91-4a2a-9d93-80a35d8aa847")
+IFsrmCommittableCollection : public IFsrmMutableCollection
 {
+    virtual HRESULT STDMETHODCALLTYPE Commit(
+        FsrmCommitOptions options,
+        IFsrmCollection **results) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IFsrmCommittableCollection, 0x96deb3b5, 0x8b91, 0x4a2a, 0x9d,0x93, 0x80,0xa3,0x5d,0x8a,0xa8,0x47)
+#endif
+#else
+typedef struct IFsrmCommittableCollectionVtbl {
     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)(
+        IFsrmCommittableCollection* 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)(
+        IFsrmCommittableCollection* This);
 
-    /* IFsrmAction methods */
-    STDMETHOD_(HRESULT,get_Id)(THIS_ FSRM_OBJECT_ID *id) PURE;
-    STDMETHOD_(HRESULT,get_ActionType)(THIS_ FsrmActionType *actionType) PURE;
-    STDMETHOD_(HRESULT,put_RunLimitInterval)(THIS_ __LONG32 minutes) PURE;
-    STDMETHOD_(HRESULT,get_RunLimitInterval)(THIS_ __LONG32 *minutes) PURE;
-    STDMETHOD_(HRESULT,Delete)(THIS) PURE;
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFsrmCommittableCollection* This);
+
+    /*** IDispatch methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
+        IFsrmCommittableCollection* This,
+        UINT *pctinfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
+        IFsrmCommittableCollection* This,
+        UINT iTInfo,
+        LCID lcid,
+        ITypeInfo **ppTInfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
+        IFsrmCommittableCollection* This,
+        REFIID riid,
+        LPOLESTR *rgszNames,
+        UINT cNames,
+        LCID lcid,
+        DISPID *rgDispId);
+
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        IFsrmCommittableCollection* This,
+        DISPID dispIdMember,
+        REFIID riid,
+        LCID lcid,
+        WORD wFlags,
+        DISPPARAMS *pDispParams,
+        VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo,
+        UINT *puArgErr);
+
+    /*** IFsrmCollection methods ***/
+    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
+        IFsrmCommittableCollection* This,
+        IUnknown **unknown);
+
+    HRESULT (STDMETHODCALLTYPE *get_Item)(
+        IFsrmCommittableCollection* This,
+        LONG index,
+        VARIANT *item);
+
+    HRESULT (STDMETHODCALLTYPE *get_Count)(
+        IFsrmCommittableCollection* This,
+        LONG *count);
+
+    HRESULT (STDMETHODCALLTYPE *get_State)(
+        IFsrmCommittableCollection* This,
+        FsrmCollectionState *state);
+
+    HRESULT (STDMETHODCALLTYPE *Cancel)(
+        IFsrmCommittableCollection* This);
+
+    HRESULT (STDMETHODCALLTYPE *WaitForCompletion)(
+        IFsrmCommittableCollection* This,
+        LONG waitSeconds,
+        VARIANT_BOOL *completed);
+
+    HRESULT (STDMETHODCALLTYPE *GetById)(
+        IFsrmCommittableCollection* This,
+        FSRM_OBJECT_ID id,
+        VARIANT *entry);
+
+    /*** IFsrmMutableCollection methods ***/
+    HRESULT (STDMETHODCALLTYPE *Add)(
+        IFsrmCommittableCollection* This,
+        VARIANT item);
+
+    HRESULT (STDMETHODCALLTYPE *Remove)(
+        IFsrmCommittableCollection* This,
+        LONG index);
+
+    HRESULT (STDMETHODCALLTYPE *RemoveById)(
+        IFsrmCommittableCollection* This,
+        FSRM_OBJECT_ID id);
+
+    HRESULT (STDMETHODCALLTYPE *Clone)(
+        IFsrmCommittableCollection* This,
+        IFsrmMutableCollection **collection);
+
+    /*** IFsrmCommittableCollection methods ***/
+    HRESULT (STDMETHODCALLTYPE *Commit)(
+        IFsrmCommittableCollection* This,
+        FsrmCommitOptions options,
+        IFsrmCollection **results);
 
     END_INTERFACE
+} IFsrmCommittableCollectionVtbl;
+interface IFsrmCommittableCollection {
+    CONST_VTBL IFsrmCommittableCollectionVtbl* lpVtbl;
 };
+
 #ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IFsrmCommittableCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IFsrmCommittableCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IFsrmCommittableCollection_Release(This) (This)->lpVtbl->Release(This)
+/*** IDispatch methods ***/
+#define IFsrmCommittableCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
+#define IFsrmCommittableCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
+#define IFsrmCommittableCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
+#define IFsrmCommittableCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
+/*** IFsrmCollection methods ***/
+#define IFsrmCommittableCollection_get__NewEnum(This,unknown) (This)->lpVtbl->get__NewEnum(This,unknown)
+#define IFsrmCommittableCollection_get_Item(This,index,item) (This)->lpVtbl->get_Item(This,index,item)
+#define IFsrmCommittableCollection_get_Count(This,count) (This)->lpVtbl->get_Count(This,count)
+#define IFsrmCommittableCollection_get_State(This,state) (This)->lpVtbl->get_State(This,state)
+#define IFsrmCommittableCollection_Cancel(This) (This)->lpVtbl->Cancel(This)
+#define IFsrmCommittableCollection_WaitForCompletion(This,waitSeconds,completed) (This)->lpVtbl->WaitForCompletion(This,waitSeconds,completed)
+#define IFsrmCommittableCollection_GetById(This,id,entry) (This)->lpVtbl->GetById(This,id,entry)
+/*** IFsrmMutableCollection methods ***/
+#define IFsrmCommittableCollection_Add(This,item) (This)->lpVtbl->Add(This,item)
+#define IFsrmCommittableCollection_Remove(This,index) (This)->lpVtbl->Remove(This,index)
+#define IFsrmCommittableCollection_RemoveById(This,id) (This)->lpVtbl->RemoveById(This,id)
+#define IFsrmCommittableCollection_Clone(This,collection) (This)->lpVtbl->Clone(This,collection)
+/*** IFsrmCommittableCollection methods ***/
+#define IFsrmCommittableCollection_Commit(This,options,results) (This)->lpVtbl->Commit(This,options,results)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IFsrmCommittableCollection_QueryInterface(IFsrmCommittableCollection* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmCommittableCollection_AddRef(IFsrmCommittableCollection* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmCommittableCollection_Release(IFsrmCommittableCollection* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmCommittableCollection_GetTypeInfoCount(IFsrmCommittableCollection* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmCommittableCollection_GetTypeInfo(IFsrmCommittableCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE HRESULT IFsrmCommittableCollection_GetIDsOfNames(IFsrmCommittableCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
+    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
+}
+static FORCEINLINE HRESULT IFsrmCommittableCollection_Invoke(IFsrmCommittableCollection* 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);
+}
+/*** IFsrmCollection methods ***/
+static FORCEINLINE HRESULT IFsrmCommittableCollection_get__NewEnum(IFsrmCommittableCollection* This,IUnknown **unknown) {
+    return This->lpVtbl->get__NewEnum(This,unknown);
+}
+static FORCEINLINE HRESULT IFsrmCommittableCollection_get_Item(IFsrmCommittableCollection* This,LONG index,VARIANT *item) {
+    return This->lpVtbl->get_Item(This,index,item);
+}
+static FORCEINLINE HRESULT IFsrmCommittableCollection_get_Count(IFsrmCommittableCollection* This,LONG *count) {
+    return This->lpVtbl->get_Count(This,count);
+}
+static FORCEINLINE HRESULT IFsrmCommittableCollection_get_State(IFsrmCommittableCollection* This,FsrmCollectionState *state) {
+    return This->lpVtbl->get_State(This,state);
+}
+static FORCEINLINE HRESULT IFsrmCommittableCollection_Cancel(IFsrmCommittableCollection* This) {
+    return This->lpVtbl->Cancel(This);
+}
+static FORCEINLINE HRESULT IFsrmCommittableCollection_WaitForCompletion(IFsrmCommittableCollection* This,LONG waitSeconds,VARIANT_BOOL *completed) {
+    return This->lpVtbl->WaitForCompletion(This,waitSeconds,completed);
+}
+static FORCEINLINE HRESULT IFsrmCommittableCollection_GetById(IFsrmCommittableCollection* This,FSRM_OBJECT_ID id,VARIANT *entry) {
+    return This->lpVtbl->GetById(This,id,entry);
+}
+/*** IFsrmMutableCollection methods ***/
+static FORCEINLINE HRESULT IFsrmCommittableCollection_Add(IFsrmCommittableCollection* This,VARIANT item) {
+    return This->lpVtbl->Add(This,item);
+}
+static FORCEINLINE HRESULT IFsrmCommittableCollection_Remove(IFsrmCommittableCollection* This,LONG index) {
+    return This->lpVtbl->Remove(This,index);
+}
+static FORCEINLINE HRESULT IFsrmCommittableCollection_RemoveById(IFsrmCommittableCollection* This,FSRM_OBJECT_ID id) {
+    return This->lpVtbl->RemoveById(This,id);
+}
+static FORCEINLINE HRESULT IFsrmCommittableCollection_Clone(IFsrmCommittableCollection* This,IFsrmMutableCollection **collection) {
+    return This->lpVtbl->Clone(This,collection);
+}
+/*** IFsrmCommittableCollection methods ***/
+static FORCEINLINE HRESULT IFsrmCommittableCollection_Commit(IFsrmCommittableCollection* This,FsrmCommitOptions options,IFsrmCollection **results) {
+    return This->lpVtbl->Commit(This,options,results);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmCommittableCollection_Commit_Proxy(
+    IFsrmCommittableCollection* This,
+    FsrmCommitOptions options,
+    IFsrmCollection **results);
+void __RPC_STUB IFsrmCommittableCollection_Commit_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IFsrmCommittableCollection_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IFsrmAccessDeniedRemediationClient interface
+ */
+#ifndef __IFsrmAccessDeniedRemediationClient_INTERFACE_DEFINED__
+#define __IFsrmAccessDeniedRemediationClient_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IFsrmAccessDeniedRemediationClient, 0x40002314, 0x590b, 0x45a5, 0x8e,0x1b, 0x8c,0x05,0xda,0x52,0x7e,0x52);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("40002314-590b-45a5-8e1b-8c05da527e52")
+IFsrmAccessDeniedRemediationClient : public IDispatch
+{
+    virtual HRESULT STDMETHODCALLTYPE Show(
+        ULONG_PTR parentWnd,
+        BSTR accessPath,
+        AdrClientErrorType errorType,
+        LONG flags,
+        BSTR windowTitle = L"",
+        BSTR windowMessage = L"",
+        LONG *result) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IFsrmAccessDeniedRemediationClient, 0x40002314, 0x590b, 0x45a5, 0x8e,0x1b, 0x8c,0x05,0xda,0x52,0x7e,0x52)
+#endif
+#else
+typedef struct IFsrmAccessDeniedRemediationClientVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFsrmAccessDeniedRemediationClient* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFsrmAccessDeniedRemediationClient* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFsrmAccessDeniedRemediationClient* This);
+
+    /*** IDispatch methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
+        IFsrmAccessDeniedRemediationClient* This,
+        UINT *pctinfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
+        IFsrmAccessDeniedRemediationClient* This,
+        UINT iTInfo,
+        LCID lcid,
+        ITypeInfo **ppTInfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
+        IFsrmAccessDeniedRemediationClient* This,
+        REFIID riid,
+        LPOLESTR *rgszNames,
+        UINT cNames,
+        LCID lcid,
+        DISPID *rgDispId);
+
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        IFsrmAccessDeniedRemediationClient* This,
+        DISPID dispIdMember,
+        REFIID riid,
+        LCID lcid,
+        WORD wFlags,
+        DISPPARAMS *pDispParams,
+        VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo,
+        UINT *puArgErr);
+
+    /*** IFsrmAccessDeniedRemediationClient methods ***/
+    HRESULT (STDMETHODCALLTYPE *Show)(
+        IFsrmAccessDeniedRemediationClient* This,
+        ULONG_PTR parentWnd,
+        BSTR accessPath,
+        AdrClientErrorType errorType,
+        LONG flags,
+        BSTR windowTitle,
+        BSTR windowMessage,
+        LONG *result);
+
+    END_INTERFACE
+} IFsrmAccessDeniedRemediationClientVtbl;
+interface IFsrmAccessDeniedRemediationClient {
+    CONST_VTBL IFsrmAccessDeniedRemediationClientVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IFsrmAccessDeniedRemediationClient_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IFsrmAccessDeniedRemediationClient_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IFsrmAccessDeniedRemediationClient_Release(This) (This)->lpVtbl->Release(This)
+/*** IDispatch methods ***/
+#define IFsrmAccessDeniedRemediationClient_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
+#define IFsrmAccessDeniedRemediationClient_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
+#define IFsrmAccessDeniedRemediationClient_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
+#define IFsrmAccessDeniedRemediationClient_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
+/*** IFsrmAccessDeniedRemediationClient methods ***/
+#define IFsrmAccessDeniedRemediationClient_Show(This,parentWnd,accessPath,errorType,flags,windowTitle,windowMessage,result) (This)->lpVtbl->Show(This,parentWnd,accessPath,errorType,flags,windowTitle,windowMessage,result)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IFsrmAccessDeniedRemediationClient_QueryInterface(IFsrmAccessDeniedRemediationClient* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmAccessDeniedRemediationClient_AddRef(IFsrmAccessDeniedRemediationClient* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmAccessDeniedRemediationClient_Release(IFsrmAccessDeniedRemediationClient* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmAccessDeniedRemediationClient_GetTypeInfoCount(IFsrmAccessDeniedRemediationClient* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmAccessDeniedRemediationClient_GetTypeInfo(IFsrmAccessDeniedRemediationClient* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE HRESULT IFsrmAccessDeniedRemediationClient_GetIDsOfNames(IFsrmAccessDeniedRemediationClient* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
+    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
+}
+static FORCEINLINE HRESULT IFsrmAccessDeniedRemediationClient_Invoke(IFsrmAccessDeniedRemediationClient* 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);
+}
+/*** IFsrmAccessDeniedRemediationClient methods ***/
+static FORCEINLINE HRESULT IFsrmAccessDeniedRemediationClient_Show(IFsrmAccessDeniedRemediationClient* This,ULONG_PTR parentWnd,BSTR accessPath,AdrClientErrorType errorType,LONG flags,BSTR windowTitle,BSTR windowMessage,LONG *result) {
+    return This->lpVtbl->Show(This,parentWnd,accessPath,errorType,flags,windowTitle,windowMessage,result);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmAccessDeniedRemediationClient_Show_Proxy(
+    IFsrmAccessDeniedRemediationClient* This,
+    ULONG_PTR parentWnd,
+    BSTR accessPath,
+    AdrClientErrorType errorType,
+    LONG flags,
+    BSTR windowTitle,
+    BSTR windowMessage,
+    LONG *result);
+void __RPC_STUB IFsrmAccessDeniedRemediationClient_Show_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IFsrmAccessDeniedRemediationClient_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IFsrmAction interface
+ */
+#ifndef __IFsrmAction_INTERFACE_DEFINED__
+#define __IFsrmAction_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IFsrmAction, 0x6cd6408a, 0xae60, 0x463b, 0x9e,0xf1, 0xe1,0x17,0x53,0x4d,0x69,0xdc);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("6cd6408a-ae60-463b-9ef1-e117534d69dc")
+IFsrmAction : public IDispatch
+{
+    virtual HRESULT STDMETHODCALLTYPE get_Id(
+        FSRM_OBJECT_ID *id) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_ActionType(
+        FsrmActionType *actionType) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_RunLimitInterval(
+        LONG *minutes) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_RunLimitInterval(
+        LONG minutes) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Delete(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IFsrmAction, 0x6cd6408a, 0xae60, 0x463b, 0x9e,0xf1, 0xe1,0x17,0x53,0x4d,0x69,0xdc)
+#endif
+#else
+typedef struct IFsrmActionVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFsrmAction* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFsrmAction* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFsrmAction* This);
+
+    /*** IDispatch methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
+        IFsrmAction* This,
+        UINT *pctinfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
+        IFsrmAction* This,
+        UINT iTInfo,
+        LCID lcid,
+        ITypeInfo **ppTInfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
+        IFsrmAction* This,
+        REFIID riid,
+        LPOLESTR *rgszNames,
+        UINT cNames,
+        LCID lcid,
+        DISPID *rgDispId);
+
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        IFsrmAction* This,
+        DISPID dispIdMember,
+        REFIID riid,
+        LCID lcid,
+        WORD wFlags,
+        DISPPARAMS *pDispParams,
+        VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo,
+        UINT *puArgErr);
+
+    /*** IFsrmAction methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Id)(
+        IFsrmAction* This,
+        FSRM_OBJECT_ID *id);
+
+    HRESULT (STDMETHODCALLTYPE *get_ActionType)(
+        IFsrmAction* This,
+        FsrmActionType *actionType);
+
+    HRESULT (STDMETHODCALLTYPE *get_RunLimitInterval)(
+        IFsrmAction* This,
+        LONG *minutes);
+
+    HRESULT (STDMETHODCALLTYPE *put_RunLimitInterval)(
+        IFsrmAction* This,
+        LONG minutes);
+
+    HRESULT (STDMETHODCALLTYPE *Delete)(
+        IFsrmAction* This);
+
+    END_INTERFACE
+} IFsrmActionVtbl;
+interface IFsrmAction {
+    CONST_VTBL IFsrmActionVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
 #define IFsrmAction_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
 #define IFsrmAction_AddRef(This) (This)->lpVtbl->AddRef(This)
 #define IFsrmAction_Release(This) (This)->lpVtbl->Release(This)
+/*** IDispatch methods ***/
 #define IFsrmAction_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
 #define IFsrmAction_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
 #define IFsrmAction_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
 #define IFsrmAction_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
+/*** IFsrmAction methods ***/
 #define IFsrmAction_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
 #define IFsrmAction_get_ActionType(This,actionType) (This)->lpVtbl->get_ActionType(This,actionType)
-#define IFsrmAction_put_RunLimitInterval(This,minutes) (This)->lpVtbl->put_RunLimitInterval(This,minutes)
 #define IFsrmAction_get_RunLimitInterval(This,minutes) (This)->lpVtbl->get_RunLimitInterval(This,minutes)
-#define IFsrmAction_Delete() (This)->lpVtbl->Delete(This)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmActionCommand
-#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 IFsrmAction_put_RunLimitInterval(This,minutes) (This)->lpVtbl->put_RunLimitInterval(This,minutes)
+#define IFsrmAction_Delete(This) (This)->lpVtbl->Delete(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IFsrmAction_QueryInterface(IFsrmAction* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmAction_AddRef(IFsrmAction* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmAction_Release(IFsrmAction* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmAction_GetTypeInfoCount(IFsrmAction* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmAction_GetTypeInfo(IFsrmAction* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE HRESULT IFsrmAction_GetIDsOfNames(IFsrmAction* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
+    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
+}
+static FORCEINLINE HRESULT IFsrmAction_Invoke(IFsrmAction* 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);
+}
+/*** IFsrmAction methods ***/
+static FORCEINLINE HRESULT IFsrmAction_get_Id(IFsrmAction* This,FSRM_OBJECT_ID *id) {
+    return This->lpVtbl->get_Id(This,id);
+}
+static FORCEINLINE HRESULT IFsrmAction_get_ActionType(IFsrmAction* This,FsrmActionType *actionType) {
+    return This->lpVtbl->get_ActionType(This,actionType);
+}
+static FORCEINLINE HRESULT IFsrmAction_get_RunLimitInterval(IFsrmAction* This,LONG *minutes) {
+    return This->lpVtbl->get_RunLimitInterval(This,minutes);
+}
+static FORCEINLINE HRESULT IFsrmAction_put_RunLimitInterval(IFsrmAction* This,LONG minutes) {
+    return This->lpVtbl->put_RunLimitInterval(This,minutes);
+}
+static FORCEINLINE HRESULT IFsrmAction_Delete(IFsrmAction* This) {
+    return This->lpVtbl->Delete(This);
+}
 #endif
-DECLARE_INTERFACE_(IFsrmActionCommand,IFsrmAction)
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmAction_get_Id_Proxy(
+    IFsrmAction* This,
+    FSRM_OBJECT_ID *id);
+void __RPC_STUB IFsrmAction_get_Id_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmAction_get_ActionType_Proxy(
+    IFsrmAction* This,
+    FsrmActionType *actionType);
+void __RPC_STUB IFsrmAction_get_ActionType_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmAction_get_RunLimitInterval_Proxy(
+    IFsrmAction* This,
+    LONG *minutes);
+void __RPC_STUB IFsrmAction_get_RunLimitInterval_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmAction_put_RunLimitInterval_Proxy(
+    IFsrmAction* This,
+    LONG minutes);
+void __RPC_STUB IFsrmAction_put_RunLimitInterval_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmAction_Delete_Proxy(
+    IFsrmAction* This);
+void __RPC_STUB IFsrmAction_Delete_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IFsrmAction_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IFsrmActionCommand interface
+ */
+#ifndef __IFsrmActionCommand_INTERFACE_DEFINED__
+#define __IFsrmActionCommand_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IFsrmActionCommand, 0x12937789, 0xe247, 0x4917, 0x9c,0x20, 0xf3,0xee,0x9c,0x7e,0xe7,0x83);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("12937789-e247-4917-9c20-f3ee9c7ee783")
+IFsrmActionCommand : public IFsrmAction
 {
+    virtual HRESULT STDMETHODCALLTYPE get_ExecutablePath(
+        BSTR *executablePath) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_ExecutablePath(
+        BSTR executablePath) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_Arguments(
+        BSTR *arguments) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_Arguments(
+        BSTR arguments) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_Account(
+        FsrmAccountType *account) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_Account(
+        FsrmAccountType account) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_WorkingDirectory(
+        BSTR *workingDirectory) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_WorkingDirectory(
+        BSTR workingDirectory) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_MonitorCommand(
+        VARIANT_BOOL *monitorCommand) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_MonitorCommand(
+        VARIANT_BOOL monitorCommand) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_KillTimeOut(
+        LONG *minutes) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_KillTimeOut(
+        LONG minutes) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_LogResult(
+        VARIANT_BOOL *logResults) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_LogResult(
+        VARIANT_BOOL logResults) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IFsrmActionCommand, 0x12937789, 0xe247, 0x4917, 0x9c,0x20, 0xf3,0xee,0x9c,0x7e,0xe7,0x83)
+#endif
+#else
+typedef struct IFsrmActionCommandVtbl {
     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)(
+        IFsrmActionCommand* 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)(
+        IFsrmActionCommand* This);
 
-    /* IFsrmAction methods */
-    STDMETHOD_(HRESULT,get_Id)(THIS_ FSRM_OBJECT_ID *id) PURE;
-    STDMETHOD_(HRESULT,get_ActionType)(THIS_ FsrmActionType *actionType) PURE;
-    STDMETHOD_(HRESULT,put_RunLimitInterval)(THIS_ __LONG32 minutes) PURE;
-    STDMETHOD_(HRESULT,get_RunLimitInterval)(THIS_ __LONG32 *minutes) PURE;
-    STDMETHOD_(HRESULT,Delete)(THIS) PURE;
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFsrmActionCommand* This);
 
-    /* IFsrmActionCommand methods */
-    STDMETHOD_(HRESULT,get_ExecutablePath)(THIS_ BSTR *executablePath) PURE;
-    STDMETHOD_(HRESULT,put_ExecutablePath)(THIS_ BSTR executablePath) PURE;
-    STDMETHOD_(HRESULT,get_Arguments)(THIS_ BSTR *arguments) PURE;
-    STDMETHOD_(HRESULT,put_Arguments)(THIS_ BSTR arguments) PURE;
-    STDMETHOD_(HRESULT,get_Account)(THIS_ FsrmAccountType *account) PURE;
-    STDMETHOD_(HRESULT,put_Account)(THIS_ FsrmAccountType account) PURE;
-    STDMETHOD_(HRESULT,get_WorkingDirectory)(THIS_ BSTR *workingDirectory) PURE;
-    STDMETHOD_(HRESULT,put_WorkingDirectory)(THIS_ BSTR workingDirectory) PURE;
-    STDMETHOD_(HRESULT,get_MonitorCommand)(THIS_ VARIANT_BOOL *monitorCommand) PURE;
-    STDMETHOD_(HRESULT,put_MonitorCommand)(THIS_ VARIANT_BOOL monitorCommand) PURE;
-    STDMETHOD_(HRESULT,get_KillTimeOut)(THIS_ __LONG32 *minutes) PURE;
-    STDMETHOD_(HRESULT,put_KillTimeOut)(THIS_ __LONG32 minutes) PURE;
-    STDMETHOD_(HRESULT,get_LogResult)(THIS_ VARIANT_BOOL *logResults) PURE;
-    STDMETHOD_(HRESULT,put_LogResult)(THIS_ VARIANT_BOOL logResults) PURE;
+    /*** IDispatch methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
+        IFsrmActionCommand* This,
+        UINT *pctinfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
+        IFsrmActionCommand* This,
+        UINT iTInfo,
+        LCID lcid,
+        ITypeInfo **ppTInfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
+        IFsrmActionCommand* This,
+        REFIID riid,
+        LPOLESTR *rgszNames,
+        UINT cNames,
+        LCID lcid,
+        DISPID *rgDispId);
+
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        IFsrmActionCommand* This,
+        DISPID dispIdMember,
+        REFIID riid,
+        LCID lcid,
+        WORD wFlags,
+        DISPPARAMS *pDispParams,
+        VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo,
+        UINT *puArgErr);
+
+    /*** IFsrmAction methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Id)(
+        IFsrmActionCommand* This,
+        FSRM_OBJECT_ID *id);
+
+    HRESULT (STDMETHODCALLTYPE *get_ActionType)(
+        IFsrmActionCommand* This,
+        FsrmActionType *actionType);
+
+    HRESULT (STDMETHODCALLTYPE *get_RunLimitInterval)(
+        IFsrmActionCommand* This,
+        LONG *minutes);
+
+    HRESULT (STDMETHODCALLTYPE *put_RunLimitInterval)(
+        IFsrmActionCommand* This,
+        LONG minutes);
+
+    HRESULT (STDMETHODCALLTYPE *Delete)(
+        IFsrmActionCommand* This);
+
+    /*** IFsrmActionCommand methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_ExecutablePath)(
+        IFsrmActionCommand* This,
+        BSTR *executablePath);
+
+    HRESULT (STDMETHODCALLTYPE *put_ExecutablePath)(
+        IFsrmActionCommand* This,
+        BSTR executablePath);
+
+    HRESULT (STDMETHODCALLTYPE *get_Arguments)(
+        IFsrmActionCommand* This,
+        BSTR *arguments);
+
+    HRESULT (STDMETHODCALLTYPE *put_Arguments)(
+        IFsrmActionCommand* This,
+        BSTR arguments);
+
+    HRESULT (STDMETHODCALLTYPE *get_Account)(
+        IFsrmActionCommand* This,
+        FsrmAccountType *account);
+
+    HRESULT (STDMETHODCALLTYPE *put_Account)(
+        IFsrmActionCommand* This,
+        FsrmAccountType account);
+
+    HRESULT (STDMETHODCALLTYPE *get_WorkingDirectory)(
+        IFsrmActionCommand* This,
+        BSTR *workingDirectory);
+
+    HRESULT (STDMETHODCALLTYPE *put_WorkingDirectory)(
+        IFsrmActionCommand* This,
+        BSTR workingDirectory);
+
+    HRESULT (STDMETHODCALLTYPE *get_MonitorCommand)(
+        IFsrmActionCommand* This,
+        VARIANT_BOOL *monitorCommand);
+
+    HRESULT (STDMETHODCALLTYPE *put_MonitorCommand)(
+        IFsrmActionCommand* This,
+        VARIANT_BOOL monitorCommand);
+
+    HRESULT (STDMETHODCALLTYPE *get_KillTimeOut)(
+        IFsrmActionCommand* This,
+        LONG *minutes);
+
+    HRESULT (STDMETHODCALLTYPE *put_KillTimeOut)(
+        IFsrmActionCommand* This,
+        LONG minutes);
+
+    HRESULT (STDMETHODCALLTYPE *get_LogResult)(
+        IFsrmActionCommand* This,
+        VARIANT_BOOL *logResults);
+
+    HRESULT (STDMETHODCALLTYPE *put_LogResult)(
+        IFsrmActionCommand* This,
+        VARIANT_BOOL logResults);
 
     END_INTERFACE
+} IFsrmActionCommandVtbl;
+interface IFsrmActionCommand {
+    CONST_VTBL IFsrmActionCommandVtbl* lpVtbl;
 };
+
 #ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
 #define IFsrmActionCommand_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
 #define IFsrmActionCommand_AddRef(This) (This)->lpVtbl->AddRef(This)
 #define IFsrmActionCommand_Release(This) (This)->lpVtbl->Release(This)
+/*** IDispatch methods ***/
 #define IFsrmActionCommand_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
 #define IFsrmActionCommand_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
 #define IFsrmActionCommand_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
 #define IFsrmActionCommand_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
+/*** IFsrmAction methods ***/
 #define IFsrmActionCommand_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
 #define IFsrmActionCommand_get_ActionType(This,actionType) (This)->lpVtbl->get_ActionType(This,actionType)
-#define IFsrmActionCommand_put_RunLimitInterval(This,minutes) (This)->lpVtbl->put_RunLimitInterval(This,minutes)
 #define IFsrmActionCommand_get_RunLimitInterval(This,minutes) (This)->lpVtbl->get_RunLimitInterval(This,minutes)
-#define IFsrmActionCommand_Delete() (This)->lpVtbl->Delete(This)
+#define IFsrmActionCommand_put_RunLimitInterval(This,minutes) (This)->lpVtbl->put_RunLimitInterval(This,minutes)
+#define IFsrmActionCommand_Delete(This) (This)->lpVtbl->Delete(This)
+/*** IFsrmActionCommand methods ***/
 #define IFsrmActionCommand_get_ExecutablePath(This,executablePath) (This)->lpVtbl->get_ExecutablePath(This,executablePath)
 #define IFsrmActionCommand_put_ExecutablePath(This,executablePath) (This)->lpVtbl->put_ExecutablePath(This,executablePath)
 #define IFsrmActionCommand_get_Arguments(This,arguments) (This)->lpVtbl->get_Arguments(This,arguments)
@@ -412,68 +1029,2256 @@
 #define IFsrmActionCommand_put_KillTimeOut(This,minutes) (This)->lpVtbl->put_KillTimeOut(This,minutes)
 #define IFsrmActionCommand_get_LogResult(This,logResults) (This)->lpVtbl->get_LogResult(This,logResults)
 #define IFsrmActionCommand_put_LogResult(This,logResults) (This)->lpVtbl->put_LogResult(This,logResults)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmActionEmail
-#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 IFsrmActionCommand_QueryInterface(IFsrmActionCommand* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmActionCommand_AddRef(IFsrmActionCommand* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmActionCommand_Release(IFsrmActionCommand* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmActionCommand_GetTypeInfoCount(IFsrmActionCommand* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmActionCommand_GetTypeInfo(IFsrmActionCommand* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE HRESULT IFsrmActionCommand_GetIDsOfNames(IFsrmActionCommand* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
+    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
+}
+static FORCEINLINE HRESULT IFsrmActionCommand_Invoke(IFsrmActionCommand* 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);
+}
+/*** IFsrmAction methods ***/
+static FORCEINLINE HRESULT IFsrmActionCommand_get_Id(IFsrmActionCommand* This,FSRM_OBJECT_ID *id) {
+    return This->lpVtbl->get_Id(This,id);
+}
+static FORCEINLINE HRESULT IFsrmActionCommand_get_ActionType(IFsrmActionCommand* This,FsrmActionType *actionType) {
+    return This->lpVtbl->get_ActionType(This,actionType);
+}
+static FORCEINLINE HRESULT IFsrmActionCommand_get_RunLimitInterval(IFsrmActionCommand* This,LONG *minutes) {
+    return This->lpVtbl->get_RunLimitInterval(This,minutes);
+}
+static FORCEINLINE HRESULT IFsrmActionCommand_put_RunLimitInterval(IFsrmActionCommand* This,LONG minutes) {
+    return This->lpVtbl->put_RunLimitInterval(This,minutes);
+}
+static FORCEINLINE HRESULT IFsrmActionCommand_Delete(IFsrmActionCommand* This) {
+    return This->lpVtbl->Delete(This);
+}
+/*** IFsrmActionCommand methods ***/
+static FORCEINLINE HRESULT IFsrmActionCommand_get_ExecutablePath(IFsrmActionCommand* This,BSTR *executablePath) {
+    return This->lpVtbl->get_ExecutablePath(This,executablePath);
+}
+static FORCEINLINE HRESULT IFsrmActionCommand_put_ExecutablePath(IFsrmActionCommand* This,BSTR executablePath) {
+    return This->lpVtbl->put_ExecutablePath(This,executablePath);
+}
+static FORCEINLINE HRESULT IFsrmActionCommand_get_Arguments(IFsrmActionCommand* This,BSTR *arguments) {
+    return This->lpVtbl->get_Arguments(This,arguments);
+}
+static FORCEINLINE HRESULT IFsrmActionCommand_put_Arguments(IFsrmActionCommand* This,BSTR arguments) {
+    return This->lpVtbl->put_Arguments(This,arguments);
+}
+static FORCEINLINE HRESULT IFsrmActionCommand_get_Account(IFsrmActionCommand* This,FsrmAccountType *account) {
+    return This->lpVtbl->get_Account(This,account);
+}
+static FORCEINLINE HRESULT IFsrmActionCommand_put_Account(IFsrmActionCommand* This,FsrmAccountType account) {
+    return This->lpVtbl->put_Account(This,account);
+}
+static FORCEINLINE HRESULT IFsrmActionCommand_get_WorkingDirectory(IFsrmActionCommand* This,BSTR *workingDirectory) {
+    return This->lpVtbl->get_WorkingDirectory(This,workingDirectory);
+}
+static FORCEINLINE HRESULT IFsrmActionCommand_put_WorkingDirectory(IFsrmActionCommand* This,BSTR workingDirectory) {
+    return This->lpVtbl->put_WorkingDirectory(This,workingDirectory);
+}
+static FORCEINLINE HRESULT IFsrmActionCommand_get_MonitorCommand(IFsrmActionCommand* This,VARIANT_BOOL *monitorCommand) {
+    return This->lpVtbl->get_MonitorCommand(This,monitorCommand);
+}
+static FORCEINLINE HRESULT IFsrmActionCommand_put_MonitorCommand(IFsrmActionCommand* This,VARIANT_BOOL monitorCommand) {
+    return This->lpVtbl->put_MonitorCommand(This,monitorCommand);
+}
+static FORCEINLINE HRESULT IFsrmActionCommand_get_KillTimeOut(IFsrmActionCommand* This,LONG *minutes) {
+    return This->lpVtbl->get_KillTimeOut(This,minutes);
+}
+static FORCEINLINE HRESULT IFsrmActionCommand_put_KillTimeOut(IFsrmActionCommand* This,LONG minutes) {
+    return This->lpVtbl->put_KillTimeOut(This,minutes);
+}
+static FORCEINLINE HRESULT IFsrmActionCommand_get_LogResult(IFsrmActionCommand* This,VARIANT_BOOL *logResults) {
+    return This->lpVtbl->get_LogResult(This,logResults);
+}
+static FORCEINLINE HRESULT IFsrmActionCommand_put_LogResult(IFsrmActionCommand* This,VARIANT_BOOL logResults) {
+    return This->lpVtbl->put_LogResult(This,logResults);
+}
 #endif
-DECLARE_INTERFACE_(IFsrmActionEmail,IFsrmAction)
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmActionCommand_get_ExecutablePath_Proxy(
+    IFsrmActionCommand* This,
+    BSTR *executablePath);
+void __RPC_STUB IFsrmActionCommand_get_ExecutablePath_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmActionCommand_put_ExecutablePath_Proxy(
+    IFsrmActionCommand* This,
+    BSTR executablePath);
+void __RPC_STUB IFsrmActionCommand_put_ExecutablePath_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmActionCommand_get_Arguments_Proxy(
+    IFsrmActionCommand* This,
+    BSTR *arguments);
+void __RPC_STUB IFsrmActionCommand_get_Arguments_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmActionCommand_put_Arguments_Proxy(
+    IFsrmActionCommand* This,
+    BSTR arguments);
+void __RPC_STUB IFsrmActionCommand_put_Arguments_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmActionCommand_get_Account_Proxy(
+    IFsrmActionCommand* This,
+    FsrmAccountType *account);
+void __RPC_STUB IFsrmActionCommand_get_Account_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmActionCommand_put_Account_Proxy(
+    IFsrmActionCommand* This,
+    FsrmAccountType account);
+void __RPC_STUB IFsrmActionCommand_put_Account_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmActionCommand_get_WorkingDirectory_Proxy(
+    IFsrmActionCommand* This,
+    BSTR *workingDirectory);
+void __RPC_STUB IFsrmActionCommand_get_WorkingDirectory_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmActionCommand_put_WorkingDirectory_Proxy(
+    IFsrmActionCommand* This,
+    BSTR workingDirectory);
+void __RPC_STUB IFsrmActionCommand_put_WorkingDirectory_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmActionCommand_get_MonitorCommand_Proxy(
+    IFsrmActionCommand* This,
+    VARIANT_BOOL *monitorCommand);
+void __RPC_STUB IFsrmActionCommand_get_MonitorCommand_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmActionCommand_put_MonitorCommand_Proxy(
+    IFsrmActionCommand* This,
+    VARIANT_BOOL monitorCommand);
+void __RPC_STUB IFsrmActionCommand_put_MonitorCommand_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmActionCommand_get_KillTimeOut_Proxy(
+    IFsrmActionCommand* This,
+    LONG *minutes);
+void __RPC_STUB IFsrmActionCommand_get_KillTimeOut_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmActionCommand_put_KillTimeOut_Proxy(
+    IFsrmActionCommand* This,
+    LONG minutes);
+void __RPC_STUB IFsrmActionCommand_put_KillTimeOut_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmActionCommand_get_LogResult_Proxy(
+    IFsrmActionCommand* This,
+    VARIANT_BOOL *logResults);
+void __RPC_STUB IFsrmActionCommand_get_LogResult_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmActionCommand_put_LogResult_Proxy(
+    IFsrmActionCommand* This,
+    VARIANT_BOOL logResults);
+void __RPC_STUB IFsrmActionCommand_put_LogResult_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IFsrmActionCommand_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IFsrmActionEventLog interface
+ */
+#ifndef __IFsrmActionEventLog_INTERFACE_DEFINED__
+#define __IFsrmActionEventLog_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IFsrmActionEventLog, 0x4c8f96c3, 0x5d94, 0x4f37, 0xa4,0xf4, 0xf5,0x6a,0xb4,0x63,0x54,0x6f);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("4c8f96c3-5d94-4f37-a4f4-f56ab463546f")
+IFsrmActionEventLog : public IFsrmAction
 {
+    virtual HRESULT STDMETHODCALLTYPE get_EventType(
+        FsrmEventType *eventType) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_EventType(
+        FsrmEventType eventType) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_MessageText(
+        BSTR *messageText) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_MessageText(
+        BSTR messageText) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IFsrmActionEventLog, 0x4c8f96c3, 0x5d94, 0x4f37, 0xa4,0xf4, 0xf5,0x6a,0xb4,0x63,0x54,0x6f)
+#endif
+#else
+typedef struct IFsrmActionEventLogVtbl {
     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)(
+        IFsrmActionEventLog* 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)(
+        IFsrmActionEventLog* This);
 
-    /* IFsrmAction methods */
-    STDMETHOD_(HRESULT,get_Id)(THIS_ FSRM_OBJECT_ID *id) PURE;
-    STDMETHOD_(HRESULT,get_ActionType)(THIS_ FsrmActionType *actionType) PURE;
-    STDMETHOD_(HRESULT,put_RunLimitInterval)(THIS_ __LONG32 minutes) PURE;
-    STDMETHOD_(HRESULT,get_RunLimitInterval)(THIS_ __LONG32 *minutes) PURE;
-    STDMETHOD_(HRESULT,Delete)(THIS) PURE;
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFsrmActionEventLog* This);
 
-    /* IFsrmActionEmail methods */
-    STDMETHOD_(HRESULT,get_MailFrom)(THIS_ BSTR *mailFrom) PURE;
-    STDMETHOD_(HRESULT,put_MailFrom)(THIS_ BSTR mailFrom) PURE;
-    STDMETHOD_(HRESULT,get_MailReplyTo)(THIS_ BSTR *mailReplyTo) PURE;
-    STDMETHOD_(HRESULT,put_MailReplyTo)(THIS_ BSTR mailReplyTo) PURE;
-    STDMETHOD_(HRESULT,get_MailTo)(THIS_ BSTR *mailTo) PURE;
-    STDMETHOD_(HRESULT,put_MailTo)(THIS_ BSTR mailTo) PURE;
-    STDMETHOD_(HRESULT,get_MailCc)(THIS_ BSTR *mailCc) PURE;
-    STDMETHOD_(HRESULT,put_MailCc)(THIS_ BSTR mailCc) PURE;
-    STDMETHOD_(HRESULT,get_MailBcc)(THIS_ BSTR *mailBcc) PURE;
-    STDMETHOD_(HRESULT,put_MailBcc)(THIS_ BSTR mailBcc) PURE;
-    STDMETHOD_(HRESULT,get_MailSubject)(THIS_ BSTR *mailSubject) PURE;
-    STDMETHOD_(HRESULT,put_MailSubject)(THIS_ BSTR mailSubject) PURE;
-    STDMETHOD_(HRESULT,get_MessageText)(THIS_ BSTR *messageText) PURE;
-    STDMETHOD_(HRESULT,put_MessageText)(THIS_ BSTR messageText) PURE;
+    /*** IDispatch methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
+        IFsrmActionEventLog* This,
+        UINT *pctinfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
+        IFsrmActionEventLog* This,
+        UINT iTInfo,
+        LCID lcid,
+        ITypeInfo **ppTInfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
+        IFsrmActionEventLog* This,
+        REFIID riid,
+        LPOLESTR *rgszNames,
+        UINT cNames,
+        LCID lcid,
+        DISPID *rgDispId);
+
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        IFsrmActionEventLog* This,
+        DISPID dispIdMember,
+        REFIID riid,
+        LCID lcid,
+        WORD wFlags,
+        DISPPARAMS *pDispParams,
+        VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo,
+        UINT *puArgErr);
+
+    /*** IFsrmAction methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Id)(
+        IFsrmActionEventLog* This,
+        FSRM_OBJECT_ID *id);
+
+    HRESULT (STDMETHODCALLTYPE *get_ActionType)(
+        IFsrmActionEventLog* This,
+        FsrmActionType *actionType);
+
+    HRESULT (STDMETHODCALLTYPE *get_RunLimitInterval)(
+        IFsrmActionEventLog* This,
+        LONG *minutes);
+
+    HRESULT (STDMETHODCALLTYPE *put_RunLimitInterval)(
+        IFsrmActionEventLog* This,
+        LONG minutes);
+
+    HRESULT (STDMETHODCALLTYPE *Delete)(
+        IFsrmActionEventLog* This);
+
+    /*** IFsrmActionEventLog methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_EventType)(
+        IFsrmActionEventLog* This,
+        FsrmEventType *eventType);
+
+    HRESULT (STDMETHODCALLTYPE *put_EventType)(
+        IFsrmActionEventLog* This,
+        FsrmEventType eventType);
+
+    HRESULT (STDMETHODCALLTYPE *get_MessageText)(
+        IFsrmActionEventLog* This,
+        BSTR *messageText);
+
+    HRESULT (STDMETHODCALLTYPE *put_MessageText)(
+        IFsrmActionEventLog* This,
+        BSTR messageText);
 
     END_INTERFACE
+} IFsrmActionEventLogVtbl;
+interface IFsrmActionEventLog {
+    CONST_VTBL IFsrmActionEventLogVtbl* lpVtbl;
 };
+
 #ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IFsrmActionEventLog_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IFsrmActionEventLog_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IFsrmActionEventLog_Release(This) (This)->lpVtbl->Release(This)
+/*** IDispatch methods ***/
+#define IFsrmActionEventLog_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
+#define IFsrmActionEventLog_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
+#define IFsrmActionEventLog_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
+#define IFsrmActionEventLog_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
+/*** IFsrmAction methods ***/
+#define IFsrmActionEventLog_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
+#define IFsrmActionEventLog_get_ActionType(This,actionType) (This)->lpVtbl->get_ActionType(This,actionType)
+#define IFsrmActionEventLog_get_RunLimitInterval(This,minutes) (This)->lpVtbl->get_RunLimitInterval(This,minutes)
+#define IFsrmActionEventLog_put_RunLimitInterval(This,minutes) (This)->lpVtbl->put_RunLimitInterval(This,minutes)
+#define IFsrmActionEventLog_Delete(This) (This)->lpVtbl->Delete(This)
+/*** IFsrmActionEventLog methods ***/
+#define IFsrmActionEventLog_get_EventType(This,eventType) (This)->lpVtbl->get_EventType(This,eventType)
+#define IFsrmActionEventLog_put_EventType(This,eventType) (This)->lpVtbl->put_EventType(This,eventType)
+#define IFsrmActionEventLog_get_MessageText(This,messageText) (This)->lpVtbl->get_MessageText(This,messageText)
+#define IFsrmActionEventLog_put_MessageText(This,messageText) (This)->lpVtbl->put_MessageText(This,messageText)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IFsrmActionEventLog_QueryInterface(IFsrmActionEventLog* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmActionEventLog_AddRef(IFsrmActionEventLog* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmActionEventLog_Release(IFsrmActionEventLog* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmActionEventLog_GetTypeInfoCount(IFsrmActionEventLog* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmActionEventLog_GetTypeInfo(IFsrmActionEventLog* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE HRESULT IFsrmActionEventLog_GetIDsOfNames(IFsrmActionEventLog* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
+    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
+}
+static FORCEINLINE HRESULT IFsrmActionEventLog_Invoke(IFsrmActionEventLog* 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);
+}
+/*** IFsrmAction methods ***/
+static FORCEINLINE HRESULT IFsrmActionEventLog_get_Id(IFsrmActionEventLog* This,FSRM_OBJECT_ID *id) {
+    return This->lpVtbl->get_Id(This,id);
+}
+static FORCEINLINE HRESULT IFsrmActionEventLog_get_ActionType(IFsrmActionEventLog* This,FsrmActionType *actionType) {
+    return This->lpVtbl->get_ActionType(This,actionType);
+}
+static FORCEINLINE HRESULT IFsrmActionEventLog_get_RunLimitInterval(IFsrmActionEventLog* This,LONG *minutes) {
+    return This->lpVtbl->get_RunLimitInterval(This,minutes);
+}
+static FORCEINLINE HRESULT IFsrmActionEventLog_put_RunLimitInterval(IFsrmActionEventLog* This,LONG minutes) {
+    return This->lpVtbl->put_RunLimitInterval(This,minutes);
+}
+static FORCEINLINE HRESULT IFsrmActionEventLog_Delete(IFsrmActionEventLog* This) {
+    return This->lpVtbl->Delete(This);
+}
+/*** IFsrmActionEventLog methods ***/
+static FORCEINLINE HRESULT IFsrmActionEventLog_get_EventType(IFsrmActionEventLog* This,FsrmEventType *eventType) {
+    return This->lpVtbl->get_EventType(This,eventType);
+}
+static FORCEINLINE HRESULT IFsrmActionEventLog_put_EventType(IFsrmActionEventLog* This,FsrmEventType eventType) {
+    return This->lpVtbl->put_EventType(This,eventType);
+}
+static FORCEINLINE HRESULT IFsrmActionEventLog_get_MessageText(IFsrmActionEventLog* This,BSTR *messageText) {
+    return This->lpVtbl->get_MessageText(This,messageText);
+}
+static FORCEINLINE HRESULT IFsrmActionEventLog_put_MessageText(IFsrmActionEventLog* This,BSTR messageText) {
+    return This->lpVtbl->put_MessageText(This,messageText);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmActionEventLog_get_EventType_Proxy(
+    IFsrmActionEventLog* This,
+    FsrmEventType *eventType);
+void __RPC_STUB IFsrmActionEventLog_get_EventType_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmActionEventLog_put_EventType_Proxy(
+    IFsrmActionEventLog* This,
+    FsrmEventType eventType);
+void __RPC_STUB IFsrmActionEventLog_put_EventType_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmActionEventLog_get_MessageText_Proxy(
+    IFsrmActionEventLog* This,
+    BSTR *messageText);
+void __RPC_STUB IFsrmActionEventLog_get_MessageText_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmActionEventLog_put_MessageText_Proxy(
+    IFsrmActionEventLog* This,
+    BSTR messageText);
+void __RPC_STUB IFsrmActionEventLog_put_MessageText_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IFsrmActionEventLog_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IFsrmActionReport interface
+ */
+#ifndef __IFsrmActionReport_INTERFACE_DEFINED__
+#define __IFsrmActionReport_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IFsrmActionReport, 0x2dbe63c4, 0xb340, 0x48a0, 0xa5,0xb0, 0x15,0x8e,0x07,0xfc,0x56,0x7e);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("2dbe63c4-b340-48a0-a5b0-158e07fc567e")
+IFsrmActionReport : public IFsrmAction
+{
+    virtual HRESULT STDMETHODCALLTYPE get_ReportTypes(
+        SAFEARRAY **reportTypes) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_ReportTypes(
+        SAFEARRAY *reportTypes) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_MailTo(
+        BSTR *mailTo) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_MailTo(
+        BSTR mailTo) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IFsrmActionReport, 0x2dbe63c4, 0xb340, 0x48a0, 0xa5,0xb0, 0x15,0x8e,0x07,0xfc,0x56,0x7e)
+#endif
+#else
+typedef struct IFsrmActionReportVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFsrmActionReport* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFsrmActionReport* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFsrmActionReport* This);
+
+    /*** IDispatch methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
+        IFsrmActionReport* This,
+        UINT *pctinfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
+        IFsrmActionReport* This,
+        UINT iTInfo,
+        LCID lcid,
+        ITypeInfo **ppTInfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
+        IFsrmActionReport* This,
+        REFIID riid,
+        LPOLESTR *rgszNames,
+        UINT cNames,
+        LCID lcid,
+        DISPID *rgDispId);
+
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        IFsrmActionReport* This,
+        DISPID dispIdMember,
+        REFIID riid,
+        LCID lcid,
+        WORD wFlags,
+        DISPPARAMS *pDispParams,
+        VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo,
+        UINT *puArgErr);
+
+    /*** IFsrmAction methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Id)(
+        IFsrmActionReport* This,
+        FSRM_OBJECT_ID *id);
+
+    HRESULT (STDMETHODCALLTYPE *get_ActionType)(
+        IFsrmActionReport* This,
+        FsrmActionType *actionType);
+
+    HRESULT (STDMETHODCALLTYPE *get_RunLimitInterval)(
+        IFsrmActionReport* This,
+        LONG *minutes);
+
+    HRESULT (STDMETHODCALLTYPE *put_RunLimitInterval)(
+        IFsrmActionReport* This,
+        LONG minutes);
+
+    HRESULT (STDMETHODCALLTYPE *Delete)(
+        IFsrmActionReport* This);
+
+    /*** IFsrmActionReport methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_ReportTypes)(
+        IFsrmActionReport* This,
+        SAFEARRAY **reportTypes);
+
+    HRESULT (STDMETHODCALLTYPE *put_ReportTypes)(
+        IFsrmActionReport* This,
+        SAFEARRAY *reportTypes);
+
+    HRESULT (STDMETHODCALLTYPE *get_MailTo)(
+        IFsrmActionReport* This,
+        BSTR *mailTo);
+
+    HRESULT (STDMETHODCALLTYPE *put_MailTo)(
+        IFsrmActionReport* This,
+        BSTR mailTo);
+
+    END_INTERFACE
+} IFsrmActionReportVtbl;
+interface IFsrmActionReport {
+    CONST_VTBL IFsrmActionReportVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IFsrmActionReport_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IFsrmActionReport_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IFsrmActionReport_Release(This) (This)->lpVtbl->Release(This)
+/*** IDispatch methods ***/
+#define IFsrmActionReport_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
+#define IFsrmActionReport_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
+#define IFsrmActionReport_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
+#define IFsrmActionReport_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
+/*** IFsrmAction methods ***/
+#define IFsrmActionReport_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
+#define IFsrmActionReport_get_ActionType(This,actionType) (This)->lpVtbl->get_ActionType(This,actionType)
+#define IFsrmActionReport_get_RunLimitInterval(This,minutes) (This)->lpVtbl->get_RunLimitInterval(This,minutes)
+#define IFsrmActionReport_put_RunLimitInterval(This,minutes) (This)->lpVtbl->put_RunLimitInterval(This,minutes)
+#define IFsrmActionReport_Delete(This) (This)->lpVtbl->Delete(This)
+/*** IFsrmActionReport methods ***/
+#define IFsrmActionReport_get_ReportTypes(This,reportTypes) (This)->lpVtbl->get_ReportTypes(This,reportTypes)
+#define IFsrmActionReport_put_ReportTypes(This,reportTypes) (This)->lpVtbl->put_ReportTypes(This,reportTypes)
+#define IFsrmActionReport_get_MailTo(This,mailTo) (This)->lpVtbl->get_MailTo(This,mailTo)
+#define IFsrmActionReport_put_MailTo(This,mailTo) (This)->lpVtbl->put_MailTo(This,mailTo)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IFsrmActionReport_QueryInterface(IFsrmActionReport* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmActionReport_AddRef(IFsrmActionReport* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmActionReport_Release(IFsrmActionReport* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmActionReport_GetTypeInfoCount(IFsrmActionReport* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmActionReport_GetTypeInfo(IFsrmActionReport* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE HRESULT IFsrmActionReport_GetIDsOfNames(IFsrmActionReport* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
+    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
+}
+static FORCEINLINE HRESULT IFsrmActionReport_Invoke(IFsrmActionReport* 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);
+}
+/*** IFsrmAction methods ***/
+static FORCEINLINE HRESULT IFsrmActionReport_get_Id(IFsrmActionReport* This,FSRM_OBJECT_ID *id) {
+    return This->lpVtbl->get_Id(This,id);
+}
+static FORCEINLINE HRESULT IFsrmActionReport_get_ActionType(IFsrmActionReport* This,FsrmActionType *actionType) {
+    return This->lpVtbl->get_ActionType(This,actionType);
+}
+static FORCEINLINE HRESULT IFsrmActionReport_get_RunLimitInterval(IFsrmActionReport* This,LONG *minutes) {
+    return This->lpVtbl->get_RunLimitInterval(This,minutes);
+}
+static FORCEINLINE HRESULT IFsrmActionReport_put_RunLimitInterval(IFsrmActionReport* This,LONG minutes) {
+    return This->lpVtbl->put_RunLimitInterval(This,minutes);
+}
+static FORCEINLINE HRESULT IFsrmActionReport_Delete(IFsrmActionReport* This) {
+    return This->lpVtbl->Delete(This);
+}
+/*** IFsrmActionReport methods ***/
+static FORCEINLINE HRESULT IFsrmActionReport_get_ReportTypes(IFsrmActionReport* This,SAFEARRAY **reportTypes) {
+    return This->lpVtbl->get_ReportTypes(This,reportTypes);
+}
+static FORCEINLINE HRESULT IFsrmActionReport_put_ReportTypes(IFsrmActionReport* This,SAFEARRAY *reportTypes) {
+    return This->lpVtbl->put_ReportTypes(This,reportTypes);
+}
+static FORCEINLINE HRESULT IFsrmActionReport_get_MailTo(IFsrmActionReport* This,BSTR *mailTo) {
+    return This->lpVtbl->get_MailTo(This,mailTo);
+}
+static FORCEINLINE HRESULT IFsrmActionReport_put_MailTo(IFsrmActionReport* This,BSTR mailTo) {
+    return This->lpVtbl->put_MailTo(This,mailTo);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmActionReport_get_ReportTypes_Proxy(
+    IFsrmActionReport* This,
+    SAFEARRAY **reportTypes);
+void __RPC_STUB IFsrmActionReport_get_ReportTypes_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmActionReport_put_ReportTypes_Proxy(
+    IFsrmActionReport* This,
+    SAFEARRAY *reportTypes);
+void __RPC_STUB IFsrmActionReport_put_ReportTypes_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmActionReport_get_MailTo_Proxy(
+    IFsrmActionReport* This,
+    BSTR *mailTo);
+void __RPC_STUB IFsrmActionReport_get_MailTo_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmActionReport_put_MailTo_Proxy(
+    IFsrmActionReport* This,
+    BSTR mailTo);
+void __RPC_STUB IFsrmActionReport_put_MailTo_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IFsrmActionReport_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IFsrmCollection interface
+ */
+#ifndef __IFsrmCollection_INTERFACE_DEFINED__
+#define __IFsrmCollection_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IFsrmCollection, 0xf76fbf3b, 0x8ddd, 0x4b42, 0xb0,0x5a, 0xcb,0x1c,0x3f,0xf1,0xfe,0xe8);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("f76fbf3b-8ddd-4b42-b05a-cb1c3ff1fee8")
+IFsrmCollection : public IDispatch
+{
+    virtual HRESULT STDMETHODCALLTYPE get__NewEnum(
+        IUnknown **unknown) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_Item(
+        LONG index,
+        VARIANT *item) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_Count(
+        LONG *count) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_State(
+        FsrmCollectionState *state) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Cancel(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE WaitForCompletion(
+        LONG waitSeconds,
+        VARIANT_BOOL *completed) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetById(
+        FSRM_OBJECT_ID id,
+        VARIANT *entry) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IFsrmCollection, 0xf76fbf3b, 0x8ddd, 0x4b42, 0xb0,0x5a, 0xcb,0x1c,0x3f,0xf1,0xfe,0xe8)
+#endif
+#else
+typedef struct IFsrmCollectionVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFsrmCollection* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFsrmCollection* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFsrmCollection* This);
+
+    /*** IDispatch methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
+        IFsrmCollection* This,
+        UINT *pctinfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
+        IFsrmCollection* This,
+        UINT iTInfo,
+        LCID lcid,
+        ITypeInfo **ppTInfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
+        IFsrmCollection* This,
+        REFIID riid,
+        LPOLESTR *rgszNames,
+        UINT cNames,
+        LCID lcid,
+        DISPID *rgDispId);
+
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        IFsrmCollection* This,
+        DISPID dispIdMember,
+        REFIID riid,
+        LCID lcid,
+        WORD wFlags,
+        DISPPARAMS *pDispParams,
+        VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo,
+        UINT *puArgErr);
+
+    /*** IFsrmCollection methods ***/
+    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
+        IFsrmCollection* This,
+        IUnknown **unknown);
+
+    HRESULT (STDMETHODCALLTYPE *get_Item)(
+        IFsrmCollection* This,
+        LONG index,
+        VARIANT *item);
+
+    HRESULT (STDMETHODCALLTYPE *get_Count)(
+        IFsrmCollection* This,
+        LONG *count);
+
+    HRESULT (STDMETHODCALLTYPE *get_State)(
+        IFsrmCollection* This,
+        FsrmCollectionState *state);
+
+    HRESULT (STDMETHODCALLTYPE *Cancel)(
+        IFsrmCollection* This);
+
+    HRESULT (STDMETHODCALLTYPE *WaitForCompletion)(
+        IFsrmCollection* This,
+        LONG waitSeconds,
+        VARIANT_BOOL *completed);
+
+    HRESULT (STDMETHODCALLTYPE *GetById)(
+        IFsrmCollection* This,
+        FSRM_OBJECT_ID id,
+        VARIANT *entry);
+
+    END_INTERFACE
+} IFsrmCollectionVtbl;
+interface IFsrmCollection {
+    CONST_VTBL IFsrmCollectionVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IFsrmCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IFsrmCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IFsrmCollection_Release(This) (This)->lpVtbl->Release(This)
+/*** IDispatch methods ***/
+#define IFsrmCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
+#define IFsrmCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
+#define IFsrmCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
+#define IFsrmCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
+/*** IFsrmCollection methods ***/
+#define IFsrmCollection_get__NewEnum(This,unknown) (This)->lpVtbl->get__NewEnum(This,unknown)
+#define IFsrmCollection_get_Item(This,index,item) (This)->lpVtbl->get_Item(This,index,item)
+#define IFsrmCollection_get_Count(This,count) (This)->lpVtbl->get_Count(This,count)
+#define IFsrmCollection_get_State(This,state) (This)->lpVtbl->get_State(This,state)
+#define IFsrmCollection_Cancel(This) (This)->lpVtbl->Cancel(This)
+#define IFsrmCollection_WaitForCompletion(This,waitSeconds,completed) (This)->lpVtbl->WaitForCompletion(This,waitSeconds,completed)
+#define IFsrmCollection_GetById(This,id,entry) (This)->lpVtbl->GetById(This,id,entry)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IFsrmCollection_QueryInterface(IFsrmCollection* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmCollection_AddRef(IFsrmCollection* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmCollection_Release(IFsrmCollection* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmCollection_GetTypeInfoCount(IFsrmCollection* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmCollection_GetTypeInfo(IFsrmCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE HRESULT IFsrmCollection_GetIDsOfNames(IFsrmCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
+    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
+}
+static FORCEINLINE HRESULT IFsrmCollection_Invoke(IFsrmCollection* 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);
+}
+/*** IFsrmCollection methods ***/
+static FORCEINLINE HRESULT IFsrmCollection_get__NewEnum(IFsrmCollection* This,IUnknown **unknown) {
+    return This->lpVtbl->get__NewEnum(This,unknown);
+}
+static FORCEINLINE HRESULT IFsrmCollection_get_Item(IFsrmCollection* This,LONG index,VARIANT *item) {
+    return This->lpVtbl->get_Item(This,index,item);
+}
+static FORCEINLINE HRESULT IFsrmCollection_get_Count(IFsrmCollection* This,LONG *count) {
+    return This->lpVtbl->get_Count(This,count);
+}
+static FORCEINLINE HRESULT IFsrmCollection_get_State(IFsrmCollection* This,FsrmCollectionState *state) {
+    return This->lpVtbl->get_State(This,state);
+}
+static FORCEINLINE HRESULT IFsrmCollection_Cancel(IFsrmCollection* This) {
+    return This->lpVtbl->Cancel(This);
+}
+static FORCEINLINE HRESULT IFsrmCollection_WaitForCompletion(IFsrmCollection* This,LONG waitSeconds,VARIANT_BOOL *completed) {
+    return This->lpVtbl->WaitForCompletion(This,waitSeconds,completed);
+}
+static FORCEINLINE HRESULT IFsrmCollection_GetById(IFsrmCollection* This,FSRM_OBJECT_ID id,VARIANT *entry) {
+    return This->lpVtbl->GetById(This,id,entry);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmCollection_get__NewEnum_Proxy(
+    IFsrmCollection* This,
+    IUnknown **unknown);
+void __RPC_STUB IFsrmCollection_get__NewEnum_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmCollection_get_Item_Proxy(
+    IFsrmCollection* This,
+    LONG index,
+    VARIANT *item);
+void __RPC_STUB IFsrmCollection_get_Item_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmCollection_get_Count_Proxy(
+    IFsrmCollection* This,
+    LONG *count);
+void __RPC_STUB IFsrmCollection_get_Count_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmCollection_get_State_Proxy(
+    IFsrmCollection* This,
+    FsrmCollectionState *state);
+void __RPC_STUB IFsrmCollection_get_State_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmCollection_Cancel_Proxy(
+    IFsrmCollection* This);
+void __RPC_STUB IFsrmCollection_Cancel_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmCollection_WaitForCompletion_Proxy(
+    IFsrmCollection* This,
+    LONG waitSeconds,
+    VARIANT_BOOL *completed);
+void __RPC_STUB IFsrmCollection_WaitForCompletion_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmCollection_GetById_Proxy(
+    IFsrmCollection* This,
+    FSRM_OBJECT_ID id,
+    VARIANT *entry);
+void __RPC_STUB IFsrmCollection_GetById_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IFsrmCollection_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IFsrmDerivedObjectsResult interface
+ */
+#ifndef __IFsrmDerivedObjectsResult_INTERFACE_DEFINED__
+#define __IFsrmDerivedObjectsResult_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IFsrmDerivedObjectsResult, 0x39322a2d, 0x38ee, 0x4d0d, 0x80,0x95, 0x42,0x1a,0x80,0x84,0x9a,0x82);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("39322a2d-38ee-4d0d-8095-421a80849a82")
+IFsrmDerivedObjectsResult : public IDispatch
+{
+    virtual HRESULT STDMETHODCALLTYPE get_DerivedObjects(
+        IFsrmCollection **derivedObjects) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_Results(
+        IFsrmCollection **results) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IFsrmDerivedObjectsResult, 0x39322a2d, 0x38ee, 0x4d0d, 0x80,0x95, 0x42,0x1a,0x80,0x84,0x9a,0x82)
+#endif
+#else
+typedef struct IFsrmDerivedObjectsResultVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFsrmDerivedObjectsResult* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFsrmDerivedObjectsResult* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFsrmDerivedObjectsResult* This);
+
+    /*** IDispatch methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
+        IFsrmDerivedObjectsResult* This,
+        UINT *pctinfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
+        IFsrmDerivedObjectsResult* This,
+        UINT iTInfo,
+        LCID lcid,
+        ITypeInfo **ppTInfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
+        IFsrmDerivedObjectsResult* This,
+        REFIID riid,
+        LPOLESTR *rgszNames,
+        UINT cNames,
+        LCID lcid,
+        DISPID *rgDispId);
+
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        IFsrmDerivedObjectsResult* This,
+        DISPID dispIdMember,
+        REFIID riid,
+        LCID lcid,
+        WORD wFlags,
+        DISPPARAMS *pDispParams,
+        VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo,
+        UINT *puArgErr);
+
+    /*** IFsrmDerivedObjectsResult methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_DerivedObjects)(
+        IFsrmDerivedObjectsResult* This,
+        IFsrmCollection **derivedObjects);
+
+    HRESULT (STDMETHODCALLTYPE *get_Results)(
+        IFsrmDerivedObjectsResult* This,
+        IFsrmCollection **results);
+
+    END_INTERFACE
+} IFsrmDerivedObjectsResultVtbl;
+interface IFsrmDerivedObjectsResult {
+    CONST_VTBL IFsrmDerivedObjectsResultVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IFsrmDerivedObjectsResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IFsrmDerivedObjectsResult_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IFsrmDerivedObjectsResult_Release(This) (This)->lpVtbl->Release(This)
+/*** IDispatch methods ***/
+#define IFsrmDerivedObjectsResult_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
+#define IFsrmDerivedObjectsResult_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
+#define IFsrmDerivedObjectsResult_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
+#define IFsrmDerivedObjectsResult_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
+/*** IFsrmDerivedObjectsResult methods ***/
+#define IFsrmDerivedObjectsResult_get_DerivedObjects(This,derivedObjects) (This)->lpVtbl->get_DerivedObjects(This,derivedObjects)
+#define IFsrmDerivedObjectsResult_get_Results(This,results) (This)->lpVtbl->get_Results(This,results)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IFsrmDerivedObjectsResult_QueryInterface(IFsrmDerivedObjectsResult* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmDerivedObjectsResult_AddRef(IFsrmDerivedObjectsResult* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmDerivedObjectsResult_Release(IFsrmDerivedObjectsResult* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmDerivedObjectsResult_GetTypeInfoCount(IFsrmDerivedObjectsResult* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmDerivedObjectsResult_GetTypeInfo(IFsrmDerivedObjectsResult* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE HRESULT IFsrmDerivedObjectsResult_GetIDsOfNames(IFsrmDerivedObjectsResult* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
+    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
+}
+static FORCEINLINE HRESULT IFsrmDerivedObjectsResult_Invoke(IFsrmDerivedObjectsResult* 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);
+}
+/*** IFsrmDerivedObjectsResult methods ***/
+static FORCEINLINE HRESULT IFsrmDerivedObjectsResult_get_DerivedObjects(IFsrmDerivedObjectsResult* This,IFsrmCollection **derivedObjects) {
+    return This->lpVtbl->get_DerivedObjects(This,derivedObjects);
+}
+static FORCEINLINE HRESULT IFsrmDerivedObjectsResult_get_Results(IFsrmDerivedObjectsResult* This,IFsrmCollection **results) {
+    return This->lpVtbl->get_Results(This,results);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmDerivedObjectsResult_get_DerivedObjects_Proxy(
+    IFsrmDerivedObjectsResult* This,
+    IFsrmCollection **derivedObjects);
+void __RPC_STUB IFsrmDerivedObjectsResult_get_DerivedObjects_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmDerivedObjectsResult_get_Results_Proxy(
+    IFsrmDerivedObjectsResult* This,
+    IFsrmCollection **results);
+void __RPC_STUB IFsrmDerivedObjectsResult_get_Results_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IFsrmDerivedObjectsResult_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IFsrmExportImport interface
+ */
+#ifndef __IFsrmExportImport_INTERFACE_DEFINED__
+#define __IFsrmExportImport_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IFsrmExportImport, 0xefcb0ab1, 0x16c4, 0x4a79, 0x81,0x2c, 0x72,0x56,0x14,0xc3,0x30,0x6b);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("efcb0ab1-16c4-4a79-812c-725614c3306b")
+IFsrmExportImport : public IDispatch
+{
+    virtual HRESULT STDMETHODCALLTYPE ExportFileGroups(
+        BSTR filePath,
+        VARIANT *fileGroupNamesSafeArray = 0,
+        BSTR remoteHost = L"") = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ImportFileGroups(
+        BSTR filePath,
+        VARIANT *fileGroupNamesSafeArray = 0,
+        BSTR remoteHost = L"",
+        IFsrmCommittableCollection **fileGroups) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ExportFileScreenTemplates(
+        BSTR filePath,
+        VARIANT *templateNamesSafeArray = 0,
+        BSTR remoteHost = L"") = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ImportFileScreenTemplates(
+        BSTR filePath,
+        VARIANT *templateNamesSafeArray = 0,
+        BSTR remoteHost = L"",
+        IFsrmCommittableCollection **templates) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ExportQuotaTemplates(
+        BSTR filePath,
+        VARIANT *templateNamesSafeArray = 0,
+        BSTR remoteHost = L"") = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ImportQuotaTemplates(
+        BSTR filePath,
+        VARIANT *templateNamesSafeArray = 0,
+        BSTR remoteHost = L"",
+        IFsrmCommittableCollection **templates) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IFsrmExportImport, 0xefcb0ab1, 0x16c4, 0x4a79, 0x81,0x2c, 0x72,0x56,0x14,0xc3,0x30,0x6b)
+#endif
+#else
+typedef struct IFsrmExportImportVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFsrmExportImport* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFsrmExportImport* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFsrmExportImport* This);
+
+    /*** IDispatch methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
+        IFsrmExportImport* This,
+        UINT *pctinfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
+        IFsrmExportImport* This,
+        UINT iTInfo,
+        LCID lcid,
+        ITypeInfo **ppTInfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
+        IFsrmExportImport* This,
+        REFIID riid,
+        LPOLESTR *rgszNames,
+        UINT cNames,
+        LCID lcid,
+        DISPID *rgDispId);
+
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        IFsrmExportImport* This,
+        DISPID dispIdMember,
+        REFIID riid,
+        LCID lcid,
+        WORD wFlags,
+        DISPPARAMS *pDispParams,
+        VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo,
+        UINT *puArgErr);
+
+    /*** IFsrmExportImport methods ***/
+    HRESULT (STDMETHODCALLTYPE *ExportFileGroups)(
+        IFsrmExportImport* This,
+        BSTR filePath,
+        VARIANT *fileGroupNamesSafeArray,
+        BSTR remoteHost);
+
+    HRESULT (STDMETHODCALLTYPE *ImportFileGroups)(
+        IFsrmExportImport* This,
+        BSTR filePath,
+        VARIANT *fileGroupNamesSafeArray,
+        BSTR remoteHost,
+        IFsrmCommittableCollection **fileGroups);
+
+    HRESULT (STDMETHODCALLTYPE *ExportFileScreenTemplates)(
+        IFsrmExportImport* This,
+        BSTR filePath,
+        VARIANT *templateNamesSafeArray,
+        BSTR remoteHost);
+
+    HRESULT (STDMETHODCALLTYPE *ImportFileScreenTemplates)(
+        IFsrmExportImport* This,
+        BSTR filePath,
+        VARIANT *templateNamesSafeArray,
+        BSTR remoteHost,
+        IFsrmCommittableCollection **templates);
+
+    HRESULT (STDMETHODCALLTYPE *ExportQuotaTemplates)(
+        IFsrmExportImport* This,
+        BSTR filePath,
+        VARIANT *templateNamesSafeArray,
+        BSTR remoteHost);
+
+    HRESULT (STDMETHODCALLTYPE *ImportQuotaTemplates)(
+        IFsrmExportImport* This,
+        BSTR filePath,
+        VARIANT *templateNamesSafeArray,
+        BSTR remoteHost,
+        IFsrmCommittableCollection **templates);
+
+    END_INTERFACE
+} IFsrmExportImportVtbl;
+interface IFsrmExportImport {
+    CONST_VTBL IFsrmExportImportVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IFsrmExportImport_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IFsrmExportImport_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IFsrmExportImport_Release(This) (This)->lpVtbl->Release(This)
+/*** IDispatch methods ***/
+#define IFsrmExportImport_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
+#define IFsrmExportImport_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
+#define IFsrmExportImport_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
+#define IFsrmExportImport_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
+/*** IFsrmExportImport methods ***/
+#define IFsrmExportImport_ExportFileGroups(This,filePath,fileGroupNamesSafeArray,remoteHost) (This)->lpVtbl->ExportFileGroups(This,filePath,fileGroupNamesSafeArray,remoteHost)
+#define IFsrmExportImport_ImportFileGroups(This,filePath,fileGroupNamesSafeArray,remoteHost,fileGroups) (This)->lpVtbl->ImportFileGroups(This,filePath,fileGroupNamesSafeArray,remoteHost,fileGroups)
+#define IFsrmExportImport_ExportFileScreenTemplates(This,filePath,templateNamesSafeArray,remoteHost) (This)->lpVtbl->ExportFileScreenTemplates(This,filePath,templateNamesSafeArray,remoteHost)
+#define IFsrmExportImport_ImportFileScreenTemplates(This,filePath,templateNamesSafeArray,remoteHost,templates) (This)->lpVtbl->ImportFileScreenTemplates(This,filePath,templateNamesSafeArray,remoteHost,templates)
+#define IFsrmExportImport_ExportQuotaTemplates(This,filePath,templateNamesSafeArray,remoteHost) (This)->lpVtbl->ExportQuotaTemplates(This,filePath,templateNamesSafeArray,remoteHost)
+#define IFsrmExportImport_ImportQuotaTemplates(This,filePath,templateNamesSafeArray,remoteHost,templates) (This)->lpVtbl->ImportQuotaTemplates(This,filePath,templateNamesSafeArray,remoteHost,templates)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IFsrmExportImport_QueryInterface(IFsrmExportImport* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmExportImport_AddRef(IFsrmExportImport* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmExportImport_Release(IFsrmExportImport* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmExportImport_GetTypeInfoCount(IFsrmExportImport* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmExportImport_GetTypeInfo(IFsrmExportImport* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE HRESULT IFsrmExportImport_GetIDsOfNames(IFsrmExportImport* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
+    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
+}
+static FORCEINLINE HRESULT IFsrmExportImport_Invoke(IFsrmExportImport* 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);
+}
+/*** IFsrmExportImport methods ***/
+static FORCEINLINE HRESULT IFsrmExportImport_ExportFileGroups(IFsrmExportImport* This,BSTR filePath,VARIANT *fileGroupNamesSafeArray,BSTR remoteHost) {
+    return This->lpVtbl->ExportFileGroups(This,filePath,fileGroupNamesSafeArray,remoteHost);
+}
+static FORCEINLINE HRESULT IFsrmExportImport_ImportFileGroups(IFsrmExportImport* This,BSTR filePath,VARIANT *fileGroupNamesSafeArray,BSTR remoteHost,IFsrmCommittableCollection **fileGroups) {
+    return This->lpVtbl->ImportFileGroups(This,filePath,fileGroupNamesSafeArray,remoteHost,fileGroups);
+}
+static FORCEINLINE HRESULT IFsrmExportImport_ExportFileScreenTemplates(IFsrmExportImport* This,BSTR filePath,VARIANT *templateNamesSafeArray,BSTR remoteHost) {
+    return This->lpVtbl->ExportFileScreenTemplates(This,filePath,templateNamesSafeArray,remoteHost);
+}
+static FORCEINLINE HRESULT IFsrmExportImport_ImportFileScreenTemplates(IFsrmExportImport* This,BSTR filePath,VARIANT *templateNamesSafeArray,BSTR remoteHost,IFsrmCommittableCollection **templates) {
+    return This->lpVtbl->ImportFileScreenTemplates(This,filePath,templateNamesSafeArray,remoteHost,templates);
+}
+static FORCEINLINE HRESULT IFsrmExportImport_ExportQuotaTemplates(IFsrmExportImport* This,BSTR filePath,VARIANT *templateNamesSafeArray,BSTR remoteHost) {
+    return This->lpVtbl->ExportQuotaTemplates(This,filePath,templateNamesSafeArray,remoteHost);
+}
+static FORCEINLINE HRESULT IFsrmExportImport_ImportQuotaTemplates(IFsrmExportImport* This,BSTR filePath,VARIANT *templateNamesSafeArray,BSTR remoteHost,IFsrmCommittableCollection **templates) {
+    return This->lpVtbl->ImportQuotaTemplates(This,filePath,templateNamesSafeArray,remoteHost,templates);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmExportImport_ExportFileGroups_Proxy(
+    IFsrmExportImport* This,
+    BSTR filePath,
+    VARIANT *fileGroupNamesSafeArray,
+    BSTR remoteHost);
+void __RPC_STUB IFsrmExportImport_ExportFileGroups_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmExportImport_ImportFileGroups_Proxy(
+    IFsrmExportImport* This,
+    BSTR filePath,
+    VARIANT *fileGroupNamesSafeArray,
+    BSTR remoteHost,
+    IFsrmCommittableCollection **fileGroups);
+void __RPC_STUB IFsrmExportImport_ImportFileGroups_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmExportImport_ExportFileScreenTemplates_Proxy(
+    IFsrmExportImport* This,
+    BSTR filePath,
+    VARIANT *templateNamesSafeArray,
+    BSTR remoteHost);
+void __RPC_STUB IFsrmExportImport_ExportFileScreenTemplates_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmExportImport_ImportFileScreenTemplates_Proxy(
+    IFsrmExportImport* This,
+    BSTR filePath,
+    VARIANT *templateNamesSafeArray,
+    BSTR remoteHost,
+    IFsrmCommittableCollection **templates);
+void __RPC_STUB IFsrmExportImport_ImportFileScreenTemplates_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmExportImport_ExportQuotaTemplates_Proxy(
+    IFsrmExportImport* This,
+    BSTR filePath,
+    VARIANT *templateNamesSafeArray,
+    BSTR remoteHost);
+void __RPC_STUB IFsrmExportImport_ExportQuotaTemplates_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmExportImport_ImportQuotaTemplates_Proxy(
+    IFsrmExportImport* This,
+    BSTR filePath,
+    VARIANT *templateNamesSafeArray,
+    BSTR remoteHost,
+    IFsrmCommittableCollection **templates);
+void __RPC_STUB IFsrmExportImport_ImportQuotaTemplates_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IFsrmExportImport_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IFsrmObject interface
+ */
+#ifndef __IFsrmObject_INTERFACE_DEFINED__
+#define __IFsrmObject_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IFsrmObject, 0x22bcef93, 0x4a3f, 0x4183, 0x89,0xf9, 0x2f,0x8b,0x8a,0x62,0x8a,0xee);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("22bcef93-4a3f-4183-89f9-2f8b8a628aee")
+IFsrmObject : public IDispatch
+{
+    virtual HRESULT STDMETHODCALLTYPE get_Id(
+        FSRM_OBJECT_ID *id) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_Description(
+        BSTR *description) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_Description(
+        BSTR description) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Delete(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Commit(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IFsrmObject, 0x22bcef93, 0x4a3f, 0x4183, 0x89,0xf9, 0x2f,0x8b,0x8a,0x62,0x8a,0xee)
+#endif
+#else
+typedef struct IFsrmObjectVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFsrmObject* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFsrmObject* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFsrmObject* This);
+
+    /*** IDispatch methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
+        IFsrmObject* This,
+        UINT *pctinfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
+        IFsrmObject* This,
+        UINT iTInfo,
+        LCID lcid,
+        ITypeInfo **ppTInfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
+        IFsrmObject* This,
+        REFIID riid,
+        LPOLESTR *rgszNames,
+        UINT cNames,
+        LCID lcid,
+        DISPID *rgDispId);
+
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        IFsrmObject* This,
+        DISPID dispIdMember,
+        REFIID riid,
+        LCID lcid,
+        WORD wFlags,
+        DISPPARAMS *pDispParams,
+        VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo,
+        UINT *puArgErr);
+
+    /*** IFsrmObject methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Id)(
+        IFsrmObject* This,
+        FSRM_OBJECT_ID *id);
+
+    HRESULT (STDMETHODCALLTYPE *get_Description)(
+        IFsrmObject* This,
+        BSTR *description);
+
+    HRESULT (STDMETHODCALLTYPE *put_Description)(
+        IFsrmObject* This,
+        BSTR description);
+
+    HRESULT (STDMETHODCALLTYPE *Delete)(
+        IFsrmObject* This);
+
+    HRESULT (STDMETHODCALLTYPE *Commit)(
+        IFsrmObject* This);
+
+    END_INTERFACE
+} IFsrmObjectVtbl;
+interface IFsrmObject {
+    CONST_VTBL IFsrmObjectVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IFsrmObject_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IFsrmObject_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IFsrmObject_Release(This) (This)->lpVtbl->Release(This)
+/*** IDispatch methods ***/
+#define IFsrmObject_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
+#define IFsrmObject_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
+#define IFsrmObject_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
+#define IFsrmObject_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 IFsrmObject_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
+#define IFsrmObject_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
+#define IFsrmObject_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
+#define IFsrmObject_Delete(This) (This)->lpVtbl->Delete(This)
+#define IFsrmObject_Commit(This) (This)->lpVtbl->Commit(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IFsrmObject_QueryInterface(IFsrmObject* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmObject_AddRef(IFsrmObject* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmObject_Release(IFsrmObject* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmObject_GetTypeInfoCount(IFsrmObject* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmObject_GetTypeInfo(IFsrmObject* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE HRESULT IFsrmObject_GetIDsOfNames(IFsrmObject* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
+    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
+}
+static FORCEINLINE HRESULT IFsrmObject_Invoke(IFsrmObject* 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 IFsrmObject_get_Id(IFsrmObject* This,FSRM_OBJECT_ID *id) {
+    return This->lpVtbl->get_Id(This,id);
+}
+static FORCEINLINE HRESULT IFsrmObject_get_Description(IFsrmObject* This,BSTR *description) {
+    return This->lpVtbl->get_Description(This,description);
+}
+static FORCEINLINE HRESULT IFsrmObject_put_Description(IFsrmObject* This,BSTR description) {
+    return This->lpVtbl->put_Description(This,description);
+}
+static FORCEINLINE HRESULT IFsrmObject_Delete(IFsrmObject* This) {
+    return This->lpVtbl->Delete(This);
+}
+static FORCEINLINE HRESULT IFsrmObject_Commit(IFsrmObject* This) {
+    return This->lpVtbl->Commit(This);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmObject_get_Id_Proxy(
+    IFsrmObject* This,
+    FSRM_OBJECT_ID *id);
+void __RPC_STUB IFsrmObject_get_Id_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmObject_get_Description_Proxy(
+    IFsrmObject* This,
+    BSTR *description);
+void __RPC_STUB IFsrmObject_get_Description_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmObject_put_Description_Proxy(
+    IFsrmObject* This,
+    BSTR description);
+void __RPC_STUB IFsrmObject_put_Description_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmObject_Delete_Proxy(
+    IFsrmObject* This);
+void __RPC_STUB IFsrmObject_Delete_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmObject_Commit_Proxy(
+    IFsrmObject* This);
+void __RPC_STUB IFsrmObject_Commit_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IFsrmObject_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IFsrmPathMapper interface
+ */
+#ifndef __IFsrmPathMapper_INTERFACE_DEFINED__
+#define __IFsrmPathMapper_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IFsrmPathMapper, 0x6f4dbfff, 0x6920, 0x4821, 0xa6,0xc3, 0xb7,0xe9,0x4c,0x1f,0xd6,0x0c);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("6f4dbfff-6920-4821-a6c3-b7e94c1fd60c")
+IFsrmPathMapper : public IDispatch
+{
+    virtual HRESULT STDMETHODCALLTYPE GetSharePathsForLocalPath(
+        BSTR localPath,
+        SAFEARRAY **sharePaths) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IFsrmPathMapper, 0x6f4dbfff, 0x6920, 0x4821, 0xa6,0xc3, 0xb7,0xe9,0x4c,0x1f,0xd6,0x0c)
+#endif
+#else
+typedef struct IFsrmPathMapperVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFsrmPathMapper* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFsrmPathMapper* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFsrmPathMapper* This);
+
+    /*** IDispatch methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
+        IFsrmPathMapper* This,
+        UINT *pctinfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
+        IFsrmPathMapper* This,
+        UINT iTInfo,
+        LCID lcid,
+        ITypeInfo **ppTInfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
+        IFsrmPathMapper* This,
+        REFIID riid,
+        LPOLESTR *rgszNames,
+        UINT cNames,
+        LCID lcid,
+        DISPID *rgDispId);
+
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        IFsrmPathMapper* This,
+        DISPID dispIdMember,
+        REFIID riid,
+        LCID lcid,
+        WORD wFlags,
+        DISPPARAMS *pDispParams,
+        VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo,
+        UINT *puArgErr);
+
+    /*** IFsrmPathMapper methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetSharePathsForLocalPath)(
+        IFsrmPathMapper* This,
+        BSTR localPath,
+        SAFEARRAY **sharePaths);
+
+    END_INTERFACE
+} IFsrmPathMapperVtbl;
+interface IFsrmPathMapper {
+    CONST_VTBL IFsrmPathMapperVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IFsrmPathMapper_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IFsrmPathMapper_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IFsrmPathMapper_Release(This) (This)->lpVtbl->Release(This)
+/*** IDispatch methods ***/
+#define IFsrmPathMapper_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
+#define IFsrmPathMapper_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
+#define IFsrmPathMapper_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
+#define IFsrmPathMapper_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
+/*** IFsrmPathMapper methods ***/
+#define IFsrmPathMapper_GetSharePathsForLocalPath(This,localPath,sharePaths) (This)->lpVtbl->GetSharePathsForLocalPath(This,localPath,sharePaths)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IFsrmPathMapper_QueryInterface(IFsrmPathMapper* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmPathMapper_AddRef(IFsrmPathMapper* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmPathMapper_Release(IFsrmPathMapper* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmPathMapper_GetTypeInfoCount(IFsrmPathMapper* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmPathMapper_GetTypeInfo(IFsrmPathMapper* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE HRESULT IFsrmPathMapper_GetIDsOfNames(IFsrmPathMapper* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
+    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
+}
+static FORCEINLINE HRESULT IFsrmPathMapper_Invoke(IFsrmPathMapper* 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);
+}
+/*** IFsrmPathMapper methods ***/
+static FORCEINLINE HRESULT IFsrmPathMapper_GetSharePathsForLocalPath(IFsrmPathMapper* This,BSTR localPath,SAFEARRAY **sharePaths) {
+    return This->lpVtbl->GetSharePathsForLocalPath(This,localPath,sharePaths);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmPathMapper_GetSharePathsForLocalPath_Proxy(
+    IFsrmPathMapper* This,
+    BSTR localPath,
+    SAFEARRAY **sharePaths);
+void __RPC_STUB IFsrmPathMapper_GetSharePathsForLocalPath_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IFsrmPathMapper_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IFsrmSetting interface
+ */
+#ifndef __IFsrmSetting_INTERFACE_DEFINED__
+#define __IFsrmSetting_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IFsrmSetting, 0xf411d4fd, 0x14be, 0x4260, 0x8c,0x40, 0x03,0xb7,0xc9,0x5e,0x60,0x8a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("f411d4fd-14be-4260-8c40-03b7c95e608a")
+IFsrmSetting : public IDispatch
+{
+    virtual HRESULT STDMETHODCALLTYPE get_SmtpServer(
+        BSTR *smtpServer) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_SmtpServer(
+        BSTR smtpServer) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_MailFrom(
+        BSTR *mailFrom) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_MailFrom(
+        BSTR mailFrom) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_AdminEmail(
+        BSTR *adminEmail) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_AdminEmail(
+        BSTR adminEmail) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_DisableCommandLine(
+        VARIANT_BOOL *disableCommandLine) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_DisableCommandLine(
+        VARIANT_BOOL disableCommandLine) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_EnableScreeningAudit(
+        VARIANT_BOOL *enableScreeningAudit) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_EnableScreeningAudit(
+        VARIANT_BOOL enableScreeningAudit) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EmailTest(
+        BSTR mailTo) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetActionRunLimitInterval(
+        FsrmActionType actionType,
+        LONG delayTimeMinutes) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetActionRunLimitInterval(
+        FsrmActionType actionType,
+        LONG *delayTimeMinutes) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IFsrmSetting, 0xf411d4fd, 0x14be, 0x4260, 0x8c,0x40, 0x03,0xb7,0xc9,0x5e,0x60,0x8a)
+#endif
+#else
+typedef struct IFsrmSettingVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFsrmSetting* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFsrmSetting* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFsrmSetting* This);
+
+    /*** IDispatch methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
+        IFsrmSetting* This,
+        UINT *pctinfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
+        IFsrmSetting* This,
+        UINT iTInfo,
+        LCID lcid,
+        ITypeInfo **ppTInfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
+        IFsrmSetting* This,
+        REFIID riid,
+        LPOLESTR *rgszNames,
+        UINT cNames,
+        LCID lcid,
+        DISPID *rgDispId);
+
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        IFsrmSetting* This,
+        DISPID dispIdMember,
+        REFIID riid,
+        LCID lcid,
+        WORD wFlags,
+        DISPPARAMS *pDispParams,
+        VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo,
+        UINT *puArgErr);
+
+    /*** IFsrmSetting methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_SmtpServer)(
+        IFsrmSetting* This,
+        BSTR *smtpServer);
+
+    HRESULT (STDMETHODCALLTYPE *put_SmtpServer)(
+        IFsrmSetting* This,
+        BSTR smtpServer);
+
+    HRESULT (STDMETHODCALLTYPE *get_MailFrom)(
+        IFsrmSetting* This,
+        BSTR *mailFrom);
+
+    HRESULT (STDMETHODCALLTYPE *put_MailFrom)(
+        IFsrmSetting* This,
+        BSTR mailFrom);
+
+    HRESULT (STDMETHODCALLTYPE *get_AdminEmail)(
+        IFsrmSetting* This,
+        BSTR *adminEmail);
+
+    HRESULT (STDMETHODCALLTYPE *put_AdminEmail)(
+        IFsrmSetting* This,
+        BSTR adminEmail);
+
+    HRESULT (STDMETHODCALLTYPE *get_DisableCommandLine)(
+        IFsrmSetting* This,
+        VARIANT_BOOL *disableCommandLine);
+
+    HRESULT (STDMETHODCALLTYPE *put_DisableCommandLine)(
+        IFsrmSetting* This,
+        VARIANT_BOOL disableCommandLine);
+
+    HRESULT (STDMETHODCALLTYPE *get_EnableScreeningAudit)(
+        IFsrmSetting* This,
+        VARIANT_BOOL *enableScreeningAudit);
+
+    HRESULT (STDMETHODCALLTYPE *put_EnableScreeningAudit)(
+        IFsrmSetting* This,
+        VARIANT_BOOL enableScreeningAudit);
+
+    HRESULT (STDMETHODCALLTYPE *EmailTest)(
+        IFsrmSetting* This,
+        BSTR mailTo);
+
+    HRESULT (STDMETHODCALLTYPE *SetActionRunLimitInterval)(
+        IFsrmSetting* This,
+        FsrmActionType actionType,
+        LONG delayTimeMinutes);
+
+    HRESULT (STDMETHODCALLTYPE *GetActionRunLimitInterval)(
+        IFsrmSetting* This,
+        FsrmActionType actionType,
+        LONG *delayTimeMinutes);
+
+    END_INTERFACE
+} IFsrmSettingVtbl;
+interface IFsrmSetting {
+    CONST_VTBL IFsrmSettingVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IFsrmSetting_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IFsrmSetting_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IFsrmSetting_Release(This) (This)->lpVtbl->Release(This)
+/*** IDispatch methods ***/
+#define IFsrmSetting_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
+#define IFsrmSetting_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
+#define IFsrmSetting_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
+#define IFsrmSetting_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
+/*** IFsrmSetting methods ***/
+#define IFsrmSetting_get_SmtpServer(This,smtpServer) (This)->lpVtbl->get_SmtpServer(This,smtpServer)
+#define IFsrmSetting_put_SmtpServer(This,smtpServer) (This)->lpVtbl->put_SmtpServer(This,smtpServer)
+#define IFsrmSetting_get_MailFrom(This,mailFrom) (This)->lpVtbl->get_MailFrom(This,mailFrom)
+#define IFsrmSetting_put_MailFrom(This,mailFrom) (This)->lpVtbl->put_MailFrom(This,mailFrom)
+#define IFsrmSetting_get_AdminEmail(This,adminEmail) (This)->lpVtbl->get_AdminEmail(This,adminEmail)
+#define IFsrmSetting_put_AdminEmail(This,adminEmail) (This)->lpVtbl->put_AdminEmail(This,adminEmail)
+#define IFsrmSetting_get_DisableCommandLine(This,disableCommandLine) (This)->lpVtbl->get_DisableCommandLine(This,disableCommandLine)
+#define IFsrmSetting_put_DisableCommandLine(This,disableCommandLine) (This)->lpVtbl->put_DisableCommandLine(This,disableCommandLine)
+#define IFsrmSetting_get_EnableScreeningAudit(This,enableScreeningAudit) (This)->lpVtbl->get_EnableScreeningAudit(This,enableScreeningAudit)
+#define IFsrmSetting_put_EnableScreeningAudit(This,enableScreeningAudit) (This)->lpVtbl->put_EnableScreeningAudit(This,enableScreeningAudit)
+#define IFsrmSetting_EmailTest(This,mailTo) (This)->lpVtbl->EmailTest(This,mailTo)
+#define IFsrmSetting_SetActionRunLimitInterval(This,actionType,delayTimeMinutes) (This)->lpVtbl->SetActionRunLimitInterval(This,actionType,delayTimeMinutes)
+#define IFsrmSetting_GetActionRunLimitInterval(This,actionType,delayTimeMinutes) (This)->lpVtbl->GetActionRunLimitInterval(This,actionType,delayTimeMinutes)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IFsrmSetting_QueryInterface(IFsrmSetting* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmSetting_AddRef(IFsrmSetting* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmSetting_Release(IFsrmSetting* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmSetting_GetTypeInfoCount(IFsrmSetting* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmSetting_GetTypeInfo(IFsrmSetting* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE HRESULT IFsrmSetting_GetIDsOfNames(IFsrmSetting* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
+    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
+}
+static FORCEINLINE HRESULT IFsrmSetting_Invoke(IFsrmSetting* 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);
+}
+/*** IFsrmSetting methods ***/
+static FORCEINLINE HRESULT IFsrmSetting_get_SmtpServer(IFsrmSetting* This,BSTR *smtpServer) {
+    return This->lpVtbl->get_SmtpServer(This,smtpServer);
+}
+static FORCEINLINE HRESULT IFsrmSetting_put_SmtpServer(IFsrmSetting* This,BSTR smtpServer) {
+    return This->lpVtbl->put_SmtpServer(This,smtpServer);
+}
+static FORCEINLINE HRESULT IFsrmSetting_get_MailFrom(IFsrmSetting* This,BSTR *mailFrom) {
+    return This->lpVtbl->get_MailFrom(This,mailFrom);
+}
+static FORCEINLINE HRESULT IFsrmSetting_put_MailFrom(IFsrmSetting* This,BSTR mailFrom) {
+    return This->lpVtbl->put_MailFrom(This,mailFrom);
+}
+static FORCEINLINE HRESULT IFsrmSetting_get_AdminEmail(IFsrmSetting* This,BSTR *adminEmail) {
+    return This->lpVtbl->get_AdminEmail(This,adminEmail);
+}
+static FORCEINLINE HRESULT IFsrmSetting_put_AdminEmail(IFsrmSetting* This,BSTR adminEmail) {
+    return This->lpVtbl->put_AdminEmail(This,adminEmail);
+}
+static FORCEINLINE HRESULT IFsrmSetting_get_DisableCommandLine(IFsrmSetting* This,VARIANT_BOOL *disableCommandLine) {
+    return This->lpVtbl->get_DisableCommandLine(This,disableCommandLine);
+}
+static FORCEINLINE HRESULT IFsrmSetting_put_DisableCommandLine(IFsrmSetting* This,VARIANT_BOOL disableCommandLine) {
+    return This->lpVtbl->put_DisableCommandLine(This,disableCommandLine);
+}
+static FORCEINLINE HRESULT IFsrmSetting_get_EnableScreeningAudit(IFsrmSetting* This,VARIANT_BOOL *enableScreeningAudit) {
+    return This->lpVtbl->get_EnableScreeningAudit(This,enableScreeningAudit);
+}
+static FORCEINLINE HRESULT IFsrmSetting_put_EnableScreeningAudit(IFsrmSetting* This,VARIANT_BOOL enableScreeningAudit) {
+    return This->lpVtbl->put_EnableScreeningAudit(This,enableScreeningAudit);
+}
+static FORCEINLINE HRESULT IFsrmSetting_EmailTest(IFsrmSetting* This,BSTR mailTo) {
+    return This->lpVtbl->EmailTest(This,mailTo);
+}
+static FORCEINLINE HRESULT IFsrmSetting_SetActionRunLimitInterval(IFsrmSetting* This,FsrmActionType actionType,LONG delayTimeMinutes) {
+    return This->lpVtbl->SetActionRunLimitInterval(This,actionType,delayTimeMinutes);
+}
+static FORCEINLINE HRESULT IFsrmSetting_GetActionRunLimitInterval(IFsrmSetting* This,FsrmActionType actionType,LONG *delayTimeMinutes) {
+    return This->lpVtbl->GetActionRunLimitInterval(This,actionType,delayTimeMinutes);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmSetting_get_SmtpServer_Proxy(
+    IFsrmSetting* This,
+    BSTR *smtpServer);
+void __RPC_STUB IFsrmSetting_get_SmtpServer_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmSetting_put_SmtpServer_Proxy(
+    IFsrmSetting* This,
+    BSTR smtpServer);
+void __RPC_STUB IFsrmSetting_put_SmtpServer_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmSetting_get_MailFrom_Proxy(
+    IFsrmSetting* This,
+    BSTR *mailFrom);
+void __RPC_STUB IFsrmSetting_get_MailFrom_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmSetting_put_MailFrom_Proxy(
+    IFsrmSetting* This,
+    BSTR mailFrom);
+void __RPC_STUB IFsrmSetting_put_MailFrom_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmSetting_get_AdminEmail_Proxy(
+    IFsrmSetting* This,
+    BSTR *adminEmail);
+void __RPC_STUB IFsrmSetting_get_AdminEmail_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmSetting_put_AdminEmail_Proxy(
+    IFsrmSetting* This,
+    BSTR adminEmail);
+void __RPC_STUB IFsrmSetting_put_AdminEmail_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmSetting_get_DisableCommandLine_Proxy(
+    IFsrmSetting* This,
+    VARIANT_BOOL *disableCommandLine);
+void __RPC_STUB IFsrmSetting_get_DisableCommandLine_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmSetting_put_DisableCommandLine_Proxy(
+    IFsrmSetting* This,
+    VARIANT_BOOL disableCommandLine);
+void __RPC_STUB IFsrmSetting_put_DisableCommandLine_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmSetting_get_EnableScreeningAudit_Proxy(
+    IFsrmSetting* This,
+    VARIANT_BOOL *enableScreeningAudit);
+void __RPC_STUB IFsrmSetting_get_EnableScreeningAudit_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmSetting_put_EnableScreeningAudit_Proxy(
+    IFsrmSetting* This,
+    VARIANT_BOOL enableScreeningAudit);
+void __RPC_STUB IFsrmSetting_put_EnableScreeningAudit_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmSetting_EmailTest_Proxy(
+    IFsrmSetting* This,
+    BSTR mailTo);
+void __RPC_STUB IFsrmSetting_EmailTest_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmSetting_SetActionRunLimitInterval_Proxy(
+    IFsrmSetting* This,
+    FsrmActionType actionType,
+    LONG delayTimeMinutes);
+void __RPC_STUB IFsrmSetting_SetActionRunLimitInterval_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmSetting_GetActionRunLimitInterval_Proxy(
+    IFsrmSetting* This,
+    FsrmActionType actionType,
+    LONG *delayTimeMinutes);
+void __RPC_STUB IFsrmSetting_GetActionRunLimitInterval_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IFsrmSetting_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IFsrmActionEmail interface
+ */
+#ifndef __IFsrmActionEmail_INTERFACE_DEFINED__
+#define __IFsrmActionEmail_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IFsrmActionEmail, 0xd646567d, 0x26ae, 0x4caa, 0x9f,0x84, 0x4e,0x0a,0xad,0x20,0x7f,0xca);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("d646567d-26ae-4caa-9f84-4e0aad207fca")
+IFsrmActionEmail : public IFsrmAction
+{
+    virtual HRESULT STDMETHODCALLTYPE get_MailFrom(
+        BSTR *mailFrom) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_MailFrom(
+        BSTR mailFrom) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_MailReplyTo(
+        BSTR *mailReplyTo) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_MailReplyTo(
+        BSTR mailReplyTo) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_MailTo(
+        BSTR *mailTo) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_MailTo(
+        BSTR mailTo) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_MailCc(
+        BSTR *mailCc) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_MailCc(
+        BSTR mailCc) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_MailBcc(
+        BSTR *mailBcc) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_MailBcc(
+        BSTR mailBcc) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_MailSubject(
+        BSTR *mailSubject) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_MailSubject(
+        BSTR mailSubject) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_MessageText(
+        BSTR *messageText) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_MessageText(
+        BSTR messageText) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IFsrmActionEmail, 0xd646567d, 0x26ae, 0x4caa, 0x9f,0x84, 0x4e,0x0a,0xad,0x20,0x7f,0xca)
+#endif
+#else
+typedef struct IFsrmActionEmailVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IFsrmActionEmail* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IFsrmActionEmail* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFsrmActionEmail* This);
+
+    /*** IDispatch methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
+        IFsrmActionEmail* This,
+        UINT *pctinfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
+        IFsrmActionEmail* This,
+        UINT iTInfo,
+        LCID lcid,
+        ITypeInfo **ppTInfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
+        IFsrmActionEmail* This,
+        REFIID riid,
+        LPOLESTR *rgszNames,
+        UINT cNames,
+        LCID lcid,
+        DISPID *rgDispId);
+
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        IFsrmActionEmail* This,
+        DISPID dispIdMember,
+        REFIID riid,
+        LCID lcid,
+        WORD wFlags,
+        DISPPARAMS *pDispParams,
+        VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo,
+        UINT *puArgErr);
+
+    /*** IFsrmAction methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Id)(
+        IFsrmActionEmail* This,
+        FSRM_OBJECT_ID *id);
+
+    HRESULT (STDMETHODCALLTYPE *get_ActionType)(
+        IFsrmActionEmail* This,
+        FsrmActionType *actionType);
+
+    HRESULT (STDMETHODCALLTYPE *get_RunLimitInterval)(
+        IFsrmActionEmail* This,
+        LONG *minutes);
+
+    HRESULT (STDMETHODCALLTYPE *put_RunLimitInterval)(
+        IFsrmActionEmail* This,
+        LONG minutes);
+
+    HRESULT (STDMETHODCALLTYPE *Delete)(
+        IFsrmActionEmail* This);
+
+    /*** IFsrmActionEmail methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_MailFrom)(
+        IFsrmActionEmail* This,
+        BSTR *mailFrom);
+
+    HRESULT (STDMETHODCALLTYPE *put_MailFrom)(
+        IFsrmActionEmail* This,
+        BSTR mailFrom);
+
+    HRESULT (STDMETHODCALLTYPE *get_MailReplyTo)(
+        IFsrmActionEmail* This,
+        BSTR *mailReplyTo);
+
+    HRESULT (STDMETHODCALLTYPE *put_MailReplyTo)(
+        IFsrmActionEmail* This,
+        BSTR mailReplyTo);
+
+    HRESULT (STDMETHODCALLTYPE *get_MailTo)(
+        IFsrmActionEmail* This,
+        BSTR *mailTo);
+
+    HRESULT (STDMETHODCALLTYPE *put_MailTo)(
+        IFsrmActionEmail* This,
+        BSTR mailTo);
+
+    HRESULT (STDMETHODCALLTYPE *get_MailCc)(
+        IFsrmActionEmail* This,
+        BSTR *mailCc);
+
+    HRESULT (STDMETHODCALLTYPE *put_MailCc)(
+        IFsrmActionEmail* This,
+        BSTR mailCc);
+
+    HRESULT (STDMETHODCALLTYPE *get_MailBcc)(
+        IFsrmActionEmail* This,
+        BSTR *mailBcc);
+
+    HRESULT (STDMETHODCALLTYPE *put_MailBcc)(
+        IFsrmActionEmail* This,
+        BSTR mailBcc);
+
+    HRESULT (STDMETHODCALLTYPE *get_MailSubject)(
+        IFsrmActionEmail* This,
+        BSTR *mailSubject);
+
+    HRESULT (STDMETHODCALLTYPE *put_MailSubject)(
+        IFsrmActionEmail* This,
+        BSTR mailSubject);
+
+    HRESULT (STDMETHODCALLTYPE *get_MessageText)(
+        IFsrmActionEmail* This,
+        BSTR *messageText);
+
+    HRESULT (STDMETHODCALLTYPE *put_MessageText)(
+        IFsrmActionEmail* This,
+        BSTR messageText);
+
+    END_INTERFACE
+} IFsrmActionEmailVtbl;
+interface IFsrmActionEmail {
+    CONST_VTBL IFsrmActionEmailVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
 #define IFsrmActionEmail_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
 #define IFsrmActionEmail_AddRef(This) (This)->lpVtbl->AddRef(This)
 #define IFsrmActionEmail_Release(This) (This)->lpVtbl->Release(This)
+/*** IDispatch methods ***/
 #define IFsrmActionEmail_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
 #define IFsrmActionEmail_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
 #define IFsrmActionEmail_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
 #define IFsrmActionEmail_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
+/*** IFsrmAction methods ***/
 #define IFsrmActionEmail_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
 #define IFsrmActionEmail_get_ActionType(This,actionType) (This)->lpVtbl->get_ActionType(This,actionType)
-#define IFsrmActionEmail_put_RunLimitInterval(This,minutes) (This)->lpVtbl->put_RunLimitInterval(This,minutes)
 #define IFsrmActionEmail_get_RunLimitInterval(This,minutes) (This)->lpVtbl->get_RunLimitInterval(This,minutes)
-#define IFsrmActionEmail_Delete() (This)->lpVtbl->Delete(This)
+#define IFsrmActionEmail_put_RunLimitInterval(This,minutes) (This)->lpVtbl->put_RunLimitInterval(This,minutes)
+#define IFsrmActionEmail_Delete(This) (This)->lpVtbl->Delete(This)
+/*** IFsrmActionEmail methods ***/
 #define IFsrmActionEmail_get_MailFrom(This,mailFrom) (This)->lpVtbl->get_MailFrom(This,mailFrom)
 #define IFsrmActionEmail_put_MailFrom(This,mailFrom) (This)->lpVtbl->put_MailFrom(This,mailFrom)
 #define IFsrmActionEmail_get_MailReplyTo(This,mailReplyTo) (This)->lpVtbl->get_MailReplyTo(This,mailReplyTo)
@@ -488,72 +3293,386 @@
 #define IFsrmActionEmail_put_MailSubject(This,mailSubject) (This)->lpVtbl->put_MailSubject(This,mailSubject)
 #define IFsrmActionEmail_get_MessageText(This,messageText) (This)->lpVtbl->get_MessageText(This,messageText)
 #define IFsrmActionEmail_put_MessageText(This,messageText) (This)->lpVtbl->put_MessageText(This,messageText)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmActionEmail2
-#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 IFsrmActionEmail_QueryInterface(IFsrmActionEmail* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmActionEmail_AddRef(IFsrmActionEmail* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmActionEmail_Release(IFsrmActionEmail* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmActionEmail_GetTypeInfoCount(IFsrmActionEmail* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail_GetTypeInfo(IFsrmActionEmail* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail_GetIDsOfNames(IFsrmActionEmail* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
+    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail_Invoke(IFsrmActionEmail* 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);
+}
+/*** IFsrmAction methods ***/
+static FORCEINLINE HRESULT IFsrmActionEmail_get_Id(IFsrmActionEmail* This,FSRM_OBJECT_ID *id) {
+    return This->lpVtbl->get_Id(This,id);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail_get_ActionType(IFsrmActionEmail* This,FsrmActionType *actionType) {
+    return This->lpVtbl->get_ActionType(This,actionType);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail_get_RunLimitInterval(IFsrmActionEmail* This,LONG *minutes) {
+    return This->lpVtbl->get_RunLimitInterval(This,minutes);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail_put_RunLimitInterval(IFsrmActionEmail* This,LONG minutes) {
+    return This->lpVtbl->put_RunLimitInterval(This,minutes);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail_Delete(IFsrmActionEmail* This) {
+    return This->lpVtbl->Delete(This);
+}
+/*** IFsrmActionEmail methods ***/
+static FORCEINLINE HRESULT IFsrmActionEmail_get_MailFrom(IFsrmActionEmail* This,BSTR *mailFrom) {
+    return This->lpVtbl->get_MailFrom(This,mailFrom);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail_put_MailFrom(IFsrmActionEmail* This,BSTR mailFrom) {
+    return This->lpVtbl->put_MailFrom(This,mailFrom);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail_get_MailReplyTo(IFsrmActionEmail* This,BSTR *mailReplyTo) {
+    return This->lpVtbl->get_MailReplyTo(This,mailReplyTo);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail_put_MailReplyTo(IFsrmActionEmail* This,BSTR mailReplyTo) {
+    return This->lpVtbl->put_MailReplyTo(This,mailReplyTo);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail_get_MailTo(IFsrmActionEmail* This,BSTR *mailTo) {
+    return This->lpVtbl->get_MailTo(This,mailTo);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail_put_MailTo(IFsrmActionEmail* This,BSTR mailTo) {
+    return This->lpVtbl->put_MailTo(This,mailTo);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail_get_MailCc(IFsrmActionEmail* This,BSTR *mailCc) {
+    return This->lpVtbl->get_MailCc(This,mailCc);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail_put_MailCc(IFsrmActionEmail* This,BSTR mailCc) {
+    return This->lpVtbl->put_MailCc(This,mailCc);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail_get_MailBcc(IFsrmActionEmail* This,BSTR *mailBcc) {
+    return This->lpVtbl->get_MailBcc(This,mailBcc);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail_put_MailBcc(IFsrmActionEmail* This,BSTR mailBcc) {
+    return This->lpVtbl->put_MailBcc(This,mailBcc);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail_get_MailSubject(IFsrmActionEmail* This,BSTR *mailSubject) {
+    return This->lpVtbl->get_MailSubject(This,mailSubject);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail_put_MailSubject(IFsrmActionEmail* This,BSTR mailSubject) {
+    return This->lpVtbl->put_MailSubject(This,mailSubject);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail_get_MessageText(IFsrmActionEmail* This,BSTR *messageText) {
+    return This->lpVtbl->get_MessageText(This,messageText);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail_put_MessageText(IFsrmActionEmail* This,BSTR messageText) {
+    return This->lpVtbl->put_MessageText(This,messageText);
+}
 #endif
-DECLARE_INTERFACE_(IFsrmActionEmail2,IFsrmActionEmail)
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmActionEmail_get_MailFrom_Proxy(
+    IFsrmActionEmail* This,
+    BSTR *mailFrom);
+void __RPC_STUB IFsrmActionEmail_get_MailFrom_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmActionEmail_put_MailFrom_Proxy(
+    IFsrmActionEmail* This,
+    BSTR mailFrom);
+void __RPC_STUB IFsrmActionEmail_put_MailFrom_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmActionEmail_get_MailReplyTo_Proxy(
+    IFsrmActionEmail* This,
+    BSTR *mailReplyTo);
+void __RPC_STUB IFsrmActionEmail_get_MailReplyTo_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmActionEmail_put_MailReplyTo_Proxy(
+    IFsrmActionEmail* This,
+    BSTR mailReplyTo);
+void __RPC_STUB IFsrmActionEmail_put_MailReplyTo_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmActionEmail_get_MailTo_Proxy(
+    IFsrmActionEmail* This,
+    BSTR *mailTo);
+void __RPC_STUB IFsrmActionEmail_get_MailTo_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmActionEmail_put_MailTo_Proxy(
+    IFsrmActionEmail* This,
+    BSTR mailTo);
+void __RPC_STUB IFsrmActionEmail_put_MailTo_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmActionEmail_get_MailCc_Proxy(
+    IFsrmActionEmail* This,
+    BSTR *mailCc);
+void __RPC_STUB IFsrmActionEmail_get_MailCc_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmActionEmail_put_MailCc_Proxy(
+    IFsrmActionEmail* This,
+    BSTR mailCc);
+void __RPC_STUB IFsrmActionEmail_put_MailCc_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmActionEmail_get_MailBcc_Proxy(
+    IFsrmActionEmail* This,
+    BSTR *mailBcc);
+void __RPC_STUB IFsrmActionEmail_get_MailBcc_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmActionEmail_put_MailBcc_Proxy(
+    IFsrmActionEmail* This,
+    BSTR mailBcc);
+void __RPC_STUB IFsrmActionEmail_put_MailBcc_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmActionEmail_get_MailSubject_Proxy(
+    IFsrmActionEmail* This,
+    BSTR *mailSubject);
+void __RPC_STUB IFsrmActionEmail_get_MailSubject_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmActionEmail_put_MailSubject_Proxy(
+    IFsrmActionEmail* This,
+    BSTR mailSubject);
+void __RPC_STUB IFsrmActionEmail_put_MailSubject_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmActionEmail_get_MessageText_Proxy(
+    IFsrmActionEmail* This,
+    BSTR *messageText);
+void __RPC_STUB IFsrmActionEmail_get_MessageText_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmActionEmail_put_MessageText_Proxy(
+    IFsrmActionEmail* This,
+    BSTR messageText);
+void __RPC_STUB IFsrmActionEmail_put_MessageText_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IFsrmActionEmail_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IFsrmActionEmail2 interface
+ */
+#ifndef __IFsrmActionEmail2_INTERFACE_DEFINED__
+#define __IFsrmActionEmail2_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IFsrmActionEmail2, 0x8276702f, 0x2532, 0x4839, 0x89,0xbf, 0x48,0x72,0x60,0x9a,0x2e,0xa4);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("8276702f-2532-4839-89bf-4872609a2ea4")
+IFsrmActionEmail2 : public IFsrmActionEmail
 {
+    virtual HRESULT STDMETHODCALLTYPE get_AttachmentFileListSize(
+        LONG *attachmentFileListSize) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_AttachmentFileListSize(
+        LONG attachmentFileListSize) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IFsrmActionEmail2, 0x8276702f, 0x2532, 0x4839, 0x89,0xbf, 0x48,0x72,0x60,0x9a,0x2e,0xa4)
+#endif
+#else
+typedef struct IFsrmActionEmail2Vtbl {
     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)(
+        IFsrmActionEmail2* 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)(
+        IFsrmActionEmail2* This);
 
-    /* IFsrmAction methods */
-    STDMETHOD_(HRESULT,get_Id)(THIS_ FSRM_OBJECT_ID *id) PURE;
-    STDMETHOD_(HRESULT,get_ActionType)(THIS_ FsrmActionType *actionType) PURE;
-    STDMETHOD_(HRESULT,put_RunLimitInterval)(THIS_ __LONG32 minutes) PURE;
-    STDMETHOD_(HRESULT,get_RunLimitInterval)(THIS_ __LONG32 *minutes) PURE;
-    STDMETHOD_(HRESULT,Delete)(THIS) PURE;
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFsrmActionEmail2* This);
 
-    /* IFsrmActionEmail methods */
-    STDMETHOD_(HRESULT,get_MailFrom)(THIS_ BSTR *mailFrom) PURE;
-    STDMETHOD_(HRESULT,put_MailFrom)(THIS_ BSTR mailFrom) PURE;
-    STDMETHOD_(HRESULT,get_MailReplyTo)(THIS_ BSTR *mailReplyTo) PURE;
-    STDMETHOD_(HRESULT,put_MailReplyTo)(THIS_ BSTR mailReplyTo) PURE;
-    STDMETHOD_(HRESULT,get_MailTo)(THIS_ BSTR *mailTo) PURE;
-    STDMETHOD_(HRESULT,put_MailTo)(THIS_ BSTR mailTo) PURE;
-    STDMETHOD_(HRESULT,get_MailCc)(THIS_ BSTR *mailCc) PURE;
-    STDMETHOD_(HRESULT,put_MailCc)(THIS_ BSTR mailCc) PURE;
-    STDMETHOD_(HRESULT,get_MailBcc)(THIS_ BSTR *mailBcc) PURE;
-    STDMETHOD_(HRESULT,put_MailBcc)(THIS_ BSTR mailBcc) PURE;
-    STDMETHOD_(HRESULT,get_MailSubject)(THIS_ BSTR *mailSubject) PURE;
-    STDMETHOD_(HRESULT,put_MailSubject)(THIS_ BSTR mailSubject) PURE;
-    STDMETHOD_(HRESULT,get_MessageText)(THIS_ BSTR *messageText) PURE;
-    STDMETHOD_(HRESULT,put_MessageText)(THIS_ BSTR messageText) PURE;
+    /*** IDispatch methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
+        IFsrmActionEmail2* This,
+        UINT *pctinfo);
 
-    /* IFsrmActionEmail2 methods */
-    STDMETHOD_(HRESULT,get_AttachmentFileListSize)(THIS_ __LONG32 *pAttachmentFileListSize) PURE;
-    STDMETHOD_(HRESULT,put_AttachmentFileListSize)(THIS_ __LONG32 attachmentFileListSize) PURE;
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
+        IFsrmActionEmail2* This,
+        UINT iTInfo,
+        LCID lcid,
+        ITypeInfo **ppTInfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
+        IFsrmActionEmail2* This,
+        REFIID riid,
+        LPOLESTR *rgszNames,
+        UINT cNames,
+        LCID lcid,
+        DISPID *rgDispId);
+
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        IFsrmActionEmail2* This,
+        DISPID dispIdMember,
+        REFIID riid,
+        LCID lcid,
+        WORD wFlags,
+        DISPPARAMS *pDispParams,
+        VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo,
+        UINT *puArgErr);
+
+    /*** IFsrmAction methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_Id)(
+        IFsrmActionEmail2* This,
+        FSRM_OBJECT_ID *id);
+
+    HRESULT (STDMETHODCALLTYPE *get_ActionType)(
+        IFsrmActionEmail2* This,
+        FsrmActionType *actionType);
+
+    HRESULT (STDMETHODCALLTYPE *get_RunLimitInterval)(
+        IFsrmActionEmail2* This,
+        LONG *minutes);
+
+    HRESULT (STDMETHODCALLTYPE *put_RunLimitInterval)(
+        IFsrmActionEmail2* This,
+        LONG minutes);
+
+    HRESULT (STDMETHODCALLTYPE *Delete)(
+        IFsrmActionEmail2* This);
+
+    /*** IFsrmActionEmail methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_MailFrom)(
+        IFsrmActionEmail2* This,
+        BSTR *mailFrom);
+
+    HRESULT (STDMETHODCALLTYPE *put_MailFrom)(
+        IFsrmActionEmail2* This,
+        BSTR mailFrom);
+
+    HRESULT (STDMETHODCALLTYPE *get_MailReplyTo)(
+        IFsrmActionEmail2* This,
+        BSTR *mailReplyTo);
+
+    HRESULT (STDMETHODCALLTYPE *put_MailReplyTo)(
+        IFsrmActionEmail2* This,
+        BSTR mailReplyTo);
+
+    HRESULT (STDMETHODCALLTYPE *get_MailTo)(
+        IFsrmActionEmail2* This,
+        BSTR *mailTo);
+
+    HRESULT (STDMETHODCALLTYPE *put_MailTo)(
+        IFsrmActionEmail2* This,
+        BSTR mailTo);
+
+    HRESULT (STDMETHODCALLTYPE *get_MailCc)(
+        IFsrmActionEmail2* This,
+        BSTR *mailCc);
+
+    HRESULT (STDMETHODCALLTYPE *put_MailCc)(
+        IFsrmActionEmail2* This,
+        BSTR mailCc);
+
+    HRESULT (STDMETHODCALLTYPE *get_MailBcc)(
+        IFsrmActionEmail2* This,
+        BSTR *mailBcc);
+
+    HRESULT (STDMETHODCALLTYPE *put_MailBcc)(
+        IFsrmActionEmail2* This,
+        BSTR mailBcc);
+
+    HRESULT (STDMETHODCALLTYPE *get_MailSubject)(
+        IFsrmActionEmail2* This,
+        BSTR *mailSubject);
+
+    HRESULT (STDMETHODCALLTYPE *put_MailSubject)(
+        IFsrmActionEmail2* This,
+        BSTR mailSubject);
+
+    HRESULT (STDMETHODCALLTYPE *get_MessageText)(
+        IFsrmActionEmail2* This,
+        BSTR *messageText);
+
+    HRESULT (STDMETHODCALLTYPE *put_MessageText)(
+        IFsrmActionEmail2* This,
+        BSTR messageText);
+
+    /*** IFsrmActionEmail2 methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_AttachmentFileListSize)(
+        IFsrmActionEmail2* This,
+        LONG *attachmentFileListSize);
+
+    HRESULT (STDMETHODCALLTYPE *put_AttachmentFileListSize)(
+        IFsrmActionEmail2* This,
+        LONG attachmentFileListSize);
 
     END_INTERFACE
+} IFsrmActionEmail2Vtbl;
+interface IFsrmActionEmail2 {
+    CONST_VTBL IFsrmActionEmail2Vtbl* lpVtbl;
 };
+
 #ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
 #define IFsrmActionEmail2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
 #define IFsrmActionEmail2_AddRef(This) (This)->lpVtbl->AddRef(This)
 #define IFsrmActionEmail2_Release(This) (This)->lpVtbl->Release(This)
+/*** IDispatch methods ***/
 #define IFsrmActionEmail2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
 #define IFsrmActionEmail2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
 #define IFsrmActionEmail2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
 #define IFsrmActionEmail2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
+/*** IFsrmAction methods ***/
 #define IFsrmActionEmail2_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
 #define IFsrmActionEmail2_get_ActionType(This,actionType) (This)->lpVtbl->get_ActionType(This,actionType)
-#define IFsrmActionEmail2_put_RunLimitInterval(This,minutes) (This)->lpVtbl->put_RunLimitInterval(This,minutes)
 #define IFsrmActionEmail2_get_RunLimitInterval(This,minutes) (This)->lpVtbl->get_RunLimitInterval(This,minutes)
-#define IFsrmActionEmail2_Delete() (This)->lpVtbl->Delete(This)
+#define IFsrmActionEmail2_put_RunLimitInterval(This,minutes) (This)->lpVtbl->put_RunLimitInterval(This,minutes)
+#define IFsrmActionEmail2_Delete(This) (This)->lpVtbl->Delete(This)
+/*** IFsrmActionEmail methods ***/
 #define IFsrmActionEmail2_get_MailFrom(This,mailFrom) (This)->lpVtbl->get_MailFrom(This,mailFrom)
 #define IFsrmActionEmail2_put_MailFrom(This,mailFrom) (This)->lpVtbl->put_MailFrom(This,mailFrom)
 #define IFsrmActionEmail2_get_MailReplyTo(This,mailReplyTo) (This)->lpVtbl->get_MailReplyTo(This,mailReplyTo)
@@ -568,1638 +3687,389 @@
 #define IFsrmActionEmail2_put_MailSubject(This,mailSubject) (This)->lpVtbl->put_MailSubject(This,mailSubject)
 #define IFsrmActionEmail2_get_MessageText(This,messageText) (This)->lpVtbl->get_MessageText(This,messageText)
 #define IFsrmActionEmail2_put_MessageText(This,messageText) (This)->lpVtbl->put_MessageText(This,messageText)
-#define IFsrmActionEmail2_get_AttachmentFileListSize(This,pAttachmentFileListSize) (This)->lpVtbl->get_AttachmentFileListSize(This,pAttachmentFileListSize)
+/*** IFsrmActionEmail2 methods ***/
+#define IFsrmActionEmail2_get_AttachmentFileListSize(This,attachmentFileListSize) (This)->lpVtbl->get_AttachmentFileListSize(This,attachmentFileListSize)
 #define IFsrmActionEmail2_put_AttachmentFileListSize(This,attachmentFileListSize) (This)->lpVtbl->put_AttachmentFileListSize(This,attachmentFileListSize)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmActionEventLog
-#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 IFsrmActionEmail2_QueryInterface(IFsrmActionEmail2* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmActionEmail2_AddRef(IFsrmActionEmail2* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmActionEmail2_Release(IFsrmActionEmail2* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmActionEmail2_GetTypeInfoCount(IFsrmActionEmail2* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail2_GetTypeInfo(IFsrmActionEmail2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail2_GetIDsOfNames(IFsrmActionEmail2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
+    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail2_Invoke(IFsrmActionEmail2* 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);
+}
+/*** IFsrmAction methods ***/
+static FORCEINLINE HRESULT IFsrmActionEmail2_get_Id(IFsrmActionEmail2* This,FSRM_OBJECT_ID *id) {
+    return This->lpVtbl->get_Id(This,id);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail2_get_ActionType(IFsrmActionEmail2* This,FsrmActionType *actionType) {
+    return This->lpVtbl->get_ActionType(This,actionType);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail2_get_RunLimitInterval(IFsrmActionEmail2* This,LONG *minutes) {
+    return This->lpVtbl->get_RunLimitInterval(This,minutes);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail2_put_RunLimitInterval(IFsrmActionEmail2* This,LONG minutes) {
+    return This->lpVtbl->put_RunLimitInterval(This,minutes);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail2_Delete(IFsrmActionEmail2* This) {
+    return This->lpVtbl->Delete(This);
+}
+/*** IFsrmActionEmail methods ***/
+static FORCEINLINE HRESULT IFsrmActionEmail2_get_MailFrom(IFsrmActionEmail2* This,BSTR *mailFrom) {
+    return This->lpVtbl->get_MailFrom(This,mailFrom);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail2_put_MailFrom(IFsrmActionEmail2* This,BSTR mailFrom) {
+    return This->lpVtbl->put_MailFrom(This,mailFrom);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail2_get_MailReplyTo(IFsrmActionEmail2* This,BSTR *mailReplyTo) {
+    return This->lpVtbl->get_MailReplyTo(This,mailReplyTo);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail2_put_MailReplyTo(IFsrmActionEmail2* This,BSTR mailReplyTo) {
+    return This->lpVtbl->put_MailReplyTo(This,mailReplyTo);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail2_get_MailTo(IFsrmActionEmail2* This,BSTR *mailTo) {
+    return This->lpVtbl->get_MailTo(This,mailTo);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail2_put_MailTo(IFsrmActionEmail2* This,BSTR mailTo) {
+    return This->lpVtbl->put_MailTo(This,mailTo);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail2_get_MailCc(IFsrmActionEmail2* This,BSTR *mailCc) {
+    return This->lpVtbl->get_MailCc(This,mailCc);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail2_put_MailCc(IFsrmActionEmail2* This,BSTR mailCc) {
+    return This->lpVtbl->put_MailCc(This,mailCc);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail2_get_MailBcc(IFsrmActionEmail2* This,BSTR *mailBcc) {
+    return This->lpVtbl->get_MailBcc(This,mailBcc);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail2_put_MailBcc(IFsrmActionEmail2* This,BSTR mailBcc) {
+    return This->lpVtbl->put_MailBcc(This,mailBcc);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail2_get_MailSubject(IFsrmActionEmail2* This,BSTR *mailSubject) {
+    return This->lpVtbl->get_MailSubject(This,mailSubject);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail2_put_MailSubject(IFsrmActionEmail2* This,BSTR mailSubject) {
+    return This->lpVtbl->put_MailSubject(This,mailSubject);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail2_get_MessageText(IFsrmActionEmail2* This,BSTR *messageText) {
+    return This->lpVtbl->get_MessageText(This,messageText);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail2_put_MessageText(IFsrmActionEmail2* This,BSTR messageText) {
+    return This->lpVtbl->put_MessageText(This,messageText);
+}
+/*** IFsrmActionEmail2 methods ***/
+static FORCEINLINE HRESULT IFsrmActionEmail2_get_AttachmentFileListSize(IFsrmActionEmail2* This,LONG *attachmentFileListSize) {
+    return This->lpVtbl->get_AttachmentFileListSize(This,attachmentFileListSize);
+}
+static FORCEINLINE HRESULT IFsrmActionEmail2_put_AttachmentFileListSize(IFsrmActionEmail2* This,LONG attachmentFileListSize) {
+    return This->lpVtbl->put_AttachmentFileListSize(This,attachmentFileListSize);
+}
 #endif
-DECLARE_INTERFACE_(IFsrmActionEventLog,IFsrmAction)
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IFsrmActionEmail2_get_AttachmentFileListSize_Proxy(
+    IFsrmActionEmail2* This,
+    LONG *attachmentFileListSize);
+void __RPC_STUB IFsrmActionEmail2_get_AttachmentFileListSize_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmActionEmail2_put_AttachmentFileListSize_Proxy(
+    IFsrmActionEmail2* This,
+    LONG attachmentFileListSize);
+void __RPC_STUB IFsrmActionEmail2_put_AttachmentFileListSize_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IFsrmActionEmail2_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IFsrmMutableCollection interface
+ */
+#ifndef __IFsrmMutableCollection_INTERFACE_DEFINED__
+#define __IFsrmMutableCollection_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IFsrmMutableCollection, 0x1bb617b8, 0x3886, 0x49dc, 0xaf,0x82, 0xa6,0xc9,0x0f,0xa3,0x5d,0xda);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("1bb617b8-3886-49dc-af82-a6c90fa35dda")
+IFsrmMutableCollection : public IFsrmCollection
 {
+    virtual HRESULT STDMETHODCALLTYPE Add(
+        VARIANT item) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Remove(
+        LONG index) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RemoveById(
+        FSRM_OBJECT_ID id) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Clone(
+        IFsrmMutableCollection **collection) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IFsrmMutableCollection, 0x1bb617b8, 0x3886, 0x49dc, 0xaf,0x82, 0xa6,0xc9,0x0f,0xa3,0x5d,0xda)
+#endif
+#else
+typedef struct IFsrmMutableCollectionVtbl {
     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)(
+        IFsrmMutableCollection* 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)(
+        IFsrmMutableCollection* This);
 
-    /* IFsrmAction methods */
-    STDMETHOD_(HRESULT,get_Id)(THIS_ FSRM_OBJECT_ID *id) PURE;
-    STDMETHOD_(HRESULT,get_ActionType)(THIS_ FsrmActionType *actionType) PURE;
-    STDMETHOD_(HRESULT,put_RunLimitInterval)(THIS_ __LONG32 minutes) PURE;
-    STDMETHOD_(HRESULT,get_RunLimitInterval)(THIS_ __LONG32 *minutes) PURE;
-    STDMETHOD_(HRESULT,Delete)(THIS) PURE;
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IFsrmMutableCollection* This);
 
-    /* IFsrmActionEventLog methods */
-    STDMETHOD_(HRESULT,get_EventType)(THIS_ FsrmEventType *eventType) PURE;
-    STDMETHOD_(HRESULT,put_EventType)(THIS_ FsrmEventType eventType) PURE;
-    STDMETHOD_(HRESULT,get_MessageText)(THIS_ BSTR *messageText) PURE;
-    STDMETHOD_(HRESULT,put_MessageText)(THIS_ BSTR messageText) PURE;
+    /*** IDispatch methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
+        IFsrmMutableCollection* This,
+        UINT *pctinfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
+        IFsrmMutableCollection* This,
+        UINT iTInfo,
+        LCID lcid,
+        ITypeInfo **ppTInfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
+        IFsrmMutableCollection* This,
+        REFIID riid,
+        LPOLESTR *rgszNames,
+        UINT cNames,
+        LCID lcid,
+        DISPID *rgDispId);
+
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        IFsrmMutableCollection* This,
+        DISPID dispIdMember,
+        REFIID riid,
+        LCID lcid,
+        WORD wFlags,
+        DISPPARAMS *pDispParams,
+        VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo,
+        UINT *puArgErr);
+
+    /*** IFsrmCollection methods ***/
+    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
+        IFsrmMutableCollection* This,
+        IUnknown **unknown);
+
+    HRESULT (STDMETHODCALLTYPE *get_Item)(
+        IFsrmMutableCollection* This,
+        LONG index,
+        VARIANT *item);
+
+    HRESULT (STDMETHODCALLTYPE *get_Count)(
+        IFsrmMutableCollection* This,
+        LONG *count);
+
+    HRESULT (STDMETHODCALLTYPE *get_State)(
+        IFsrmMutableCollection* This,
+        FsrmCollectionState *state);
+
+    HRESULT (STDMETHODCALLTYPE *Cancel)(
+        IFsrmMutableCollection* This);
+
+    HRESULT (STDMETHODCALLTYPE *WaitForCompletion)(
+        IFsrmMutableCollection* This,
+        LONG waitSeconds,
+        VARIANT_BOOL *completed);
+
+    HRESULT (STDMETHODCALLTYPE *GetById)(
+        IFsrmMutableCollection* This,
+        FSRM_OBJECT_ID id,
+        VARIANT *entry);
+
+    /*** IFsrmMutableCollection methods ***/
+    HRESULT (STDMETHODCALLTYPE *Add)(
+        IFsrmMutableCollection* This,
+        VARIANT item);
+
+    HRESULT (STDMETHODCALLTYPE *Remove)(
+        IFsrmMutableCollection* This,
+        LONG index);
+
+    HRESULT (STDMETHODCALLTYPE *RemoveById)(
+        IFsrmMutableCollection* This,
+        FSRM_OBJECT_ID id);
+
+    HRESULT (STDMETHODCALLTYPE *Clone)(
+        IFsrmMutableCollection* This,
+        IFsrmMutableCollection **collection);
 
     END_INTERFACE
+} IFsrmMutableCollectionVtbl;
+interface IFsrmMutableCollection {
+    CONST_VTBL IFsrmMutableCollectionVtbl* lpVtbl;
 };
+
 #ifdef COBJMACROS
-#define IFsrmActionEventLog_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IFsrmActionEventLog_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IFsrmActionEventLog_Release(This) (This)->lpVtbl->Release(This)
-#define IFsrmActionEventLog_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
-#define IFsrmActionEventLog_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
-#define IFsrmActionEventLog_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
-#define IFsrmActionEventLog_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
-#define IFsrmActionEventLog_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
-#define IFsrmActionEventLog_get_ActionType(This,actionType) (This)->lpVtbl->get_ActionType(This,actionType)
-#define IFsrmActionEventLog_put_RunLimitInterval(This,minutes) (This)->lpVtbl->put_RunLimitInterval(This,minutes)
-#define IFsrmActionEventLog_get_RunLimitInterval(This,minutes) (This)->lpVtbl->get_RunLimitInterval(This,minutes)
-#define IFsrmActionEventLog_Delete() (This)->lpVtbl->Delete(This)
-#define IFsrmActionEventLog_get_EventType(This,eventType) (This)->lpVtbl->get_EventType(This,eventType)
-#define IFsrmActionEventLog_put_EventType(This,eventType) (This)->lpVtbl->put_EventType(This,eventType)
-#define IFsrmActionEventLog_get_MessageText(This,messageText) (This)->lpVtbl->get_MessageText(This,messageText)
-#define IFsrmActionEventLog_put_MessageText(This,messageText) (This)->lpVtbl->put_MessageText(This,messageText)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmActionReport
-#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_(IFsrmActionReport,IFsrmAction)
-{
-    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;
-
-    /* IFsrmAction methods */
-    STDMETHOD_(HRESULT,get_Id)(THIS_ FSRM_OBJECT_ID *id) PURE;
-    STDMETHOD_(HRESULT,get_ActionType)(THIS_ FsrmActionType *actionType) PURE;
-    STDMETHOD_(HRESULT,put_RunLimitInterval)(THIS_ __LONG32 minutes) PURE;
-    STDMETHOD_(HRESULT,get_RunLimitInterval)(THIS_ __LONG32 *minutes) PURE;
-    STDMETHOD_(HRESULT,Delete)(THIS) PURE;
-
-    /* IFsrmActionReport methods */
-    STDMETHOD_(HRESULT,get_ReportTypes)(THIS_ SAFEARRAY **reportTypes) PURE;
-    STDMETHOD_(HRESULT,put_ReportTypes)(THIS_ SAFEARRAY *reportTypes) PURE;
-    STDMETHOD_(HRESULT,get_MailTo)(THIS_ BSTR *mailTo) PURE;
-    STDMETHOD_(HRESULT,put_MailTo)(THIS_ BSTR mailTo) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IFsrmActionReport_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IFsrmActionReport_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IFsrmActionReport_Release(This) (This)->lpVtbl->Release(This)
-#define IFsrmActionReport_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
-#define IFsrmActionReport_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
-#define IFsrmActionReport_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
-#define IFsrmActionReport_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
-#define IFsrmActionReport_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
-#define IFsrmActionReport_get_ActionType(This,actionType) (This)->lpVtbl->get_ActionType(This,actionType)
-#define IFsrmActionReport_put_RunLimitInterval(This,minutes) (This)->lpVtbl->put_RunLimitInterval(This,minutes)
-#define IFsrmActionReport_get_RunLimitInterval(This,minutes) (This)->lpVtbl->get_RunLimitInterval(This,minutes)
-#define IFsrmActionReport_Delete() (This)->lpVtbl->Delete(This)
-#define IFsrmActionReport_get_ReportTypes(This,reportTypes) (This)->lpVtbl->get_ReportTypes(This,reportTypes)
-#define IFsrmActionReport_put_ReportTypes(This,reportTypes) (This)->lpVtbl->put_ReportTypes(This,reportTypes)
-#define IFsrmActionReport_get_MailTo(This,mailTo) (This)->lpVtbl->get_MailTo(This,mailTo)
-#define IFsrmActionReport_put_MailTo(This,mailTo) (This)->lpVtbl->put_MailTo(This,mailTo)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmCollection
-#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_(IFsrmCollection,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;
-
-    /* IFsrmCollection methods */
-    STDMETHOD_(HRESULT,get__NewEnum)(THIS_ IUnknown **unknown) PURE;
-    STDMETHOD_(HRESULT,get_Item)(THIS_ __LONG32 index,VARIANT *item) PURE;
-    STDMETHOD_(HRESULT,get_Count)(THIS_ __LONG32 *count) PURE;
-    STDMETHOD_(HRESULT,get_State)(THIS_ FsrmCollectionState *state) PURE;
-    STDMETHOD_(HRESULT,Cancel)(THIS) PURE;
-    STDMETHOD_(HRESULT,GetById)(THIS_ FSRM_OBJECT_ID id,VARIANT *entry) PURE;
-    STDMETHOD_(HRESULT,WaitForCompletion)(THIS_ __LONG32 waitSeconds,VARIANT_BOOL *completed) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IFsrmCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IFsrmCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IFsrmCollection_Release(This) (This)->lpVtbl->Release(This)
-#define IFsrmCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
-#define IFsrmCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
-#define IFsrmCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
-#define IFsrmCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
-#define IFsrmCollection_get__NewEnum(This,unknown) (This)->lpVtbl->get__NewEnum(This,unknown)
-#define IFsrmCollection_get_Item(This,index,item) (This)->lpVtbl->get_Item(This,index,item)
-#define IFsrmCollection_get_Count(This,count) (This)->lpVtbl->get_Count(This,count)
-#define IFsrmCollection_get_State(This,state) (This)->lpVtbl->get_State(This,state)
-#define IFsrmCollection_Cancel() (This)->lpVtbl->Cancel(This)
-#define IFsrmCollection_GetById(This,id,entry) (This)->lpVtbl->GetById(This,id,entry)
-#define IFsrmCollection_WaitForCompletion(This,waitSeconds,completed) (This)->lpVtbl->WaitForCompletion(This,waitSeconds,completed)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmDerivedObjectsResult
-#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_(IFsrmDerivedObjectsResult,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;
-
-    /* IFsrmDerivedObjectsResult methods */
-    STDMETHOD_(HRESULT,get_DerivedObjects)(THIS_ IFsrmCollection **derivedObjects) PURE;
-    STDMETHOD_(HRESULT,get_Results)(THIS_ IFsrmCollection **results) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IFsrmDerivedObjectsResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IFsrmDerivedObjectsResult_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IFsrmDerivedObjectsResult_Release(This) (This)->lpVtbl->Release(This)
-#define IFsrmDerivedObjectsResult_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
-#define IFsrmDerivedObjectsResult_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
-#define IFsrmDerivedObjectsResult_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
-#define IFsrmDerivedObjectsResult_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
-#define IFsrmDerivedObjectsResult_get_DerivedObjects(This,derivedObjects) (This)->lpVtbl->get_DerivedObjects(This,derivedObjects)
-#define IFsrmDerivedObjectsResult_get_Results(This,results) (This)->lpVtbl->get_Results(This,results)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmObject
-#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_(IFsrmObject,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;
-
-    /* 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;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IFsrmObject_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IFsrmObject_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IFsrmObject_Release(This) (This)->lpVtbl->Release(This)
-#define IFsrmObject_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
-#define IFsrmObject_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
-#define IFsrmObject_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
-#define IFsrmObject_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
-#define IFsrmObject_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
-#define IFsrmObject_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
-#define IFsrmObject_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
-#define IFsrmObject_Delete() (This)->lpVtbl->Delete(This)
-#define IFsrmObject_Commit() (This)->lpVtbl->Commit(This)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmMutableCollection
-#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_(IFsrmMutableCollection,IFsrmCollection)
-{
-    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;
-
-    /* IFsrmCollection methods */
-    STDMETHOD_(HRESULT,get__NewEnum)(THIS_ IUnknown **unknown) PURE;
-    STDMETHOD_(HRESULT,get_Item)(THIS_ __LONG32 index,VARIANT *item) PURE;
-    STDMETHOD_(HRESULT,get_Count)(THIS_ __LONG32 *count) PURE;
-    STDMETHOD_(HRESULT,get_State)(THIS_ FsrmCollectionState *state) PURE;
-    STDMETHOD_(HRESULT,Cancel)(THIS) PURE;
-    STDMETHOD_(HRESULT,GetById)(THIS_ FSRM_OBJECT_ID id,VARIANT *entry) PURE;
-    STDMETHOD_(HRESULT,WaitForCompletion)(THIS_ __LONG32 waitSeconds,VARIANT_BOOL *completed) PURE;
-
-    /* IFsrmMutableCollection methods */
-    STDMETHOD_(HRESULT,Add)(THIS_ VARIANT item) PURE;
-    STDMETHOD_(HRESULT,Remove)(THIS_ __LONG32 index) PURE;
-    STDMETHOD_(HRESULT,RemoveById)(THIS_ FSRM_OBJECT_ID id) PURE;
-    STDMETHOD_(HRESULT,Clone)(THIS_ IFsrmMutableCollection **collection) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
 #define IFsrmMutableCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
 #define IFsrmMutableCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
 #define IFsrmMutableCollection_Release(This) (This)->lpVtbl->Release(This)
+/*** IDispatch methods ***/
 #define IFsrmMutableCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
 #define IFsrmMutableCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
 #define IFsrmMutableCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
 #define IFsrmMutableCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
-#define IIFsrmMutableCollection_get__NewEnum(This,unknown) (This)->lpVtbl->get__NewEnum(This,unknown)
+/*** IFsrmCollection methods ***/
+#define IFsrmMutableCollection_get__NewEnum(This,unknown) (This)->lpVtbl->get__NewEnum(This,unknown)
 #define IFsrmMutableCollection_get_Item(This,index,item) (This)->lpVtbl->get_Item(This,index,item)
 #define IFsrmMutableCollection_get_Count(This,count) (This)->lpVtbl->get_Count(This,count)
 #define IFsrmMutableCollection_get_State(This,state) (This)->lpVtbl->get_State(This,state)
-#define IFsrmMutableCollection_Cancel() (This)->lpVtbl->Cancel(This)
-#define IFsrmMutableCollection_GetById(This,id,entry) (This)->lpVtbl->GetById(This,id,entry)
+#define IFsrmMutableCollection_Cancel(This) (This)->lpVtbl->Cancel(This)
 #define IFsrmMutableCollection_WaitForCompletion(This,waitSeconds,completed) (This)->lpVtbl->WaitForCompletion(This,waitSeconds,completed)
+#define IFsrmMutableCollection_GetById(This,id,entry) (This)->lpVtbl->GetById(This,id,entry)
+/*** IFsrmMutableCollection methods ***/
 #define IFsrmMutableCollection_Add(This,item) (This)->lpVtbl->Add(This,item)
 #define IFsrmMutableCollection_Remove(This,index) (This)->lpVtbl->Remove(This,index)
 #define IFsrmMutableCollection_RemoveById(This,id) (This)->lpVtbl->RemoveById(This,id)
 #define IFsrmMutableCollection_Clone(This,collection) (This)->lpVtbl->Clone(This,collection)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmCommittableCollection
-#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 IFsrmMutableCollection_QueryInterface(IFsrmMutableCollection* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IFsrmMutableCollection_AddRef(IFsrmMutableCollection* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IFsrmMutableCollection_Release(IFsrmMutableCollection* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static FORCEINLINE HRESULT IFsrmMutableCollection_GetTypeInfoCount(IFsrmMutableCollection* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static FORCEINLINE HRESULT IFsrmMutableCollection_GetTypeInfo(IFsrmMutableCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static FORCEINLINE HRESULT IFsrmMutableCollection_GetIDsOfNames(IFsrmMutableCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
+    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
+}
+static FORCEINLINE HRESULT IFsrmMutableCollection_Invoke(IFsrmMutableCollection* 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);
+}
+/*** IFsrmCollection methods ***/
+static FORCEINLINE HRESULT IFsrmMutableCollection_get__NewEnum(IFsrmMutableCollection* This,IUnknown **unknown) {
+    return This->lpVtbl->get__NewEnum(This,unknown);
+}
+static FORCEINLINE HRESULT IFsrmMutableCollection_get_Item(IFsrmMutableCollection* This,LONG index,VARIANT *item) {
+    return This->lpVtbl->get_Item(This,index,item);
+}
+static FORCEINLINE HRESULT IFsrmMutableCollection_get_Count(IFsrmMutableCollection* This,LONG *count) {
+    return This->lpVtbl->get_Count(This,count);
+}
+static FORCEINLINE HRESULT IFsrmMutableCollection_get_State(IFsrmMutableCollection* This,FsrmCollectionState *state) {
+    return This->lpVtbl->get_State(This,state);
+}
+static FORCEINLINE HRESULT IFsrmMutableCollection_Cancel(IFsrmMutableCollection* This) {
+    return This->lpVtbl->Cancel(This);
+}
+static FORCEINLINE HRESULT IFsrmMutableCollection_WaitForCompletion(IFsrmMutableCollection* This,LONG waitSeconds,VARIANT_BOOL *completed) {
+    return This->lpVtbl->WaitForCompletion(This,waitSeconds,completed);
+}
+static FORCEINLINE HRESULT IFsrmMutableCollection_GetById(IFsrmMutableCollection* This,FSRM_OBJECT_ID id,VARIANT *entry) {
+    return This->lpVtbl->GetById(This,id,entry);
+}
+/*** IFsrmMutableCollection methods ***/
+static FORCEINLINE HRESULT IFsrmMutableCollection_Add(IFsrmMutableCollection* This,VARIANT item) {
+    return This->lpVtbl->Add(This,item);
+}
+static FORCEINLINE HRESULT IFsrmMutableCollection_Remove(IFsrmMutableCollection* This,LONG index) {
+    return This->lpVtbl->Remove(This,index);
+}
+static FORCEINLINE HRESULT IFsrmMutableCollection_RemoveById(IFsrmMutableCollection* This,FSRM_OBJECT_ID id) {
+    return This->lpVtbl->RemoveById(This,id);
+}
+static FORCEINLINE HRESULT IFsrmMutableCollection_Clone(IFsrmMutableCollection* This,IFsrmMutableCollection **collection) {
+    return This->lpVtbl->Clone(This,collection);
+}
 #endif
-DECLARE_INTERFACE_(IFsrmCommittableCollection,IFsrmMutableCollection)
-{
-    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;
-
-    /* IFsrmCollection methods */
-    STDMETHOD_(HRESULT,get__NewEnum)(THIS_ IUnknown **unknown) PURE;
-    STDMETHOD_(HRESULT,get_Item)(THIS_ __LONG32 index,VARIANT *item) PURE;
-    STDMETHOD_(HRESULT,get_Count)(THIS_ __LONG32 *count) PURE;
-    STDMETHOD_(HRESULT,get_State)(THIS_ FsrmCollectionState *state) PURE;
-    STDMETHOD_(HRESULT,Cancel)(THIS) PURE;
-    STDMETHOD_(HRESULT,GetById)(THIS_ FSRM_OBJECT_ID id,VARIANT *entry) PURE;
-    STDMETHOD_(HRESULT,WaitForCompletion)(THIS_ __LONG32 waitSeconds,VARIANT_BOOL *completed) PURE;
-
-    /* IFsrmMutableCollection methods */
-    STDMETHOD_(HRESULT,Add)(THIS_ VARIANT item) PURE;
-    STDMETHOD_(HRESULT,Remove)(THIS_ __LONG32 index) PURE;
-    STDMETHOD_(HRESULT,RemoveById)(THIS_ FSRM_OBJECT_ID id) PURE;
-    STDMETHOD_(HRESULT,Clone)(THIS_ IFsrmMutableCollection **collection) PURE;
-
-    /* IFsrmCommittableCollection methods */
-    STDMETHOD_(HRESULT,Commit)(THIS_ FsrmCommitOptions options,IFsrmCollection** results) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IFsrmCommittableCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IFsrmCommittableCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IFsrmCommittableCollection_Release(This) (This)->lpVtbl->Release(This)
-#define IFsrmCommittableCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
-#define IFsrmCommittableCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
-#define IFsrmCommittableCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
-#define IFsrmCommittableCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
-#define IFsrmCommittableCollection_get__NewEnum(This,unknown) (This)->lpVtbl->get__NewEnum(This,unknown)
-#define IFsrmCommittableCollection_get_Item(This,index,item) (This)->lpVtbl->get_Item(This,index,item)
-#define IFsrmCommittableCollection_get_Count(This,count) (This)->lpVtbl->get_Count(This,count)
-#define IFsrmCommittableCollection_get_State(This,state) (This)->lpVtbl->get_State(This,state)
-#define IFsrmCommittableCollection_Cancel() (This)->lpVtbl->Cancel(This)
-#define IFsrmCommittableCollection_GetById(This,id,entry) (This)->lpVtbl->GetById(This,id,entry)
-#define IFsrmCommittableCollection_WaitForCompletion(This,waitSeconds,completed) (This)->lpVtbl->WaitForCompletion(This,waitSeconds,completed)
-#define IFsrmCommittableCollection_Add(This,item) (This)->lpVtbl->Add(This,item)
-#define IFsrmCommittableCollection_Remove(This,index) (This)->lpVtbl->Remove(This,index)
-#define IFsrmCommittableCollection_RemoveById(This,id) (This)->lpVtbl->RemoveById(This,id)
-#define IFsrmCommittableCollection_Clone(This,collection) (This)->lpVtbl->Clone(This,collection)
-#define IFsrmCommittableCollection_Commit(This,options,results) (This)->lpVtbl->Commit(This,options,results)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmExportImport
-#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_(IFsrmExportImport,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;
-
-    /* IFsrmExportImport methods */
-    STDMETHOD_(HRESULT,ExportFileGroups)(THIS_ BSTR filePath,VARIANT *fileGroupNamesSafeArray,BSTR remoteHost) PURE;
-    STDMETHOD_(HRESULT,ImportFileGroups)(THIS_ BSTR filePath,VARIANT *fileGroupNamesSafeArray,BSTR remoteHost,IFsrmCommittableCollection **fileGroups) PURE;
-    STDMETHOD_(HRESULT,ExportFileScreenTemplates)(THIS_ BSTR filePath,VARIANT *templateNamesSafeArray,BSTR remoteHost) PURE;
-    STDMETHOD_(HRESULT,ImportFileScreenTemplates)(THIS_ BSTR filePath,VARIANT *templateNamesSafeArray,BSTR remoteHost,IFsrmCommittableCollection **templates) PURE;
-    STDMETHOD_(HRESULT,ExportQuotaTemplates)(THIS_ BSTR filePath,VARIANT *templateNamesSafeArray,BSTR remoteHost) PURE;
-    STDMETHOD_(HRESULT,ImportQuotaTemplates)(THIS_ BSTR filePath,VARIANT *templateNamesSafeArray,BSTR remoteHost,IFsrmCommittableCollection **templates) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IFsrmExportImport_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IFsrmExportImport_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IFsrmExportImport_Release(This) (This)->lpVtbl->Release(This)
-#define IFsrmCommittableCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
-#define IFsrmCommittableCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
-#define IFsrmCommittableCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
-#define IFsrmCommittableCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
-#define IFsrmExportImport_ExportFileGroups(This,filePath,fileGroupNamesSafeArray,remoteHost) (This)->lpVtbl->ExportFileGroups(This,filePath,fileGroupNamesSafeArray,remoteHost)
-#define IFsrmExportImport_ImportFileGroups(This,filePath,fileGroupNamesSafeArray,remoteHost,fileGroups) (This)->lpVtbl->ImportFileGroups(This,filePath,fileGroupNamesSafeArray,remoteHost,fileGroups)
-#define IFsrmExportImport_ExportFileScreenTemplates(This,filePath,templateNamesSafeArray,remoteHost) (This)->lpVtbl->ExportFileScreenTemplates(This,filePath,templateNamesSafeArray,remoteHost)
-#define IFsrmExportImport_ImportFileScreenTemplates(This,filePath,templateNamesSafeArray,remoteHost,templates) (This)->lpVtbl->ImportFileScreenTemplates(This,filePath,templateNamesSafeArray,remoteHost,templates)
-#define IFsrmExportImport_ExportQuotaTemplates(This,filePath,templateNamesSafeArray,remoteHost) (This)->lpVtbl->ExportQuotaTemplates(This,filePath,templateNamesSafeArray,remoteHost)
-#define IFsrmExportImport_ImportQuotaTemplates(This,filePath,templateNamesSafeArray,remoteHost,templates) (This)->lpVtbl->ImportQuotaTemplates(This,filePath,templateNamesSafeArray,remoteHost,templates)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmFileManagementJob
-#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_(IFsrmFileManagementJob,IFsrmObject)
-{
-    BEGIN_INTERFACE
 
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+HRESULT STDMETHODCALLTYPE IFsrmMutableCollection_Add_Proxy(
+    IFsrmMutableCollection* This,
+    VARIANT item);
+void __RPC_STUB IFsrmMutableCollection_Add_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmMutableCollection_Remove_Proxy(
+    IFsrmMutableCollection* This,
+    LONG index);
+void __RPC_STUB IFsrmMutableCollection_Remove_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmMutableCollection_RemoveById_Proxy(
+    IFsrmMutableCollection* This,
+    FSRM_OBJECT_ID id);
+void __RPC_STUB IFsrmMutableCollection_RemoveById_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IFsrmMutableCollection_Clone_Proxy(
+    IFsrmMutableCollection* This,
+    IFsrmMutableCollection **collection);
+void __RPC_STUB IFsrmMutableCollection_Clone_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
 
-    /* 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;
+#endif  /* __IFsrmMutableCollection_INTERFACE_DEFINED__ */
 
-    /* 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;
-
-    /* IFsrmFileManagementJob methods */
-    STDMETHOD_(HRESULT,get_Name)(THIS_ BSTR *pName) PURE;
-    STDMETHOD_(HRESULT,put_Name)(THIS_ BSTR name) PURE;
-    STDMETHOD_(HRESULT,get_NamespaceRoots)(THIS_ SAFEARRAY *pNamespaceRoots) PURE;
-    STDMETHOD_(HRESULT,put_NamespaceRoots)(THIS_ SAFEARRAY namespaceRoots) PURE;
-    STDMETHOD_(HRESULT,get_Enabled)(THIS_ VARIANT_BOOL *pEnabled) PURE;
-    STDMETHOD_(HRESULT,put_Enabled)(THIS_ VARIANT_BOOL enabled) PURE;
-    STDMETHOD_(HRESULT,get_OperationType)(THIS_ FsrmFileManagementType *pOperationType) PURE;
-    STDMETHOD_(HRESULT,put_OperationType)(THIS_ FsrmFileManagementType operationType) PURE;
-    STDMETHOD_(HRESULT,get_ExpirationDirectory)(THIS_ BSTR *pExpirationDirectory) PURE;
-    STDMETHOD_(HRESULT,put_ExpirationDirectory)(THIS_ BSTR expirationDirectory) PURE;
-    STDMETHOD_(HRESULT,get_CustomAction)(THIS_ IFsrmActionCommand **pAction) PURE;
-    STDMETHOD_(HRESULT,get_Notifications)(THIS_ SAFEARRAY *pNotifications) PURE;
-    STDMETHOD_(HRESULT,get_Logging)(THIS_ __LONG32 *pLoggingFlags) PURE;
-    STDMETHOD_(HRESULT,put_Logging)(THIS_ __LONG32 loggingFlags) PURE;
-    STDMETHOD_(HRESULT,get_ReportEnabled)(THIS_ VARIANT_BOOL *pReportEnabled) PURE;
-    STDMETHOD_(HRESULT,put_ReportEnabled)(THIS_ VARIANT_BOOL reportEnabled) PURE;
-    STDMETHOD_(HRESULT,get_Formats)(THIS_ SAFEARRAY *pFormats) PURE;
-    STDMETHOD_(HRESULT,put_Formats)(THIS_ SAFEARRAY formats) PURE;
-    STDMETHOD_(HRESULT,get_MailTo)(THIS_ BSTR *pMailTo) PURE;
-    STDMETHOD_(HRESULT,put_MailTo)(THIS_ BSTR mailTo) PURE;
-    STDMETHOD_(HRESULT,get_DaysSinceFileCreated)(THIS_ __LONG32 *pDaysSinceCreation) PURE;
-    STDMETHOD_(HRESULT,put_DaysSinceFileCreated)(THIS_ __LONG32 daysSinceCreation) PURE;
-    STDMETHOD_(HRESULT,get_DaysSinceFileLastAccessed)(THIS_ __LONG32 *pDaysSinceAccess) PURE;
-    STDMETHOD_(HRESULT,put_DaysSinceFileLastAccessed)(THIS_ __LONG32 daysSinceAccess) PURE;
-    STDMETHOD_(HRESULT,get_DaysSinceFileLastModified)(THIS_ __LONG32 *pDaysSinceModify) PURE;
-    STDMETHOD_(HRESULT,put_DaysSinceFileLastModified)(THIS_ __LONG32 daysSinceModify) PURE;
-    STDMETHOD_(HRESULT,get_PropertyConditions)(THIS_ IFsrmCollection **pPropertyConditions) PURE;
-    STDMETHOD_(HRESULT,get_FromDate)(THIS_ DATE *pFromDate) PURE;
-    STDMETHOD_(HRESULT,put_FromDate)(THIS_ DATE fromDate) PURE;
-    STDMETHOD_(HRESULT,get_Task)(THIS_ BSTR *taskName) PURE;
-    STDMETHOD_(HRESULT,put_Task)(THIS_ BSTR taskName) PURE;
-    STDMETHOD_(HRESULT,get_Parameters)(THIS_ SAFEARRAY *pParameters) PURE;
-    STDMETHOD_(HRESULT,put_Parameters)(THIS_ SAFEARRAY parameters) PURE;
-    STDMETHOD_(HRESULT,get_RunningStatus)(THIS_ FsrmReportRunningStatus *pRunningStatus) PURE;
-    STDMETHOD_(HRESULT,get_LastError)(THIS_ BSTR *lastError) PURE;
-    STDMETHOD_(HRESULT,get_LastReportPathWithoutExtension)(THIS_ BSTR *pPath) PURE;
-    STDMETHOD_(HRESULT,get_LastRun)(THIS_ DATE *lastRun) PURE;
-    STDMETHOD_(HRESULT,get_FileNamePattern)(THIS_ BSTR *pFileNamePattern) PURE;
-    STDMETHOD_(HRESULT,put_FileNamePattern)(THIS_ BSTR fileNamePattern) PURE;
-    STDMETHOD_(HRESULT,Run)(THIS_ FsrmReportGenerationContext context) PURE;
-    STDMETHOD_(HRESULT,WaitForCompletion)(THIS_ __LONG32 waitSeconds,VARIANT_BOOL *completed) PURE;
-    STDMETHOD_(HRESULT,Cancel)(THIS) PURE;
-    STDMETHOD_(HRESULT,AddNotification)(THIS_ __LONG32 days) PURE;
-    STDMETHOD_(HRESULT,DeleteNotification)(THIS_ __LONG32 days) PURE;
-    STDMETHOD_(HRESULT,ModifyNotification)(THIS_ __LONG32 days,__LONG32 newDays) PURE;
-    STDMETHOD_(HRESULT,CreateNotificationAction)(THIS_ __LONG32 days,FsrmActionType actionType,IFsrmAction **action) PURE;
-    STDMETHOD_(HRESULT,EnumNotificationActions)(THIS_ __LONG32 days,IFsrmCollection **actions) PURE;
-    STDMETHOD_(HRESULT,CreatePropertyCondition)(THIS_ BSTR name,IFsrmPropertyCondition **pPropertyCondition) PURE;
-    STDMETHOD_(HRESULT,CreateCustomAction)(THIS_ IFsrmActionCommand **customAction) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#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)
-#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)
-#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)->lpVtbl->Delete(This)
-#define IFsrmFileManagementJob_Commit() (This)->lpVtbl->Commit(This)
-#define IFsrmFileManagementJob_get_Name(This,pName) (This)->lpVtbl->get_Name(This,pName)
-#define IFsrmFileManagementJob_put_Name(This,name) (This)->lpVtbl->put_Name(This,name)
-#define IFsrmFileManagementJob_get_NamespaceRoots(This,pNamespaceRoots) (This)->lpVtbl->get_NamespaceRoots(This,pNamespaceRoots)
-#define IFsrmFileManagementJob_put_NamespaceRoots(This,namespaceRoots) (This)->lpVtbl->put_NamespaceRoots(This,namespaceRoots)
-#define IFsrmFileManagementJob_get_Enabled(This,pEnabled) (This)->lpVtbl->get_Enabled(This,pEnabled)
-#define IFsrmFileManagementJob_put_Enabled(This,enabled) (This)->lpVtbl->put_Enabled(This,enabled)
-#define IFsrmFileManagementJob_get_OperationType(This,pOperationType) (This)->lpVtbl->get_OperationType(This,pOperationType)
-#define IFsrmFileManagementJob_put_OperationType(This,operationType) (This)->lpVtbl->put_OperationType(This,operationType)
-#define IFsrmFileManagementJob_get_ExpirationDirectory(This,pExpirationDirectory) (This)->lpVtbl->get_ExpirationDirectory(This,pExpirationDirectory)
-#define IFsrmFileManagementJob_put_ExpirationDirectory(This,expirationDirectory) (This)->lpVtbl->put_ExpirationDirectory(This,expirationDirectory)
-#define IFsrmFileManagementJob_get_CustomAction(This,pAction) (This)->lpVtbl->get_CustomAction(This,pAction)
-#define IFsrmFileManagementJob_get_Notifications(This,pNotifications) (This)->lpVtbl->get_Notifications(This,pNotifications)
-#define IFsrmFileManagementJob_get_Logging(This,pLoggingFlags) (This)->lpVtbl->get_Logging(This,pLoggingFlags)
-#define IFsrmFileManagementJob_put_Logging(This,loggingFlags) (This)->lpVtbl->put_Logging(This,loggingFlags)
-#define IFsrmFileManagementJob_get_ReportEnabled(This,pReportEnabled) (This)->lpVtbl->get_ReportEnabled(This,pReportEnabled)
-#define IFsrmFileManagementJob_put_ReportEnabled(This,reportEnabled) (This)->lpVtbl->put_ReportEnabled(This,reportEnabled)
-#define IFsrmFileManagementJob_get_Formats(This,pFormats) (This)->lpVtbl->get_Formats(This,pFormats)
-#define IFsrmFileManagementJob_put_Formats(This,formats) (This)->lpVtbl->put_Formats(This,formats)
-#define IFsrmFileManagementJob_get_MailTo(This,pMailTo) (This)->lpVtbl->get_MailTo(This,pMailTo)
-#define IFsrmFileManagementJob_put_MailTo(This,mailTo) (This)->lpVtbl->put_MailTo(This,mailTo)
-#define IFsrmFileManagementJob_get_DaysSinceFileCreated(This,pDaysSinceCreation) (This)->lpVtbl->get_DaysSinceFileCreated(This,pDaysSinceCreation)
-#define IFsrmFileManagementJob_put_DaysSinceFileCreated(This,daysSinceCreation) (This)->lpVtbl->put_DaysSinceFileCreated(This,daysSinceCreation)
-#define IFsrmFileManagementJob_get_DaysSinceFileLastAccessed(This,pDaysSinceAccess) (This)->lpVtbl->get_DaysSinceFileLastAccessed(This,pDaysSinceAccess)
-#define IFsrmFileManagementJob_put_DaysSinceFileLastAccessed(This,daysSinceAccess) (This)->lpVtbl->put_DaysSinceFileLastAccessed(This,daysSinceAccess)
-#define IFsrmFileManagementJob_get_DaysSinceFileLastModified(This,pDaysSinceModify) (This)->lpVtbl->get_DaysSinceFileLastModified(This,pDaysSinceModify)
-#define IFsrmFileManagementJob_put_DaysSinceFileLastModified(This,daysSinceModify) (This)->lpVtbl->put_DaysSinceFileLastModified(This,daysSinceModify)
-#define IFsrmFileManagementJob_get_PropertyConditions(This,pPropertyConditions) (This)->lpVtbl->get_PropertyConditions(This,pPropertyConditions)
-#define IFsrmFileManagementJob_get_FromDate(This,pFromDate) (This)->lpVtbl->get_FromDate(This,pFromDate)
-#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,pParameters) (This)->lpVtbl->get_Parameters(This,pParameters)
-#define IFsrmFileManagementJob_put_Parameters(This,parameters) (This)->lpVtbl->put_Parameters(This,parameters)
-#define IFsrmFileManagementJob_get_RunningStatus(This,pRunningStatus) (This)->lpVtbl->get_RunningStatus(This,pRunningStatus)
-#define IFsrmFileManagementJob_get_LastError(This,lastError) (This)->lpVtbl->get_LastError(This,lastError)
-#define IFsrmFileManagementJob_get_LastReportPathWithoutExtension(This,pPath) (This)->lpVtbl->get_LastReportPathWithoutExtension(This,pPath)
-#define IFsrmFileManagementJob_get_LastRun(This,lastRun) (This)->lpVtbl->get_LastRun(This,lastRun)
-#define IFsrmFileManagementJob_get_FileNamePattern(This,pFileNamePattern) (This)->lpVtbl->get_FileNamePattern(This,pFileNamePattern)
-#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)->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,pPropertyCondition) (This)->lpVtbl->CreatePropertyCondition(This,name,pPropertyCondition)
-#define IFsrmFileManagementJob_CreateCustomAction(This,customAction) (This)->lpVtbl->CreateCustomAction(This,customAction)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmPathMapper
-DECLARE_INTERFACE_(IFsrmPathMapper,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;
-
-    /* IFsrmPathMapper methods */
-    STDMETHOD_(HRESULT,GetSharePathsForLocalPath)(THIS_ BSTR localPath,SAFEARRAY *sharePaths) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IFsrmPathMapper_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IFsrmPathMapper_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IFsrmPathMapper_Release(This) (This)->lpVtbl->Release(This)
-#define IFsrmPathMapper_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
-#define IFsrmPathMapper_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
-#define IFsrmPathMapper_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
-#define IFsrmPathMapper_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
-#define IFsrmPathMapper_GetSharePathsForLocalPath(This,localPath,sharePaths) (This)->lpVtbl->GetSharePathsForLocalPath(This,localPath,sharePaths)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmSetting
-#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_(IFsrmSetting,IDispatch)
-{
-    BEGIN_INTERFACE
+/* Begin additional prototypes for all interfaces */
 
-    /* IUnknown methods */
-    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
-    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
-    STDMETHOD_(ULONG, Release)(THIS) PURE;
+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 *);
 
-    /* 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;
+/* End additional prototypes */
 
-    /* IFsrmSetting methods */
-    STDMETHOD_(HRESULT,get_SmtpServer)(THIS_ BSTR *smtpServer) PURE;
-    STDMETHOD_(HRESULT,put_SmtpServer)(THIS_ BSTR smtpServer) PURE;
-    STDMETHOD_(HRESULT,get_MailFrom)(THIS_ BSTR *mailFrom) PURE;
-    STDMETHOD_(HRESULT,put_MailFrom)(THIS_ BSTR mailFrom) PURE;
-    STDMETHOD_(HRESULT,get_AdminEmail)(THIS_ BSTR *adminEmail) PURE;
-    STDMETHOD_(HRESULT,put_AdminEmail)(THIS_ BSTR adminEmail) PURE;
-    STDMETHOD_(HRESULT,get_DisableCommandLine)(THIS_ VARIANT_BOOL *disableCommandLine) PURE;
-    STDMETHOD_(HRESULT,put_DisableCommandLine)(THIS_ VARIANT_BOOL disableCommandLine) PURE;
-    STDMETHOD_(HRESULT,get_EnableScreeningAudit)(THIS_ VARIANT_BOOL *enableScreeningAudit) PURE;
-    STDMETHOD_(HRESULT,put_EnableScreeningAudit)(THIS_ VARIANT_BOOL enableScreeningAudit) PURE;
-    STDMETHOD_(HRESULT,EmailTest)(THIS_ BSTR mailTo) PURE;
-    STDMETHOD_(HRESULT,SetActionRunLimitInterval)(THIS_ FsrmActionType actionType,__LONG32 delayTimeMinutes) PURE;
-    STDMETHOD_(HRESULT,GetActionRunLimitInterval)(THIS_ FsrmActionType actionType,__LONG32 *delayTimeMinutes) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IFsrmSetting_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IFsrmSetting_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IFsrmSetting_Release(This) (This)->lpVtbl->Release(This)
-#define IFsrmSetting_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
-#define IFsrmSetting_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
-#define IFsrmSetting_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
-#define IFsrmSetting_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
-#define IFsrmSetting_VerifyNamespaces(This,namespacesSafeArray) (This)->lpVtbl->VerifyNamespaces(This,namespacesSafeArray)
-#define IFsrmSetting_CreateScheduleTask(This,taskName,namespacesSafeArray,serializedTask) (This)->lpVtbl->CreateScheduleTask(This,taskName,namespacesSafeArray,serializedTask)
-#define IFsrmSetting_ModifyScheduleTask(This,taskName,namespacesSafeArray,serializedTask) (This)->lpVtbl->ModifyScheduleTask(This,taskName,namespacesSafeArray,serializedTask)
-#define IFsrmSetting_DeleteScheduleTask(This,taskName) (This)->lpVtbl->DeleteScheduleTask(This,taskName)
-#define IFsrmSetting_get_SmtpServer(This,smtpServer) (This)->lpVtbl->get_SmtpServer(This,smtpServer)
-#define IFsrmSetting_put_SmtpServer(This,smtpServer) (This)->lpVtbl->put_SmtpServer(This,smtpServer)
-#define IFsrmSetting_get_MailFrom(This,mailFrom) (This)->lpVtbl->get_MailFrom(This,mailFrom)
-#define IFsrmSetting_put_MailFrom(This,mailFrom) (This)->lpVtbl->put_MailFrom(This,mailFrom)
-#define IFsrmSetting_get_AdminEmail(This,adminEmail) (This)->lpVtbl->get_AdminEmail(This,adminEmail)
-#define IFsrmSetting_put_AdminEmail(This,adminEmail) (This)->lpVtbl->put_AdminEmail(This,adminEmail)
-#define IFsrmSetting_get_DisableCommandLine(This,disableCommandLine) (This)->lpVtbl->get_DisableCommandLine(This,disableCommandLine)
-#define IFsrmSetting_put_DisableCommandLine(This,disableCommandLine) (This)->lpVtbl->put_DisableCommandLine(This,disableCommandLine)
-#define IFsrmSetting_get_EnableScreeningAudit(This,enableScreeningAudit) (This)->lpVtbl->get_EnableScreeningAudit(This,enableScreeningAudit)
-#define IFsrmSetting_put_EnableScreeningAudit(This,enableScreeningAudit) (This)->lpVtbl->put_EnableScreeningAudit(This,enableScreeningAudit)
-#define IFsrmSetting_EmailTest(This,mailTo) (This)->lpVtbl->EmailTest(This,mailTo)
-#define IFsrmSetting_SetActionRunLimitInterval(This,actionType,delayTimeMinutes) (This)->lpVtbl->SetActionRunLimitInterval(This,actionType,delayTimeMinutes)
-#define IFsrmSetting_GetActionRunLimitInterval(This,actionType,delayTimeMinutes) (This)->lpVtbl->GetActionRunLimitInterval(This,actionType,delayTimeMinutes)
-#endif /*COBJMACROS*/
-
-#endif /*(_WIN32_WINNT >= 0x0600)*/
-
-#if (_WIN32_WINNT >= 0x0601)
-
-#undef  INTERFACE
-#define INTERFACE IFsrmRule
-#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)
+#ifdef __cplusplus
+}
 #endif
-DECLARE_INTERFACE_(IFsrmRule,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;
-
-    /* IFsrmRule methods */
-    STDMETHOD_(HRESULT,get_Name)(THIS_ BSTR *pName) PURE;
-    STDMETHOD_(HRESULT,put_Name)(THIS_ BSTR name) PURE;
-    STDMETHOD_(HRESULT,get_RuleType)(THIS_ FsrmRuleType *pRuleType) PURE;
-    STDMETHOD_(HRESULT,get_ModuleDefinitionName)(THIS_ BSTR *pModuleDefinitionName) PURE;
-    STDMETHOD_(HRESULT,put_ModuleDefinitionName)(THIS_ BSTR moduleDefinitionName) PURE;
-    STDMETHOD_(HRESULT,get_NamespaceRoots)(THIS_ SAFEARRAY *namespaceRoots) PURE;
-    STDMETHOD_(HRESULT,put_NamespaceRoots)(THIS_ SAFEARRAY namespaceRoots) PURE;
-    STDMETHOD_(HRESULT,get_RuleFlags)(THIS_ __LONG32 *pRuleFlags) PURE;
-    STDMETHOD_(HRESULT,put_RuleFlags)(THIS_ __LONG32 ruleFlags) PURE;
-    STDMETHOD_(HRESULT,get_Parameters)(THIS_ SAFEARRAY *pParameters) PURE;
-    STDMETHOD_(HRESULT,put_Parameters)(THIS_ SAFEARRAY parameters) PURE;
-    STDMETHOD_(HRESULT,get_LastModified)(THIS_ VARIANT *pLastModified) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IFsrmRule_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IFsrmRule_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IFsrmRule_Release(This) (This)->lpVtbl->Release(This)
-#define IFsrmRule_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
-#define IFsrmRule_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
-#define IFsrmRule_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
-#define IFsrmRule_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
-#define IFsrmRule_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
-#define IFsrmRule_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
-#define IFsrmRule_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
-#define IFsrmRule_Delete() (This)->lpVtbl->Delete(This)
-#define IFsrmRule_Commit() (This)->lpVtbl->Commit(This)
-#define IFsrmRule_get_Name(This,pName) (This)->lpVtbl->get_Name(This,pName)
-#define IFsrmRule_put_Name(This,name) (This)->lpVtbl->put_Name(This,name)
-#define IFsrmRule_get_RuleType(This,pRuleType) (This)->lpVtbl->get_RuleType(This,pRuleType)
-#define IFsrmRule_get_ModuleDefinitionName(This,pModuleDefinitionName) (This)->lpVtbl->get_ModuleDefinitionName(This,pModuleDefinitionName)
-#define IFsrmRule_put_ModuleDefinitionName(This,moduleDefinitionName) (This)->lpVtbl->put_ModuleDefinitionName(This,moduleDefinitionName)
-#define IFsrmRule_get_NamespaceRoots(This,namespaceRoots) (This)->lpVtbl->get_NamespaceRoots(This,namespaceRoots)
-#define IFsrmRule_put_NamespaceRoots(This,namespaceRoots) (This)->lpVtbl->put_NamespaceRoots(This,namespaceRoots)
-#define IFsrmRule_get_RuleFlags(This,pRuleFlags) (This)->lpVtbl->get_RuleFlags(This,pRuleFlags)
-#define IFsrmRule_put_RuleFlags(This,ruleFlags) (This)->lpVtbl->put_RuleFlags(This,ruleFlags)
-#define IFsrmRule_get_Parameters(This,pParameters) (This)->lpVtbl->get_Parameters(This,pParameters)
-#define IFsrmRule_put_Parameters(This,parameters) (This)->lpVtbl->put_Parameters(This,parameters)
-#define IFsrmRule_get_LastModified(This,pLastModified) (This)->lpVtbl->get_LastModified(This,pLastModified)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmClassificationManager
-#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_(IFsrmClassificationManager,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;
-
-    /* IFsrmClassificationManager methods */
-    STDMETHOD_(HRESULT,get_ClassificationReportFormats)(THIS_ SAFEARRAY *pFormats) PURE;
-    STDMETHOD_(HRESULT,put_ClassificationReportFormats)(THIS_ SAFEARRAY formats) PURE;
-    STDMETHOD_(HRESULT,get_Logging)(THIS_ __LONG32 *pLogging) PURE;
-    STDMETHOD_(HRESULT,put_Logging)(THIS_ __LONG32 logging) PURE;
-    STDMETHOD_(HRESULT,get_ClassificationReportMailTo)(THIS_ BSTR *pMailTo) PURE;
-    STDMETHOD_(HRESULT,put_ClassificationReportMailTo)(THIS_ BSTR mailTo) PURE;
-    STDMETHOD_(HRESULT,get_ClassificationReportEnabled)(THIS_ VARIANT_BOOL *pReportEnabled) PURE;
-    STDMETHOD_(HRESULT,put_ClassificationReportEnabled)(THIS_ VARIANT_BOOL reportEnabled) PURE;
-    STDMETHOD_(HRESULT,get_ClassificationLastReportPathWithoutExtension)(THIS_ BSTR *pLastReportPath) PURE;
-    STDMETHOD_(HRESULT,get_ClassificationLastError)(THIS_ BSTR *pLastError) PURE;
-    STDMETHOD_(HRESULT,get_ClassificationRunningStatus)(THIS_ FsrmReportRunningStatus *pRunningStatus) PURE;
-    STDMETHOD_(HRESULT,EnumPropertyDefinitions)(THIS_ FsrmEnumOptions options,IFsrmCollection **propertyDefinitions) PURE;
-    STDMETHOD_(HRESULT,CreatePropertyDefinition)(THIS_ IFsrmPropertyDefinition **propertyDefinition) PURE;
-    STDMETHOD_(HRESULT,GetPropertyDefinition)(THIS_ BSTR propertyName,IFsrmPropertyDefinition **propertyDefinition) PURE;
-    STDMETHOD_(HRESULT,EnumRules)(THIS_ FsrmRuleType ruleType,FsrmEnumOptions options,IFsrmCollection **rules) PURE;
-    STDMETHOD_(HRESULT,CreateRule)(THIS_ FsrmRuleType ruleType,IFsrmRule **rule) PURE;
-    STDMETHOD_(HRESULT,GetRule)(THIS_ BSTR ruleName,FsrmRuleType ruleType,IFsrmRule **rule) PURE;
-    STDMETHOD_(HRESULT,EnumModuleDefinitions)(THIS_ FsrmPipelineModuleType moduleType,FsrmEnumOptions options,IFsrmCollection **moduleDefinitions) PURE;
-    STDMETHOD_(HRESULT,CreateModuleDefinition)(THIS_ FsrmPipelineModuleType moduleType,IFsrmPipelineModuleDefinition **moduleDefinition) PURE;
-    STDMETHOD_(HRESULT,GetModuleDefinition)(THIS_ BSTR moduleName,FsrmPipelineModuleType moduleType,IFsrmPipelineModuleDefinition **moduleDefinition) PURE;
-    STDMETHOD_(HRESULT,RunClassification)(THIS_ FsrmReportGenerationContext context,BSTR reserved) PURE;
-    STDMETHOD_(HRESULT,WaitForClassificationCompletion)(THIS_ __LONG32 waitSeconds,VARIANT_BOOL *completed) PURE;
-    STDMETHOD_(HRESULT,CancelClassification)(THIS) PURE;
-    STDMETHOD_(HRESULT,EnumFileProperties)(THIS_ BSTR filePath,FsrmGetFilePropertyOptions options,IFsrmCollection **fileProperties) PURE;
-    STDMETHOD_(HRESULT,GetFileProperty)(THIS_ BSTR filePath,BSTR propertyName,FsrmGetFilePropertyOptions options,IFsrmProperty **property) PURE;
-    STDMETHOD_(HRESULT,SetFileProperty)(THIS_ BSTR filePath,BSTR propertyName,BSTR propertyValue) PURE;
-    STDMETHOD_(HRESULT,ClearFileProperty)(THIS_ BSTR filePath,BSTR propertyName) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IFsrmClassificationManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IFsrmClassificationManager_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IFsrmClassificationManager_Release(This) (This)->lpVtbl->Release(This)
-#define IFsrmClassificationManager_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
-#define IFsrmClassificationManager_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
-#define IFsrmClassificationManager_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
-#define IFsrmClassificationManager_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
-#define IFsrmClassificationManager_get_ClassificationReportFormats(This,pFormats) (This)->lpVtbl->get_ClassificationReportFormats(This,pFormats)
-#define IFsrmClassificationManager_put_ClassificationReportFormats(This,formats) (This)->lpVtbl->put_ClassificationReportFormats(This,formats)
-#define IFsrmClassificationManager_get_Logging(This,pLogging) (This)->lpVtbl->get_Logging(This,pLogging)
-#define IFsrmClassificationManager_put_Logging(This,logging) (This)->lpVtbl->put_Logging(This,logging)
-#define IFsrmClassificationManager_get_ClassificationReportMailTo(This,pMailTo) (This)->lpVtbl->get_ClassificationReportMailTo(This,pMailTo)
-#define IFsrmClassificationManager_put_ClassificationReportMailTo(This,mailTo) (This)->lpVtbl->put_ClassificationReportMailTo(This,mailTo)
-#define IFsrmClassificationManager_get_ClassificationReportEnabled(This,pReportEnabled) (This)->lpVtbl->get_ClassificationReportEnabled(This,pReportEnabled)
-#define IFsrmClassificationManager_put_ClassificationReportEnabled(This,reportEnabled) (This)->lpVtbl->put_ClassificationReportEnabled(This,reportEnabled)
-#define IFsrmClassificationManager_get_ClassificationLastReportPathWithoutExtension(This,pLastReportPath) (This)->lpVtbl->get_ClassificationLastReportPathWithoutExtension(This,pLastReportPath)
-#define IFsrmClassificationManager_get_ClassificationLastError(This,pLastError) (This)->lpVtbl->get_ClassificationLastError(This,pLastError)
-#define IFsrmClassificationManager_get_ClassificationRunningStatus(This,pRunningStatus) (This)->lpVtbl->get_ClassificationRunningStatus(This,pRunningStatus)
-#define IFsrmClassificationManager_EnumPropertyDefinitions(This,options,propertyDefinitions) (This)->lpVtbl->EnumPropertyDefinitions(This,options,propertyDefinitions)
-#define IFsrmClassificationManager_CreatePropertyDefinition(This,propertyDefinition) (This)->lpVtbl->CreatePropertyDefinition(This,propertyDefinition)
-#define IFsrmClassificationManager_GetPropertyDefinition(This,propertyName,propertyDefinition) (This)->lpVtbl->GetPropertyDefinition(This,propertyName,propertyDefinition)
-#define IFsrmClassificationManager_EnumRules(This,ruleType,options,rules) (This)->lpVtbl->EnumRules(This,ruleType,options,rules)
-#define IFsrmClassificationManager_CreateRule(This,ruleType,rule) (This)->lpVtbl->CreateRule(This,ruleType,rule)
-#define IFsrmClassificationManager_GetRule(This,ruleName,ruleType,rule) (This)->lpVtbl->GetRule(This,ruleName,ruleType,rule)
-#define IFsrmClassificationManager_EnumModuleDefinitions(This,moduleType,options,moduleDefinitions) (This)->lpVtbl->EnumModuleDefinitions(This,moduleType,options,moduleDefinitions)
-#define IFsrmClassificationManager_CreateModuleDefinition(This,moduleType,moduleDefinition) (This)->lpVtbl->CreateModuleDefinition(This,moduleType,moduleDefinition)
-#define IFsrmClassificationManager_GetModuleDefinition(This,moduleName,moduleType,moduleDefinition) (This)->lpVtbl->GetModuleDefinition(This,moduleName,moduleType,moduleDefinition)
-#define IFsrmClassificationManager_RunClassification(This,context,reserved) (This)->lpVtbl->RunClassification(This,context,reserved)
-#define IFsrmClassificationManager_WaitForClassificationCompletion(This,waitSeconds,completed) (This)->lpVtbl->WaitForClassificationCompletion(This,waitSeconds,completed)
-#define IFsrmClassificationManager_CancelClassification() (This)->lpVtbl->CancelClassification(This)
-#define IFsrmClassificationManager_EnumFileProperties(This,filePath,options,fileProperties) (This)->lpVtbl->EnumFileProperties(This,filePath,options,fileProperties)
-#define IFsrmClassificationManager_GetFileProperty(This,filePath,propertyName,options,property) (This)->lpVtbl->GetFileProperty(This,filePath,propertyName,options,property)
-#define IFsrmClassificationManager_SetFileProperty(This,filePath,propertyName,propertyValue) (This)->lpVtbl->SetFileProperty(This,filePath,propertyName,propertyValue)
-#define IFsrmClassificationManager_ClearFileProperty(This,filePath,propertyName) (This)->lpVtbl->ClearFileProperty(This,filePath,propertyName)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmClassificationRule
-DECLARE_INTERFACE_(IFsrmClassificationRule,IFsrmRule)
-{
-    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;
-
-    /* IFsrmRule methods */
-    STDMETHOD_(HRESULT,get_Name)(THIS_ BSTR *pName) PURE;
-    STDMETHOD_(HRESULT,put_Name)(THIS_ BSTR name) PURE;
-    STDMETHOD_(HRESULT,get_RuleType)(THIS_ FsrmRuleType *pRuleType) PURE;
-    STDMETHOD_(HRESULT,get_ModuleDefinitionName)(THIS_ BSTR *pModuleDefinitionName) PURE;
-    STDMETHOD_(HRESULT,put_ModuleDefinitionName)(THIS_ BSTR moduleDefinitionName) PURE;
-    STDMETHOD_(HRESULT,get_NamespaceRoots)(THIS_ SAFEARRAY *namespaceRoots) PURE;
-    STDMETHOD_(HRESULT,put_NamespaceRoots)(THIS_ SAFEARRAY namespaceRoots) PURE;
-    STDMETHOD_(HRESULT,get_RuleFlags)(THIS_ __LONG32 *pRuleFlags) PURE;
-    STDMETHOD_(HRESULT,put_RuleFlags)(THIS_ __LONG32 ruleFlags) PURE;
-    STDMETHOD_(HRESULT,get_Parameters)(THIS_ SAFEARRAY *pParameters) PURE;
-    STDMETHOD_(HRESULT,put_Parameters)(THIS_ SAFEARRAY parameters) PURE;
-    STDMETHOD_(HRESULT,get_LastModified)(THIS_ VARIANT *pLastModified) PURE;
-    
-    /* IFsrmClassificationRule methods */
-    STDMETHOD_(HRESULT,get_ExecutionOption)(THIS_ FsrmExecutionOption *pExecutionOption) PURE;
-    STDMETHOD_(HRESULT,put_ExecutionOption)(THIS_ FsrmExecutionOption executionOption) PURE;
-    STDMETHOD_(HRESULT,get_PropertyAffected)(THIS_ BSTR *pProperty) PURE;
-    STDMETHOD_(HRESULT,put_PropertyAffected)(THIS_ BSTR property) PURE;
-    STDMETHOD_(HRESULT,get_Value)(THIS_ BSTR *pValue) PURE;
-    STDMETHOD_(HRESULT,put_Value)(THIS_ BSTR value) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IFsrmClassificationRule_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IFsrmClassificationRule_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IFsrmClassificationRule_Release(This) (This)->lpVtbl->Release(This)
-#define IFsrmClassificationRule_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
-#define IFsrmClassificationRule_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
-#define IFsrmClassificationRule_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
-#define IFsrmClassificationRule_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
-#define IFsrmClassificationRule_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
-#define IFsrmClassificationRule_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
-#define IFsrmClassificationRule_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
-#define IFsrmClassificationRule_Delete() (This)->lpVtbl->Delete(This)
-#define IFsrmClassificationRule_Commit() (This)->lpVtbl->Commit(This)
-#define IFsrmClassificationRule_get_Name(This,pName) (This)->lpVtbl->get_Name(This,pName)
-#define IFsrmClassificationRule_put_Name(This,name) (This)->lpVtbl->put_Name(This,name)
-#define IFsrmClassificationRule_get_RuleType(This,pRuleType) (This)->lpVtbl->get_RuleType(This,pRuleType)
-#define IFsrmClassificationRule_get_ModuleDefinitionName(This,pModuleDefinitionName) (This)->lpVtbl->get_ModuleDefinitionName(This,pModuleDefinitionName)
-#define IFsrmClassificationRule_put_ModuleDefinitionName(This,moduleDefinitionName) (This)->lpVtbl->put_ModuleDefinitionName(This,moduleDefinitionName)
-#define IFsrmClassificationRule_get_NamespaceRoots(This,namespaceRoots) (This)->lpVtbl->get_NamespaceRoots(This,namespaceRoots)
-#define IFsrmClassificationRule_put_NamespaceRoots(This,namespaceRoots) (This)->lpVtbl->put_NamespaceRoots(This,namespaceRoots)
-#define IFsrmClassificationRule_get_RuleFlags(This,pRuleFlags) (This)->lpVtbl->get_RuleFlags(This,pRuleFlags)
-#define IFsrmClassificationRule_put_RuleFlags(This,ruleFlags) (This)->lpVtbl->put_RuleFlags(This,ruleFlags)
-#define IFsrmClassificationRule_get_Parameters(This,pParameters) (This)->lpVtbl->get_Parameters(This,pParameters)
-#define IFsrmClassificationRule_put_Parameters(This,parameters) (This)->lpVtbl->put_Parameters(This,parameters)
-#define IFsrmClassificationRule_get_LastModified(This,pLastModified) (This)->lpVtbl->get_LastModified(This,pLastModified)
-#define IFsrmClassificationRule_get_ExecutionOption(This,pExecutionOption) (This)->lpVtbl->get_ExecutionOption(This,pExecutionOption)
-#define IFsrmClassificationRule_put_ExecutionOption(This,executionOption) (This)->lpVtbl->put_ExecutionOption(This,executionOption)
-#define IFsrmClassificationRule_get_PropertyAffected(This,pProperty) (This)->lpVtbl->get_PropertyAffected(This,pProperty)
-#define IFsrmClassificationRule_put_PropertyAffected(This,property) (This)->lpVtbl->put_PropertyAffected(This,property)
-#define IFsrmClassificationRule_get_Value(This,pValue) (This)->lpVtbl->get_Value(This,pValue)
-#define IFsrmClassificationRule_put_Value(This,value) (This)->lpVtbl->put_Value(This,value)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmPipelineModuleDefinition
-#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_(IFsrmPipelineModuleDefinition,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;
-
-    /* IFsrmPipelineModuleDefinition methods */
-    STDMETHOD_(HRESULT,get_ModuleClsid)(THIS_ BSTR *pModuleClsid) PURE;
-    STDMETHOD_(HRESULT,put_ModuleClsid)(THIS_ BSTR moduleClsid) PURE;
-    STDMETHOD_(HRESULT,get_Name)(THIS_ BSTR *pName) PURE;
-    STDMETHOD_(HRESULT,put_Name)(THIS_ BSTR name) PURE;
-    STDMETHOD_(HRESULT,get_Company)(THIS_ BSTR *pCompany) PURE;
-    STDMETHOD_(HRESULT,put_Company)(THIS_ BSTR company) PURE;
-    STDMETHOD_(HRESULT,get_Version)(THIS_ BSTR *version) PURE;
-    STDMETHOD_(HRESULT,put_Version)(THIS_ BSTR version) PURE;
-    STDMETHOD_(HRESULT,get_ModuleType)(THIS_ FsrmPipelineModuleType *pModuleType) PURE;
-    STDMETHOD_(HRESULT,get_Enabled)(THIS_ VARIANT_BOOL *pEnabled) PURE;
-    STDMETHOD_(HRESULT,put_Enabled)(THIS_ VARIANT_BOOL enabled) PURE;
-    STDMETHOD_(HRESULT,get_NeedsFileContent)(THIS_ VARIANT_BOOL *pNeedsFileContent) PURE;
-    STDMETHOD_(HRESULT,put_NeedsFileContent)(THIS_ VARIANT_BOOL needsFileContent) PURE;
-    STDMETHOD_(HRESULT,get_Account)(THIS_ FsrmAccountType *pRetrievalAccount) PURE;
-    STDMETHOD_(HRESULT,put_Account)(THIS_ FsrmAccountType retrievalAccount) PURE;
-    STDMETHOD_(HRESULT,get_SupportedExtensions)(THIS_ SAFEARRAY *pSupportedExtensions) PURE;
-    STDMETHOD_(HRESULT,put_SupportedExtensions)(THIS_ SAFEARRAY supportedExtensions) PURE;
-    STDMETHOD_(HRESULT,get_Parameters)(THIS_ SAFEARRAY *pParameters) PURE;
-    STDMETHOD_(HRESULT,put_Parameters)(THIS_ SAFEARRAY parameters) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IFsrmPipelineModuleDefinition_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IFsrmPipelineModuleDefinition_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IFsrmPipelineModuleDefinition_Release(This) (This)->lpVtbl->Release(This)
-#define IFsrmPipelineModuleDefinition_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
-#define IFsrmPipelineModuleDefinition_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
-#define IFsrmPipelineModuleDefinition_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
-#define IFsrmPipelineModuleDefinition_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
-#define IFsrmPipelineModuleDefinition_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
-#define IFsrmPipelineModuleDefinition_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
-#define IFsrmPipelineModuleDefinition_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
-#define IFsrmPipelineModuleDefinition_Delete() (This)->lpVtbl->Delete(This)
-#define IFsrmPipelineModuleDefinition_Commit() (This)->lpVtbl->Commit(This)
-#define IFsrmPipelineModuleDefinition_get_ModuleClsid(This,pModuleClsid) (This)->lpVtbl->get_ModuleClsid(This,pModuleClsid)
-#define IFsrmPipelineModuleDefinition_put_ModuleClsid(This,moduleClsid) (This)->lpVtbl->put_ModuleClsid(This,moduleClsid)
-#define IFsrmPipelineModuleDefinition_get_Name(This,pName) (This)->lpVtbl->get_Name(This,pName)
-#define IFsrmPipelineModuleDefinition_put_Name(This,name) (This)->lpVtbl->put_Name(This,name)
-#define IFsrmPipelineModuleDefinition_get_Company(This,pCompany) (This)->lpVtbl->get_Company(This,pCompany)
-#define IFsrmPipelineModuleDefinition_put_Company(This,company) (This)->lpVtbl->put_Company(This,company)
-#define IFsrmPipelineModuleDefinition_get_Version(This,version) (This)->lpVtbl->get_Version(This,version)
-#define IFsrmPipelineModuleDefinition_put_Version(This,version) (This)->lpVtbl->put_Version(This,version)
-#define IFsrmPipelineModuleDefinition_get_ModuleType(This,pModuleType) (This)->lpVtbl->get_ModuleType(This,pModuleType)
-#define IFsrmPipelineModuleDefinition_get_Enabled(This,pEnabled) (This)->lpVtbl->get_Enabled(This,pEnabled)
-#define IFsrmPipelineModuleDefinition_put_Enabled(This,enabled) (This)->lpVtbl->put_Enabled(This,enabled)
-#define IFsrmPipelineModuleDefinition_get_NeedsFileContent(This,pNeedsFileContent) (This)->lpVtbl->get_NeedsFileContent(This,pNeedsFileContent)
-#define IFsrmPipelineModuleDefinition_put_NeedsFileContent(This,needsFileContent) (This)->lpVtbl->put_NeedsFileContent(This,needsFileContent)
-#define IFsrmPipelineModuleDefinition_get_Account(This,pRetrievalAccount) (This)->lpVtbl->get_Account(This,pRetrievalAccount)
-#define IFsrmPipelineModuleDefinition_put_Account(This,retrievalAccount) (This)->lpVtbl->put_Account(This,retrievalAccount)
-#define IFsrmPipelineModuleDefinition_get_SupportedExtensions(This,pSupportedExtensions) (This)->lpVtbl->get_SupportedExtensions(This,pSupportedExtensions)
-#define IFsrmPipelineModuleDefinition_put_SupportedExtensions(This,supportedExtensions) (This)->lpVtbl->put_SupportedExtensions(This,supportedExtensions)
-#define IFsrmPipelineModuleDefinition_get_Parameters(This,pParameters) (This)->lpVtbl->get_Parameters(This,pParameters)
-#define IFsrmPipelineModuleDefinition_put_Parameters(This,parameters) (This)->lpVtbl->put_Parameters(This,parameters)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmClassifierModuleDefinition
-#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_(IFsrmClassifierModuleDefinition,IFsrmPipelineModuleDefinition)
-{
-    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;
-
-    /* IFsrmPipelineModuleDefinition methods */
-    STDMETHOD_(HRESULT,get_ModuleClsid)(THIS_ BSTR *pModuleClsid) PURE;
-    STDMETHOD_(HRESULT,put_ModuleClsid)(THIS_ BSTR moduleClsid) PURE;
-    STDMETHOD_(HRESULT,get_Name)(THIS_ BSTR *pName) PURE;
-    STDMETHOD_(HRESULT,put_Name)(THIS_ BSTR name) PURE;
-    STDMETHOD_(HRESULT,get_Company)(THIS_ BSTR *pCompany) PURE;
-    STDMETHOD_(HRESULT,put_Company)(THIS_ BSTR company) PURE;
-    STDMETHOD_(HRESULT,get_Version)(THIS_ BSTR *version) PURE;
-    STDMETHOD_(HRESULT,put_Version)(THIS_ BSTR version) PURE;
-    STDMETHOD_(HRESULT,get_ModuleType)(THIS_ FsrmPipelineModuleType *pModuleType) PURE;
-    STDMETHOD_(HRESULT,get_Enabled)(THIS_ VARIANT_BOOL *pEnabled) PURE;
-    STDMETHOD_(HRESULT,put_Enabled)(THIS_ VARIANT_BOOL enabled) PURE;
-    STDMETHOD_(HRESULT,get_NeedsFileContent)(THIS_ VARIANT_BOOL *pNeedsFileContent) PURE;
-    STDMETHOD_(HRESULT,put_NeedsFileContent)(THIS_ VARIANT_BOOL needsFileContent) PURE;
-    STDMETHOD_(HRESULT,get_Account)(THIS_ FsrmAccountType *pRetrievalAccount) PURE;
-    STDMETHOD_(HRESULT,put_Account)(THIS_ FsrmAccountType retrievalAccount) PURE;
-    STDMETHOD_(HRESULT,get_SupportedExtensions)(THIS_ SAFEARRAY *pSupportedExtensions) PURE;
-    STDMETHOD_(HRESULT,put_SupportedExtensions)(THIS_ SAFEARRAY supportedExtensions) PURE;
-    STDMETHOD_(HRESULT,get_Parameters)(THIS_ SAFEARRAY *pParameters) PURE;
-    STDMETHOD_(HRESULT,put_Parameters)(THIS_ SAFEARRAY parameters) PURE;
-
-    /* IFsrmClassifierModuleDefinition methods */
-    STDMETHOD_(HRESULT,get_PropertiesAffected)(THIS_ SAFEARRAY *pPropertiesAffected) PURE;
-    STDMETHOD_(HRESULT,put_PropertiesAffected)(THIS_ SAFEARRAY propertiesAffected) PURE;
-    STDMETHOD_(HRESULT,get_PropertiesUsed)(THIS_ SAFEARRAY *pPropertiesAffected) PURE;
-    STDMETHOD_(HRESULT,put_PropertiesUsed)(THIS_ SAFEARRAY propertiesAffected) PURE;
-    STDMETHOD_(HRESULT,get_NeedsExplicitValue)(THIS_ VARIANT_BOOL *pNeedsExplicitValue) PURE;
-    STDMETHOD_(HRESULT,put_NeedsExplicitValue)(THIS_ VARIANT_BOOL needsExplicitValue) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IFsrmClassifierModuleDefinition_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IFsrmClassifierModuleDefinition_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IFsrmClassifierModuleDefinition_Release(This) (This)->lpVtbl->Release(This)
-#define IFsrmClassifierModuleDefinition_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
-#define IFsrmClassifierModuleDefinition_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
-#define IFsrmClassifierModuleDefinition_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
-#define IFsrmClassifierModuleDefinition_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
-#define IFsrmClassifierModuleDefinition_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
-#define IFsrmClassifierModuleDefinition_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
-#define IFsrmClassifierModuleDefinition_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
-#define IFsrmClassifierModuleDefinition_Delete() (This)->lpVtbl->Delete(This)
-#define IFsrmClassifierModuleDefinition_Commit() (This)->lpVtbl->Commit(This)
-#define IFsrmClassifierModuleDefinition_get_ModuleClsid(This,pModuleClsid) (This)->lpVtbl->get_ModuleClsid(This,pModuleClsid)
-#define IFsrmClassifierModuleDefinition_put_ModuleClsid(This,moduleClsid) (This)->lpVtbl->put_ModuleClsid(This,moduleClsid)
-#define IFsrmClassifierModuleDefinition_get_Name(This,pName) (This)->lpVtbl->get_Name(This,pName)
-#define IFsrmClassifierModuleDefinition_put_Name(This,name) (This)->lpVtbl->put_Name(This,name)
-#define IFsrmClassifierModuleDefinition_get_Company(This,pCompany) (This)->lpVtbl->get_Company(This,pCompany)
-#define IFsrmClassifierModuleDefinition_put_Company(This,company) (This)->lpVtbl->put_Company(This,company)
-#define IFsrmClassifierModuleDefinition_get_Version(This,version) (This)->lpVtbl->get_Version(This,version)
-#define IFsrmClassifierModuleDefinition_put_Version(This,version) (This)->lpVtbl->put_Version(This,version)
-#define IFsrmClassifierModuleDefinition_get_ModuleType(This,pModuleType) (This)->lpVtbl->get_ModuleType(This,pModuleType)
-#define IFsrmClassifierModuleDefinition_get_Enabled(This,pEnabled) (This)->lpVtbl->get_Enabled(This,pEnabled)
-#define IFsrmClassifierModuleDefinition_put_Enabled(This,enabled) (This)->lpVtbl->put_Enabled(This,enabled)
-#define IFsrmClassifierModuleDefinition_get_NeedsFileContent(This,pNeedsFileContent) (This)->lpVtbl->get_NeedsFileContent(This,pNeedsFileContent)
-#define IFsrmClassifierModuleDefinition_put_NeedsFileContent(This,needsFileContent) (This)->lpVtbl->put_NeedsFileContent(This,needsFileContent)
-#define IFsrmClassifierModuleDefinition_get_Account(This,pRetrievalAccount) (This)->lpVtbl->get_Account(This,pRetrievalAccount)
-#define IFsrmClassifierModuleDefinition_put_Account(This,retrievalAccount) (This)->lpVtbl->put_Account(This,retrievalAccount)
-#define IFsrmClassifierModuleDefinition_get_SupportedExtensions(This,pSupportedExtensions) (This)->lpVtbl->get_SupportedExtensions(This,pSupportedExtensions)
-#define IFsrmClassifierModuleDefinition_put_SupportedExtensions(This,supportedExtensions) (This)->lpVtbl->put_SupportedExtensions(This,supportedExtensions)
-#define IFsrmClassifierModuleDefinition_get_Parameters(This,pParameters) (This)->lpVtbl->get_Parameters(This,pParameters)
-#define IFsrmClassifierModuleDefinition_put_Parameters(This,parameters) (This)->lpVtbl->put_Parameters(This,parameters)
-#define IFsrmClassifierModuleDefinition_get_PropertiesAffected(This,pPropertiesAffected) (This)->lpVtbl->get_PropertiesAffected(This,pPropertiesAffected)
-#define IFsrmClassifierModuleDefinition_put_PropertiesAffected(This,propertiesAffected) (This)->lpVtbl->put_PropertiesAffected(This,propertiesAffected)
-#define IFsrmClassifierModuleDefinition_get_PropertiesUsed(This,pPropertiesAffected) (This)->lpVtbl->get_PropertiesUsed(This,pPropertiesAffected)
-#define IFsrmClassifierModuleDefinition_put_PropertiesUsed(This,propertiesAffected) (This)->lpVtbl->put_PropertiesUsed(This,propertiesAffected)
-#define IFsrmClassifierModuleDefinition_get_NeedsExplicitValue(This,pNeedsExplicitValue) (This)->lpVtbl->get_NeedsExplicitValue(This,pNeedsExplicitValue)
-#define IFsrmClassifierModuleDefinition_put_NeedsExplicitValue(This,needsExplicitValue) (This)->lpVtbl->put_NeedsExplicitValue(This,needsExplicitValue)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmPipelineModuleImplementation
-#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_(IFsrmPipelineModuleImplementation,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;
-
-    /* IFsrmPipelineModuleImplementation methods */
-    STDMETHOD_(HRESULT,OnLoad)(THIS_ IFsrmPipelineModuleDefinition *moduleDefinition,IFsrmPipelineModuleConnector **moduleConnector) PURE;
-    STDMETHOD_(HRESULT,OnUnload)(THIS) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IFsrmPipelineModuleImplementation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IFsrmPipelineModuleImplementation_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IFsrmPipelineModuleImplementation_Release(This) (This)->lpVtbl->Release(This)
-#define IFsrmPipelineModuleImplementation_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
-#define IFsrmPipelineModuleImplementation_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
-#define IFsrmPipelineModuleImplementation_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
-#define IFsrmPipelineModuleImplementation_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
-#define IFsrmPipelineModuleImplementation_OnLoad(This,moduleDefinition,moduleConnector) (This)->lpVtbl->OnLoad(This,moduleDefinition,moduleConnector)
-#define IFsrmPipelineModuleImplementation_OnUnload() (This)->lpVtbl->OnUnload(This)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmClassifierModuleImplementation
-#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_(IFsrmClassifierModuleImplementation,IFsrmPipelineModuleImplementation)
-{
-    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;
-
-    /* IFsrmPipelineModuleImplementation methods */
-    STDMETHOD_(HRESULT,OnLoad)(THIS_ IFsrmPipelineModuleDefinition *moduleDefinition,IFsrmPipelineModuleConnector **moduleConnector) PURE;
-    STDMETHOD_(HRESULT,OnUnload)(THIS) PURE;
-
-    /* IFsrmClassifierModuleImplementation methods */
-    STDMETHOD_(HRESULT,get_LastModified)(THIS_ VARIANT *pLastModified) PURE;
-    STDMETHOD_(HRESULT,UseRulesAndDefinitions)(THIS_ IFsrmCollection *rules,IFsrmCollection *propertyDefinitions) PURE;
-    STDMETHOD_(HRESULT,OnBeginFile)(THIS_ IFsrmPropertyBag *propertyBag,SAFEARRAY arrayRuleIds) PURE;
-    STDMETHOD_(HRESULT,DoesPropertyValueApply)(THIS_ BSTR property,BSTR value,VARIANT_BOOL *applyValue,FSRM_OBJECT_ID idRule,FSRM_OBJECT_ID idPropDef) PURE;
-    STDMETHOD_(HRESULT,GetPropertyValueToApply)(THIS_ BSTR property,BSTR *value,FSRM_OBJECT_ID idRule,FSRM_OBJECT_ID idPropDef) PURE;
-    STDMETHOD_(HRESULT,OnEndFile)(THIS) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IFsrmClassifierModuleImplementation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IFsrmClassifierModuleImplementation_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IFsrmClassifierModuleImplementation_Release(This) (This)->lpVtbl->Release(This)
-#define IFsrmClassifierModuleImplementation_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
-#define IFsrmClassifierModuleImplementation_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
-#define IFsrmClassifierModuleImplementation_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
-#define IFsrmClassifierModuleImplementation_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
-#define IFsrmClassifierModuleImplementation_OnLoad(This,moduleDefinition,moduleConnector) (This)->lpVtbl->OnLoad(This,moduleDefinition,moduleConnector)
-#define IFsrmClassifierModuleImplementation_OnUnload() (This)->lpVtbl->OnUnload(This)
-#define IFsrmClassifierModuleImplementation_get_LastModified(This,pLastModified) (This)->lpVtbl->get_LastModified(This,pLastModified)
-#define IFsrmClassifierModuleImplementation_UseRulesAndDefinitions(This,rules,propertyDefinitions) (This)->lpVtbl->UseRulesAndDefinitions(This,rules,propertyDefinitions)
-#define IFsrmClassifierModuleImplementation_OnBeginFile(This,propertyBag,arrayRuleIds) (This)->lpVtbl->OnBeginFile(This,propertyBag,arrayRuleIds)
-#define IFsrmClassifierModuleImplementation_DoesPropertyValueApply(This,property,value,applyValue,idRule,idPropDef) (This)->lpVtbl->DoesPropertyValueApply(This,property,value,applyValue,idRule,idPropDef)
-#define IFsrmClassifierModuleImplementation_GetPropertyValueToApply(This,property,value,idRule,idPropDef) (This)->lpVtbl->GetPropertyValueToApply(This,property,value,idRule,idPropDef)
-#define IFsrmClassifierModuleImplementation_OnEndFile() (This)->lpVtbl->OnEndFile(This)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmPipelineModuleConnector
-#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_(IFsrmPipelineModuleConnector,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;
-
-    /* IFsrmPipelineModuleConnector methods */
-    STDMETHOD_(HRESULT,get_ModuleImplementation)(THIS_ IFsrmPipelineModuleImplementation **pipelineModuleImplementation) PURE;
-    STDMETHOD_(HRESULT,get_ModuleName)(THIS_ BSTR *name) PURE;
-    STDMETHOD_(HRESULT,get_HostingUserAccount)(THIS_ BSTR *userAccount) PURE;
-    STDMETHOD_(HRESULT,get_HostingProcessPid)(THIS_ __LONG32 *pid) PURE;
-    STDMETHOD_(HRESULT,Bind)(THIS_ IFsrmPipelineModuleDefinition *moduleDefinition,IFsrmCollection *rules,IFsrmPipelineModuleImplementation *moduleImplementation) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IFsrmPipelineModuleConnector_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IFsrmPipelineModuleConnector_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IFsrmPipelineModuleConnector_Release(This) (This)->lpVtbl->Release(This)
-#define IFsrmPipelineModuleConnector_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
-#define IFsrmPipelineModuleConnector_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
-#define IFsrmPipelineModuleConnector_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
-#define IFsrmPipelineModuleConnector_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
-#define IFsrmPipelineModuleConnector_get_ModuleImplementation(This,pipelineModuleImplementation) (This)->lpVtbl->get_ModuleImplementation(This,pipelineModuleImplementation)
-#define IFsrmPipelineModuleConnector_get_ModuleName(This,name) (This)->lpVtbl->get_ModuleName(This,name)
-#define IFsrmPipelineModuleConnector_get_HostingUserAccount(This,userAccount) (This)->lpVtbl->get_HostingUserAccount(This,userAccount)
-#define IFsrmPipelineModuleConnector_get_HostingProcessPid(This,pid) (This)->lpVtbl->get_HostingProcessPid(This,pid)
-#define IFsrmPipelineModuleConnector_Bind(This,moduleDefinition,rules,moduleImplementation) (This)->lpVtbl->Bind(This,moduleDefinition,rules,moduleImplementation)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmProperty
-#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_(IFsrmProperty,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;
-
-    /* IFsrmProperty methods */
-    STDMETHOD_(HRESULT,get_Name)(THIS_ BSTR *pName) PURE;
-    STDMETHOD_(HRESULT,get_Value)(THIS_ BSTR *pValue) PURE;
-    STDMETHOD_(HRESULT,get_Sources)(THIS_ SAFEARRAY *pSources) PURE;
-    STDMETHOD_(HRESULT,get_PropertyFlags)(THIS_ __LONG32 *flags) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IFsrmProperty_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IFsrmProperty_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IFsrmProperty_Release(This) (This)->lpVtbl->Release(This)
-#define IFsrmProperty_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
-#define IFsrmProperty_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
-#define IFsrmProperty_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
-#define IFsrmProperty_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
-#define IFsrmProperty_get_Name(This,pName) (This)->lpVtbl->get_Name(This,pName)
-#define IFsrmProperty_get_Value(This,pValue) (This)->lpVtbl->get_Value(This,pValue)
-#define IFsrmProperty_get_Sources(This,pSources) (This)->lpVtbl->get_Sources(This,pSources)
-#define IFsrmProperty_get_PropertyFlags(This,flags) (This)->lpVtbl->get_PropertyFlags(This,flags)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmPropertyBag
-#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_(IFsrmPropertyBag,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;
-
-    /* IFsrmPropertyBag methods */
-    STDMETHOD_(HRESULT,get_Name)(THIS_ BSTR *name) PURE;
-    STDMETHOD_(HRESULT,get_RelativePath)(THIS_ BSTR *path) PURE;
-    STDMETHOD_(HRESULT,get_VolumeName)(THIS_ BSTR *volumeName) PURE;
-    STDMETHOD_(HRESULT,get_RelativeNamespaceRoot)(THIS_ BSTR *relativeNamespaceRoot) PURE;
-    STDMETHOD_(HRESULT,get_VolumeIndex)(THIS_ unsigned __LONG32 *volumeId) PURE;
-    STDMETHOD_(HRESULT,get_FileId)(THIS_ VARIANT *fileId) PURE;
-    STDMETHOD_(HRESULT,get_ParentDirectoryId)(THIS_ VARIANT *parentDirectoryId) PURE;
-    STDMETHOD_(HRESULT,get_Size)(THIS_ VARIANT *size) PURE;
-    STDMETHOD_(HRESULT,get_SizeAllocated)(THIS_ VARIANT *sizeAllocated) PURE;
-    STDMETHOD_(HRESULT,get_CreationTime)(THIS_ VARIANT *creationTime) PURE;
-    STDMETHOD_(HRESULT,get_LastAccessTime)(THIS_ VARIANT *creationTime) PURE;
-    STDMETHOD_(HRESULT,get_LastModificationTime)(THIS_ VARIANT *creationTime) PURE;
-    STDMETHOD_(HRESULT,get_Attributes)(THIS_ unsigned __LONG32 *attributes) PURE;
-    STDMETHOD_(HRESULT,get_OwnerSid)(THIS_ BSTR *ownerSid) PURE;
-    STDMETHOD_(HRESULT,get_FilePropertyNames)(THIS_ SAFEARRAY *filePropertyNames) PURE;
-    STDMETHOD_(HRESULT,get_Messages)(THIS_ SAFEARRAY *messages) PURE;
-    STDMETHOD_(HRESULT,get_PropertyBagFlags)(THIS_ unsigned __LONG32 flags) PURE;
-    STDMETHOD_(HRESULT,GetFileProperty)(THIS_ BSTR name,IFsrmProperty **fileProperty) PURE;
-    STDMETHOD_(HRESULT,SetFileProperty)(THIS_ BSTR name,BSTR value) PURE;
-    STDMETHOD_(HRESULT,AddMessage)(THIS_ BSTR message) PURE;
-    STDMETHOD_(HRESULT,GetFileStreamInterface)(THIS_ FsrmFileStreamingMode accessMode,FsrmFileStreamingInterfaceType interfaceType,VARIANT **streamInterface) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IFsrmPropertyBag_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IFsrmPropertyBag_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IFsrmPropertyBag_Release(This) (This)->lpVtbl->Release(This)
-#define IFsrmPropertyBag_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
-#define IFsrmPropertyBag_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
-#define IFsrmPropertyBag_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
-#define IFsrmPropertyBag_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
-#define IFsrmPropertyBag_get_Name(This,name) (This)->lpVtbl->get_Name(This,name)
-#define IFsrmPropertyBag_get_RelativePath(This,path) (This)->lpVtbl->get_RelativePath(This,path)
-#define IFsrmPropertyBag_get_VolumeName(This,volumeName) (This)->lpVtbl->get_VolumeName(This,volumeName)
-#define IFsrmPropertyBag_get_RelativeNamespaceRoot(This,relativeNamespaceRoot) (This)->lpVtbl->get_RelativeNamespaceRoot(This,relativeNamespaceRoot)
-#define IFsrmPropertyBag_get_VolumeIndex(This,volumeId) (This)->lpVtbl->get_VolumeIndex(This,volumeId)
-#define IFsrmPropertyBag_get_FileId(This,fileId) (This)->lpVtbl->get_FileId(This,fileId)
-#define IFsrmPropertyBag_get_ParentDirectoryId(This,parentDirectoryId) (This)->lpVtbl->get_ParentDirectoryId(This,parentDirectoryId)
-#define IFsrmPropertyBag_get_Size(This,size) (This)->lpVtbl->get_Size(This,size)
-#define IFsrmPropertyBag_get_SizeAllocated(This,sizeAllocated) (This)->lpVtbl->get_SizeAllocated(This,sizeAllocated)
-#define IFsrmPropertyBag_get_CreationTime(This,creationTime) (This)->lpVtbl->get_CreationTime(This,creationTime)
-#define IFsrmPropertyBag_get_LastAccessTime(This,creationTime) (This)->lpVtbl->get_LastAccessTime(This,creationTime)
-#define IFsrmPropertyBag_get_LastModificationTime(This,creationTime) (This)->lpVtbl->get_LastModificationTime(This,creationTime)
-#define IFsrmPropertyBag_get_Attributes(This,attributes) (This)->lpVtbl->get_Attributes(This,attributes)
-#define IFsrmPropertyBag_get_OwnerSid(This,ownerSid) (This)->lpVtbl->get_OwnerSid(This,ownerSid)
-#define IFsrmPropertyBag_get_FilePropertyNames(This,filePropertyNames) (This)->lpVtbl->get_FilePropertyNames(This,filePropertyNames)
-#define IFsrmPropertyBag_get_Messages(This,messages) (This)->lpVtbl->get_Messages(This,messages)
-#define IFsrmPropertyBag_get_PropertyBagFlags(This,flags) (This)->lpVtbl->get_PropertyBagFlags(This,flags)
-#define IFsrmPropertyBag_GetFileProperty(This,name,fileProperty) (This)->lpVtbl->GetFileProperty(This,name,fileProperty)
-#define IFsrmPropertyBag_SetFileProperty(This,name,value) (This)->lpVtbl->SetFileProperty(This,name,value)
-#define IFsrmPropertyBag_AddMessage(This,message) (This)->lpVtbl->AddMessage(This,message)
-#define IFsrmPropertyBag_GetFileStreamInterface(This,accessMode,interfaceType,streamInterface) (This)->lpVtbl->GetFileStreamInterface(This,accessMode,interfaceType,streamInterface)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmStorageModuleDefinition
-#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_(IFsrmStorageModuleDefinition,IFsrmPipelineModuleDefinition)
-{
-    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;
-
-    /* IFsrmPipelineModuleDefinition methods */
-    STDMETHOD_(HRESULT,get_ModuleClsid)(THIS_ BSTR *pModuleClsid) PURE;
-    STDMETHOD_(HRESULT,put_ModuleClsid)(THIS_ BSTR moduleClsid) PURE;
-    STDMETHOD_(HRESULT,get_Name)(THIS_ BSTR *pName) PURE;
-    STDMETHOD_(HRESULT,put_Name)(THIS_ BSTR name) PURE;
-    STDMETHOD_(HRESULT,get_Company)(THIS_ BSTR *pCompany) PURE;
-    STDMETHOD_(HRESULT,put_Company)(THIS_ BSTR company) PURE;
-    STDMETHOD_(HRESULT,get_Version)(THIS_ BSTR *version) PURE;
-    STDMETHOD_(HRESULT,put_Version)(THIS_ BSTR version) PURE;
-    STDMETHOD_(HRESULT,get_ModuleType)(THIS_ FsrmPipelineModuleType *pModuleType) PURE;
-    STDMETHOD_(HRESULT,get_Enabled)(THIS_ VARIANT_BOOL *pEnabled) PURE;
-    STDMETHOD_(HRESULT,put_Enabled)(THIS_ VARIANT_BOOL enabled) PURE;
-    STDMETHOD_(HRESULT,get_NeedsFileContent)(THIS_ VARIANT_BOOL *pNeedsFileContent) PURE;
-    STDMETHOD_(HRESULT,put_NeedsFileContent)(THIS_ VARIANT_BOOL needsFileContent) PURE;
-    STDMETHOD_(HRESULT,get_Account)(THIS_ FsrmAccountType *pRetrievalAccount) PURE;
-    STDMETHOD_(HRESULT,put_Account)(THIS_ FsrmAccountType retrievalAccount) PURE;
-    STDMETHOD_(HRESULT,get_SupportedExtensions)(THIS_ SAFEARRAY *pSupportedExtensions) PURE;
-    STDMETHOD_(HRESULT,put_SupportedExtensions)(THIS_ SAFEARRAY supportedExtensions) PURE;
-    STDMETHOD_(HRESULT,get_Parameters)(THIS_ SAFEARRAY *pParameters) PURE;
-    STDMETHOD_(HRESULT,put_Parameters)(THIS_ SAFEARRAY parameters) PURE;
-
-    /* IFsrmStorageModuleDefinition methods */
-    STDMETHOD_(HRESULT,get_Capabilities)(THIS_ FsrmStorageModuleCaps *pCapabilities) PURE;
-    STDMETHOD_(HRESULT,put_Capabilities)(THIS_ FsrmStorageModuleCaps capabilities) PURE;
-    STDMETHOD_(HRESULT,get_StorageType)(THIS_ FsrmStorageModuleType *pStorageType) PURE;
-    STDMETHOD_(HRESULT,put_StorageType)(THIS_ FsrmStorageModuleType storageType) PURE;
-    STDMETHOD_(HRESULT,get_UpdatesFileContent)(THIS_ VARIANT_BOOL *pUpdatesFileContent) PURE;
-    STDMETHOD_(HRESULT,put_UpdatesFileContent)(THIS_ VARIANT_BOOL updatesFileContent) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IFsrmStorageModuleDefinition_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IFsrmStorageModuleDefinition_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IFsrmStorageModuleDefinition_Release(This) (This)->lpVtbl->Release(This)
-#define IFsrmStorageModuleDefinition_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
-#define IFsrmStorageModuleDefinition_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
-#define IFsrmStorageModuleDefinition_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
-#define IFsrmStorageModuleDefinition_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
-#define IFsrmStorageModuleDefinition_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
-#define IFsrmStorageModuleDefinition_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
-#define IFsrmStorageModuleDefinition_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
-#define IFsrmStorageModuleDefinition_Delete() (This)->lpVtbl->Delete(This)
-#define IFsrmStorageModuleDefinition_Commit() (This)->lpVtbl->Commit(This)
-#define IFsrmStorageModuleDefinition_get_ModuleClsid(This,pModuleClsid) (This)->lpVtbl->get_ModuleClsid(This,pModuleClsid)
-#define IFsrmStorageModuleDefinition_put_ModuleClsid(This,moduleClsid) (This)->lpVtbl->put_ModuleClsid(This,moduleClsid)
-#define IFsrmStorageModuleDefinition_get_Name(This,pName) (This)->lpVtbl->get_Name(This,pName)
-#define IFsrmStorageModuleDefinition_put_Name(This,name) (This)->lpVtbl->put_Name(This,name)
-#define IFsrmStorageModuleDefinition_get_Company(This,pCompany) (This)->lpVtbl->get_Company(This,pCompany)
-#define IFsrmStorageModuleDefinition_put_Company(This,company) (This)->lpVtbl->put_Company(This,company)
-#define IFsrmStorageModuleDefinition_get_Version(This,version) (This)->lpVtbl->get_Version(This,version)
-#define IFsrmStorageModuleDefinition_put_Version(This,version) (This)->lpVtbl->put_Version(This,version)
-#define IFsrmStorageModuleDefinition_get_ModuleType(This,pModuleType) (This)->lpVtbl->get_ModuleType(This,pModuleType)
-#define IFsrmStorageModuleDefinition_get_Enabled(This,pEnabled) (This)->lpVtbl->get_Enabled(This,pEnabled)
-#define IFsrmStorageModuleDefinition_put_Enabled(This,enabled) (This)->lpVtbl->put_Enabled(This,enabled)
-#define IFsrmStorageModuleDefinition_get_NeedsFileContent(This,pNeedsFileContent) (This)->lpVtbl->get_NeedsFileContent(This,pNeedsFileContent)
-#define IFsrmStorageModuleDefinition_put_NeedsFileContent(This,needsFileContent) (This)->lpVtbl->put_NeedsFileContent(This,needsFileContent)
-#define IFsrmStorageModuleDefinition_get_Account(This,pRetrievalAccount) (This)->lpVtbl->get_Account(This,pRetrievalAccount)
-#define IFsrmStorageModuleDefinition_put_Account(This,retrievalAccount) (This)->lpVtbl->put_Account(This,retrievalAccount)
-#define IFsrmStorageModuleDefinition_get_SupportedExtensions(This,pSupportedExtensions) (This)->lpVtbl->get_SupportedExtensions(This,pSupportedExtensions)
-#define IFsrmStorageModuleDefinition_put_SupportedExtensions(This,supportedExtensions) (This)->lpVtbl->put_SupportedExtensions(This,supportedExtensions)
-#define IFsrmStorageModuleDefinition_get_Parameters(This,pParameters) (This)->lpVtbl->get_Parameters(This,pParameters)
-#define IFsrmStorageModuleDefinition_put_Parameters(This,parameters) (This)->lpVtbl->put_Parameters(This,parameters)
-#define IFsrmStorageModuleDefinition_get_Capabilities(This,pCapabilities) (This)->lpVtbl->get_Capabilities(This,pCapabilities)
-#define IFsrmStorageModuleDefinition_put_Capabilities(This,capabilities) (This)->lpVtbl->put_Capabilities(This,capabilities)
-#define IFsrmStorageModuleDefinition_get_StorageType(This,pStorageType) (This)->lpVtbl->get_StorageType(This,pStorageType)
-#define IFsrmStorageModuleDefinition_put_StorageType(This,storageType) (This)->lpVtbl->put_StorageType(This,storageType)
-#define IFsrmStorageModuleDefinition_get_UpdatesFileContent(This,pUpdatesFileContent) (This)->lpVtbl->get_UpdatesFileContent(This,pUpdatesFileContent)
-#define IFsrmStorageModuleDefinition_put_UpdatesFileContent(This,updatesFileContent) (This)->lpVtbl->put_UpdatesFileContent(This,updatesFileContent)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmStorageModuleImplementation
-#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_(IFsrmStorageModuleImplementation,IFsrmPipelineModuleImplementation)
-{
-    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;
-
-    /* IFsrmPipelineModuleImplementation methods */
-    STDMETHOD_(HRESULT,OnLoad)(THIS_ IFsrmPipelineModuleDefinition *moduleDefinition,IFsrmPipelineModuleConnector **moduleConnector) PURE;
-    STDMETHOD_(HRESULT,OnUnload)(THIS) PURE;
-
-    /* IFsrmStorageModuleImplementation methods */
-    STDMETHOD_(HRESULT,UseDefinitions)(THIS_ IFsrmCollection *propertyDefinitions) PURE;
-    STDMETHOD_(HRESULT,LoadProperties)(THIS_ IFsrmPropertyBag *propertyBag) PURE;
-    STDMETHOD_(HRESULT,SaveProperties)(THIS_ IFsrmPropertyBag *propertyBag) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IFsrmStorageModuleImplementation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IFsrmStorageModuleImplementation_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IFsrmStorageModuleImplementation_Release(This) (This)->lpVtbl->Release(This)
-#define IFsrmStorageModuleImplementation_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
-#define IFsrmStorageModuleImplementation_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
-#define IFsrmStorageModuleImplementation_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
-#define IFsrmStorageModuleImplementation_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
-#define IFsrmStorageModuleImplementation_OnLoad(This,moduleDefinition,moduleConnector) (This)->lpVtbl->OnLoad(This,moduleDefinition,moduleConnector)
-#define IFsrmStorageModuleImplementation_OnUnload() (This)->lpVtbl->OnUnload(This)
-#define IFsrmStorageModuleImplementation_UseDefinitions(This,propertyDefinitions) (This)->lpVtbl->UseDefinitions(This,propertyDefinitions)
-#define IFsrmStorageModuleImplementation_LoadProperties(This,propertyBag) (This)->lpVtbl->LoadProperties(This,propertyBag)
-#define IFsrmStorageModuleImplementation_SaveProperties(This,propertyBag) (This)->lpVtbl->SaveProperties(This,propertyBag)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmPropertyCondition
-#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_(IFsrmPropertyCondition,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;
-
-    /* IFsrmPropertyCondition methods */
-    STDMETHOD_(HRESULT,get_Name)(THIS_ BSTR *pName) PURE;
-    STDMETHOD_(HRESULT,put_Name)(THIS_ BSTR name) PURE;
-    STDMETHOD_(HRESULT,get_Type)(THIS_ FsrmPropertyConditionType *pType) PURE;
-    STDMETHOD_(HRESULT,put_Type)(THIS_ FsrmPropertyConditionType type) PURE;
-    STDMETHOD_(HRESULT,get_Value)(THIS_ BSTR *pValue) PURE;
-    STDMETHOD_(HRESULT,put_Value)(THIS_ BSTR value) PURE;
-    STDMETHOD_(HRESULT,Delete)(THIS) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#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)
-#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)
-#define IFsrmPropertyCondition_get_Name(This,pName) (This)->lpVtbl->get_Name(This,pName)
-#define IFsrmPropertyCondition_put_Name(This,name) (This)->lpVtbl->put_Name(This,name)
-#define IFsrmPropertyCondition_get_Type(This,pType) (This)->lpVtbl->get_Type(This,pType)
-#define IFsrmPropertyCondition_put_Type(This,type) (This)->lpVtbl->put_Type(This,type)
-#define IFsrmPropertyCondition_get_Value(This,pValue) (This)->lpVtbl->get_Value(This,pValue)
-#define IFsrmPropertyCondition_put_Value(This,value) (This)->lpVtbl->put_Value(This,value)
-#define IFsrmPropertyCondition_Delete() (This)->lpVtbl->Delete(This)
-#endif /*COBJMACROS*/
-
-#undef  INTERFACE
-#define INTERFACE IFsrmPropertyDefinition
-#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_(IFsrmPropertyDefinition,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;
-
-    /* IFsrmPropertyDefinition methods */
-    STDMETHOD_(HRESULT,get_Name)(THIS_ BSTR *pName) PURE;
-    STDMETHOD_(HRESULT,put_Name)(THIS_ BSTR name) PURE;
-    STDMETHOD_(HRESULT,get_Type)(THIS_ FsrmPropertyDefinitionType *pType) PURE;
-    STDMETHOD_(HRESULT,put_Type)(THIS_ FsrmPropertyDefinitionType type) PURE;
-    STDMETHOD_(HRESULT,get_PossibleValues)(THIS_ SAFEARRAY *pPossibleValues) PURE;
-    STDMETHOD_(HRESULT,put_PossibleValues)(THIS_ SAFEARRAY possibleValues) PURE;
-    STDMETHOD_(HRESULT,get_ValueDescriptions)(THIS_ SAFEARRAY *pPossibleValues) PURE;
-    STDMETHOD_(HRESULT,put_ValueDescriptions)(THIS_ SAFEARRAY possibleValues) PURE;
-    STDMETHOD_(HRESULT,get_Parameters)(THIS_ SAFEARRAY pParameters) PURE;
-    STDMETHOD_(HRESULT,put_Parameters)(THIS_ SAFEARRAY parameters) PURE;
-
-    END_INTERFACE
-};
-#ifdef COBJMACROS
-#define IFsrmPropertyDefinition_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
-#define IFsrmPropertyDefinition_AddRef(This) (This)->lpVtbl->AddRef(This)
-#define IFsrmPropertyDefinition_Release(This) (This)->lpVtbl->Release(This)
-#define IFsrmPropertyDefinition_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
-#define IFsrmPropertyDefinition_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
-#define IFsrmPropertyDefinition_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
-#define IFsrmPropertyDefinition_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
-#define IFsrmPropertyDefinition_get_Id(This,id) (This)->lpVtbl->get_Id(This,id)
-#define IFsrmPropertyDefinition_get_Description(This,description) (This)->lpVtbl->get_Description(This,description)
-#define IFsrmPropertyDefinition_put_Description(This,description) (This)->lpVtbl->put_Description(This,description)
-#define IFsrmPropertyDefinition_Delete() (This)->lpVtbl->Delete(This)
-#define IFsrmPropertyDefinition_Commit() (This)->lpVtbl->Commit(This)
-#define IFsrmPropertyDefinition_get_Name(This,pName) (This)->lpVtbl->get_Name(This,pName)
-#define IFsrmPropertyDefinition_put_Name(This,name) (This)->lpVtbl->put_Name(This,name)
-#define IFsrmPropertyDefinition_get_Type(This,pType) (This)->lpVtbl->get_Type(This,pType)
-#define IFsrmPropertyDefinition_put_Type(This,type) (This)->lpVtbl->put_Type(This,type)
-#define IFsrmPropertyDefinition_get_PossibleValues(This,pPossibleValues) (This)->lpVtbl->get_PossibleValues(This,pPossibleValues)
-#define IFsrmPropertyDefinition_put_PossibleValues(This,possibleValues) (This)->lpVtbl->put_PossibleValues(This,possibleValues)
-#define IFsrmPropertyDefinition_get_ValueDescriptions(This,pPossibleValues) (This)->lpVtbl->get_ValueDescriptions(This,pPossibleValues)
-#define IFsrmPropertyDefinition_put_ValueDescriptions(This,possibleValues) (This)->lpVtbl->put_ValueDescriptions(This,possibleValues)
-#define IFsrmPropertyDefinition_get_Parameters(This,pParameters) (This)->lpVtbl->get_Parameters(This,pParameters)
-#define IFsrmPropertyDefinition_put_Parameters(This,parameters) (This)->lpVtbl->put_Parameters(This,parameters)
-#endif /*COBJMACROS*/
-
-#endif /*(_WIN32_WINNT >= 0x0601)*/
-#include <fsrmquota.h>
-#include <fsrmscreen.h>
-#include <fsrmreports.h>
-#endif /*_INC_FSRM*/
+#endif /* __fsrm_h__ */
diff --git a/mingw-w64-headers/include/fsrm.idl b/mingw-w64-headers/include/fsrm.idl
new file mode 100644
index 0000000..ec51c24
--- /dev/null
+++ b/mingw-w64-headers/include/fsrm.idl
@@ -0,0 +1,201 @@
+/**
+ * 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";
+
+cpp_quote("#include <winapifamily.h>")
+cpp_quote("")
+cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)")
+
+interface IFsrmObject;
+interface IFsrmCollection;
+interface IFsrmMutableCollection;
+interface IFsrmCommittableCollection;
+interface IFsrmAction;
+interface IFsrmActionEmail;
+interface IFsrmActionReport;
+interface IFsrmActionEventLog;
+interface IFsrmActionCommand;
+interface IFsrmSetting;
+interface IFsrmPathMapper;
+interface IFsrmExportImport;
+
+const DISPID FSRM_DISPID_FEATURE_MASK = 0xf000000;
+const DISPID FSRM_DISPID_INTERFACE_A_MASK = 0xf00000;
+const DISPID FSRM_DISPID_INTERFACE_B_MASK = 0xf0000;
+const DISPID FSRM_DISPID_INTERFACE_C_MASK = 0xf000;
+const DISPID FSRM_DISPID_INTERFACE_D_MASK = 0xf00;
+const DISPID FSRM_DISPID_INTERFACE_MASK = 0xffff00;
+const DISPID FSRM_DISPID_IS_PROPERTY = 0x80;
+const DISPID FSRM_DISPID_METHOD_NUM_MASK = 0x7f;
+const DISPID FSRM_DISPID_METHOD_MASK = 0xff;
+
+const DISPID FSRM_DISPID_FEATURE_GENERAL = 0x1000000;
+const DISPID FSRM_DISPID_FEATURE_QUOTA = 0x2000000;
+const DISPID FSRM_DISPID_FEATURE_FILESCREEN = 0x3000000;
+const DISPID FSRM_DISPID_FEATURE_REPORTS = 0x4000000;
+const DISPID FSRM_DISPID_FEATURE_CLASSIFICATION = 0x5000000;
+const DISPID FSRM_DISPID_FEATURE_PIPELINE = 0x6000000;
+
+const DISPID FSRM_DISPID_OBJECT = FSRM_DISPID_FEATURE_GENERAL | 0x100000;
+const DISPID FSRM_DISPID_COLLECTION = FSRM_DISPID_FEATURE_GENERAL | 0x200000;
+const DISPID FSRM_DISPID_COLLECTION_MUTABLE = FSRM_DISPID_COLLECTION | 0x10000;
+const DISPID FSRM_DISPID_COLLECTION_COMMITTABLE = FSRM_DISPID_COLLECTION_MUTABLE | 0x1000;
+const DISPID FSRM_DISPID_ACTION = FSRM_DISPID_FEATURE_GENERAL | 0x300000;
+const DISPID FSRM_DISPID_ACTION_EMAIL = FSRM_DISPID_ACTION | 0x10000;
+const DISPID FSRM_DISPID_ACTION_REPORT = FSRM_DISPID_ACTION | 0x20000;
+const DISPID FSRM_DISPID_ACTION_EVENTLOG = FSRM_DISPID_ACTION | 0x30000;
+const DISPID FSRM_DISPID_ACTION_COMMAND = FSRM_DISPID_ACTION | 0x40000;
+const DISPID FSRM_DISPID_ACTION_EMAIL2 = FSRM_DISPID_ACTION | 0x50000;
+const DISPID FSRM_DISPID_SETTING = FSRM_DISPID_FEATURE_GENERAL | 0x400000;
+const DISPID FSRM_DISPID_PATHMAPPER = FSRM_DISPID_FEATURE_GENERAL | 0x500000;
+const DISPID FSRM_DISPID_EXPORTIMPORT = FSRM_DISPID_FEATURE_GENERAL | 0x600000;
+const DISPID FSRM_DISPID_DERIVEDOBJECTSRESULT = FSRM_DISPID_FEATURE_GENERAL | 0x700000;
+const DISPID FSRM_DISPID_ADR = FSRM_DISPID_FEATURE_GENERAL | 0x800000;
+
+[object, uuid (96deb3b5-8b91-4a2a-9d93-80a35d8aa847), dual, hidden, nonextensible, pointer_default (unique)]
+interface IFsrmCommittableCollection : IFsrmMutableCollection {
+  [id (FSRM_DISPID_COLLECTION_COMMITTABLE | 0x1)] HRESULT Commit ([in] FsrmCommitOptions options,[out, retval] IFsrmCollection **results);
+};
+
+[object, uuid (40002314-590b-45a5-8e1b-8c05da527e52), dual, oleautomation, pointer_default (unique)]
+interface IFsrmAccessDeniedRemediationClient : IDispatch {
+  [id (FSRM_DISPID_ADR | 0x01)] HRESULT Show ([in] ULONG_PTR parentWnd,[in] BSTR accessPath,[in] AdrClientErrorType errorType,[in] long flags,[in, defaultvalue (L"")] BSTR windowTitle,[in, defaultvalue (L"")] BSTR windowMessage,[out, retval] long *result);
+};
+
+[object, uuid (6cd6408a-ae60-463b-9ef1-e117534d69dc), dual, pointer_default (unique)]
+interface IFsrmAction : IDispatch {
+  [propget, id (FSRM_DISPID_ACTION | 0x81)] HRESULT Id ([out, retval] FSRM_OBJECT_ID *id);
+  [propget, id (FSRM_DISPID_ACTION | 0x82)] HRESULT ActionType ([out, retval] FsrmActionType *actionType);
+  [propget, id (FSRM_DISPID_ACTION | 0x83)] HRESULT RunLimitInterval ([out, retval] long *minutes);
+  [propput, id (FSRM_DISPID_ACTION | 0x83)] HRESULT RunLimitInterval ([in] long minutes);
+  [id (FSRM_DISPID_ACTION | 0x1)] HRESULT Delete ();
+};
+
+[object, uuid (12937789-e247-4917-9c20-f3ee9c7ee783), dual, pointer_default (unique)]
+interface IFsrmActionCommand : IFsrmAction {
+  [propget, id (FSRM_DISPID_ACTION_COMMAND | 0x81)] HRESULT ExecutablePath ([out, retval] BSTR *executablePath);
+  [propput, id (FSRM_DISPID_ACTION_COMMAND | 0x81)] HRESULT ExecutablePath ([in] BSTR executablePath);
+  [propget, id (FSRM_DISPID_ACTION_COMMAND | 0x82)] HRESULT Arguments ([out, retval] BSTR *arguments);
+  [propput, id (FSRM_DISPID_ACTION_COMMAND | 0x82)] HRESULT Arguments ([in] BSTR arguments);
+  [propget, id (FSRM_DISPID_ACTION_COMMAND | 0x83)] HRESULT Account ([out, retval] FsrmAccountType *account);
+  [propput, id (FSRM_DISPID_ACTION_COMMAND | 0x83)] HRESULT Account ([in] FsrmAccountType account);
+  [propget, id (FSRM_DISPID_ACTION_COMMAND | 0x84)] HRESULT WorkingDirectory ([out, retval] BSTR *workingDirectory);
+  [propput, id (FSRM_DISPID_ACTION_COMMAND | 0x84)] HRESULT WorkingDirectory ([in] BSTR workingDirectory);
+  [propget, id (FSRM_DISPID_ACTION_COMMAND | 0x85)] HRESULT MonitorCommand ([out, retval] VARIANT_BOOL *monitorCommand);
+  [propput, id (FSRM_DISPID_ACTION_COMMAND | 0x85)] HRESULT MonitorCommand ([in] VARIANT_BOOL monitorCommand);
+  [propget, id (FSRM_DISPID_ACTION_COMMAND | 0x86)] HRESULT KillTimeOut ([out, retval] long *minutes);
+  [propput, id (FSRM_DISPID_ACTION_COMMAND | 0x86)] HRESULT KillTimeOut ([in] long minutes);
+  [propget, id (FSRM_DISPID_ACTION_COMMAND | 0x87)] HRESULT LogResult ([out, retval] VARIANT_BOOL *logResults);
+  [propput, id (FSRM_DISPID_ACTION_COMMAND | 0x87)] HRESULT LogResult ([in] VARIANT_BOOL logResults);
+};
+
+[object, uuid (4c8f96c3-5d94-4f37-a4f4-f56ab463546f), dual, pointer_default (unique)]
+interface IFsrmActionEventLog : IFsrmAction {
+  [propget, id (FSRM_DISPID_ACTION_EVENTLOG | 0x81)] HRESULT EventType ([out, retval] FsrmEventType *eventType);
+  [propput, id (FSRM_DISPID_ACTION_EVENTLOG | 0x81)] HRESULT EventType ([in] FsrmEventType eventType);
+  [propget, id (FSRM_DISPID_ACTION_EVENTLOG | 0x82)] HRESULT MessageText ([out, retval] BSTR *messageText);
+  [propput, id (FSRM_DISPID_ACTION_EVENTLOG | 0x82)] HRESULT MessageText ([in] BSTR messageText);
+};
+
+[object, uuid (2dbe63c4-b340-48a0-a5b0-158e07fc567e), dual, pointer_default (unique)]
+interface IFsrmActionReport : IFsrmAction {
+  [propget, id (FSRM_DISPID_ACTION_REPORT | 0x81)] HRESULT ReportTypes ([out, retval] SAFEARRAY (VARIANT) *reportTypes);
+  [propput, id (FSRM_DISPID_ACTION_REPORT | 0x81)] HRESULT ReportTypes ([in] SAFEARRAY (VARIANT) reportTypes);
+  [propget, id (FSRM_DISPID_ACTION_REPORT | 0x82)] HRESULT MailTo ([out, retval] BSTR *mailTo);
+  [propput, id (FSRM_DISPID_ACTION_REPORT | 0x82)] HRESULT MailTo ([in] BSTR mailTo);
+};
+
+[object, uuid (f76fbf3b-8ddd-4b42-b05a-cb1c3ff1fee8), dual, hidden, nonextensible, pointer_default (unique)]
+interface IFsrmCollection : IDispatch {
+  [propget, id (DISPID_NEWENUM), restricted] HRESULT _NewEnum ([out, retval] IUnknown **unknown);
+  [propget, id (DISPID_VALUE)] HRESULT Item ([in] long index,[out, retval] VARIANT *item);
+  [propget, id (FSRM_DISPID_COLLECTION | 0x81)] HRESULT Count ([out, retval] long *count);
+  [propget, id (FSRM_DISPID_COLLECTION | 0x82)] HRESULT State ([out, retval] FsrmCollectionState *state);
+  [id (FSRM_DISPID_COLLECTION | 0x1)] HRESULT Cancel ();
+  [id (FSRM_DISPID_COLLECTION | 0x2)] HRESULT WaitForCompletion ([in] long waitSeconds,[out, retval] VARIANT_BOOL *completed);
+  [id (FSRM_DISPID_COLLECTION | 0x3)] HRESULT GetById ([in] FSRM_OBJECT_ID id,[out, retval] VARIANT *entry);
+};
+
+[object, uuid (39322a2d-38ee-4d0d-8095-421a80849a82), dual, pointer_default (unique)]
+interface IFsrmDerivedObjectsResult : IDispatch {
+  [propget, id (FSRM_DISPID_DERIVEDOBJECTSRESULT | 0x81)] HRESULT DerivedObjects ([out, retval] IFsrmCollection **derivedObjects);
+  [propget, id (FSRM_DISPID_DERIVEDOBJECTSRESULT | 0x82)] HRESULT Results ([out, retval] IFsrmCollection **results);
+};
+
+[object, uuid (efcb0ab1-16c4-4a79-812c-725614c3306b), dual, pointer_default (unique)]
+interface IFsrmExportImport : IDispatch {
+  [id (FSRM_DISPID_EXPORTIMPORT | 0x1)] HRESULT ExportFileGroups ([in] BSTR filePath,[in, defaultvalue (NULL)] VARIANT *fileGroupNamesSafeArray,[in, defaultvalue (L"")] BSTR remoteHost);
+  [id (FSRM_DISPID_EXPORTIMPORT | 0x2)] HRESULT ImportFileGroups ([in] BSTR filePath,[in, defaultvalue (NULL)] VARIANT *fileGroupNamesSafeArray,[in, defaultvalue (L"")] BSTR remoteHost,[out, retval] IFsrmCommittableCollection **fileGroups);
+  [id (FSRM_DISPID_EXPORTIMPORT | 0x3)] HRESULT ExportFileScreenTemplates ([in] BSTR filePath,[in, defaultvalue (NULL)] VARIANT *templateNamesSafeArray,[in, defaultvalue (L"")] BSTR remoteHost);
+  [id (FSRM_DISPID_EXPORTIMPORT | 0x4)] HRESULT ImportFileScreenTemplates ([in] BSTR filePath,[in, defaultvalue (NULL)] VARIANT *templateNamesSafeArray,[in, defaultvalue (L"")] BSTR remoteHost,[out, retval] IFsrmCommittableCollection **templates);
+  [id (FSRM_DISPID_EXPORTIMPORT | 0x5)] HRESULT ExportQuotaTemplates ([in] BSTR filePath,[in, defaultvalue (NULL)] VARIANT *templateNamesSafeArray,[in, defaultvalue (L"")] BSTR remoteHost);
+  [id (FSRM_DISPID_EXPORTIMPORT | 0x6)] HRESULT ImportQuotaTemplates ([in] BSTR filePath,[in, defaultvalue (NULL)] VARIANT *templateNamesSafeArray,[in, defaultvalue (L"")] BSTR remoteHost,[out, retval] IFsrmCommittableCollection **templates);
+};
+
+[object, uuid (22bcef93-4a3f-4183-89f9-2f8b8a628aee), dual, hidden, nonextensible, pointer_default (unique)]
+interface IFsrmObject : IDispatch {
+  [propget, id (FSRM_DISPID_OBJECT | 0x81)] HRESULT Id ([out, retval] FSRM_OBJECT_ID *id);
+  [propget, id (FSRM_DISPID_OBJECT | 0x82)] HRESULT Description ([out, retval] BSTR *description);
+  [propput, id (FSRM_DISPID_OBJECT | 0x82)] HRESULT Description ([in] BSTR description);
+  [id (FSRM_DISPID_OBJECT | 0x1)] HRESULT Delete ();
+  [id (FSRM_DISPID_OBJECT | 0x2)] HRESULT Commit ();
+};
+
+[object, uuid (6f4dbfff-6920-4821-a6c3-b7e94c1fd60c), dual, pointer_default (unique)]
+interface IFsrmPathMapper : IDispatch {
+  [id (FSRM_DISPID_PATHMAPPER | 0x01)] HRESULT GetSharePathsForLocalPath ([in] BSTR localPath,[out, retval] SAFEARRAY (VARIANT) *sharePaths);
+};
+
+[object, uuid (f411d4fd-14be-4260-8c40-03b7c95e608a), dual, pointer_default (unique)]
+interface IFsrmSetting : IDispatch {
+  [propget, id (FSRM_DISPID_SETTING | 0x81)] HRESULT SmtpServer ([out, retval] BSTR *smtpServer);
+  [propput, id (FSRM_DISPID_SETTING | 0x81)] HRESULT SmtpServer ([in] BSTR smtpServer);
+  [propget, id (FSRM_DISPID_SETTING | 0x82)] HRESULT MailFrom ([out, retval] BSTR *mailFrom);
+  [propput, id (FSRM_DISPID_SETTING | 0x82)] HRESULT MailFrom ([in] BSTR mailFrom);
+  [propget, id (FSRM_DISPID_SETTING | 0x83)] HRESULT AdminEmail ([out, retval] BSTR *adminEmail);
+  [propput, id (FSRM_DISPID_SETTING | 0x83)] HRESULT AdminEmail ([in] BSTR adminEmail);
+  [propget, id (FSRM_DISPID_SETTING | 0x84)] HRESULT DisableCommandLine ([out, retval] VARIANT_BOOL *disableCommandLine);
+  [propput, id (FSRM_DISPID_SETTING | 0x84)] HRESULT DisableCommandLine ([in] VARIANT_BOOL disableCommandLine);
+  [propget, id (FSRM_DISPID_SETTING | 0x85)] HRESULT EnableScreeningAudit ([out, retval] VARIANT_BOOL *enableScreeningAudit);
+  [propput, id (FSRM_DISPID_SETTING | 0x85)] HRESULT EnableScreeningAudit ([in] VARIANT_BOOL enableScreeningAudit);
+  [id (FSRM_DISPID_SETTING | 0x01)] HRESULT EmailTest ([in] BSTR mailTo);
+  [id (FSRM_DISPID_SETTING | 0x02)] HRESULT SetActionRunLimitInterval ([in] FsrmActionType actionType,[in] long delayTimeMinutes);
+  [id (FSRM_DISPID_SETTING | 0x03)] HRESULT GetActionRunLimitInterval ([in] FsrmActionType actionType,[out, retval] long *delayTimeMinutes);
+};
+
+[object, uuid (d646567d-26ae-4caa-9f84-4e0aad207fca), dual, pointer_default (unique)]
+interface IFsrmActionEmail : IFsrmAction {
+  [propget, id (FSRM_DISPID_ACTION_EMAIL | 0x81)] HRESULT MailFrom ([out, retval] BSTR *mailFrom);
+  [propput, id (FSRM_DISPID_ACTION_EMAIL | 0x81)] HRESULT MailFrom ([in] BSTR mailFrom);
+  [propget, id (FSRM_DISPID_ACTION_EMAIL | 0x82)] HRESULT MailReplyTo ([out, retval] BSTR *mailReplyTo);
+  [propput, id (FSRM_DISPID_ACTION_EMAIL | 0x82)] HRESULT MailReplyTo ([in] BSTR mailReplyTo);
+  [propget, id (FSRM_DISPID_ACTION_EMAIL | 0x83)] HRESULT MailTo ([out, retval] BSTR *mailTo);
+  [propput, id (FSRM_DISPID_ACTION_EMAIL | 0x83)] HRESULT MailTo ([in] BSTR mailTo);
+  [propget, id (FSRM_DISPID_ACTION_EMAIL | 0x84)] HRESULT MailCc ([out, retval] BSTR *mailCc);
+  [propput, id (FSRM_DISPID_ACTION_EMAIL | 0x84)] HRESULT MailCc ([in] BSTR mailCc);
+  [propget, id (FSRM_DISPID_ACTION_EMAIL | 0x85)] HRESULT MailBcc ([out, retval] BSTR *mailBcc);
+  [propput, id (FSRM_DISPID_ACTION_EMAIL | 0x85)] HRESULT MailBcc ([in] BSTR mailBcc);
+  [propget, id (FSRM_DISPID_ACTION_EMAIL | 0x86)] HRESULT MailSubject ([out, retval] BSTR *mailSubject);
+  [propput, id (FSRM_DISPID_ACTION_EMAIL | 0x86)] HRESULT MailSubject ([in] BSTR mailSubject);
+  [propget, id (FSRM_DISPID_ACTION_EMAIL | 0x87)] HRESULT MessageText ([out, retval] BSTR *messageText);
+  [propput, id (FSRM_DISPID_ACTION_EMAIL | 0x87)] HRESULT MessageText ([in] BSTR messageText);
+};
+
+[object, uuid (8276702f-2532-4839-89bf-4872609a2ea4), dual, pointer_default (unique)]
+interface IFsrmActionEmail2 : IFsrmActionEmail {
+  [propget, id (FSRM_DISPID_ACTION_EMAIL2 | 0x81)] HRESULT AttachmentFileListSize ([out, retval] long *attachmentFileListSize);
+  [propput, id (FSRM_DISPID_ACTION_EMAIL2 | 0x81)] HRESULT AttachmentFileListSize ([in] long attachmentFileListSize);
+};
+
+[object, uuid (1bb617b8-3886-49dc-af82-a6c90fa35dda), dual, hidden, nonextensible, pointer_default (unique)]
+interface IFsrmMutableCollection : IFsrmCollection {
+  [id (FSRM_DISPID_COLLECTION_MUTABLE | 0x1)] HRESULT Add ([in] VARIANT item);
+  [id (FSRM_DISPID_COLLECTION_MUTABLE | 0x2)] HRESULT Remove ([in] long index);
+  [id (FSRM_DISPID_COLLECTION_MUTABLE | 0x3)] HRESULT RemoveById ([in] FSRM_OBJECT_ID id);
+  [id (FSRM_DISPID_COLLECTION_MUTABLE | 0x4)] HRESULT Clone ([out, retval] IFsrmMutableCollection **collection);
+};
+cpp_quote("#endif")
diff --git a/mingw-w64-headers/include/fsrmenums.h b/mingw-w64-headers/include/fsrmenums.h
index 47fe5cb..2a4f9bd 100644
--- a/mingw-w64-headers/include/fsrmenums.h
+++ b/mingw-w64-headers/include/fsrmenums.h
@@ -1,260 +1,330 @@
-/**
- * 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.
- */
-#ifndef _INC_FSRMENUMS
-#define _INC_FSRMENUMS
-#if (_WIN32_WINNT >= 0x0600)
+/*** Autogenerated by WIDL 1.6 from fsrmenums.idl - Do not edit ***/
+
+#ifndef __REQUIRED_RPCNDR_H_VERSION__
+#define __REQUIRED_RPCNDR_H_VERSION__ 475
+#endif
+
+#include <rpc.h>
+#include <rpcndr.h>
+
+#ifndef COM_NO_WINDOWS_H
+#include <windows.h>
+#include <ole2.h>
+#endif
+
+#ifndef __fsrmenums_h__
+#define __fsrmenums_h__
+
+/* Forward declarations */
+
+/* Headers for imported files */
+
+#include <oaidl.h>
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
+#include <winapifamily.h>
+
+#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
 typedef enum _FsrmAccountType {
-  FsrmAccountType_Unknown          = 0,
-  FsrmAccountType_NetworkService   = 1,
-  FsrmAccountType_LocalService     = 2,
-  FsrmAccountType_LocalSystem      = 3,
-  FsrmAccountType_InProc           = 4,
-  FsrmAccountType_External         = 5 
+    FsrmAccountType_Unknown = 0,
+    FsrmAccountType_NetworkService = 1,
+    FsrmAccountType_LocalService = 2,
+    FsrmAccountType_LocalSystem = 3,
+    FsrmAccountType_InProc = 4,
+    FsrmAccountType_External = 5,
+    FsrmAccountType_Automatic = 500
 } FsrmAccountType;
-
 typedef enum _FsrmActionType {
-  FsrmActionType_Unknown    = 0,
-  FsrmActionType_EventLog   = 1,
-  FsrmActionType_Email      = 2,
-  FsrmActionType_Command    = 3,
-  FsrmActionType_Report     = 4 
+    FsrmActionType_Unknown = 0,
+    FsrmActionType_EventLog = 1,
+    FsrmActionType_Email = 2,
+    FsrmActionType_Command = 3,
+    FsrmActionType_Report = 4
 } FsrmActionType;
-
+typedef enum _AdrClientDisplayFlags {
+    AdrClientDisplayFlags_AllowEmailRequests = 0x1,
+    AdrClientDisplayFlags_ShowDeviceTroubleshooting = 0x2
+} AdrClientDisplayFlags;
+typedef enum _AdrClientErrorType {
+    AdrClientErrorType_Unknown = 0,
+    AdrClientErrorType_AccessDenied = 1,
+    AdrClientErrorType_FileNotFound = 2
+} AdrClientErrorType;
+typedef enum _AdrClientFlags {
+    AdrClientFlags_None = 0x0,
+    AdrClientFlags_FailForLocalPaths = 0x1,
+    AdrClientFlags_FailIfNotSupportedByServer = 0x2,
+    AdrClientFlags_FailIfNotDomainJoined = 0x4
+} AdrClientFlags;
+typedef enum _AdrEmailFlags {
+    AdrEmailFlags_PutDataOwnerOnToLine = 0x1,
+    AdrEmailFlags_PutAdminOnToLine = 0x2,
+    AdrEmailFlags_IncludeDeviceClaims = 0x4,
+    AdrEmailFlags_IncludeUserInfo = 0x8,
+    AdrEmailFlags_GenerateEventLog = 0x10
+} AdrEmailFlags;
 typedef enum _FsrmClassificationLoggingFlags {
-  FsrmClassificationLoggingFlags_None                         = 0x00000000,
-  FsrmClassificationLoggingFlags_ClassificationsInLogFile     = 0x00000001,
-  FsrmClassificationLoggingFlags_ErrorsInLogFile              = 0x00000002,
-  FsrmClassificationLoggingFlags_ClassificationsInSystemLog   = 0x00000004,
-  FsrmClassificationLoggingFlags_ErrorsInSystemLog            = 0x00000008 
+    FsrmClassificationLoggingFlags_None = 0x0,
+    FsrmClassificationLoggingFlags_ClassificationsInLogFile = 0x1,
+    FsrmClassificationLoggingFlags_ErrorsInLogFile = 0x2,
+    FsrmClassificationLoggingFlags_ClassificationsInSystemLog = 0x4,
+    FsrmClassificationLoggingFlags_ErrorsInSystemLog = 0x8
 } FsrmClassificationLoggingFlags;
-
 typedef enum _FsrmCollectionState {
-  FsrmCollectionState_Fetching     = 1,
-  FsrmCollectionState_Committing   = 2,
-  FsrmCollectionState_Complete     = 3,
-  FsrmCollectionState_Cancelled    = 4 
+    FsrmCollectionState_Fetching = 1,
+    FsrmCollectionState_Committing = 2,
+    FsrmCollectionState_Complete = 3,
+    FsrmCollectionState_Cancelled = 4
 } FsrmCollectionState;
-
 typedef enum _FsrmCommitOptions {
-  FsrmCommitOptions_None           = 0x00000000,
-  FsrmCommitOptions_Asynchronous   = 0x00000001 
+    FsrmCommitOptions_None = 0x0,
+    FsrmCommitOptions_Asynchronous = 0x1
 } FsrmCommitOptions;
-
 typedef enum _FsrmEnumOptions {
-  FsrmEnumOptions_None                  = 0x00000000,
-  FsrmEnumOptions_Asynchronous          = 0x00000001,
-  FsrmEnumOptions_CheckRecycleBin       = 0x00000002,
-  FsrmEnumOptions_IncludeClusterNodes   = 0x00000004 
+    FsrmEnumOptions_None = 0x0,
+    FsrmEnumOptions_Asynchronous = 0x1,
+    FsrmEnumOptions_CheckRecycleBin = 0x2,
+    FsrmEnumOptions_IncludeClusterNodes = 0x4,
+    FsrmEnumOptions_IncludeDeprecatedObjects = 0x8
 } FsrmEnumOptions;
-
 typedef enum _FsrmEventType {
-  FsrmEventType_Unknown       = 0,
-  FsrmEventType_Information   = 1,
-  FsrmEventType_Warning       = 2,
-  FsrmEventType_Error         = 3 
+    FsrmEventType_Unknown = 0,
+    FsrmEventType_Information = 1,
+    FsrmEventType_Warning = 2,
+    FsrmEventType_Error = 3
 } FsrmEventType;
-
 typedef enum _FsrmExecutionOption {
-  FsrmExecutionOption_Unknown                            = 0,
-  FsrmExecutionOption_EvaluateUnset                      = 1,
-  FsrmExecutionOption_ReEvaluate_ConsiderExistingValue   = 2,
-  FsrmExecutionOption_ReEvaluate_IgnoreExistingValue     = 3 
+    FsrmExecutionOption_Unknown = 0,
+    FsrmExecutionOption_EvaluateUnset = 1,
+    FsrmExecutionOption_ReEvaluate_ConsiderExistingValue = 2,
+    FsrmExecutionOption_ReEvaluate_IgnoreExistingValue = 3
 } FsrmExecutionOption;
-
+typedef enum _FsrmFileConditionType {
+    FsrmFileConditionType_Unknown = 0,
+    FsrmFileConditionType_Property = 1
+} FsrmFileConditionType;
 typedef enum _FsrmFileManagementLoggingFlags {
-  FsrmFileManagementLoggingFlags_None          = 0x00000000,
-  FsrmFileManagementLoggingFlags_Error         = 0x00000001,
-  FsrmFileManagementLoggingFlags_Information   = 0x00000002,
-  FsrmFileManagementLoggingFlags_Audit         = 0x00000004 
+    FsrmFileManagementLoggingFlags_None = 0x0,
+    FsrmFileManagementLoggingFlags_Error = 0x1,
+    FsrmFileManagementLoggingFlags_Information = 0x2,
+    FsrmFileManagementLoggingFlags_Audit = 0x4
 } FsrmFileManagementLoggingFlags;
-
 typedef enum _FsrmFileManagementType {
-  FsrmFileManagementType_Unknown      = 0,
-  FsrmFileManagementType_Expiration   = 1,
-  FsrmFileManagementType_Custom       = 2 
+    FsrmFileManagementType_Unknown = 0,
+    FsrmFileManagementType_Expiration = 1,
+    FsrmFileManagementType_Custom = 2,
+    FsrmFileManagementType_Rms = 3
 } FsrmFileManagementType;
-
-typedef enum _FsrmFileStreamingInterfaceType {
-  FsrmFileStreamingInterfaceType_Unknown      = 0x00000000,
-  FsrmFileStreamingInterfaceType_ILockBytes   = 0x00000001,
-  FsrmFileStreamingInterfaceType_IStream      = 0x00000002 
-} FsrmFileStreamingInterfaceType;
-
-typedef enum _FsrmFileStreamingMode {
-  FsrmFileStreamingMode_Unknown   = 0x00000000,
-  FsrmFileStreamingMode_Read      = 0x00000001,
-  FsrmFileStreamingMode_Write     = 0x00000002 
-} FsrmFileStreamingMode;
-
 typedef enum _FsrmFileScreenFlags {
-  FsrmFileScreenFlags_Enforce   = 0x00000001 
+    FsrmFileScreenFlags_Enforce = 0x1
 } FsrmFileScreenFlags;
-
+typedef enum _FsrmFileStreamingInterfaceType {
+    FsrmFileStreamingInterfaceType_Unknown = 0x0,
+    FsrmFileStreamingInterfaceType_ILockBytes = 0x1,
+    FsrmFileStreamingInterfaceType_IStream = 0x2
+} FsrmFileStreamingInterfaceType;
+typedef enum _FsrmFileStreamingMode {
+    FsrmFileStreamingMode_Unknown = 0x0,
+    FsrmFileStreamingMode_Read = 0x1,
+    FsrmFileStreamingMode_Write = 0x2
+} FsrmFileStreamingMode;
+typedef enum _FsrmFileSystemPropertyId {
+    FsrmFileSystemPropertyId_Undefined = 0,
+    FsrmFileSystemPropertyId_FileName = 1,
+    FsrmFileSystemPropertyId_DateCreated = 2,
+    FsrmFileSystemPropertyId_DateLastAccessed = 3,
+    FsrmFileSystemPropertyId_DateLastModified = 4,
+    FsrmFileSystemPropertyId_DateNow = 5
+} FsrmFileSystemPropertyId;
+typedef enum _FsrmGetFilePropertyOptions {
+    FsrmGetFilePropertyOptions_None = 0x0,
+    FsrmGetFilePropertyOptions_NoRuleEvaluation = 0x1,
+    FsrmGetFilePropertyOptions_Persistent = 0x2,
+    FsrmGetFilePropertyOptions_FailOnPersistErrors = 0x4,
+    FsrmGetFilePropertyOptions_SkipOrphaned = 0x8
+} FsrmGetFilePropertyOptions;
 typedef enum _FsrmPipelineModuleType {
-  FsrmPipelineModuleType_Unknown      = 0,
-  FsrmPipelineModuleType_Storage      = 1,
-  FsrmPipelineModuleType_Classifier   = 2 
+    FsrmPipelineModuleType_Unknown = 0,
+    FsrmPipelineModuleType_Storage = 1,
+    FsrmPipelineModuleType_Classifier = 2
 } FsrmPipelineModuleType;
-
+typedef enum _FsrmPropertyBagField {
+    FsrmPropertyBagField_AccessVolume = 0,
+    FsrmPropertyBagField_VolumeGuidName = 1
+} FsrmPropertyBagField;
 typedef enum _FsrmPropertyBagFlags {
-  FsrmPropertyBagFlags_UpdatedByClassifier           = 0x00000001,
-  FsrmPropertyBagFlags_FailedLoadingProperties       = 0x00000002,
-  FsrmPropertyBagFlags_FailedSavingProperties        = 0x00000004,
-  FsrmPropertyBagFlags_FailedClassifyingProperties   = 0x00000008 
+    FsrmPropertyBagFlags_UpdatedByClassifier = 0x1,
+    FsrmPropertyBagFlags_FailedLoadingProperties = 0x2,
+    FsrmPropertyBagFlags_FailedSavingProperties = 0x4,
+    FsrmPropertyBagFlags_FailedClassifyingProperties = 0x8
 } FsrmPropertyBagFlags;
-
 typedef enum _FsrmPropertyConditionType {
-  FsrmPropertyConditionType_Unknown       = 0,
-  FsrmPropertyConditionType_Equal         = 1,
-  FsrmPropertyConditionType_NotEqual      = 2,
-  FsrmPropertyConditionType_GreaterThan   = 3,
-  FsrmPropertyConditionType_LessThan      = 4,
-  FsrmPropertyConditionType_Contain       = 5,
-  FsrmPropertyConditionType_Exist         = 6,
-  FsrmPropertyConditionType_NotExist      = 7,
-  FsrmPropertyConditionType_StartWith     = 8,
-  FsrmPropertyConditionType_EndWith       = 9,
-  FsrmPropertyConditionType_ContainedIn   = 10,
-  FsrmPropertyConditionType_PrefixOf      = 11,
-  FsrmPropertyConditionType_SuffixOf      = 12 
+    FsrmPropertyConditionType_Unknown = 0,
+    FsrmPropertyConditionType_Equal = 1,
+    FsrmPropertyConditionType_NotEqual = 2,
+    FsrmPropertyConditionType_GreaterThan = 3,
+    FsrmPropertyConditionType_LessThan = 4,
+    FsrmPropertyConditionType_Contain = 5,
+    FsrmPropertyConditionType_Exist = 6,
+    FsrmPropertyConditionType_NotExist = 7,
+    FsrmPropertyConditionType_StartWith = 8,
+    FsrmPropertyConditionType_EndWith = 9,
+    FsrmPropertyConditionType_ContainedIn = 10,
+    FsrmPropertyConditionType_PrefixOf = 11,
+    FsrmPropertyConditionType_SuffixOf = 12,
+    FsrmPropertyConditionType_MatchesPattern = 13
 } FsrmPropertyConditionType;
-
+typedef enum _FsrmPropertyDefinitionAppliesTo {
+    FsrmPropertyDefinitionAppliesTo_Files = 0x1,
+    FsrmPropertyDefinitionAppliesTo_Folders = 0x2
+} FsrmPropertyDefinitionAppliesTo;
+typedef enum _FsrmPropertyDefinitionFlags {
+    FsrmPropertyDefinitionFlags_Global = 0x1,
+    FsrmPropertyDefinitionFlags_Deprecated = 0x2,
+    FsrmPropertyDefinitionFlags_Secure = 0x4
+} FsrmPropertyDefinitionFlags;
 typedef enum _FsrmPropertyDefinitionType {
-  FsrmPropertyDefinitionType_Unknown           = 0,
-  FsrmPropertyDefinitionType_OrderedList       = 1,
-  FsrmPropertyDefinitionType_MultiChoiceList   = 2,
-  FsrmPropertyDefinitionType_String            = 4,
-  FsrmPropertyDefinitionType_MultiString       = 5,
-  FsrmPropertyDefinitionType_Int               = 6,
-  FsrmPropertyDefinitionType_Bool              = 7,
-  FsrmPropertyDefinitionType_Date              = 8 
+    FsrmPropertyDefinitionType_Unknown = 0,
+    FsrmPropertyDefinitionType_OrderedList = 1,
+    FsrmPropertyDefinitionType_MultiChoiceList = 2,
+    FsrmPropertyDefinitionType_SingleChoiceList = 3,
+    FsrmPropertyDefinitionType_String = 4,
+    FsrmPropertyDefinitionType_MultiString = 5,
+    FsrmPropertyDefinitionType_Int = 6,
+    FsrmPropertyDefinitionType_Bool = 7,
+    FsrmPropertyDefinitionType_Date = 8
 } FsrmPropertyDefinitionType;
-
 typedef enum _FsrmPropertyFlags {
-  FsrmPropertyFlags_Orphaned                      = 0x00000001,
-  FsrmPropertyFlags_RetrievedFromCache            = 0x00000002,
-  FsrmPropertyFlags_RetrievedFromStorage          = 0x00000004,
-  FsrmPropertyFlags_SetByClassifier               = 0x00000008,
-  FsrmPropertyFlags_Deleted                       = 0x00000010,
-  FsrmPropertyFlags_Reclassified                  = 0x00000020,
-  FsrmPropertyFlags_AggregationFailed             = 0x00000040,
-  FsrmPropertyFlags_Existing                      = 0x00000080,
-  FsrmPropertyFlags_FailedLoadingProperties       = 0x00000100,
-  FsrmPropertyFlags_FailedClassifyingProperties   = 0x00000200,
-  FsrmPropertyFlags_PropertySourceMask            = 0x0000000E 
+    FsrmPropertyFlags_None = 0x0,
+    FsrmPropertyFlags_Orphaned = 0x1,
+    FsrmPropertyFlags_RetrievedFromCache = 0x2,
+    FsrmPropertyFlags_RetrievedFromStorage = 0x4,
+    FsrmPropertyFlags_SetByClassifier = 0x8,
+    FsrmPropertyFlags_Deleted = 0x10,
+    FsrmPropertyFlags_Reclassified = 0x20,
+    FsrmPropertyFlags_AggregationFailed = 0x40,
+    FsrmPropertyFlags_Existing = 0x80,
+    FsrmPropertyFlags_FailedLoadingProperties = 0x100,
+    FsrmPropertyFlags_FailedClassifyingProperties = 0x200,
+    FsrmPropertyFlags_FailedSavingProperties = 0x400,
+    FsrmPropertyFlags_Secure = 0x800,
+    FsrmPropertyFlags_PolicyDerived = 0x1000,
+    FsrmPropertyFlags_Inherited = 0x2000,
+    FsrmPropertyFlags_Manual = 0x4000,
+    FsrmPropertyFlags_ExplicitValueDeleted = 0x8000,
+    FsrmPropertyFlags_PropertySourceMask = (FsrmPropertyFlags_RetrievedFromCache | FsrmPropertyFlags_RetrievedFromStorage) | FsrmPropertyFlags_SetByClassifier,
+    FsrmPropertyFlags_PersistentMask = FsrmPropertyFlags_PolicyDerived | FsrmPropertyFlags_Manual
 } FsrmPropertyFlags;
-
+typedef enum _FsrmPropertyValueType {
+    FsrmPropertyValueType_Undefined = 0,
+    FsrmPropertyValueType_Literal = 1,
+    FsrmPropertyValueType_DateOffset = 2
+} FsrmPropertyValueType;
 typedef enum _FsrmQuotaFlags {
-  FsrmQuotaFlags_Enforce            = 0x00000100,
-  FsrmQuotaFlags_Disable            = 0x00000200,
-  FsrmQuotaFlags_StatusIncomplete   = 0x00010000,
-  FsrmQuotaFlags_StatusRebuilding   = 0x00020000 
+    FsrmQuotaFlags_Enforce = 0x100,
+    FsrmQuotaFlags_Disable = 0x200,
+    FsrmQuotaFlags_StatusIncomplete = 0x10000,
+    FsrmQuotaFlags_StatusRebuilding = 0x20000
 } FsrmQuotaFlags;
-
 typedef enum _FsrmReportFilter {
-  FsrmReportFilter_MinSize         = 1,
-  FsrmReportFilter_MinAgeDays      = 2,
-  FsrmReportFilter_MaxAgeDays      = 3,
-  FsrmReportFilter_MinQuotaUsage   = 4,
-  FsrmReportFilter_FileGroups      = 5,
-  FsrmReportFilter_Owners          = 6,
-  FsrmReportFilter_NamePattern     = 7,
-  FsrmReportFilter_Property        = 8 
+    FsrmReportFilter_MinSize = 1,
+    FsrmReportFilter_MinAgeDays = 2,
+    FsrmReportFilter_MaxAgeDays = 3,
+    FsrmReportFilter_MinQuotaUsage = 4,
+    FsrmReportFilter_FileGroups = 5,
+    FsrmReportFilter_Owners = 6,
+    FsrmReportFilter_NamePattern = 7,
+    FsrmReportFilter_Property = 8
 } FsrmReportFilter;
-
 typedef enum _FsrmReportFormat {
-  FsrmReportFormat_Unknown   = 0,
-  FsrmReportFormat_DHtml     = 1,
-  FsrmReportFormat_Html      = 2,
-  FsrmReportFormat_Txt       = 3,
-  FsrmReportFormat_Csv       = 4,
-  FsrmReportFormat_Xml       = 5 
+    FsrmReportFormat_Unknown = 0,
+    FsrmReportFormat_DHtml = 1,
+    FsrmReportFormat_Html = 2,
+    FsrmReportFormat_Txt = 3,
+    FsrmReportFormat_Csv = 4,
+    FsrmReportFormat_Xml = 5
 } FsrmReportFormat;
-
 typedef enum _FsrmReportGenerationContext {
-  FsrmReportGenerationContext_Undefined           = 1,
-  FsrmReportGenerationContext_ScheduledReport     = 2,
-  FsrmReportGenerationContext_InteractiveReport   = 3,
-  FsrmReportGenerationContext_IncidentReport      = 4 
+    FsrmReportGenerationContext_Undefined = 1,
+    FsrmReportGenerationContext_ScheduledReport = 2,
+    FsrmReportGenerationContext_InteractiveReport = 3,
+    FsrmReportGenerationContext_IncidentReport = 4
 } FsrmReportGenerationContext;
-
 typedef enum _FsrmReportLimit {
-  FsrmReportLimit_MaxFiles                   = 1,
-  FsrmReportLimit_MaxFileGroups              = 2,
-  FsrmReportLimit_MaxOwners                  = 3,
-  FsrmReportLimit_MaxFilesPerFileGroup       = 4,
-  FsrmReportLimit_MaxFilesPerOwner           = 5,
-  FsrmReportLimit_MaxFilesPerDuplGroup       = 6,
-  FsrmReportLimit_MaxDuplicateGroups         = 7,
-  FsrmReportLimit_MaxQuotas                  = 8,
-  FsrmReportLimit_MaxFileScreenEvents        = 9,
-  FsrmReportLimit_MaxPropertyValues          = 10,
-  FsrmReportLimit_MaxFilesPerPropertyValue   = 11 
+    FsrmReportLimit_MaxFiles = 1,
+    FsrmReportLimit_MaxFileGroups = 2,
+    FsrmReportLimit_MaxOwners = 3,
+    FsrmReportLimit_MaxFilesPerFileGroup = 4,
+    FsrmReportLimit_MaxFilesPerOwner = 5,
+    FsrmReportLimit_MaxFilesPerDuplGroup = 6,
+    FsrmReportLimit_MaxDuplicateGroups = 7,
+    FsrmReportLimit_MaxQuotas = 8,
+    FsrmReportLimit_MaxFileScreenEvents = 9,
+    FsrmReportLimit_MaxPropertyValues = 10,
+    FsrmReportLimit_MaxFilesPerPropertyValue = 11,
+    FsrmReportLimit_MaxFolders = 12
 } FsrmReportLimit;
-
 typedef enum _FsrmReportRunningStatus {
-  FsrmReportRunningStatus_Unknown      = 0,
-  FsrmReportRunningStatus_NotRunning   = 1,
-  FsrmReportRunningStatus_Queued       = 2,
-  FsrmReportRunningStatus_Running      = 3 
+    FsrmReportRunningStatus_Unknown = 0,
+    FsrmReportRunningStatus_NotRunning = 1,
+    FsrmReportRunningStatus_Queued = 2,
+    FsrmReportRunningStatus_Running = 3
 } FsrmReportRunningStatus;
-
 typedef enum _FsrmReportType {
-  FsrmReportType_Unknown                   = 0,
-  FsrmReportType_LargeFiles                = 1,
-  FsrmReportType_FilesByType               = 2,
-  FsrmReportType_LeastRecentlyAccessed     = 3,
-  FsrmReportType_MostRecentlyAccessed      = 4,
-  FsrmReportType_QuotaUsage                = 5,
-  FsrmReportType_FilesByOwner              = 6,
-  FsrmReportType_ExportReport              = 7,
-  FsrmReportType_DuplicateFiles            = 8,
-  FsrmReportType_FileScreenAudit           = 9,
-  FsrmReportType_FilesByProperty           = 10,
-  FsrmReportType_AutomaticClassification   = 11,
-  FsrmReportType_Expiration                = 12 
+    FsrmReportType_Unknown = 0,
+    FsrmReportType_LargeFiles = 1,
+    FsrmReportType_FilesByType = 2,
+    FsrmReportType_LeastRecentlyAccessed = 3,
+    FsrmReportType_MostRecentlyAccessed = 4,
+    FsrmReportType_QuotaUsage = 5,
+    FsrmReportType_FilesByOwner = 6,
+    FsrmReportType_ExportReport = 7,
+    FsrmReportType_DuplicateFiles = 8,
+    FsrmReportType_FileScreenAudit = 9,
+    FsrmReportType_FilesByProperty = 10,
+    FsrmReportType_AutomaticClassification = 11,
+    FsrmReportType_Expiration = 12,
+    FsrmReportType_FoldersByProperty = 13
 } FsrmReportType;
-
 typedef enum _FsrmRuleFlags {
-  FsrmRuleFlags_Disabled   = 0x00000100,
-  FsrmRuleFlags_Invalid    = 0x00001000 
+    FsrmRuleFlags_Disabled = 0x100,
+    FsrmRuleFlags_Invalid = 0x1000
 } FsrmRuleFlags;
-
 typedef enum _FsrmRuleType {
-  FsrmRuleType_Unknown          = 0,
-  FsrmRuleType_Classification   = 1,
-  FsrmRuleType_Generic          = 2 
+    FsrmRuleType_Unknown = 0,
+    FsrmRuleType_Classification = 1,
+    FsrmRuleType_Generic = 2
 } FsrmRuleType;
-
 typedef enum _FsrmStorageModuleCaps {
-  FsrmStorageModuleCaps_Unknown   = 0x00000000,
-  FsrmStorageModuleCaps_CanGet    = 0x00000001,
-  FsrmStorageModuleCaps_CanSet    = 0x00000002 
+    FsrmStorageModuleCaps_Unknown = 0x0,
+    FsrmStorageModuleCaps_CanGet = 0x1,
+    FsrmStorageModuleCaps_CanSet = 0x2,
+    FsrmStorageModuleCaps_CanHandleDirectories = 0x4,
+    FsrmStorageModuleCaps_CanHandleFiles = 0x8
 } FsrmStorageModuleCaps;
-
 typedef enum _FsrmStorageModuleType {
-  FsrmStorageModuleType_Unknown    = 0,
-  FsrmStorageModuleType_Cache      = 1,
-  FsrmStorageModuleType_InFile     = 2,
-  FsrmStorageModuleType_Database   = 3 
+    FsrmStorageModuleType_Unknown = 0,
+    FsrmStorageModuleType_Cache = 1,
+    FsrmStorageModuleType_InFile = 2,
+    FsrmStorageModuleType_Database = 3,
+    FsrmStorageModuleType_System = 100
 } FsrmStorageModuleType;
-
 typedef enum _FsrmTemplateApplyOptions {
-  FsrmTemplateApplyOptions_ApplyToDerivedMatching   = 1,
-  FsrmTemplateApplyOptions_ApplyToDerivedAll        = 2 
+    FsrmTemplateApplyOptions_ApplyToDerivedMatching = 1,
+    FsrmTemplateApplyOptions_ApplyToDerivedAll = 2
 } FsrmTemplateApplyOptions;
+typedef GUID FSRM_OBJECT_ID;
+#endif
+/* Begin additional prototypes for all interfaces */
+
+
+/* End additional prototypes */
 
 #ifdef __cplusplus
 }
 #endif
 
-#endif /*(_WIN32_WINNT >= 0x0600)*/
-#endif /*_INC_FSRMENUMS*/
+#endif /* __fsrmenums_h__ */
diff --git a/mingw-w64-headers/include/fsrmenums.idl b/mingw-w64-headers/include/fsrmenums.idl
new file mode 100644
index 0000000..3f49e4a
--- /dev/null
+++ b/mingw-w64-headers/include/fsrmenums.idl
@@ -0,0 +1,342 @@
+/**
+ * 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";
+
+cpp_quote("#include <winapifamily.h>")
+cpp_quote("")
+cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)")
+
+typedef enum _FsrmAccountType {
+  FsrmAccountType_Unknown = 0,
+  FsrmAccountType_NetworkService = 1,
+  FsrmAccountType_LocalService = 2,
+  FsrmAccountType_LocalSystem = 3,
+  FsrmAccountType_InProc = 4,
+  FsrmAccountType_External = 5,
+  FsrmAccountType_Automatic = 500
+} FsrmAccountType;
+
+typedef enum _FsrmActionType {
+  FsrmActionType_Unknown = 0,
+  FsrmActionType_EventLog = 1,
+  FsrmActionType_Email = 2,
+  FsrmActionType_Command = 3,
+  FsrmActionType_Report = 4
+} FsrmActionType;
+
+typedef enum _AdrClientDisplayFlags {
+  AdrClientDisplayFlags_AllowEmailRequests = 0x1,
+  AdrClientDisplayFlags_ShowDeviceTroubleshooting = 0x2
+} AdrClientDisplayFlags;
+
+typedef enum _AdrClientErrorType {
+  AdrClientErrorType_Unknown = 0,
+  AdrClientErrorType_AccessDenied = 1,
+  AdrClientErrorType_FileNotFound = 2,
+} AdrClientErrorType;
+
+typedef enum _AdrClientFlags {
+  AdrClientFlags_None = 0x0,
+  AdrClientFlags_FailForLocalPaths = 0x1,
+  AdrClientFlags_FailIfNotSupportedByServer = 0x2,
+  AdrClientFlags_FailIfNotDomainJoined = 0x4
+} AdrClientFlags;
+
+typedef enum _AdrEmailFlags {
+  AdrEmailFlags_PutDataOwnerOnToLine = 0x1,
+  AdrEmailFlags_PutAdminOnToLine = 0x2,
+  AdrEmailFlags_IncludeDeviceClaims = 0x4,
+  AdrEmailFlags_IncludeUserInfo = 0x8,
+  AdrEmailFlags_GenerateEventLog = 0x10
+} AdrEmailFlags;
+
+typedef enum _FsrmClassificationLoggingFlags {
+  FsrmClassificationLoggingFlags_None = 0x00000000,
+  FsrmClassificationLoggingFlags_ClassificationsInLogFile = 0x00000001,
+  FsrmClassificationLoggingFlags_ErrorsInLogFile = 0x00000002,
+  FsrmClassificationLoggingFlags_ClassificationsInSystemLog = 0x00000004,
+  FsrmClassificationLoggingFlags_ErrorsInSystemLog = 0x00000008
+} FsrmClassificationLoggingFlags;
+
+typedef enum _FsrmCollectionState {
+  FsrmCollectionState_Fetching = 1,
+  FsrmCollectionState_Committing = 2,
+  FsrmCollectionState_Complete = 3,
+  FsrmCollectionState_Cancelled = 4
+} FsrmCollectionState;
+
+typedef enum _FsrmCommitOptions {
+  FsrmCommitOptions_None = 0x0,
+  FsrmCommitOptions_Asynchronous = 0x1
+} FsrmCommitOptions;
+
+typedef enum _FsrmEnumOptions {
+  FsrmEnumOptions_None = 0x0,
+  FsrmEnumOptions_Asynchronous = 0x1,
+  FsrmEnumOptions_CheckRecycleBin = 0x2,
+  FsrmEnumOptions_IncludeClusterNodes = 0x4,
+  FsrmEnumOptions_IncludeDeprecatedObjects = 0x8
+} FsrmEnumOptions;
+
+typedef enum _FsrmEventType {
+  FsrmEventType_Unknown = 0,
+  FsrmEventType_Information = 1,
+  FsrmEventType_Warning = 2,
+  FsrmEventType_Error = 3
+} FsrmEventType;
+
+typedef enum _FsrmExecutionOption {
+  FsrmExecutionOption_Unknown = 0,
+  FsrmExecutionOption_EvaluateUnset = 1,
+  FsrmExecutionOption_ReEvaluate_ConsiderExistingValue = 2,
+  FsrmExecutionOption_ReEvaluate_IgnoreExistingValue = 3
+} FsrmExecutionOption;
+
+typedef enum _FsrmFileConditionType {
+  FsrmFileConditionType_Unknown = 0,
+  FsrmFileConditionType_Property = 1
+} FsrmFileConditionType;
+
+typedef enum _FsrmFileManagementLoggingFlags {
+  FsrmFileManagementLoggingFlags_None = 0x0,
+  FsrmFileManagementLoggingFlags_Error = 0x1,
+  FsrmFileManagementLoggingFlags_Information = 0x2,
+  FsrmFileManagementLoggingFlags_Audit = 0x4
+} FsrmFileManagementLoggingFlags;
+
+typedef enum _FsrmFileManagementType {
+  FsrmFileManagementType_Unknown = 0,
+  FsrmFileManagementType_Expiration = 1,
+  FsrmFileManagementType_Custom = 2,
+  FsrmFileManagementType_Rms = 3
+} FsrmFileManagementType;
+
+typedef enum _FsrmFileScreenFlags {
+  FsrmFileScreenFlags_Enforce = 0x1
+} FsrmFileScreenFlags;
+
+typedef enum _FsrmFileStreamingInterfaceType {
+  FsrmFileStreamingInterfaceType_Unknown = 0x0,
+  FsrmFileStreamingInterfaceType_ILockBytes = 0x1,
+  FsrmFileStreamingInterfaceType_IStream = 0x2
+} FsrmFileStreamingInterfaceType;
+
+typedef enum _FsrmFileStreamingMode {
+  FsrmFileStreamingMode_Unknown = 0x0,
+  FsrmFileStreamingMode_Read = 0x1,
+  FsrmFileStreamingMode_Write = 0x2
+} FsrmFileStreamingMode;
+
+typedef enum _FsrmFileSystemPropertyId {
+  FsrmFileSystemPropertyId_Undefined = 0,
+  FsrmFileSystemPropertyId_FileName = 1,
+  FsrmFileSystemPropertyId_DateCreated = 2,
+  FsrmFileSystemPropertyId_DateLastAccessed = 3,
+  FsrmFileSystemPropertyId_DateLastModified = 4,
+  FsrmFileSystemPropertyId_DateNow = 5,
+} FsrmFileSystemPropertyId;
+
+typedef enum _FsrmGetFilePropertyOptions {
+  FsrmGetFilePropertyOptions_None = 0x0,
+  FsrmGetFilePropertyOptions_NoRuleEvaluation = 0x1,
+  FsrmGetFilePropertyOptions_Persistent = 0x2,
+  FsrmGetFilePropertyOptions_FailOnPersistErrors = 0x4,
+  FsrmGetFilePropertyOptions_SkipOrphaned = 0x8
+} FsrmGetFilePropertyOptions;
+
+typedef enum _FsrmPipelineModuleType {
+  FsrmPipelineModuleType_Unknown = 0,
+  FsrmPipelineModuleType_Storage = 1,
+  FsrmPipelineModuleType_Classifier = 2
+} FsrmPipelineModuleType;
+
+typedef enum _FsrmPropertyBagField {
+  FsrmPropertyBagField_AccessVolume = 0,
+  FsrmPropertyBagField_VolumeGuidName = 1
+} FsrmPropertyBagField;
+
+typedef enum _FsrmPropertyBagFlags {
+  FsrmPropertyBagFlags_UpdatedByClassifier = 0x1,
+  FsrmPropertyBagFlags_FailedLoadingProperties = 0x2,
+  FsrmPropertyBagFlags_FailedSavingProperties = 0x4,
+  FsrmPropertyBagFlags_FailedClassifyingProperties = 0x8
+} FsrmPropertyBagFlags;
+
+typedef enum _FsrmPropertyConditionType {
+  FsrmPropertyConditionType_Unknown = 0,
+  FsrmPropertyConditionType_Equal = 1,
+  FsrmPropertyConditionType_NotEqual = 2,
+  FsrmPropertyConditionType_GreaterThan = 3,
+  FsrmPropertyConditionType_LessThan = 4,
+  FsrmPropertyConditionType_Contain = 5,
+  FsrmPropertyConditionType_Exist = 6,
+  FsrmPropertyConditionType_NotExist = 7,
+  FsrmPropertyConditionType_StartWith = 8,
+  FsrmPropertyConditionType_EndWith = 9,
+  FsrmPropertyConditionType_ContainedIn = 10,
+  FsrmPropertyConditionType_PrefixOf = 11,
+  FsrmPropertyConditionType_SuffixOf = 12,
+  FsrmPropertyConditionType_MatchesPattern = 13
+} FsrmPropertyConditionType;
+
+typedef enum _FsrmPropertyDefinitionAppliesTo {
+  FsrmPropertyDefinitionAppliesTo_Files = 0x00000001,
+  FsrmPropertyDefinitionAppliesTo_Folders = 0x00000002,
+} FsrmPropertyDefinitionAppliesTo;
+
+typedef enum _FsrmPropertyDefinitionFlags {
+  FsrmPropertyDefinitionFlags_Global = 0x00000001,
+  FsrmPropertyDefinitionFlags_Deprecated = 0x00000002,
+  FsrmPropertyDefinitionFlags_Secure = 0x00000004,
+} FsrmPropertyDefinitionFlags;
+
+typedef enum _FsrmPropertyDefinitionType {
+  FsrmPropertyDefinitionType_Unknown = 0,
+  FsrmPropertyDefinitionType_OrderedList = 1,
+  FsrmPropertyDefinitionType_MultiChoiceList = 2,
+  FsrmPropertyDefinitionType_SingleChoiceList = 3,
+  FsrmPropertyDefinitionType_String = 4,
+  FsrmPropertyDefinitionType_MultiString = 5,
+  FsrmPropertyDefinitionType_Int = 6,
+  FsrmPropertyDefinitionType_Bool = 7,
+  FsrmPropertyDefinitionType_Date = 8
+} FsrmPropertyDefinitionType;
+
+typedef enum _FsrmPropertyFlags {
+  FsrmPropertyFlags_None = 0x0,
+  FsrmPropertyFlags_Orphaned = 0x1,
+  FsrmPropertyFlags_RetrievedFromCache = 0x2,
+  FsrmPropertyFlags_RetrievedFromStorage = 0x4,
+  FsrmPropertyFlags_SetByClassifier = 0x8,
+  FsrmPropertyFlags_Deleted = 0x10,
+  FsrmPropertyFlags_Reclassified = 0x20,
+  FsrmPropertyFlags_AggregationFailed = 0x40,
+  FsrmPropertyFlags_Existing = 0x80,
+  FsrmPropertyFlags_FailedLoadingProperties = 0x100,
+  FsrmPropertyFlags_FailedClassifyingProperties = 0x200,
+  FsrmPropertyFlags_FailedSavingProperties = 0x400,
+  FsrmPropertyFlags_Secure = 0x800,
+  FsrmPropertyFlags_PolicyDerived = 0x1000,
+  FsrmPropertyFlags_Inherited = 0x2000,
+  FsrmPropertyFlags_Manual = 0x4000,
+  FsrmPropertyFlags_ExplicitValueDeleted = 0x8000,
+  FsrmPropertyFlags_PropertySourceMask = FsrmPropertyFlags_RetrievedFromCache | FsrmPropertyFlags_RetrievedFromStorage | FsrmPropertyFlags_SetByClassifier,
+  FsrmPropertyFlags_PersistentMask = FsrmPropertyFlags_PolicyDerived | FsrmPropertyFlags_Manual
+} FsrmPropertyFlags;
+
+typedef enum _FsrmPropertyValueType {
+  FsrmPropertyValueType_Undefined = 0,
+  FsrmPropertyValueType_Literal = 1,
+  FsrmPropertyValueType_DateOffset = 2
+} FsrmPropertyValueType;
+
+typedef enum _FsrmQuotaFlags {
+  FsrmQuotaFlags_Enforce = 0x100,
+  FsrmQuotaFlags_Disable = 0x200,
+  FsrmQuotaFlags_StatusIncomplete = 0x10000,
+  FsrmQuotaFlags_StatusRebuilding = 0x20000
+} FsrmQuotaFlags;
+
+typedef enum _FsrmReportFilter {
+  FsrmReportFilter_MinSize = 1,
+  FsrmReportFilter_MinAgeDays = 2,
+  FsrmReportFilter_MaxAgeDays = 3,
+  FsrmReportFilter_MinQuotaUsage = 4,
+  FsrmReportFilter_FileGroups = 5,
+  FsrmReportFilter_Owners = 6,
+  FsrmReportFilter_NamePattern = 7,
+  FsrmReportFilter_Property = 8
+} FsrmReportFilter;
+
+typedef enum _FsrmReportFormat {
+  FsrmReportFormat_Unknown = 0,
+  FsrmReportFormat_DHtml = 1,
+  FsrmReportFormat_Html = 2,
+  FsrmReportFormat_Txt = 3,
+  FsrmReportFormat_Csv = 4,
+  FsrmReportFormat_Xml = 5
+} FsrmReportFormat;
+
+typedef enum _FsrmReportGenerationContext {
+  FsrmReportGenerationContext_Undefined = 1,
+  FsrmReportGenerationContext_ScheduledReport = 2,
+  FsrmReportGenerationContext_InteractiveReport = 3,
+  FsrmReportGenerationContext_IncidentReport = 4
+} FsrmReportGenerationContext;
+
+typedef enum _FsrmReportLimit {
+  FsrmReportLimit_MaxFiles = 1,
+  FsrmReportLimit_MaxFileGroups = 2,
+  FsrmReportLimit_MaxOwners = 3,
+  FsrmReportLimit_MaxFilesPerFileGroup = 4,
+  FsrmReportLimit_MaxFilesPerOwner = 5,
+  FsrmReportLimit_MaxFilesPerDuplGroup = 6,
+  FsrmReportLimit_MaxDuplicateGroups = 7,
+  FsrmReportLimit_MaxQuotas = 8,
+  FsrmReportLimit_MaxFileScreenEvents = 9,
+  FsrmReportLimit_MaxPropertyValues = 10,
+  FsrmReportLimit_MaxFilesPerPropertyValue = 11,
+  FsrmReportLimit_MaxFolders = 12
+} FsrmReportLimit;
+
+typedef enum _FsrmReportRunningStatus {
+  FsrmReportRunningStatus_Unknown = 0,
+  FsrmReportRunningStatus_NotRunning = 1,
+  FsrmReportRunningStatus_Queued = 2,
+  FsrmReportRunningStatus_Running = 3
+} FsrmReportRunningStatus;
+
+typedef enum _FsrmReportType {
+  FsrmReportType_Unknown = 0,
+  FsrmReportType_LargeFiles = 1,
+  FsrmReportType_FilesByType = 2,
+  FsrmReportType_LeastRecentlyAccessed = 3,
+  FsrmReportType_MostRecentlyAccessed = 4,
+  FsrmReportType_QuotaUsage = 5,
+  FsrmReportType_FilesByOwner = 6,
+  FsrmReportType_ExportReport = 7,
+  FsrmReportType_DuplicateFiles = 8,
+  FsrmReportType_FileScreenAudit = 9,
+  FsrmReportType_FilesByProperty = 10,
+  FsrmReportType_AutomaticClassification = 11,
+  FsrmReportType_Expiration = 12,
+  FsrmReportType_FoldersByProperty = 13
+} FsrmReportType;
+
+typedef enum _FsrmRuleFlags {
+  FsrmRuleFlags_Disabled = 0x00000100,
+  FsrmRuleFlags_Invalid = 0x00001000
+} FsrmRuleFlags;
+
+typedef enum _FsrmRuleType {
+  FsrmRuleType_Unknown = 0,
+  FsrmRuleType_Classification = 1,
+  FsrmRuleType_Generic = 2
+} FsrmRuleType;
+
+typedef enum _FsrmStorageModuleCaps {
+  FsrmStorageModuleCaps_Unknown = 0x0,
+  FsrmStorageModuleCaps_CanGet = 0x1,
+  FsrmStorageModuleCaps_CanSet = 0x2,
+  FsrmStorageModuleCaps_CanHandleDirectories = 0x4,
+  FsrmStorageModuleCaps_CanHandleFiles = 0x8
+} FsrmStorageModuleCaps;
+
+typedef enum _FsrmStorageModuleType {
+  FsrmStorageModuleType_Unknown = 0,
+  FsrmStorageModuleType_Cache = 1,
+  FsrmStorageModuleType_InFile = 2,
+  FsrmStorageModuleType_Database = 3,
+  FsrmStorageModuleType_System = 100
+} FsrmStorageModuleType;
+
+typedef enum _FsrmTemplateApplyOptions {
+  FsrmTemplateApplyOptions_ApplyToDerivedMatching = 1,
+  FsrmTemplateApplyOptions_ApplyToDerivedAll = 2
+} FsrmTemplateApplyOptions;
+
+typedef GUID FSRM_OBJECT_ID;
+cpp_quote("#endif")
