/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the w64 mingw-runtime package.
 * No warranty is given; refer to the file DISCLAIMER within this package.
 */
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif

#include "rpc.h"
#include "rpcndr.h"

#ifndef __RPCNDR_H_VERSION__
#error this stub requires an updated version of <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include "windows.h"
#include "ole2.h"
#endif

#ifndef __cluscfgserver_h__
#define __cluscfgserver_h__

#ifndef __IClusCfgNodeInfo_FWD_DEFINED__
#define __IClusCfgNodeInfo_FWD_DEFINED__
typedef struct IClusCfgNodeInfo IClusCfgNodeInfo;
#endif

#ifndef __AsyncIClusCfgNodeInfo_FWD_DEFINED__
#define __AsyncIClusCfgNodeInfo_FWD_DEFINED__
typedef struct AsyncIClusCfgNodeInfo AsyncIClusCfgNodeInfo;
#endif

#ifndef __IEnumClusCfgManagedResources_FWD_DEFINED__
#define __IEnumClusCfgManagedResources_FWD_DEFINED__
typedef struct IEnumClusCfgManagedResources IEnumClusCfgManagedResources;
#endif

#ifndef __AsyncIEnumClusCfgManagedResources_FWD_DEFINED__
#define __AsyncIEnumClusCfgManagedResources_FWD_DEFINED__
typedef struct AsyncIEnumClusCfgManagedResources AsyncIEnumClusCfgManagedResources;
#endif

#ifndef __IEnumClusCfgNetworks_FWD_DEFINED__
#define __IEnumClusCfgNetworks_FWD_DEFINED__
typedef struct IEnumClusCfgNetworks IEnumClusCfgNetworks;
#endif

#ifndef __AsyncIEnumClusCfgNetworks_FWD_DEFINED__
#define __AsyncIEnumClusCfgNetworks_FWD_DEFINED__
typedef struct AsyncIEnumClusCfgNetworks AsyncIEnumClusCfgNetworks;
#endif

#ifndef __IClusCfgManagedResourceInfo_FWD_DEFINED__
#define __IClusCfgManagedResourceInfo_FWD_DEFINED__
typedef struct IClusCfgManagedResourceInfo IClusCfgManagedResourceInfo;
#endif

#ifndef __AsyncIClusCfgManagedResourceInfo_FWD_DEFINED__
#define __AsyncIClusCfgManagedResourceInfo_FWD_DEFINED__
typedef struct AsyncIClusCfgManagedResourceInfo AsyncIClusCfgManagedResourceInfo;
#endif

#ifndef __IEnumClusCfgPartitions_FWD_DEFINED__
#define __IEnumClusCfgPartitions_FWD_DEFINED__
typedef struct IEnumClusCfgPartitions IEnumClusCfgPartitions;
#endif

#ifndef __AsyncIEnumClusCfgPartitions_FWD_DEFINED__
#define __AsyncIEnumClusCfgPartitions_FWD_DEFINED__
typedef struct AsyncIEnumClusCfgPartitions AsyncIEnumClusCfgPartitions;
#endif

#ifndef __IClusCfgPartitionInfo_FWD_DEFINED__
#define __IClusCfgPartitionInfo_FWD_DEFINED__
typedef struct IClusCfgPartitionInfo IClusCfgPartitionInfo;
#endif

#ifndef __AsyncIClusCfgPartitionInfo_FWD_DEFINED__
#define __AsyncIClusCfgPartitionInfo_FWD_DEFINED__
typedef struct AsyncIClusCfgPartitionInfo AsyncIClusCfgPartitionInfo;
#endif

#ifndef __IEnumClusCfgIPAddresses_FWD_DEFINED__
#define __IEnumClusCfgIPAddresses_FWD_DEFINED__
typedef struct IEnumClusCfgIPAddresses IEnumClusCfgIPAddresses;
#endif

#ifndef __AsyncIEnumClusCfgIPAddresses_FWD_DEFINED__
#define __AsyncIEnumClusCfgIPAddresses_FWD_DEFINED__
typedef struct AsyncIEnumClusCfgIPAddresses AsyncIEnumClusCfgIPAddresses;
#endif

#ifndef __IClusCfgIPAddressInfo_FWD_DEFINED__
#define __IClusCfgIPAddressInfo_FWD_DEFINED__
typedef struct IClusCfgIPAddressInfo IClusCfgIPAddressInfo;
#endif

#ifndef __AsyncIClusCfgIPAddressInfo_FWD_DEFINED__
#define __AsyncIClusCfgIPAddressInfo_FWD_DEFINED__
typedef struct AsyncIClusCfgIPAddressInfo AsyncIClusCfgIPAddressInfo;
#endif

#ifndef __IClusCfgNetworkInfo_FWD_DEFINED__
#define __IClusCfgNetworkInfo_FWD_DEFINED__
typedef struct IClusCfgNetworkInfo IClusCfgNetworkInfo;
#endif

#ifndef __AsyncIClusCfgNetworkInfo_FWD_DEFINED__
#define __AsyncIClusCfgNetworkInfo_FWD_DEFINED__
typedef struct AsyncIClusCfgNetworkInfo AsyncIClusCfgNetworkInfo;
#endif

#ifndef __IClusCfgClusterInfo_FWD_DEFINED__
#define __IClusCfgClusterInfo_FWD_DEFINED__
typedef struct IClusCfgClusterInfo IClusCfgClusterInfo;
#endif

#ifndef __AsyncIClusCfgClusterInfo_FWD_DEFINED__
#define __AsyncIClusCfgClusterInfo_FWD_DEFINED__
typedef struct AsyncIClusCfgClusterInfo AsyncIClusCfgClusterInfo;
#endif

#ifndef __IClusCfgInitialize_FWD_DEFINED__
#define __IClusCfgInitialize_FWD_DEFINED__
typedef struct IClusCfgInitialize IClusCfgInitialize;
#endif

#ifndef __AsyncIClusCfgInitialize_FWD_DEFINED__
#define __AsyncIClusCfgInitialize_FWD_DEFINED__
typedef struct AsyncIClusCfgInitialize AsyncIClusCfgInitialize;
#endif

#ifndef __IClusCfgCallback_FWD_DEFINED__
#define __IClusCfgCallback_FWD_DEFINED__
typedef struct IClusCfgCallback IClusCfgCallback;
#endif

#ifndef __AsyncIClusCfgCallback_FWD_DEFINED__
#define __AsyncIClusCfgCallback_FWD_DEFINED__
typedef struct AsyncIClusCfgCallback AsyncIClusCfgCallback;
#endif

#ifndef __IClusCfgCredentials_FWD_DEFINED__
#define __IClusCfgCredentials_FWD_DEFINED__
typedef struct IClusCfgCredentials IClusCfgCredentials;
#endif

#ifndef __AsyncIClusCfgCredentials_FWD_DEFINED__
#define __AsyncIClusCfgCredentials_FWD_DEFINED__
typedef struct AsyncIClusCfgCredentials AsyncIClusCfgCredentials;
#endif

#ifndef __IClusCfgCapabilities_FWD_DEFINED__
#define __IClusCfgCapabilities_FWD_DEFINED__
typedef struct IClusCfgCapabilities IClusCfgCapabilities;
#endif

#ifndef __IClusCfgManagedResourceCfg_FWD_DEFINED__
#define __IClusCfgManagedResourceCfg_FWD_DEFINED__
typedef struct IClusCfgManagedResourceCfg IClusCfgManagedResourceCfg;
#endif

#ifndef __IClusCfgResourcePreCreate_FWD_DEFINED__
#define __IClusCfgResourcePreCreate_FWD_DEFINED__
typedef struct IClusCfgResourcePreCreate IClusCfgResourcePreCreate;
#endif

#ifndef __IClusCfgResourceCreate_FWD_DEFINED__
#define __IClusCfgResourceCreate_FWD_DEFINED__
typedef struct IClusCfgResourceCreate IClusCfgResourceCreate;
#endif

#ifndef __IClusCfgResourcePostCreate_FWD_DEFINED__
#define __IClusCfgResourcePostCreate_FWD_DEFINED__
typedef struct IClusCfgResourcePostCreate IClusCfgResourcePostCreate;
#endif

#ifndef __IClusCfgGroupCfg_FWD_DEFINED__
#define __IClusCfgGroupCfg_FWD_DEFINED__
typedef struct IClusCfgGroupCfg IClusCfgGroupCfg;
#endif

#ifndef __IClusCfgMemberSetChangeListener_FWD_DEFINED__
#define __IClusCfgMemberSetChangeListener_FWD_DEFINED__
typedef struct IClusCfgMemberSetChangeListener IClusCfgMemberSetChangeListener;
#endif

#ifndef __AsyncIClusCfgMemberSetChangeListener_FWD_DEFINED__
#define __AsyncIClusCfgMemberSetChangeListener_FWD_DEFINED__
typedef struct AsyncIClusCfgMemberSetChangeListener AsyncIClusCfgMemberSetChangeListener;
#endif

#ifndef __IClusCfgResourceTypeInfo_FWD_DEFINED__
#define __IClusCfgResourceTypeInfo_FWD_DEFINED__
typedef struct IClusCfgResourceTypeInfo IClusCfgResourceTypeInfo;
#endif

#ifndef __AsyncIClusCfgResourceTypeInfo_FWD_DEFINED__
#define __AsyncIClusCfgResourceTypeInfo_FWD_DEFINED__
typedef struct AsyncIClusCfgResourceTypeInfo AsyncIClusCfgResourceTypeInfo;
#endif

#ifndef __IClusCfgResourceTypeCreate_FWD_DEFINED__
#define __IClusCfgResourceTypeCreate_FWD_DEFINED__
typedef struct IClusCfgResourceTypeCreate IClusCfgResourceTypeCreate;
#endif

#ifndef __AsyncIClusCfgResourceTypeCreate_FWD_DEFINED__
#define __AsyncIClusCfgResourceTypeCreate_FWD_DEFINED__
typedef struct AsyncIClusCfgResourceTypeCreate AsyncIClusCfgResourceTypeCreate;
#endif

#ifndef __IClusCfgEvictCleanup_FWD_DEFINED__
#define __IClusCfgEvictCleanup_FWD_DEFINED__
typedef struct IClusCfgEvictCleanup IClusCfgEvictCleanup;
#endif

#ifndef __AsyncIClusCfgEvictCleanup_FWD_DEFINED__
#define __AsyncIClusCfgEvictCleanup_FWD_DEFINED__
typedef struct AsyncIClusCfgEvictCleanup AsyncIClusCfgEvictCleanup;
#endif

#ifndef __IClusCfgStartupListener_FWD_DEFINED__
#define __IClusCfgStartupListener_FWD_DEFINED__
typedef struct IClusCfgStartupListener IClusCfgStartupListener;
#endif

#ifndef __AsyncIClusCfgStartupListener_FWD_DEFINED__
#define __AsyncIClusCfgStartupListener_FWD_DEFINED__
typedef struct AsyncIClusCfgStartupListener AsyncIClusCfgStartupListener;
#endif

#ifndef __IClusCfgStartupNotify_FWD_DEFINED__
#define __IClusCfgStartupNotify_FWD_DEFINED__
typedef struct IClusCfgStartupNotify IClusCfgStartupNotify;
#endif

#ifndef __AsyncIClusCfgStartupNotify_FWD_DEFINED__
#define __AsyncIClusCfgStartupNotify_FWD_DEFINED__
typedef struct AsyncIClusCfgStartupNotify AsyncIClusCfgStartupNotify;
#endif

#ifndef __IClusCfgManagedResourceData_FWD_DEFINED__
#define __IClusCfgManagedResourceData_FWD_DEFINED__
typedef struct IClusCfgManagedResourceData IClusCfgManagedResourceData;
#endif

#ifndef __IClusCfgVerifyQuorum_FWD_DEFINED__
#define __IClusCfgVerifyQuorum_FWD_DEFINED__
typedef struct IClusCfgVerifyQuorum IClusCfgVerifyQuorum;
#endif

#ifndef __IClusCfgEvictListener_FWD_DEFINED__
#define __IClusCfgEvictListener_FWD_DEFINED__
typedef struct IClusCfgEvictListener IClusCfgEvictListener;
#endif

#ifndef __AsyncIClusCfgEvictListener_FWD_DEFINED__
#define __AsyncIClusCfgEvictListener_FWD_DEFINED__
typedef struct AsyncIClusCfgEvictListener AsyncIClusCfgEvictListener;
#endif

#ifndef __IClusCfgEvictNotify_FWD_DEFINED__
#define __IClusCfgEvictNotify_FWD_DEFINED__
typedef struct IClusCfgEvictNotify IClusCfgEvictNotify;
#endif

#ifndef __AsyncIClusCfgEvictNotify_FWD_DEFINED__
#define __AsyncIClusCfgEvictNotify_FWD_DEFINED__
typedef struct AsyncIClusCfgEvictNotify AsyncIClusCfgEvictNotify;
#endif

#include "unknwn.h"

#ifdef __cplusplus
extern "C"{
#endif

#ifndef __MIDL_user_allocate_free_DEFINED__
#define __MIDL_user_allocate_free_DEFINED__
  void *__RPC_API MIDL_user_allocate(size_t);
  void __RPC_API MIDL_user_free(void *);
#endif

  typedef enum __MIDL___MIDL_itf_cluscfgserver_0000_0001 {
    dluUNKNOWN = 0,dluNO_ROOT_DIRECTORY = dluUNKNOWN + 1,dluREMOVABLE_DISK = dluNO_ROOT_DIRECTORY + 1,dluFIXED_DISK = dluREMOVABLE_DISK + 1,
    dluNETWORK_DRIVE = dluFIXED_DISK + 1,dluCOMPACT_DISC = dluNETWORK_DRIVE + 1,dluRAM_DISK = dluCOMPACT_DISC + 1,dluSYSTEM = dluRAM_DISK + 1,
    dluUNUSED = dluSYSTEM + 1,dluSTART_OF_SYSTEM_BUS = 50,dluNO_ROOT_DIRECTORY_SYSTEM_BUS = dluSTART_OF_SYSTEM_BUS + 1,
    dluREMOVABLE_DISK_SYSTEM_BUS = dluNO_ROOT_DIRECTORY_SYSTEM_BUS + 1,dluFIXED_DISK_SYSTEM_BUS = dluREMOVABLE_DISK_SYSTEM_BUS + 1,
    dluNETWORK_DRIVE_SYSTEM_BUS = dluFIXED_DISK_SYSTEM_BUS + 1,dluCOMPACT_DISC_SYSTEM_BUS = dluNETWORK_DRIVE_SYSTEM_BUS + 1,
    dluRAM_DISK_SYSTEM_BUS = dluCOMPACT_DISC_SYSTEM_BUS + 1,dluSYSTEM_SYSTEM_BUS = dluRAM_DISK_SYSTEM_BUS + 1,
    dluUNUSED_SYSTEM_BUS = dluSYSTEM_SYSTEM_BUS + 1,dluMAX = dluUNUSED_SYSTEM_BUS + 1
  } EDriveLetterUsage;

  typedef struct _DRIVELETTERMAPPING {
    EDriveLetterUsage dluDrives[26 ];
  } SDriveLetterMapping;

  typedef enum __MIDL___MIDL_itf_cluscfgserver_0000_0002 {
    cmUNKNOWN = 0,cmCREATE_CLUSTER = cmUNKNOWN + 1,cmADD_NODE_TO_CLUSTER = cmCREATE_CLUSTER + 1,cmCLEANUP_NODE_AFTER_EVICT = cmADD_NODE_TO_CLUSTER + 1,
    cmMAX = cmCLEANUP_NODE_AFTER_EVICT + 1
  } ECommitMode;

  typedef enum EClusCfgCleanupReason {
    crSUCCESS = 0,crCANCELLED = 1,crERROR = 2
  } EClusCfgCleanupReason;

  typedef enum EDependencyFlags {
    dfUNKNOWN = 0,dfSHARED = 1,dfEXCLUSIVE = 2
  } EDependencyFlags;

  extern RPC_IF_HANDLE __MIDL_itf_cluscfgserver_0000_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_cluscfgserver_0000_v0_0_s_ifspec;

#ifndef __IClusCfgNodeInfo_INTERFACE_DEFINED__
#define __IClusCfgNodeInfo_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IClusCfgNodeInfo;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IClusCfgNodeInfo : public IUnknown {
  public:
    virtual HRESULT WINAPI GetName(BSTR *pbstrNameOut) = 0;
    virtual HRESULT WINAPI SetName(LPCWSTR pcszNameIn) = 0;
    virtual HRESULT WINAPI IsMemberOfCluster(void) = 0;
    virtual HRESULT WINAPI GetClusterConfigInfo(IClusCfgClusterInfo **ppClusCfgClusterInfoOut) = 0;
    virtual HRESULT WINAPI GetOSVersion(DWORD *pdwMajorVersionOut,DWORD *pdwMinorVersionOut,WORD *pwSuiteMaskOut,BYTE *pbProductTypeOut,BSTR *pbstrCSDVersionOut) = 0;
    virtual HRESULT WINAPI GetClusterVersion(DWORD *pdwNodeHighestVersion,DWORD *pdwNodeLowestVersion) = 0;
    virtual HRESULT WINAPI GetDriveLetterMappings(SDriveLetterMapping *pdlmDriveLetterUsageOut) = 0;
    virtual HRESULT WINAPI GetMaxNodeCount(DWORD *pcMaxNodesOut) = 0;
    virtual HRESULT WINAPI GetProcessorInfo(WORD *pwProcessorArchitectureOut,WORD *pwProcessorLevelOut) = 0;
  };
#else
  typedef struct IClusCfgNodeInfoVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IClusCfgNodeInfo *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IClusCfgNodeInfo *This);
      ULONG (WINAPI *Release)(IClusCfgNodeInfo *This);
      HRESULT (WINAPI *GetName)(IClusCfgNodeInfo *This,BSTR *pbstrNameOut);
      HRESULT (WINAPI *SetName)(IClusCfgNodeInfo *This,LPCWSTR pcszNameIn);
      HRESULT (WINAPI *IsMemberOfCluster)(IClusCfgNodeInfo *This);
      HRESULT (WINAPI *GetClusterConfigInfo)(IClusCfgNodeInfo *This,IClusCfgClusterInfo **ppClusCfgClusterInfoOut);
      HRESULT (WINAPI *GetOSVersion)(IClusCfgNodeInfo *This,DWORD *pdwMajorVersionOut,DWORD *pdwMinorVersionOut,WORD *pwSuiteMaskOut,BYTE *pbProductTypeOut,BSTR *pbstrCSDVersionOut);
      HRESULT (WINAPI *GetClusterVersion)(IClusCfgNodeInfo *This,DWORD *pdwNodeHighestVersion,DWORD *pdwNodeLowestVersion);
      HRESULT (WINAPI *GetDriveLetterMappings)(IClusCfgNodeInfo *This,SDriveLetterMapping *pdlmDriveLetterUsageOut);
      HRESULT (WINAPI *GetMaxNodeCount)(IClusCfgNodeInfo *This,DWORD *pcMaxNodesOut);
      HRESULT (WINAPI *GetProcessorInfo)(IClusCfgNodeInfo *This,WORD *pwProcessorArchitectureOut,WORD *pwProcessorLevelOut);
    END_INTERFACE
  } IClusCfgNodeInfoVtbl;
  struct IClusCfgNodeInfo {
    CONST_VTBL struct IClusCfgNodeInfoVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IClusCfgNodeInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IClusCfgNodeInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IClusCfgNodeInfo_Release(This) (This)->lpVtbl->Release(This)
#define IClusCfgNodeInfo_GetName(This,pbstrNameOut) (This)->lpVtbl->GetName(This,pbstrNameOut)
#define IClusCfgNodeInfo_SetName(This,pcszNameIn) (This)->lpVtbl->SetName(This,pcszNameIn)
#define IClusCfgNodeInfo_IsMemberOfCluster(This) (This)->lpVtbl->IsMemberOfCluster(This)
#define IClusCfgNodeInfo_GetClusterConfigInfo(This,ppClusCfgClusterInfoOut) (This)->lpVtbl->GetClusterConfigInfo(This,ppClusCfgClusterInfoOut)
#define IClusCfgNodeInfo_GetOSVersion(This,pdwMajorVersionOut,pdwMinorVersionOut,pwSuiteMaskOut,pbProductTypeOut,pbstrCSDVersionOut) (This)->lpVtbl->GetOSVersion(This,pdwMajorVersionOut,pdwMinorVersionOut,pwSuiteMaskOut,pbProductTypeOut,pbstrCSDVersionOut)
#define IClusCfgNodeInfo_GetClusterVersion(This,pdwNodeHighestVersion,pdwNodeLowestVersion) (This)->lpVtbl->GetClusterVersion(This,pdwNodeHighestVersion,pdwNodeLowestVersion)
#define IClusCfgNodeInfo_GetDriveLetterMappings(This,pdlmDriveLetterUsageOut) (This)->lpVtbl->GetDriveLetterMappings(This,pdlmDriveLetterUsageOut)
#define IClusCfgNodeInfo_GetMaxNodeCount(This,pcMaxNodesOut) (This)->lpVtbl->GetMaxNodeCount(This,pcMaxNodesOut)
#define IClusCfgNodeInfo_GetProcessorInfo(This,pwProcessorArchitectureOut,pwProcessorLevelOut) (This)->lpVtbl->GetProcessorInfo(This,pwProcessorArchitectureOut,pwProcessorLevelOut)
#endif
#endif
  HRESULT WINAPI IClusCfgNodeInfo_GetName_Proxy(IClusCfgNodeInfo *This,BSTR *pbstrNameOut);
  void __RPC_STUB IClusCfgNodeInfo_GetName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgNodeInfo_SetName_Proxy(IClusCfgNodeInfo *This,LPCWSTR pcszNameIn);
  void __RPC_STUB IClusCfgNodeInfo_SetName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgNodeInfo_IsMemberOfCluster_Proxy(IClusCfgNodeInfo *This);
  void __RPC_STUB IClusCfgNodeInfo_IsMemberOfCluster_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgNodeInfo_GetClusterConfigInfo_Proxy(IClusCfgNodeInfo *This,IClusCfgClusterInfo **ppClusCfgClusterInfoOut);
  void __RPC_STUB IClusCfgNodeInfo_GetClusterConfigInfo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgNodeInfo_GetOSVersion_Proxy(IClusCfgNodeInfo *This,DWORD *pdwMajorVersionOut,DWORD *pdwMinorVersionOut,WORD *pwSuiteMaskOut,BYTE *pbProductTypeOut,BSTR *pbstrCSDVersionOut);
  void __RPC_STUB IClusCfgNodeInfo_GetOSVersion_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgNodeInfo_GetClusterVersion_Proxy(IClusCfgNodeInfo *This,DWORD *pdwNodeHighestVersion,DWORD *pdwNodeLowestVersion);
  void __RPC_STUB IClusCfgNodeInfo_GetClusterVersion_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgNodeInfo_GetDriveLetterMappings_Proxy(IClusCfgNodeInfo *This,SDriveLetterMapping *pdlmDriveLetterUsageOut);
  void __RPC_STUB IClusCfgNodeInfo_GetDriveLetterMappings_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgNodeInfo_GetMaxNodeCount_Proxy(IClusCfgNodeInfo *This,DWORD *pcMaxNodesOut);
  void __RPC_STUB IClusCfgNodeInfo_GetMaxNodeCount_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgNodeInfo_GetProcessorInfo_Proxy(IClusCfgNodeInfo *This,WORD *pwProcessorArchitectureOut,WORD *pwProcessorLevelOut);
  void __RPC_STUB IClusCfgNodeInfo_GetProcessorInfo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __AsyncIClusCfgNodeInfo_INTERFACE_DEFINED__
#define __AsyncIClusCfgNodeInfo_INTERFACE_DEFINED__
  EXTERN_C const IID IID_AsyncIClusCfgNodeInfo;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct AsyncIClusCfgNodeInfo : public IUnknown {
  public:
    virtual HRESULT WINAPI Begin_GetName(void) = 0;
    virtual HRESULT WINAPI Finish_GetName(BSTR *pbstrNameOut) = 0;
    virtual HRESULT WINAPI Begin_SetName(LPCWSTR pcszNameIn) = 0;
    virtual HRESULT WINAPI Finish_SetName(void) = 0;
    virtual HRESULT WINAPI Begin_IsMemberOfCluster(void) = 0;
    virtual HRESULT WINAPI Finish_IsMemberOfCluster(void) = 0;
    virtual HRESULT WINAPI Begin_GetClusterConfigInfo(void) = 0;
    virtual HRESULT WINAPI Finish_GetClusterConfigInfo(IClusCfgClusterInfo **ppClusCfgClusterInfoOut) = 0;
    virtual HRESULT WINAPI Begin_GetOSVersion(void) = 0;
    virtual HRESULT WINAPI Finish_GetOSVersion(DWORD *pdwMajorVersionOut,DWORD *pdwMinorVersionOut,WORD *pwSuiteMaskOut,BYTE *pbProductTypeOut,BSTR *pbstrCSDVersionOut) = 0;
    virtual HRESULT WINAPI Begin_GetClusterVersion(void) = 0;
    virtual HRESULT WINAPI Finish_GetClusterVersion(DWORD *pdwNodeHighestVersion,DWORD *pdwNodeLowestVersion) = 0;
    virtual HRESULT WINAPI Begin_GetDriveLetterMappings(void) = 0;
    virtual HRESULT WINAPI Finish_GetDriveLetterMappings(SDriveLetterMapping *pdlmDriveLetterUsageOut) = 0;
    virtual HRESULT WINAPI Begin_GetMaxNodeCount(void) = 0;
    virtual HRESULT WINAPI Finish_GetMaxNodeCount(DWORD *pcMaxNodesOut) = 0;
    virtual HRESULT WINAPI Begin_GetProcessorInfo(void) = 0;
    virtual HRESULT WINAPI Finish_GetProcessorInfo(WORD *pwProcessorArchitectureOut,WORD *pwProcessorLevelOut) = 0;
  };
#else
  typedef struct AsyncIClusCfgNodeInfoVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(AsyncIClusCfgNodeInfo *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(AsyncIClusCfgNodeInfo *This);
      ULONG (WINAPI *Release)(AsyncIClusCfgNodeInfo *This);
      HRESULT (WINAPI *Begin_GetName)(AsyncIClusCfgNodeInfo *This);
      HRESULT (WINAPI *Finish_GetName)(AsyncIClusCfgNodeInfo *This,BSTR *pbstrNameOut);
      HRESULT (WINAPI *Begin_SetName)(AsyncIClusCfgNodeInfo *This,LPCWSTR pcszNameIn);
      HRESULT (WINAPI *Finish_SetName)(AsyncIClusCfgNodeInfo *This);
      HRESULT (WINAPI *Begin_IsMemberOfCluster)(AsyncIClusCfgNodeInfo *This);
      HRESULT (WINAPI *Finish_IsMemberOfCluster)(AsyncIClusCfgNodeInfo *This);
      HRESULT (WINAPI *Begin_GetClusterConfigInfo)(AsyncIClusCfgNodeInfo *This);
      HRESULT (WINAPI *Finish_GetClusterConfigInfo)(AsyncIClusCfgNodeInfo *This,IClusCfgClusterInfo **ppClusCfgClusterInfoOut);
      HRESULT (WINAPI *Begin_GetOSVersion)(AsyncIClusCfgNodeInfo *This);
      HRESULT (WINAPI *Finish_GetOSVersion)(AsyncIClusCfgNodeInfo *This,DWORD *pdwMajorVersionOut,DWORD *pdwMinorVersionOut,WORD *pwSuiteMaskOut,BYTE *pbProductTypeOut,BSTR *pbstrCSDVersionOut);
      HRESULT (WINAPI *Begin_GetClusterVersion)(AsyncIClusCfgNodeInfo *This);
      HRESULT (WINAPI *Finish_GetClusterVersion)(AsyncIClusCfgNodeInfo *This,DWORD *pdwNodeHighestVersion,DWORD *pdwNodeLowestVersion);
      HRESULT (WINAPI *Begin_GetDriveLetterMappings)(AsyncIClusCfgNodeInfo *This);
      HRESULT (WINAPI *Finish_GetDriveLetterMappings)(AsyncIClusCfgNodeInfo *This,SDriveLetterMapping *pdlmDriveLetterUsageOut);
      HRESULT (WINAPI *Begin_GetMaxNodeCount)(AsyncIClusCfgNodeInfo *This);
      HRESULT (WINAPI *Finish_GetMaxNodeCount)(AsyncIClusCfgNodeInfo *This,DWORD *pcMaxNodesOut);
      HRESULT (WINAPI *Begin_GetProcessorInfo)(AsyncIClusCfgNodeInfo *This);
      HRESULT (WINAPI *Finish_GetProcessorInfo)(AsyncIClusCfgNodeInfo *This,WORD *pwProcessorArchitectureOut,WORD *pwProcessorLevelOut);
    END_INTERFACE
  } AsyncIClusCfgNodeInfoVtbl;
  struct AsyncIClusCfgNodeInfo {
    CONST_VTBL struct AsyncIClusCfgNodeInfoVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define AsyncIClusCfgNodeInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define AsyncIClusCfgNodeInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define AsyncIClusCfgNodeInfo_Release(This) (This)->lpVtbl->Release(This)
#define AsyncIClusCfgNodeInfo_Begin_GetName(This) (This)->lpVtbl->Begin_GetName(This)
#define AsyncIClusCfgNodeInfo_Finish_GetName(This,pbstrNameOut) (This)->lpVtbl->Finish_GetName(This,pbstrNameOut)
#define AsyncIClusCfgNodeInfo_Begin_SetName(This,pcszNameIn) (This)->lpVtbl->Begin_SetName(This,pcszNameIn)
#define AsyncIClusCfgNodeInfo_Finish_SetName(This) (This)->lpVtbl->Finish_SetName(This)
#define AsyncIClusCfgNodeInfo_Begin_IsMemberOfCluster(This) (This)->lpVtbl->Begin_IsMemberOfCluster(This)
#define AsyncIClusCfgNodeInfo_Finish_IsMemberOfCluster(This) (This)->lpVtbl->Finish_IsMemberOfCluster(This)
#define AsyncIClusCfgNodeInfo_Begin_GetClusterConfigInfo(This) (This)->lpVtbl->Begin_GetClusterConfigInfo(This)
#define AsyncIClusCfgNodeInfo_Finish_GetClusterConfigInfo(This,ppClusCfgClusterInfoOut) (This)->lpVtbl->Finish_GetClusterConfigInfo(This,ppClusCfgClusterInfoOut)
#define AsyncIClusCfgNodeInfo_Begin_GetOSVersion(This) (This)->lpVtbl->Begin_GetOSVersion(This)
#define AsyncIClusCfgNodeInfo_Finish_GetOSVersion(This,pdwMajorVersionOut,pdwMinorVersionOut,pwSuiteMaskOut,pbProductTypeOut,pbstrCSDVersionOut) (This)->lpVtbl->Finish_GetOSVersion(This,pdwMajorVersionOut,pdwMinorVersionOut,pwSuiteMaskOut,pbProductTypeOut,pbstrCSDVersionOut)
#define AsyncIClusCfgNodeInfo_Begin_GetClusterVersion(This) (This)->lpVtbl->Begin_GetClusterVersion(This)
#define AsyncIClusCfgNodeInfo_Finish_GetClusterVersion(This,pdwNodeHighestVersion,pdwNodeLowestVersion) (This)->lpVtbl->Finish_GetClusterVersion(This,pdwNodeHighestVersion,pdwNodeLowestVersion)
#define AsyncIClusCfgNodeInfo_Begin_GetDriveLetterMappings(This) (This)->lpVtbl->Begin_GetDriveLetterMappings(This)
#define AsyncIClusCfgNodeInfo_Finish_GetDriveLetterMappings(This,pdlmDriveLetterUsageOut) (This)->lpVtbl->Finish_GetDriveLetterMappings(This,pdlmDriveLetterUsageOut)
#define AsyncIClusCfgNodeInfo_Begin_GetMaxNodeCount(This) (This)->lpVtbl->Begin_GetMaxNodeCount(This)
#define AsyncIClusCfgNodeInfo_Finish_GetMaxNodeCount(This,pcMaxNodesOut) (This)->lpVtbl->Finish_GetMaxNodeCount(This,pcMaxNodesOut)
#define AsyncIClusCfgNodeInfo_Begin_GetProcessorInfo(This) (This)->lpVtbl->Begin_GetProcessorInfo(This)
#define AsyncIClusCfgNodeInfo_Finish_GetProcessorInfo(This,pwProcessorArchitectureOut,pwProcessorLevelOut) (This)->lpVtbl->Finish_GetProcessorInfo(This,pwProcessorArchitectureOut,pwProcessorLevelOut)
#endif
#endif
  HRESULT WINAPI AsyncIClusCfgNodeInfo_Begin_GetName_Proxy(AsyncIClusCfgNodeInfo *This);
  void __RPC_STUB AsyncIClusCfgNodeInfo_Begin_GetName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgNodeInfo_Finish_GetName_Proxy(AsyncIClusCfgNodeInfo *This,BSTR *pbstrNameOut);
  void __RPC_STUB AsyncIClusCfgNodeInfo_Finish_GetName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgNodeInfo_Begin_SetName_Proxy(AsyncIClusCfgNodeInfo *This,LPCWSTR pcszNameIn);
  void __RPC_STUB AsyncIClusCfgNodeInfo_Begin_SetName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgNodeInfo_Finish_SetName_Proxy(AsyncIClusCfgNodeInfo *This);
  void __RPC_STUB AsyncIClusCfgNodeInfo_Finish_SetName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgNodeInfo_Begin_IsMemberOfCluster_Proxy(AsyncIClusCfgNodeInfo *This);
  void __RPC_STUB AsyncIClusCfgNodeInfo_Begin_IsMemberOfCluster_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgNodeInfo_Finish_IsMemberOfCluster_Proxy(AsyncIClusCfgNodeInfo *This);
  void __RPC_STUB AsyncIClusCfgNodeInfo_Finish_IsMemberOfCluster_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgNodeInfo_Begin_GetClusterConfigInfo_Proxy(AsyncIClusCfgNodeInfo *This);
  void __RPC_STUB AsyncIClusCfgNodeInfo_Begin_GetClusterConfigInfo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgNodeInfo_Finish_GetClusterConfigInfo_Proxy(AsyncIClusCfgNodeInfo *This,IClusCfgClusterInfo **ppClusCfgClusterInfoOut);
  void __RPC_STUB AsyncIClusCfgNodeInfo_Finish_GetClusterConfigInfo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgNodeInfo_Begin_GetOSVersion_Proxy(AsyncIClusCfgNodeInfo *This);
  void __RPC_STUB AsyncIClusCfgNodeInfo_Begin_GetOSVersion_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgNodeInfo_Finish_GetOSVersion_Proxy(AsyncIClusCfgNodeInfo *This,DWORD *pdwMajorVersionOut,DWORD *pdwMinorVersionOut,WORD *pwSuiteMaskOut,BYTE *pbProductTypeOut,BSTR *pbstrCSDVersionOut);
  void __RPC_STUB AsyncIClusCfgNodeInfo_Finish_GetOSVersion_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgNodeInfo_Begin_GetClusterVersion_Proxy(AsyncIClusCfgNodeInfo *This);
  void __RPC_STUB AsyncIClusCfgNodeInfo_Begin_GetClusterVersion_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgNodeInfo_Finish_GetClusterVersion_Proxy(AsyncIClusCfgNodeInfo *This,DWORD *pdwNodeHighestVersion,DWORD *pdwNodeLowestVersion);
  void __RPC_STUB AsyncIClusCfgNodeInfo_Finish_GetClusterVersion_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgNodeInfo_Begin_GetDriveLetterMappings_Proxy(AsyncIClusCfgNodeInfo *This);
  void __RPC_STUB AsyncIClusCfgNodeInfo_Begin_GetDriveLetterMappings_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgNodeInfo_Finish_GetDriveLetterMappings_Proxy(AsyncIClusCfgNodeInfo *This,SDriveLetterMapping *pdlmDriveLetterUsageOut);
  void __RPC_STUB AsyncIClusCfgNodeInfo_Finish_GetDriveLetterMappings_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgNodeInfo_Begin_GetMaxNodeCount_Proxy(AsyncIClusCfgNodeInfo *This);
  void __RPC_STUB AsyncIClusCfgNodeInfo_Begin_GetMaxNodeCount_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgNodeInfo_Finish_GetMaxNodeCount_Proxy(AsyncIClusCfgNodeInfo *This,DWORD *pcMaxNodesOut);
  void __RPC_STUB AsyncIClusCfgNodeInfo_Finish_GetMaxNodeCount_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgNodeInfo_Begin_GetProcessorInfo_Proxy(AsyncIClusCfgNodeInfo *This);
  void __RPC_STUB AsyncIClusCfgNodeInfo_Begin_GetProcessorInfo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgNodeInfo_Finish_GetProcessorInfo_Proxy(AsyncIClusCfgNodeInfo *This,WORD *pwProcessorArchitectureOut,WORD *pwProcessorLevelOut);
  void __RPC_STUB AsyncIClusCfgNodeInfo_Finish_GetProcessorInfo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IEnumClusCfgManagedResources_INTERFACE_DEFINED__
#define __IEnumClusCfgManagedResources_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IEnumClusCfgManagedResources;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IEnumClusCfgManagedResources : public IUnknown {
  public:
    virtual HRESULT WINAPI Next(ULONG cNumberRequestedIn,IClusCfgManagedResourceInfo **rgpManagedResourceInfoOut,ULONG *pcNumberFetchedOut) = 0;
    virtual HRESULT WINAPI Reset(void) = 0;
    virtual HRESULT WINAPI Skip(ULONG cNumberToSkip) = 0;
    virtual HRESULT WINAPI Clone(IEnumClusCfgManagedResources **ppEnumManagedResourcesOut) = 0;
    virtual HRESULT WINAPI Count(DWORD *pnCountOut) = 0;
  };
#else
  typedef struct IEnumClusCfgManagedResourcesVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IEnumClusCfgManagedResources *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IEnumClusCfgManagedResources *This);
      ULONG (WINAPI *Release)(IEnumClusCfgManagedResources *This);
      HRESULT (WINAPI *Next)(IEnumClusCfgManagedResources *This,ULONG cNumberRequestedIn,IClusCfgManagedResourceInfo **rgpManagedResourceInfoOut,ULONG *pcNumberFetchedOut);
      HRESULT (WINAPI *Reset)(IEnumClusCfgManagedResources *This);
      HRESULT (WINAPI *Skip)(IEnumClusCfgManagedResources *This,ULONG cNumberToSkip);
      HRESULT (WINAPI *Clone)(IEnumClusCfgManagedResources *This,IEnumClusCfgManagedResources **ppEnumManagedResourcesOut);
      HRESULT (WINAPI *Count)(IEnumClusCfgManagedResources *This,DWORD *pnCountOut);
    END_INTERFACE
  } IEnumClusCfgManagedResourcesVtbl;
  struct IEnumClusCfgManagedResources {
    CONST_VTBL struct IEnumClusCfgManagedResourcesVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IEnumClusCfgManagedResources_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumClusCfgManagedResources_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumClusCfgManagedResources_Release(This) (This)->lpVtbl->Release(This)
#define IEnumClusCfgManagedResources_Next(This,cNumberRequestedIn,rgpManagedResourceInfoOut,pcNumberFetchedOut) (This)->lpVtbl->Next(This,cNumberRequestedIn,rgpManagedResourceInfoOut,pcNumberFetchedOut)
#define IEnumClusCfgManagedResources_Reset(This) (This)->lpVtbl->Reset(This)
#define IEnumClusCfgManagedResources_Skip(This,cNumberToSkip) (This)->lpVtbl->Skip(This,cNumberToSkip)
#define IEnumClusCfgManagedResources_Clone(This,ppEnumManagedResourcesOut) (This)->lpVtbl->Clone(This,ppEnumManagedResourcesOut)
#define IEnumClusCfgManagedResources_Count(This,pnCountOut) (This)->lpVtbl->Count(This,pnCountOut)
#endif
#endif
  HRESULT WINAPI IEnumClusCfgManagedResources_Next_Proxy(IEnumClusCfgManagedResources *This,ULONG cNumberRequestedIn,IClusCfgManagedResourceInfo **rgpManagedResourceInfoOut,ULONG *pcNumberFetchedOut);
  void __RPC_STUB IEnumClusCfgManagedResources_Next_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEnumClusCfgManagedResources_Reset_Proxy(IEnumClusCfgManagedResources *This);
  void __RPC_STUB IEnumClusCfgManagedResources_Reset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEnumClusCfgManagedResources_Skip_Proxy(IEnumClusCfgManagedResources *This,ULONG cNumberToSkip);
  void __RPC_STUB IEnumClusCfgManagedResources_Skip_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEnumClusCfgManagedResources_Clone_Proxy(IEnumClusCfgManagedResources *This,IEnumClusCfgManagedResources **ppEnumManagedResourcesOut);
  void __RPC_STUB IEnumClusCfgManagedResources_Clone_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEnumClusCfgManagedResources_Count_Proxy(IEnumClusCfgManagedResources *This,DWORD *pnCountOut);
  void __RPC_STUB IEnumClusCfgManagedResources_Count_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __AsyncIEnumClusCfgManagedResources_INTERFACE_DEFINED__
#define __AsyncIEnumClusCfgManagedResources_INTERFACE_DEFINED__
  EXTERN_C const IID IID_AsyncIEnumClusCfgManagedResources;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct AsyncIEnumClusCfgManagedResources : public IUnknown {
  public:
    virtual HRESULT WINAPI Begin_Next(ULONG cNumberRequestedIn) = 0;
    virtual HRESULT WINAPI Finish_Next(IClusCfgManagedResourceInfo **rgpManagedResourceInfoOut,ULONG *pcNumberFetchedOut) = 0;
    virtual HRESULT WINAPI Begin_Reset(void) = 0;
    virtual HRESULT WINAPI Finish_Reset(void) = 0;
    virtual HRESULT WINAPI Begin_Skip(ULONG cNumberToSkip) = 0;
    virtual HRESULT WINAPI Finish_Skip(void) = 0;
    virtual HRESULT WINAPI Begin_Clone(void) = 0;
    virtual HRESULT WINAPI Finish_Clone(IEnumClusCfgManagedResources **ppEnumManagedResourcesOut) = 0;
    virtual HRESULT WINAPI Begin_Count(void) = 0;
    virtual HRESULT WINAPI Finish_Count(DWORD *pnCountOut) = 0;
  };
#else
  typedef struct AsyncIEnumClusCfgManagedResourcesVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(AsyncIEnumClusCfgManagedResources *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(AsyncIEnumClusCfgManagedResources *This);
      ULONG (WINAPI *Release)(AsyncIEnumClusCfgManagedResources *This);
      HRESULT (WINAPI *Begin_Next)(AsyncIEnumClusCfgManagedResources *This,ULONG cNumberRequestedIn);
      HRESULT (WINAPI *Finish_Next)(AsyncIEnumClusCfgManagedResources *This,IClusCfgManagedResourceInfo **rgpManagedResourceInfoOut,ULONG *pcNumberFetchedOut);
      HRESULT (WINAPI *Begin_Reset)(AsyncIEnumClusCfgManagedResources *This);
      HRESULT (WINAPI *Finish_Reset)(AsyncIEnumClusCfgManagedResources *This);
      HRESULT (WINAPI *Begin_Skip)(AsyncIEnumClusCfgManagedResources *This,ULONG cNumberToSkip);
      HRESULT (WINAPI *Finish_Skip)(AsyncIEnumClusCfgManagedResources *This);
      HRESULT (WINAPI *Begin_Clone)(AsyncIEnumClusCfgManagedResources *This);
      HRESULT (WINAPI *Finish_Clone)(AsyncIEnumClusCfgManagedResources *This,IEnumClusCfgManagedResources **ppEnumManagedResourcesOut);
      HRESULT (WINAPI *Begin_Count)(AsyncIEnumClusCfgManagedResources *This);
      HRESULT (WINAPI *Finish_Count)(AsyncIEnumClusCfgManagedResources *This,DWORD *pnCountOut);
    END_INTERFACE
  } AsyncIEnumClusCfgManagedResourcesVtbl;
  struct AsyncIEnumClusCfgManagedResources {
    CONST_VTBL struct AsyncIEnumClusCfgManagedResourcesVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define AsyncIEnumClusCfgManagedResources_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define AsyncIEnumClusCfgManagedResources_AddRef(This) (This)->lpVtbl->AddRef(This)
#define AsyncIEnumClusCfgManagedResources_Release(This) (This)->lpVtbl->Release(This)
#define AsyncIEnumClusCfgManagedResources_Begin_Next(This,cNumberRequestedIn) (This)->lpVtbl->Begin_Next(This,cNumberRequestedIn)
#define AsyncIEnumClusCfgManagedResources_Finish_Next(This,rgpManagedResourceInfoOut,pcNumberFetchedOut) (This)->lpVtbl->Finish_Next(This,rgpManagedResourceInfoOut,pcNumberFetchedOut)
#define AsyncIEnumClusCfgManagedResources_Begin_Reset(This) (This)->lpVtbl->Begin_Reset(This)
#define AsyncIEnumClusCfgManagedResources_Finish_Reset(This) (This)->lpVtbl->Finish_Reset(This)
#define AsyncIEnumClusCfgManagedResources_Begin_Skip(This,cNumberToSkip) (This)->lpVtbl->Begin_Skip(This,cNumberToSkip)
#define AsyncIEnumClusCfgManagedResources_Finish_Skip(This) (This)->lpVtbl->Finish_Skip(This)
#define AsyncIEnumClusCfgManagedResources_Begin_Clone(This) (This)->lpVtbl->Begin_Clone(This)
#define AsyncIEnumClusCfgManagedResources_Finish_Clone(This,ppEnumManagedResourcesOut) (This)->lpVtbl->Finish_Clone(This,ppEnumManagedResourcesOut)
#define AsyncIEnumClusCfgManagedResources_Begin_Count(This) (This)->lpVtbl->Begin_Count(This)
#define AsyncIEnumClusCfgManagedResources_Finish_Count(This,pnCountOut) (This)->lpVtbl->Finish_Count(This,pnCountOut)
#endif
#endif
  HRESULT WINAPI AsyncIEnumClusCfgManagedResources_Begin_Next_Proxy(AsyncIEnumClusCfgManagedResources *This,ULONG cNumberRequestedIn);
  void __RPC_STUB AsyncIEnumClusCfgManagedResources_Begin_Next_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIEnumClusCfgManagedResources_Finish_Next_Proxy(AsyncIEnumClusCfgManagedResources *This,IClusCfgManagedResourceInfo **rgpManagedResourceInfoOut,ULONG *pcNumberFetchedOut);
  void __RPC_STUB AsyncIEnumClusCfgManagedResources_Finish_Next_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIEnumClusCfgManagedResources_Begin_Reset_Proxy(AsyncIEnumClusCfgManagedResources *This);
  void __RPC_STUB AsyncIEnumClusCfgManagedResources_Begin_Reset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIEnumClusCfgManagedResources_Finish_Reset_Proxy(AsyncIEnumClusCfgManagedResources *This);
  void __RPC_STUB AsyncIEnumClusCfgManagedResources_Finish_Reset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIEnumClusCfgManagedResources_Begin_Skip_Proxy(AsyncIEnumClusCfgManagedResources *This,ULONG cNumberToSkip);
  void __RPC_STUB AsyncIEnumClusCfgManagedResources_Begin_Skip_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIEnumClusCfgManagedResources_Finish_Skip_Proxy(AsyncIEnumClusCfgManagedResources *This);
  void __RPC_STUB AsyncIEnumClusCfgManagedResources_Finish_Skip_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIEnumClusCfgManagedResources_Begin_Clone_Proxy(AsyncIEnumClusCfgManagedResources *This);
  void __RPC_STUB AsyncIEnumClusCfgManagedResources_Begin_Clone_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIEnumClusCfgManagedResources_Finish_Clone_Proxy(AsyncIEnumClusCfgManagedResources *This,IEnumClusCfgManagedResources **ppEnumManagedResourcesOut);
  void __RPC_STUB AsyncIEnumClusCfgManagedResources_Finish_Clone_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIEnumClusCfgManagedResources_Begin_Count_Proxy(AsyncIEnumClusCfgManagedResources *This);
  void __RPC_STUB AsyncIEnumClusCfgManagedResources_Begin_Count_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIEnumClusCfgManagedResources_Finish_Count_Proxy(AsyncIEnumClusCfgManagedResources *This,DWORD *pnCountOut);
  void __RPC_STUB AsyncIEnumClusCfgManagedResources_Finish_Count_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IEnumClusCfgNetworks_INTERFACE_DEFINED__
#define __IEnumClusCfgNetworks_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IEnumClusCfgNetworks;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IEnumClusCfgNetworks : public IUnknown {
  public:
    virtual HRESULT WINAPI Next(ULONG cNumberRequestedIn,IClusCfgNetworkInfo **rgpNetworkInfoOut,ULONG *pcNumberFetchedOut) = 0;
    virtual HRESULT WINAPI Skip(ULONG cNumberToSkipIn) = 0;
    virtual HRESULT WINAPI Reset(void) = 0;
    virtual HRESULT WINAPI Clone(IEnumClusCfgNetworks **ppEnumNetworksOut) = 0;
    virtual HRESULT WINAPI Count(DWORD *pnCountOut) = 0;
  };
#else
  typedef struct IEnumClusCfgNetworksVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IEnumClusCfgNetworks *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IEnumClusCfgNetworks *This);
      ULONG (WINAPI *Release)(IEnumClusCfgNetworks *This);
      HRESULT (WINAPI *Next)(IEnumClusCfgNetworks *This,ULONG cNumberRequestedIn,IClusCfgNetworkInfo **rgpNetworkInfoOut,ULONG *pcNumberFetchedOut);
      HRESULT (WINAPI *Skip)(IEnumClusCfgNetworks *This,ULONG cNumberToSkipIn);
      HRESULT (WINAPI *Reset)(IEnumClusCfgNetworks *This);
      HRESULT (WINAPI *Clone)(IEnumClusCfgNetworks *This,IEnumClusCfgNetworks **ppEnumNetworksOut);
      HRESULT (WINAPI *Count)(IEnumClusCfgNetworks *This,DWORD *pnCountOut);
    END_INTERFACE
  } IEnumClusCfgNetworksVtbl;
  struct IEnumClusCfgNetworks {
    CONST_VTBL struct IEnumClusCfgNetworksVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IEnumClusCfgNetworks_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumClusCfgNetworks_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumClusCfgNetworks_Release(This) (This)->lpVtbl->Release(This)
#define IEnumClusCfgNetworks_Next(This,cNumberRequestedIn,rgpNetworkInfoOut,pcNumberFetchedOut) (This)->lpVtbl->Next(This,cNumberRequestedIn,rgpNetworkInfoOut,pcNumberFetchedOut)
#define IEnumClusCfgNetworks_Skip(This,cNumberToSkipIn) (This)->lpVtbl->Skip(This,cNumberToSkipIn)
#define IEnumClusCfgNetworks_Reset(This) (This)->lpVtbl->Reset(This)
#define IEnumClusCfgNetworks_Clone(This,ppEnumNetworksOut) (This)->lpVtbl->Clone(This,ppEnumNetworksOut)
#define IEnumClusCfgNetworks_Count(This,pnCountOut) (This)->lpVtbl->Count(This,pnCountOut)
#endif
#endif
  HRESULT WINAPI IEnumClusCfgNetworks_Next_Proxy(IEnumClusCfgNetworks *This,ULONG cNumberRequestedIn,IClusCfgNetworkInfo **rgpNetworkInfoOut,ULONG *pcNumberFetchedOut);
  void __RPC_STUB IEnumClusCfgNetworks_Next_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEnumClusCfgNetworks_Skip_Proxy(IEnumClusCfgNetworks *This,ULONG cNumberToSkipIn);
  void __RPC_STUB IEnumClusCfgNetworks_Skip_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEnumClusCfgNetworks_Reset_Proxy(IEnumClusCfgNetworks *This);
  void __RPC_STUB IEnumClusCfgNetworks_Reset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEnumClusCfgNetworks_Clone_Proxy(IEnumClusCfgNetworks *This,IEnumClusCfgNetworks **ppEnumNetworksOut);
  void __RPC_STUB IEnumClusCfgNetworks_Clone_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEnumClusCfgNetworks_Count_Proxy(IEnumClusCfgNetworks *This,DWORD *pnCountOut);
  void __RPC_STUB IEnumClusCfgNetworks_Count_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __AsyncIEnumClusCfgNetworks_INTERFACE_DEFINED__
#define __AsyncIEnumClusCfgNetworks_INTERFACE_DEFINED__
  EXTERN_C const IID IID_AsyncIEnumClusCfgNetworks;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct AsyncIEnumClusCfgNetworks : public IUnknown {
  public:
    virtual HRESULT WINAPI Begin_Next(ULONG cNumberRequestedIn) = 0;
    virtual HRESULT WINAPI Finish_Next(IClusCfgNetworkInfo **rgpNetworkInfoOut,ULONG *pcNumberFetchedOut) = 0;
    virtual HRESULT WINAPI Begin_Skip(ULONG cNumberToSkipIn) = 0;
    virtual HRESULT WINAPI Finish_Skip(void) = 0;
    virtual HRESULT WINAPI Begin_Reset(void) = 0;
    virtual HRESULT WINAPI Finish_Reset(void) = 0;
    virtual HRESULT WINAPI Begin_Clone(void) = 0;
    virtual HRESULT WINAPI Finish_Clone(IEnumClusCfgNetworks **ppEnumNetworksOut) = 0;
    virtual HRESULT WINAPI Begin_Count(void) = 0;
    virtual HRESULT WINAPI Finish_Count(DWORD *pnCountOut) = 0;
  };
#else
  typedef struct AsyncIEnumClusCfgNetworksVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(AsyncIEnumClusCfgNetworks *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(AsyncIEnumClusCfgNetworks *This);
      ULONG (WINAPI *Release)(AsyncIEnumClusCfgNetworks *This);
      HRESULT (WINAPI *Begin_Next)(AsyncIEnumClusCfgNetworks *This,ULONG cNumberRequestedIn);
      HRESULT (WINAPI *Finish_Next)(AsyncIEnumClusCfgNetworks *This,IClusCfgNetworkInfo **rgpNetworkInfoOut,ULONG *pcNumberFetchedOut);
      HRESULT (WINAPI *Begin_Skip)(AsyncIEnumClusCfgNetworks *This,ULONG cNumberToSkipIn);
      HRESULT (WINAPI *Finish_Skip)(AsyncIEnumClusCfgNetworks *This);
      HRESULT (WINAPI *Begin_Reset)(AsyncIEnumClusCfgNetworks *This);
      HRESULT (WINAPI *Finish_Reset)(AsyncIEnumClusCfgNetworks *This);
      HRESULT (WINAPI *Begin_Clone)(AsyncIEnumClusCfgNetworks *This);
      HRESULT (WINAPI *Finish_Clone)(AsyncIEnumClusCfgNetworks *This,IEnumClusCfgNetworks **ppEnumNetworksOut);
      HRESULT (WINAPI *Begin_Count)(AsyncIEnumClusCfgNetworks *This);
      HRESULT (WINAPI *Finish_Count)(AsyncIEnumClusCfgNetworks *This,DWORD *pnCountOut);
    END_INTERFACE
  } AsyncIEnumClusCfgNetworksVtbl;
  struct AsyncIEnumClusCfgNetworks {
    CONST_VTBL struct AsyncIEnumClusCfgNetworksVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define AsyncIEnumClusCfgNetworks_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define AsyncIEnumClusCfgNetworks_AddRef(This) (This)->lpVtbl->AddRef(This)
#define AsyncIEnumClusCfgNetworks_Release(This) (This)->lpVtbl->Release(This)
#define AsyncIEnumClusCfgNetworks_Begin_Next(This,cNumberRequestedIn) (This)->lpVtbl->Begin_Next(This,cNumberRequestedIn)
#define AsyncIEnumClusCfgNetworks_Finish_Next(This,rgpNetworkInfoOut,pcNumberFetchedOut) (This)->lpVtbl->Finish_Next(This,rgpNetworkInfoOut,pcNumberFetchedOut)
#define AsyncIEnumClusCfgNetworks_Begin_Skip(This,cNumberToSkipIn) (This)->lpVtbl->Begin_Skip(This,cNumberToSkipIn)
#define AsyncIEnumClusCfgNetworks_Finish_Skip(This) (This)->lpVtbl->Finish_Skip(This)
#define AsyncIEnumClusCfgNetworks_Begin_Reset(This) (This)->lpVtbl->Begin_Reset(This)
#define AsyncIEnumClusCfgNetworks_Finish_Reset(This) (This)->lpVtbl->Finish_Reset(This)
#define AsyncIEnumClusCfgNetworks_Begin_Clone(This) (This)->lpVtbl->Begin_Clone(This)
#define AsyncIEnumClusCfgNetworks_Finish_Clone(This,ppEnumNetworksOut) (This)->lpVtbl->Finish_Clone(This,ppEnumNetworksOut)
#define AsyncIEnumClusCfgNetworks_Begin_Count(This) (This)->lpVtbl->Begin_Count(This)
#define AsyncIEnumClusCfgNetworks_Finish_Count(This,pnCountOut) (This)->lpVtbl->Finish_Count(This,pnCountOut)
#endif
#endif
  HRESULT WINAPI AsyncIEnumClusCfgNetworks_Begin_Next_Proxy(AsyncIEnumClusCfgNetworks *This,ULONG cNumberRequestedIn);
  void __RPC_STUB AsyncIEnumClusCfgNetworks_Begin_Next_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIEnumClusCfgNetworks_Finish_Next_Proxy(AsyncIEnumClusCfgNetworks *This,IClusCfgNetworkInfo **rgpNetworkInfoOut,ULONG *pcNumberFetchedOut);
  void __RPC_STUB AsyncIEnumClusCfgNetworks_Finish_Next_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIEnumClusCfgNetworks_Begin_Skip_Proxy(AsyncIEnumClusCfgNetworks *This,ULONG cNumberToSkipIn);
  void __RPC_STUB AsyncIEnumClusCfgNetworks_Begin_Skip_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIEnumClusCfgNetworks_Finish_Skip_Proxy(AsyncIEnumClusCfgNetworks *This);
  void __RPC_STUB AsyncIEnumClusCfgNetworks_Finish_Skip_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIEnumClusCfgNetworks_Begin_Reset_Proxy(AsyncIEnumClusCfgNetworks *This);
  void __RPC_STUB AsyncIEnumClusCfgNetworks_Begin_Reset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIEnumClusCfgNetworks_Finish_Reset_Proxy(AsyncIEnumClusCfgNetworks *This);
  void __RPC_STUB AsyncIEnumClusCfgNetworks_Finish_Reset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIEnumClusCfgNetworks_Begin_Clone_Proxy(AsyncIEnumClusCfgNetworks *This);
  void __RPC_STUB AsyncIEnumClusCfgNetworks_Begin_Clone_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIEnumClusCfgNetworks_Finish_Clone_Proxy(AsyncIEnumClusCfgNetworks *This,IEnumClusCfgNetworks **ppEnumNetworksOut);
  void __RPC_STUB AsyncIEnumClusCfgNetworks_Finish_Clone_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIEnumClusCfgNetworks_Begin_Count_Proxy(AsyncIEnumClusCfgNetworks *This);
  void __RPC_STUB AsyncIEnumClusCfgNetworks_Begin_Count_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIEnumClusCfgNetworks_Finish_Count_Proxy(AsyncIEnumClusCfgNetworks *This,DWORD *pnCountOut);
  void __RPC_STUB AsyncIEnumClusCfgNetworks_Finish_Count_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IClusCfgManagedResourceInfo_INTERFACE_DEFINED__
#define __IClusCfgManagedResourceInfo_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IClusCfgManagedResourceInfo;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IClusCfgManagedResourceInfo : public IUnknown {
  public:
    virtual HRESULT WINAPI GetUID(BSTR *pbstrUIDOut) = 0;
    virtual HRESULT WINAPI GetName(BSTR *pbstrNameOut) = 0;
    virtual HRESULT WINAPI SetName(LPCWSTR pcszNameIn) = 0;
    virtual HRESULT WINAPI IsManaged(void) = 0;
    virtual HRESULT WINAPI SetManaged(WINBOOL fIsManagedIn) = 0;
    virtual HRESULT WINAPI IsQuorumResource(void) = 0;
    virtual HRESULT WINAPI SetQuorumResource(WINBOOL fIsQuorumResourceIn) = 0;
    virtual HRESULT WINAPI IsQuorumCapable(void) = 0;
    virtual HRESULT WINAPI SetQuorumCapable(WINBOOL fIsQuorumCapableIn) = 0;
    virtual HRESULT WINAPI GetDriveLetterMappings(SDriveLetterMapping *pdlmDriveLetterMappingOut) = 0;
    virtual HRESULT WINAPI SetDriveLetterMappings(SDriveLetterMapping dlmDriveLetterMappingIn) = 0;
    virtual HRESULT WINAPI IsManagedByDefault(void) = 0;
    virtual HRESULT WINAPI SetManagedByDefault(WINBOOL fIsManagedByDefaultIn) = 0;
  };
#else
  typedef struct IClusCfgManagedResourceInfoVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IClusCfgManagedResourceInfo *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IClusCfgManagedResourceInfo *This);
      ULONG (WINAPI *Release)(IClusCfgManagedResourceInfo *This);
      HRESULT (WINAPI *GetUID)(IClusCfgManagedResourceInfo *This,BSTR *pbstrUIDOut);
      HRESULT (WINAPI *GetName)(IClusCfgManagedResourceInfo *This,BSTR *pbstrNameOut);
      HRESULT (WINAPI *SetName)(IClusCfgManagedResourceInfo *This,LPCWSTR pcszNameIn);
      HRESULT (WINAPI *IsManaged)(IClusCfgManagedResourceInfo *This);
      HRESULT (WINAPI *SetManaged)(IClusCfgManagedResourceInfo *This,WINBOOL fIsManagedIn);
      HRESULT (WINAPI *IsQuorumResource)(IClusCfgManagedResourceInfo *This);
      HRESULT (WINAPI *SetQuorumResource)(IClusCfgManagedResourceInfo *This,WINBOOL fIsQuorumResourceIn);
      HRESULT (WINAPI *IsQuorumCapable)(IClusCfgManagedResourceInfo *This);
      HRESULT (WINAPI *SetQuorumCapable)(IClusCfgManagedResourceInfo *This,WINBOOL fIsQuorumCapableIn);
      HRESULT (WINAPI *GetDriveLetterMappings)(IClusCfgManagedResourceInfo *This,SDriveLetterMapping *pdlmDriveLetterMappingOut);
      HRESULT (WINAPI *SetDriveLetterMappings)(IClusCfgManagedResourceInfo *This,SDriveLetterMapping dlmDriveLetterMappingIn);
      HRESULT (WINAPI *IsManagedByDefault)(IClusCfgManagedResourceInfo *This);
      HRESULT (WINAPI *SetManagedByDefault)(IClusCfgManagedResourceInfo *This,WINBOOL fIsManagedByDefaultIn);
    END_INTERFACE
  } IClusCfgManagedResourceInfoVtbl;
  struct IClusCfgManagedResourceInfo {
    CONST_VTBL struct IClusCfgManagedResourceInfoVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IClusCfgManagedResourceInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IClusCfgManagedResourceInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IClusCfgManagedResourceInfo_Release(This) (This)->lpVtbl->Release(This)
#define IClusCfgManagedResourceInfo_GetUID(This,pbstrUIDOut) (This)->lpVtbl->GetUID(This,pbstrUIDOut)
#define IClusCfgManagedResourceInfo_GetName(This,pbstrNameOut) (This)->lpVtbl->GetName(This,pbstrNameOut)
#define IClusCfgManagedResourceInfo_SetName(This,pcszNameIn) (This)->lpVtbl->SetName(This,pcszNameIn)
#define IClusCfgManagedResourceInfo_IsManaged(This) (This)->lpVtbl->IsManaged(This)
#define IClusCfgManagedResourceInfo_SetManaged(This,fIsManagedIn) (This)->lpVtbl->SetManaged(This,fIsManagedIn)
#define IClusCfgManagedResourceInfo_IsQuorumResource(This) (This)->lpVtbl->IsQuorumResource(This)
#define IClusCfgManagedResourceInfo_SetQuorumResource(This,fIsQuorumResourceIn) (This)->lpVtbl->SetQuorumResource(This,fIsQuorumResourceIn)
#define IClusCfgManagedResourceInfo_IsQuorumCapable(This) (This)->lpVtbl->IsQuorumCapable(This)
#define IClusCfgManagedResourceInfo_SetQuorumCapable(This,fIsQuorumCapableIn) (This)->lpVtbl->SetQuorumCapable(This,fIsQuorumCapableIn)
#define IClusCfgManagedResourceInfo_GetDriveLetterMappings(This,pdlmDriveLetterMappingOut) (This)->lpVtbl->GetDriveLetterMappings(This,pdlmDriveLetterMappingOut)
#define IClusCfgManagedResourceInfo_SetDriveLetterMappings(This,dlmDriveLetterMappingIn) (This)->lpVtbl->SetDriveLetterMappings(This,dlmDriveLetterMappingIn)
#define IClusCfgManagedResourceInfo_IsManagedByDefault(This) (This)->lpVtbl->IsManagedByDefault(This)
#define IClusCfgManagedResourceInfo_SetManagedByDefault(This,fIsManagedByDefaultIn) (This)->lpVtbl->SetManagedByDefault(This,fIsManagedByDefaultIn)
#endif
#endif
  HRESULT WINAPI IClusCfgManagedResourceInfo_GetUID_Proxy(IClusCfgManagedResourceInfo *This,BSTR *pbstrUIDOut);
  void __RPC_STUB IClusCfgManagedResourceInfo_GetUID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgManagedResourceInfo_GetName_Proxy(IClusCfgManagedResourceInfo *This,BSTR *pbstrNameOut);
  void __RPC_STUB IClusCfgManagedResourceInfo_GetName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgManagedResourceInfo_SetName_Proxy(IClusCfgManagedResourceInfo *This,LPCWSTR pcszNameIn);
  void __RPC_STUB IClusCfgManagedResourceInfo_SetName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgManagedResourceInfo_IsManaged_Proxy(IClusCfgManagedResourceInfo *This);
  void __RPC_STUB IClusCfgManagedResourceInfo_IsManaged_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgManagedResourceInfo_SetManaged_Proxy(IClusCfgManagedResourceInfo *This,WINBOOL fIsManagedIn);
  void __RPC_STUB IClusCfgManagedResourceInfo_SetManaged_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgManagedResourceInfo_IsQuorumResource_Proxy(IClusCfgManagedResourceInfo *This);
  void __RPC_STUB IClusCfgManagedResourceInfo_IsQuorumResource_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgManagedResourceInfo_SetQuorumResource_Proxy(IClusCfgManagedResourceInfo *This,WINBOOL fIsQuorumResourceIn);
  void __RPC_STUB IClusCfgManagedResourceInfo_SetQuorumResource_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgManagedResourceInfo_IsQuorumCapable_Proxy(IClusCfgManagedResourceInfo *This);
  void __RPC_STUB IClusCfgManagedResourceInfo_IsQuorumCapable_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgManagedResourceInfo_SetQuorumCapable_Proxy(IClusCfgManagedResourceInfo *This,WINBOOL fIsQuorumCapableIn);
  void __RPC_STUB IClusCfgManagedResourceInfo_SetQuorumCapable_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgManagedResourceInfo_GetDriveLetterMappings_Proxy(IClusCfgManagedResourceInfo *This,SDriveLetterMapping *pdlmDriveLetterMappingOut);
  void __RPC_STUB IClusCfgManagedResourceInfo_GetDriveLetterMappings_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgManagedResourceInfo_SetDriveLetterMappings_Proxy(IClusCfgManagedResourceInfo *This,SDriveLetterMapping dlmDriveLetterMappingIn);
  void __RPC_STUB IClusCfgManagedResourceInfo_SetDriveLetterMappings_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgManagedResourceInfo_IsManagedByDefault_Proxy(IClusCfgManagedResourceInfo *This);
  void __RPC_STUB IClusCfgManagedResourceInfo_IsManagedByDefault_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgManagedResourceInfo_SetManagedByDefault_Proxy(IClusCfgManagedResourceInfo *This,WINBOOL fIsManagedByDefaultIn);
  void __RPC_STUB IClusCfgManagedResourceInfo_SetManagedByDefault_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __AsyncIClusCfgManagedResourceInfo_INTERFACE_DEFINED__
#define __AsyncIClusCfgManagedResourceInfo_INTERFACE_DEFINED__
  EXTERN_C const IID IID_AsyncIClusCfgManagedResourceInfo;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct AsyncIClusCfgManagedResourceInfo : public IUnknown {
  public:
    virtual HRESULT WINAPI Begin_GetUID(void) = 0;
    virtual HRESULT WINAPI Finish_GetUID(BSTR *pbstrUIDOut) = 0;
    virtual HRESULT WINAPI Begin_GetName(void) = 0;
    virtual HRESULT WINAPI Finish_GetName(BSTR *pbstrNameOut) = 0;
    virtual HRESULT WINAPI Begin_SetName(LPCWSTR pcszNameIn) = 0;
    virtual HRESULT WINAPI Finish_SetName(void) = 0;
    virtual HRESULT WINAPI Begin_IsManaged(void) = 0;
    virtual HRESULT WINAPI Finish_IsManaged(void) = 0;
    virtual HRESULT WINAPI Begin_SetManaged(WINBOOL fIsManagedIn) = 0;
    virtual HRESULT WINAPI Finish_SetManaged(void) = 0;
    virtual HRESULT WINAPI Begin_IsQuorumResource(void) = 0;
    virtual HRESULT WINAPI Finish_IsQuorumResource(void) = 0;
    virtual HRESULT WINAPI Begin_SetQuorumResource(WINBOOL fIsQuorumResourceIn) = 0;
    virtual HRESULT WINAPI Finish_SetQuorumResource(void) = 0;
    virtual HRESULT WINAPI Begin_IsQuorumCapable(void) = 0;
    virtual HRESULT WINAPI Finish_IsQuorumCapable(void) = 0;
    virtual HRESULT WINAPI Begin_SetQuorumCapable(WINBOOL fIsQuorumCapableIn) = 0;
    virtual HRESULT WINAPI Finish_SetQuorumCapable(void) = 0;
    virtual HRESULT WINAPI Begin_GetDriveLetterMappings(void) = 0;
    virtual HRESULT WINAPI Finish_GetDriveLetterMappings(SDriveLetterMapping *pdlmDriveLetterMappingOut) = 0;
    virtual HRESULT WINAPI Begin_SetDriveLetterMappings(SDriveLetterMapping dlmDriveLetterMappingIn) = 0;
    virtual HRESULT WINAPI Finish_SetDriveLetterMappings(void) = 0;
    virtual HRESULT WINAPI Begin_IsManagedByDefault(void) = 0;
    virtual HRESULT WINAPI Finish_IsManagedByDefault(void) = 0;
    virtual HRESULT WINAPI Begin_SetManagedByDefault(WINBOOL fIsManagedByDefaultIn) = 0;
    virtual HRESULT WINAPI Finish_SetManagedByDefault(void) = 0;
  };
#else
  typedef struct AsyncIClusCfgManagedResourceInfoVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(AsyncIClusCfgManagedResourceInfo *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(AsyncIClusCfgManagedResourceInfo *This);
      ULONG (WINAPI *Release)(AsyncIClusCfgManagedResourceInfo *This);
      HRESULT (WINAPI *Begin_GetUID)(AsyncIClusCfgManagedResourceInfo *This);
      HRESULT (WINAPI *Finish_GetUID)(AsyncIClusCfgManagedResourceInfo *This,BSTR *pbstrUIDOut);
      HRESULT (WINAPI *Begin_GetName)(AsyncIClusCfgManagedResourceInfo *This);
      HRESULT (WINAPI *Finish_GetName)(AsyncIClusCfgManagedResourceInfo *This,BSTR *pbstrNameOut);
      HRESULT (WINAPI *Begin_SetName)(AsyncIClusCfgManagedResourceInfo *This,LPCWSTR pcszNameIn);
      HRESULT (WINAPI *Finish_SetName)(AsyncIClusCfgManagedResourceInfo *This);
      HRESULT (WINAPI *Begin_IsManaged)(AsyncIClusCfgManagedResourceInfo *This);
      HRESULT (WINAPI *Finish_IsManaged)(AsyncIClusCfgManagedResourceInfo *This);
      HRESULT (WINAPI *Begin_SetManaged)(AsyncIClusCfgManagedResourceInfo *This,WINBOOL fIsManagedIn);
      HRESULT (WINAPI *Finish_SetManaged)(AsyncIClusCfgManagedResourceInfo *This);
      HRESULT (WINAPI *Begin_IsQuorumResource)(AsyncIClusCfgManagedResourceInfo *This);
      HRESULT (WINAPI *Finish_IsQuorumResource)(AsyncIClusCfgManagedResourceInfo *This);
      HRESULT (WINAPI *Begin_SetQuorumResource)(AsyncIClusCfgManagedResourceInfo *This,WINBOOL fIsQuorumResourceIn);
      HRESULT (WINAPI *Finish_SetQuorumResource)(AsyncIClusCfgManagedResourceInfo *This);
      HRESULT (WINAPI *Begin_IsQuorumCapable)(AsyncIClusCfgManagedResourceInfo *This);
      HRESULT (WINAPI *Finish_IsQuorumCapable)(AsyncIClusCfgManagedResourceInfo *This);
      HRESULT (WINAPI *Begin_SetQuorumCapable)(AsyncIClusCfgManagedResourceInfo *This,WINBOOL fIsQuorumCapableIn);
      HRESULT (WINAPI *Finish_SetQuorumCapable)(AsyncIClusCfgManagedResourceInfo *This);
      HRESULT (WINAPI *Begin_GetDriveLetterMappings)(AsyncIClusCfgManagedResourceInfo *This);
      HRESULT (WINAPI *Finish_GetDriveLetterMappings)(AsyncIClusCfgManagedResourceInfo *This,SDriveLetterMapping *pdlmDriveLetterMappingOut);
      HRESULT (WINAPI *Begin_SetDriveLetterMappings)(AsyncIClusCfgManagedResourceInfo *This,SDriveLetterMapping dlmDriveLetterMappingIn);
      HRESULT (WINAPI *Finish_SetDriveLetterMappings)(AsyncIClusCfgManagedResourceInfo *This);
      HRESULT (WINAPI *Begin_IsManagedByDefault)(AsyncIClusCfgManagedResourceInfo *This);
      HRESULT (WINAPI *Finish_IsManagedByDefault)(AsyncIClusCfgManagedResourceInfo *This);
      HRESULT (WINAPI *Begin_SetManagedByDefault)(AsyncIClusCfgManagedResourceInfo *This,WINBOOL fIsManagedByDefaultIn);
      HRESULT (WINAPI *Finish_SetManagedByDefault)(AsyncIClusCfgManagedResourceInfo *This);
    END_INTERFACE
  } AsyncIClusCfgManagedResourceInfoVtbl;
  struct AsyncIClusCfgManagedResourceInfo {
    CONST_VTBL struct AsyncIClusCfgManagedResourceInfoVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define AsyncIClusCfgManagedResourceInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define AsyncIClusCfgManagedResourceInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define AsyncIClusCfgManagedResourceInfo_Release(This) (This)->lpVtbl->Release(This)
#define AsyncIClusCfgManagedResourceInfo_Begin_GetUID(This) (This)->lpVtbl->Begin_GetUID(This)
#define AsyncIClusCfgManagedResourceInfo_Finish_GetUID(This,pbstrUIDOut) (This)->lpVtbl->Finish_GetUID(This,pbstrUIDOut)
#define AsyncIClusCfgManagedResourceInfo_Begin_GetName(This) (This)->lpVtbl->Begin_GetName(This)
#define AsyncIClusCfgManagedResourceInfo_Finish_GetName(This,pbstrNameOut) (This)->lpVtbl->Finish_GetName(This,pbstrNameOut)
#define AsyncIClusCfgManagedResourceInfo_Begin_SetName(This,pcszNameIn) (This)->lpVtbl->Begin_SetName(This,pcszNameIn)
#define AsyncIClusCfgManagedResourceInfo_Finish_SetName(This) (This)->lpVtbl->Finish_SetName(This)
#define AsyncIClusCfgManagedResourceInfo_Begin_IsManaged(This) (This)->lpVtbl->Begin_IsManaged(This)
#define AsyncIClusCfgManagedResourceInfo_Finish_IsManaged(This) (This)->lpVtbl->Finish_IsManaged(This)
#define AsyncIClusCfgManagedResourceInfo_Begin_SetManaged(This,fIsManagedIn) (This)->lpVtbl->Begin_SetManaged(This,fIsManagedIn)
#define AsyncIClusCfgManagedResourceInfo_Finish_SetManaged(This) (This)->lpVtbl->Finish_SetManaged(This)
#define AsyncIClusCfgManagedResourceInfo_Begin_IsQuorumResource(This) (This)->lpVtbl->Begin_IsQuorumResource(This)
#define AsyncIClusCfgManagedResourceInfo_Finish_IsQuorumResource(This) (This)->lpVtbl->Finish_IsQuorumResource(This)
#define AsyncIClusCfgManagedResourceInfo_Begin_SetQuorumResource(This,fIsQuorumResourceIn) (This)->lpVtbl->Begin_SetQuorumResource(This,fIsQuorumResourceIn)
#define AsyncIClusCfgManagedResourceInfo_Finish_SetQuorumResource(This) (This)->lpVtbl->Finish_SetQuorumResource(This)
#define AsyncIClusCfgManagedResourceInfo_Begin_IsQuorumCapable(This) (This)->lpVtbl->Begin_IsQuorumCapable(This)
#define AsyncIClusCfgManagedResourceInfo_Finish_IsQuorumCapable(This) (This)->lpVtbl->Finish_IsQuorumCapable(This)
#define AsyncIClusCfgManagedResourceInfo_Begin_SetQuorumCapable(This,fIsQuorumCapableIn) (This)->lpVtbl->Begin_SetQuorumCapable(This,fIsQuorumCapableIn)
#define AsyncIClusCfgManagedResourceInfo_Finish_SetQuorumCapable(This) (This)->lpVtbl->Finish_SetQuorumCapable(This)
#define AsyncIClusCfgManagedResourceInfo_Begin_GetDriveLetterMappings(This) (This)->lpVtbl->Begin_GetDriveLetterMappings(This)
#define AsyncIClusCfgManagedResourceInfo_Finish_GetDriveLetterMappings(This,pdlmDriveLetterMappingOut) (This)->lpVtbl->Finish_GetDriveLetterMappings(This,pdlmDriveLetterMappingOut)
#define AsyncIClusCfgManagedResourceInfo_Begin_SetDriveLetterMappings(This,dlmDriveLetterMappingIn) (This)->lpVtbl->Begin_SetDriveLetterMappings(This,dlmDriveLetterMappingIn)
#define AsyncIClusCfgManagedResourceInfo_Finish_SetDriveLetterMappings(This) (This)->lpVtbl->Finish_SetDriveLetterMappings(This)
#define AsyncIClusCfgManagedResourceInfo_Begin_IsManagedByDefault(This) (This)->lpVtbl->Begin_IsManagedByDefault(This)
#define AsyncIClusCfgManagedResourceInfo_Finish_IsManagedByDefault(This) (This)->lpVtbl->Finish_IsManagedByDefault(This)
#define AsyncIClusCfgManagedResourceInfo_Begin_SetManagedByDefault(This,fIsManagedByDefaultIn) (This)->lpVtbl->Begin_SetManagedByDefault(This,fIsManagedByDefaultIn)
#define AsyncIClusCfgManagedResourceInfo_Finish_SetManagedByDefault(This) (This)->lpVtbl->Finish_SetManagedByDefault(This)
#endif
#endif
  HRESULT WINAPI AsyncIClusCfgManagedResourceInfo_Begin_GetUID_Proxy(AsyncIClusCfgManagedResourceInfo *This);
  void __RPC_STUB AsyncIClusCfgManagedResourceInfo_Begin_GetUID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgManagedResourceInfo_Finish_GetUID_Proxy(AsyncIClusCfgManagedResourceInfo *This,BSTR *pbstrUIDOut);
  void __RPC_STUB AsyncIClusCfgManagedResourceInfo_Finish_GetUID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgManagedResourceInfo_Begin_GetName_Proxy(AsyncIClusCfgManagedResourceInfo *This);
  void __RPC_STUB AsyncIClusCfgManagedResourceInfo_Begin_GetName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgManagedResourceInfo_Finish_GetName_Proxy(AsyncIClusCfgManagedResourceInfo *This,BSTR *pbstrNameOut);
  void __RPC_STUB AsyncIClusCfgManagedResourceInfo_Finish_GetName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgManagedResourceInfo_Begin_SetName_Proxy(AsyncIClusCfgManagedResourceInfo *This,LPCWSTR pcszNameIn);
  void __RPC_STUB AsyncIClusCfgManagedResourceInfo_Begin_SetName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgManagedResourceInfo_Finish_SetName_Proxy(AsyncIClusCfgManagedResourceInfo *This);
  void __RPC_STUB AsyncIClusCfgManagedResourceInfo_Finish_SetName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgManagedResourceInfo_Begin_IsManaged_Proxy(AsyncIClusCfgManagedResourceInfo *This);
  void __RPC_STUB AsyncIClusCfgManagedResourceInfo_Begin_IsManaged_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgManagedResourceInfo_Finish_IsManaged_Proxy(AsyncIClusCfgManagedResourceInfo *This);
  void __RPC_STUB AsyncIClusCfgManagedResourceInfo_Finish_IsManaged_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgManagedResourceInfo_Begin_SetManaged_Proxy(AsyncIClusCfgManagedResourceInfo *This,WINBOOL fIsManagedIn);
  void __RPC_STUB AsyncIClusCfgManagedResourceInfo_Begin_SetManaged_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgManagedResourceInfo_Finish_SetManaged_Proxy(AsyncIClusCfgManagedResourceInfo *This);
  void __RPC_STUB AsyncIClusCfgManagedResourceInfo_Finish_SetManaged_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgManagedResourceInfo_Begin_IsQuorumResource_Proxy(AsyncIClusCfgManagedResourceInfo *This);
  void __RPC_STUB AsyncIClusCfgManagedResourceInfo_Begin_IsQuorumResource_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgManagedResourceInfo_Finish_IsQuorumResource_Proxy(AsyncIClusCfgManagedResourceInfo *This);
  void __RPC_STUB AsyncIClusCfgManagedResourceInfo_Finish_IsQuorumResource_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgManagedResourceInfo_Begin_SetQuorumResource_Proxy(AsyncIClusCfgManagedResourceInfo *This,WINBOOL fIsQuorumResourceIn);
  void __RPC_STUB AsyncIClusCfgManagedResourceInfo_Begin_SetQuorumResource_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgManagedResourceInfo_Finish_SetQuorumResource_Proxy(AsyncIClusCfgManagedResourceInfo *This);
  void __RPC_STUB AsyncIClusCfgManagedResourceInfo_Finish_SetQuorumResource_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgManagedResourceInfo_Begin_IsQuorumCapable_Proxy(AsyncIClusCfgManagedResourceInfo *This);
  void __RPC_STUB AsyncIClusCfgManagedResourceInfo_Begin_IsQuorumCapable_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgManagedResourceInfo_Finish_IsQuorumCapable_Proxy(AsyncIClusCfgManagedResourceInfo *This);
  void __RPC_STUB AsyncIClusCfgManagedResourceInfo_Finish_IsQuorumCapable_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgManagedResourceInfo_Begin_SetQuorumCapable_Proxy(AsyncIClusCfgManagedResourceInfo *This,WINBOOL fIsQuorumCapableIn);
  void __RPC_STUB AsyncIClusCfgManagedResourceInfo_Begin_SetQuorumCapable_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgManagedResourceInfo_Finish_SetQuorumCapable_Proxy(AsyncIClusCfgManagedResourceInfo *This);
  void __RPC_STUB AsyncIClusCfgManagedResourceInfo_Finish_SetQuorumCapable_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgManagedResourceInfo_Begin_GetDriveLetterMappings_Proxy(AsyncIClusCfgManagedResourceInfo *This);
  void __RPC_STUB AsyncIClusCfgManagedResourceInfo_Begin_GetDriveLetterMappings_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgManagedResourceInfo_Finish_GetDriveLetterMappings_Proxy(AsyncIClusCfgManagedResourceInfo *This,SDriveLetterMapping *pdlmDriveLetterMappingOut);
  void __RPC_STUB AsyncIClusCfgManagedResourceInfo_Finish_GetDriveLetterMappings_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgManagedResourceInfo_Begin_SetDriveLetterMappings_Proxy(AsyncIClusCfgManagedResourceInfo *This,SDriveLetterMapping dlmDriveLetterMappingIn);
  void __RPC_STUB AsyncIClusCfgManagedResourceInfo_Begin_SetDriveLetterMappings_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgManagedResourceInfo_Finish_SetDriveLetterMappings_Proxy(AsyncIClusCfgManagedResourceInfo *This);
  void __RPC_STUB AsyncIClusCfgManagedResourceInfo_Finish_SetDriveLetterMappings_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgManagedResourceInfo_Begin_IsManagedByDefault_Proxy(AsyncIClusCfgManagedResourceInfo *This);
  void __RPC_STUB AsyncIClusCfgManagedResourceInfo_Begin_IsManagedByDefault_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgManagedResourceInfo_Finish_IsManagedByDefault_Proxy(AsyncIClusCfgManagedResourceInfo *This);
  void __RPC_STUB AsyncIClusCfgManagedResourceInfo_Finish_IsManagedByDefault_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgManagedResourceInfo_Begin_SetManagedByDefault_Proxy(AsyncIClusCfgManagedResourceInfo *This,WINBOOL fIsManagedByDefaultIn);
  void __RPC_STUB AsyncIClusCfgManagedResourceInfo_Begin_SetManagedByDefault_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgManagedResourceInfo_Finish_SetManagedByDefault_Proxy(AsyncIClusCfgManagedResourceInfo *This);
  void __RPC_STUB AsyncIClusCfgManagedResourceInfo_Finish_SetManagedByDefault_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IEnumClusCfgPartitions_INTERFACE_DEFINED__
#define __IEnumClusCfgPartitions_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IEnumClusCfgPartitions;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IEnumClusCfgPartitions : public IUnknown {
  public:
    virtual HRESULT WINAPI Next(ULONG cNumberRequestedIn,IClusCfgPartitionInfo **rgpPartitionInfoOut,ULONG *pcNumberFetchedOut) = 0;
    virtual HRESULT WINAPI Reset(void) = 0;
    virtual HRESULT WINAPI Skip(ULONG cNumberToSkip) = 0;
    virtual HRESULT WINAPI Clone(IEnumClusCfgPartitions **ppEnumPartitions) = 0;
    virtual HRESULT WINAPI Count(DWORD *pnCountOut) = 0;
  };
#else
  typedef struct IEnumClusCfgPartitionsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IEnumClusCfgPartitions *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IEnumClusCfgPartitions *This);
      ULONG (WINAPI *Release)(IEnumClusCfgPartitions *This);
      HRESULT (WINAPI *Next)(IEnumClusCfgPartitions *This,ULONG cNumberRequestedIn,IClusCfgPartitionInfo **rgpPartitionInfoOut,ULONG *pcNumberFetchedOut);
      HRESULT (WINAPI *Reset)(IEnumClusCfgPartitions *This);
      HRESULT (WINAPI *Skip)(IEnumClusCfgPartitions *This,ULONG cNumberToSkip);
      HRESULT (WINAPI *Clone)(IEnumClusCfgPartitions *This,IEnumClusCfgPartitions **ppEnumPartitions);
      HRESULT (WINAPI *Count)(IEnumClusCfgPartitions *This,DWORD *pnCountOut);
    END_INTERFACE
  } IEnumClusCfgPartitionsVtbl;
  struct IEnumClusCfgPartitions {
    CONST_VTBL struct IEnumClusCfgPartitionsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IEnumClusCfgPartitions_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumClusCfgPartitions_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumClusCfgPartitions_Release(This) (This)->lpVtbl->Release(This)
#define IEnumClusCfgPartitions_Next(This,cNumberRequestedIn,rgpPartitionInfoOut,pcNumberFetchedOut) (This)->lpVtbl->Next(This,cNumberRequestedIn,rgpPartitionInfoOut,pcNumberFetchedOut)
#define IEnumClusCfgPartitions_Reset(This) (This)->lpVtbl->Reset(This)
#define IEnumClusCfgPartitions_Skip(This,cNumberToSkip) (This)->lpVtbl->Skip(This,cNumberToSkip)
#define IEnumClusCfgPartitions_Clone(This,ppEnumPartitions) (This)->lpVtbl->Clone(This,ppEnumPartitions)
#define IEnumClusCfgPartitions_Count(This,pnCountOut) (This)->lpVtbl->Count(This,pnCountOut)
#endif
#endif
  HRESULT WINAPI IEnumClusCfgPartitions_Next_Proxy(IEnumClusCfgPartitions *This,ULONG cNumberRequestedIn,IClusCfgPartitionInfo **rgpPartitionInfoOut,ULONG *pcNumberFetchedOut);
  void __RPC_STUB IEnumClusCfgPartitions_Next_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEnumClusCfgPartitions_Reset_Proxy(IEnumClusCfgPartitions *This);
  void __RPC_STUB IEnumClusCfgPartitions_Reset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEnumClusCfgPartitions_Skip_Proxy(IEnumClusCfgPartitions *This,ULONG cNumberToSkip);
  void __RPC_STUB IEnumClusCfgPartitions_Skip_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEnumClusCfgPartitions_Clone_Proxy(IEnumClusCfgPartitions *This,IEnumClusCfgPartitions **ppEnumPartitions);
  void __RPC_STUB IEnumClusCfgPartitions_Clone_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEnumClusCfgPartitions_Count_Proxy(IEnumClusCfgPartitions *This,DWORD *pnCountOut);
  void __RPC_STUB IEnumClusCfgPartitions_Count_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __AsyncIEnumClusCfgPartitions_INTERFACE_DEFINED__
#define __AsyncIEnumClusCfgPartitions_INTERFACE_DEFINED__
  EXTERN_C const IID IID_AsyncIEnumClusCfgPartitions;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct AsyncIEnumClusCfgPartitions : public IUnknown {
  public:
    virtual HRESULT WINAPI Begin_Next(ULONG cNumberRequestedIn) = 0;
    virtual HRESULT WINAPI Finish_Next(IClusCfgPartitionInfo **rgpPartitionInfoOut,ULONG *pcNumberFetchedOut) = 0;
    virtual HRESULT WINAPI Begin_Reset(void) = 0;
    virtual HRESULT WINAPI Finish_Reset(void) = 0;
    virtual HRESULT WINAPI Begin_Skip(ULONG cNumberToSkip) = 0;
    virtual HRESULT WINAPI Finish_Skip(void) = 0;
    virtual HRESULT WINAPI Begin_Clone(void) = 0;
    virtual HRESULT WINAPI Finish_Clone(IEnumClusCfgPartitions **ppEnumPartitions) = 0;
    virtual HRESULT WINAPI Begin_Count(void) = 0;
    virtual HRESULT WINAPI Finish_Count(DWORD *pnCountOut) = 0;
  };
#else
  typedef struct AsyncIEnumClusCfgPartitionsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(AsyncIEnumClusCfgPartitions *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(AsyncIEnumClusCfgPartitions *This);
      ULONG (WINAPI *Release)(AsyncIEnumClusCfgPartitions *This);
      HRESULT (WINAPI *Begin_Next)(AsyncIEnumClusCfgPartitions *This,ULONG cNumberRequestedIn);
      HRESULT (WINAPI *Finish_Next)(AsyncIEnumClusCfgPartitions *This,IClusCfgPartitionInfo **rgpPartitionInfoOut,ULONG *pcNumberFetchedOut);
      HRESULT (WINAPI *Begin_Reset)(AsyncIEnumClusCfgPartitions *This);
      HRESULT (WINAPI *Finish_Reset)(AsyncIEnumClusCfgPartitions *This);
      HRESULT (WINAPI *Begin_Skip)(AsyncIEnumClusCfgPartitions *This,ULONG cNumberToSkip);
      HRESULT (WINAPI *Finish_Skip)(AsyncIEnumClusCfgPartitions *This);
      HRESULT (WINAPI *Begin_Clone)(AsyncIEnumClusCfgPartitions *This);
      HRESULT (WINAPI *Finish_Clone)(AsyncIEnumClusCfgPartitions *This,IEnumClusCfgPartitions **ppEnumPartitions);
      HRESULT (WINAPI *Begin_Count)(AsyncIEnumClusCfgPartitions *This);
      HRESULT (WINAPI *Finish_Count)(AsyncIEnumClusCfgPartitions *This,DWORD *pnCountOut);
    END_INTERFACE
  } AsyncIEnumClusCfgPartitionsVtbl;
  struct AsyncIEnumClusCfgPartitions {
    CONST_VTBL struct AsyncIEnumClusCfgPartitionsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define AsyncIEnumClusCfgPartitions_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define AsyncIEnumClusCfgPartitions_AddRef(This) (This)->lpVtbl->AddRef(This)
#define AsyncIEnumClusCfgPartitions_Release(This) (This)->lpVtbl->Release(This)
#define AsyncIEnumClusCfgPartitions_Begin_Next(This,cNumberRequestedIn) (This)->lpVtbl->Begin_Next(This,cNumberRequestedIn)
#define AsyncIEnumClusCfgPartitions_Finish_Next(This,rgpPartitionInfoOut,pcNumberFetchedOut) (This)->lpVtbl->Finish_Next(This,rgpPartitionInfoOut,pcNumberFetchedOut)
#define AsyncIEnumClusCfgPartitions_Begin_Reset(This) (This)->lpVtbl->Begin_Reset(This)
#define AsyncIEnumClusCfgPartitions_Finish_Reset(This) (This)->lpVtbl->Finish_Reset(This)
#define AsyncIEnumClusCfgPartitions_Begin_Skip(This,cNumberToSkip) (This)->lpVtbl->Begin_Skip(This,cNumberToSkip)
#define AsyncIEnumClusCfgPartitions_Finish_Skip(This) (This)->lpVtbl->Finish_Skip(This)
#define AsyncIEnumClusCfgPartitions_Begin_Clone(This) (This)->lpVtbl->Begin_Clone(This)
#define AsyncIEnumClusCfgPartitions_Finish_Clone(This,ppEnumPartitions) (This)->lpVtbl->Finish_Clone(This,ppEnumPartitions)
#define AsyncIEnumClusCfgPartitions_Begin_Count(This) (This)->lpVtbl->Begin_Count(This)
#define AsyncIEnumClusCfgPartitions_Finish_Count(This,pnCountOut) (This)->lpVtbl->Finish_Count(This,pnCountOut)
#endif
#endif
  HRESULT WINAPI AsyncIEnumClusCfgPartitions_Begin_Next_Proxy(AsyncIEnumClusCfgPartitions *This,ULONG cNumberRequestedIn);
  void __RPC_STUB AsyncIEnumClusCfgPartitions_Begin_Next_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIEnumClusCfgPartitions_Finish_Next_Proxy(AsyncIEnumClusCfgPartitions *This,IClusCfgPartitionInfo **rgpPartitionInfoOut,ULONG *pcNumberFetchedOut);
  void __RPC_STUB AsyncIEnumClusCfgPartitions_Finish_Next_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIEnumClusCfgPartitions_Begin_Reset_Proxy(AsyncIEnumClusCfgPartitions *This);
  void __RPC_STUB AsyncIEnumClusCfgPartitions_Begin_Reset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIEnumClusCfgPartitions_Finish_Reset_Proxy(AsyncIEnumClusCfgPartitions *This);
  void __RPC_STUB AsyncIEnumClusCfgPartitions_Finish_Reset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIEnumClusCfgPartitions_Begin_Skip_Proxy(AsyncIEnumClusCfgPartitions *This,ULONG cNumberToSkip);
  void __RPC_STUB AsyncIEnumClusCfgPartitions_Begin_Skip_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIEnumClusCfgPartitions_Finish_Skip_Proxy(AsyncIEnumClusCfgPartitions *This);
  void __RPC_STUB AsyncIEnumClusCfgPartitions_Finish_Skip_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIEnumClusCfgPartitions_Begin_Clone_Proxy(AsyncIEnumClusCfgPartitions *This);
  void __RPC_STUB AsyncIEnumClusCfgPartitions_Begin_Clone_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIEnumClusCfgPartitions_Finish_Clone_Proxy(AsyncIEnumClusCfgPartitions *This,IEnumClusCfgPartitions **ppEnumPartitions);
  void __RPC_STUB AsyncIEnumClusCfgPartitions_Finish_Clone_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIEnumClusCfgPartitions_Begin_Count_Proxy(AsyncIEnumClusCfgPartitions *This);
  void __RPC_STUB AsyncIEnumClusCfgPartitions_Begin_Count_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIEnumClusCfgPartitions_Finish_Count_Proxy(AsyncIEnumClusCfgPartitions *This,DWORD *pnCountOut);
  void __RPC_STUB AsyncIEnumClusCfgPartitions_Finish_Count_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IClusCfgPartitionInfo_INTERFACE_DEFINED__
#define __IClusCfgPartitionInfo_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IClusCfgPartitionInfo;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IClusCfgPartitionInfo : public IUnknown {
  public:
    virtual HRESULT WINAPI GetUID(BSTR *pbstrUIDOut) = 0;
    virtual HRESULT WINAPI GetName(BSTR *pbstrNameOut) = 0;
    virtual HRESULT WINAPI SetName(LPCWSTR pcszNameIn) = 0;
    virtual HRESULT WINAPI GetDescription(BSTR *pbstrDescriptionOut) = 0;
    virtual HRESULT WINAPI SetDescription(LPCWSTR pcszDescriptionIn) = 0;
    virtual HRESULT WINAPI GetDriveLetterMappings(SDriveLetterMapping *pdlmDriveLetterUsageOut) = 0;
    virtual HRESULT WINAPI SetDriveLetterMappings(SDriveLetterMapping dlmDriveLetterMappingIn) = 0;
    virtual HRESULT WINAPI GetSize(ULONG *pcMegaBytes) = 0;
  };
#else
  typedef struct IClusCfgPartitionInfoVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IClusCfgPartitionInfo *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IClusCfgPartitionInfo *This);
      ULONG (WINAPI *Release)(IClusCfgPartitionInfo *This);
      HRESULT (WINAPI *GetUID)(IClusCfgPartitionInfo *This,BSTR *pbstrUIDOut);
      HRESULT (WINAPI *GetName)(IClusCfgPartitionInfo *This,BSTR *pbstrNameOut);
      HRESULT (WINAPI *SetName)(IClusCfgPartitionInfo *This,LPCWSTR pcszNameIn);
      HRESULT (WINAPI *GetDescription)(IClusCfgPartitionInfo *This,BSTR *pbstrDescriptionOut);
      HRESULT (WINAPI *SetDescription)(IClusCfgPartitionInfo *This,LPCWSTR pcszDescriptionIn);
      HRESULT (WINAPI *GetDriveLetterMappings)(IClusCfgPartitionInfo *This,SDriveLetterMapping *pdlmDriveLetterUsageOut);
      HRESULT (WINAPI *SetDriveLetterMappings)(IClusCfgPartitionInfo *This,SDriveLetterMapping dlmDriveLetterMappingIn);
      HRESULT (WINAPI *GetSize)(IClusCfgPartitionInfo *This,ULONG *pcMegaBytes);
    END_INTERFACE
  } IClusCfgPartitionInfoVtbl;
  struct IClusCfgPartitionInfo {
    CONST_VTBL struct IClusCfgPartitionInfoVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IClusCfgPartitionInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IClusCfgPartitionInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IClusCfgPartitionInfo_Release(This) (This)->lpVtbl->Release(This)
#define IClusCfgPartitionInfo_GetUID(This,pbstrUIDOut) (This)->lpVtbl->GetUID(This,pbstrUIDOut)
#define IClusCfgPartitionInfo_GetName(This,pbstrNameOut) (This)->lpVtbl->GetName(This,pbstrNameOut)
#define IClusCfgPartitionInfo_SetName(This,pcszNameIn) (This)->lpVtbl->SetName(This,pcszNameIn)
#define IClusCfgPartitionInfo_GetDescription(This,pbstrDescriptionOut) (This)->lpVtbl->GetDescription(This,pbstrDescriptionOut)
#define IClusCfgPartitionInfo_SetDescription(This,pcszDescriptionIn) (This)->lpVtbl->SetDescription(This,pcszDescriptionIn)
#define IClusCfgPartitionInfo_GetDriveLetterMappings(This,pdlmDriveLetterUsageOut) (This)->lpVtbl->GetDriveLetterMappings(This,pdlmDriveLetterUsageOut)
#define IClusCfgPartitionInfo_SetDriveLetterMappings(This,dlmDriveLetterMappingIn) (This)->lpVtbl->SetDriveLetterMappings(This,dlmDriveLetterMappingIn)
#define IClusCfgPartitionInfo_GetSize(This,pcMegaBytes) (This)->lpVtbl->GetSize(This,pcMegaBytes)
#endif
#endif
  HRESULT WINAPI IClusCfgPartitionInfo_GetUID_Proxy(IClusCfgPartitionInfo *This,BSTR *pbstrUIDOut);
  void __RPC_STUB IClusCfgPartitionInfo_GetUID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgPartitionInfo_GetName_Proxy(IClusCfgPartitionInfo *This,BSTR *pbstrNameOut);
  void __RPC_STUB IClusCfgPartitionInfo_GetName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgPartitionInfo_SetName_Proxy(IClusCfgPartitionInfo *This,LPCWSTR pcszNameIn);
  void __RPC_STUB IClusCfgPartitionInfo_SetName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgPartitionInfo_GetDescription_Proxy(IClusCfgPartitionInfo *This,BSTR *pbstrDescriptionOut);
  void __RPC_STUB IClusCfgPartitionInfo_GetDescription_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgPartitionInfo_SetDescription_Proxy(IClusCfgPartitionInfo *This,LPCWSTR pcszDescriptionIn);
  void __RPC_STUB IClusCfgPartitionInfo_SetDescription_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgPartitionInfo_GetDriveLetterMappings_Proxy(IClusCfgPartitionInfo *This,SDriveLetterMapping *pdlmDriveLetterUsageOut);
  void __RPC_STUB IClusCfgPartitionInfo_GetDriveLetterMappings_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgPartitionInfo_SetDriveLetterMappings_Proxy(IClusCfgPartitionInfo *This,SDriveLetterMapping dlmDriveLetterMappingIn);
  void __RPC_STUB IClusCfgPartitionInfo_SetDriveLetterMappings_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgPartitionInfo_GetSize_Proxy(IClusCfgPartitionInfo *This,ULONG *pcMegaBytes);
  void __RPC_STUB IClusCfgPartitionInfo_GetSize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __AsyncIClusCfgPartitionInfo_INTERFACE_DEFINED__
#define __AsyncIClusCfgPartitionInfo_INTERFACE_DEFINED__
  EXTERN_C const IID IID_AsyncIClusCfgPartitionInfo;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct AsyncIClusCfgPartitionInfo : public IUnknown {
  public:
    virtual HRESULT WINAPI Begin_GetUID(void) = 0;
    virtual HRESULT WINAPI Finish_GetUID(BSTR *pbstrUIDOut) = 0;
    virtual HRESULT WINAPI Begin_GetName(void) = 0;
    virtual HRESULT WINAPI Finish_GetName(BSTR *pbstrNameOut) = 0;
    virtual HRESULT WINAPI Begin_SetName(LPCWSTR pcszNameIn) = 0;
    virtual HRESULT WINAPI Finish_SetName(void) = 0;
    virtual HRESULT WINAPI Begin_GetDescription(void) = 0;
    virtual HRESULT WINAPI Finish_GetDescription(BSTR *pbstrDescriptionOut) = 0;
    virtual HRESULT WINAPI Begin_SetDescription(LPCWSTR pcszDescriptionIn) = 0;
    virtual HRESULT WINAPI Finish_SetDescription(void) = 0;
    virtual HRESULT WINAPI Begin_GetDriveLetterMappings(void) = 0;
    virtual HRESULT WINAPI Finish_GetDriveLetterMappings(SDriveLetterMapping *pdlmDriveLetterUsageOut) = 0;
    virtual HRESULT WINAPI Begin_SetDriveLetterMappings(SDriveLetterMapping dlmDriveLetterMappingIn) = 0;
    virtual HRESULT WINAPI Finish_SetDriveLetterMappings(void) = 0;
    virtual HRESULT WINAPI Begin_GetSize(void) = 0;
    virtual HRESULT WINAPI Finish_GetSize(ULONG *pcMegaBytes) = 0;
  };
#else
  typedef struct AsyncIClusCfgPartitionInfoVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(AsyncIClusCfgPartitionInfo *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(AsyncIClusCfgPartitionInfo *This);
      ULONG (WINAPI *Release)(AsyncIClusCfgPartitionInfo *This);
      HRESULT (WINAPI *Begin_GetUID)(AsyncIClusCfgPartitionInfo *This);
      HRESULT (WINAPI *Finish_GetUID)(AsyncIClusCfgPartitionInfo *This,BSTR *pbstrUIDOut);
      HRESULT (WINAPI *Begin_GetName)(AsyncIClusCfgPartitionInfo *This);
      HRESULT (WINAPI *Finish_GetName)(AsyncIClusCfgPartitionInfo *This,BSTR *pbstrNameOut);
      HRESULT (WINAPI *Begin_SetName)(AsyncIClusCfgPartitionInfo *This,LPCWSTR pcszNameIn);
      HRESULT (WINAPI *Finish_SetName)(AsyncIClusCfgPartitionInfo *This);
      HRESULT (WINAPI *Begin_GetDescription)(AsyncIClusCfgPartitionInfo *This);
      HRESULT (WINAPI *Finish_GetDescription)(AsyncIClusCfgPartitionInfo *This,BSTR *pbstrDescriptionOut);
      HRESULT (WINAPI *Begin_SetDescription)(AsyncIClusCfgPartitionInfo *This,LPCWSTR pcszDescriptionIn);
      HRESULT (WINAPI *Finish_SetDescription)(AsyncIClusCfgPartitionInfo *This);
      HRESULT (WINAPI *Begin_GetDriveLetterMappings)(AsyncIClusCfgPartitionInfo *This);
      HRESULT (WINAPI *Finish_GetDriveLetterMappings)(AsyncIClusCfgPartitionInfo *This,SDriveLetterMapping *pdlmDriveLetterUsageOut);
      HRESULT (WINAPI *Begin_SetDriveLetterMappings)(AsyncIClusCfgPartitionInfo *This,SDriveLetterMapping dlmDriveLetterMappingIn);
      HRESULT (WINAPI *Finish_SetDriveLetterMappings)(AsyncIClusCfgPartitionInfo *This);
      HRESULT (WINAPI *Begin_GetSize)(AsyncIClusCfgPartitionInfo *This);
      HRESULT (WINAPI *Finish_GetSize)(AsyncIClusCfgPartitionInfo *This,ULONG *pcMegaBytes);
    END_INTERFACE
  } AsyncIClusCfgPartitionInfoVtbl;
  struct AsyncIClusCfgPartitionInfo {
    CONST_VTBL struct AsyncIClusCfgPartitionInfoVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define AsyncIClusCfgPartitionInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define AsyncIClusCfgPartitionInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define AsyncIClusCfgPartitionInfo_Release(This) (This)->lpVtbl->Release(This)
#define AsyncIClusCfgPartitionInfo_Begin_GetUID(This) (This)->lpVtbl->Begin_GetUID(This)
#define AsyncIClusCfgPartitionInfo_Finish_GetUID(This,pbstrUIDOut) (This)->lpVtbl->Finish_GetUID(This,pbstrUIDOut)
#define AsyncIClusCfgPartitionInfo_Begin_GetName(This) (This)->lpVtbl->Begin_GetName(This)
#define AsyncIClusCfgPartitionInfo_Finish_GetName(This,pbstrNameOut) (This)->lpVtbl->Finish_GetName(This,pbstrNameOut)
#define AsyncIClusCfgPartitionInfo_Begin_SetName(This,pcszNameIn) (This)->lpVtbl->Begin_SetName(This,pcszNameIn)
#define AsyncIClusCfgPartitionInfo_Finish_SetName(This) (This)->lpVtbl->Finish_SetName(This)
#define AsyncIClusCfgPartitionInfo_Begin_GetDescription(This) (This)->lpVtbl->Begin_GetDescription(This)
#define AsyncIClusCfgPartitionInfo_Finish_GetDescription(This,pbstrDescriptionOut) (This)->lpVtbl->Finish_GetDescription(This,pbstrDescriptionOut)
#define AsyncIClusCfgPartitionInfo_Begin_SetDescription(This,pcszDescriptionIn) (This)->lpVtbl->Begin_SetDescription(This,pcszDescriptionIn)
#define AsyncIClusCfgPartitionInfo_Finish_SetDescription(This) (This)->lpVtbl->Finish_SetDescription(This)
#define AsyncIClusCfgPartitionInfo_Begin_GetDriveLetterMappings(This) (This)->lpVtbl->Begin_GetDriveLetterMappings(This)
#define AsyncIClusCfgPartitionInfo_Finish_GetDriveLetterMappings(This,pdlmDriveLetterUsageOut) (This)->lpVtbl->Finish_GetDriveLetterMappings(This,pdlmDriveLetterUsageOut)
#define AsyncIClusCfgPartitionInfo_Begin_SetDriveLetterMappings(This,dlmDriveLetterMappingIn) (This)->lpVtbl->Begin_SetDriveLetterMappings(This,dlmDriveLetterMappingIn)
#define AsyncIClusCfgPartitionInfo_Finish_SetDriveLetterMappings(This) (This)->lpVtbl->Finish_SetDriveLetterMappings(This)
#define AsyncIClusCfgPartitionInfo_Begin_GetSize(This) (This)->lpVtbl->Begin_GetSize(This)
#define AsyncIClusCfgPartitionInfo_Finish_GetSize(This,pcMegaBytes) (This)->lpVtbl->Finish_GetSize(This,pcMegaBytes)
#endif
#endif
  HRESULT WINAPI AsyncIClusCfgPartitionInfo_Begin_GetUID_Proxy(AsyncIClusCfgPartitionInfo *This);
  void __RPC_STUB AsyncIClusCfgPartitionInfo_Begin_GetUID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgPartitionInfo_Finish_GetUID_Proxy(AsyncIClusCfgPartitionInfo *This,BSTR *pbstrUIDOut);
  void __RPC_STUB AsyncIClusCfgPartitionInfo_Finish_GetUID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgPartitionInfo_Begin_GetName_Proxy(AsyncIClusCfgPartitionInfo *This);
  void __RPC_STUB AsyncIClusCfgPartitionInfo_Begin_GetName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgPartitionInfo_Finish_GetName_Proxy(AsyncIClusCfgPartitionInfo *This,BSTR *pbstrNameOut);
  void __RPC_STUB AsyncIClusCfgPartitionInfo_Finish_GetName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgPartitionInfo_Begin_SetName_Proxy(AsyncIClusCfgPartitionInfo *This,LPCWSTR pcszNameIn);
  void __RPC_STUB AsyncIClusCfgPartitionInfo_Begin_SetName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgPartitionInfo_Finish_SetName_Proxy(AsyncIClusCfgPartitionInfo *This);
  void __RPC_STUB AsyncIClusCfgPartitionInfo_Finish_SetName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgPartitionInfo_Begin_GetDescription_Proxy(AsyncIClusCfgPartitionInfo *This);
  void __RPC_STUB AsyncIClusCfgPartitionInfo_Begin_GetDescription_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgPartitionInfo_Finish_GetDescription_Proxy(AsyncIClusCfgPartitionInfo *This,BSTR *pbstrDescriptionOut);
  void __RPC_STUB AsyncIClusCfgPartitionInfo_Finish_GetDescription_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgPartitionInfo_Begin_SetDescription_Proxy(AsyncIClusCfgPartitionInfo *This,LPCWSTR pcszDescriptionIn);
  void __RPC_STUB AsyncIClusCfgPartitionInfo_Begin_SetDescription_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgPartitionInfo_Finish_SetDescription_Proxy(AsyncIClusCfgPartitionInfo *This);
  void __RPC_STUB AsyncIClusCfgPartitionInfo_Finish_SetDescription_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgPartitionInfo_Begin_GetDriveLetterMappings_Proxy(AsyncIClusCfgPartitionInfo *This);
  void __RPC_STUB AsyncIClusCfgPartitionInfo_Begin_GetDriveLetterMappings_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgPartitionInfo_Finish_GetDriveLetterMappings_Proxy(AsyncIClusCfgPartitionInfo *This,SDriveLetterMapping *pdlmDriveLetterUsageOut);
  void __RPC_STUB AsyncIClusCfgPartitionInfo_Finish_GetDriveLetterMappings_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgPartitionInfo_Begin_SetDriveLetterMappings_Proxy(AsyncIClusCfgPartitionInfo *This,SDriveLetterMapping dlmDriveLetterMappingIn);
  void __RPC_STUB AsyncIClusCfgPartitionInfo_Begin_SetDriveLetterMappings_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgPartitionInfo_Finish_SetDriveLetterMappings_Proxy(AsyncIClusCfgPartitionInfo *This);
  void __RPC_STUB AsyncIClusCfgPartitionInfo_Finish_SetDriveLetterMappings_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgPartitionInfo_Begin_GetSize_Proxy(AsyncIClusCfgPartitionInfo *This);
  void __RPC_STUB AsyncIClusCfgPartitionInfo_Begin_GetSize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgPartitionInfo_Finish_GetSize_Proxy(AsyncIClusCfgPartitionInfo *This,ULONG *pcMegaBytes);
  void __RPC_STUB AsyncIClusCfgPartitionInfo_Finish_GetSize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IEnumClusCfgIPAddresses_INTERFACE_DEFINED__
#define __IEnumClusCfgIPAddresses_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IEnumClusCfgIPAddresses;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IEnumClusCfgIPAddresses : public IUnknown {
  public:
    virtual HRESULT WINAPI Next(ULONG cNumberRequestedIn,IClusCfgIPAddressInfo **rgpIPAddressInfoOut,ULONG *pcNumberFetchedOut) = 0;
    virtual HRESULT WINAPI Skip(ULONG cNumberToSkipIn) = 0;
    virtual HRESULT WINAPI Reset(void) = 0;
    virtual HRESULT WINAPI Clone(IEnumClusCfgIPAddresses **ppEnumIPAddressesOut) = 0;
    virtual HRESULT WINAPI Count(DWORD *pnCountOut) = 0;
  };
#else
  typedef struct IEnumClusCfgIPAddressesVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IEnumClusCfgIPAddresses *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IEnumClusCfgIPAddresses *This);
      ULONG (WINAPI *Release)(IEnumClusCfgIPAddresses *This);
      HRESULT (WINAPI *Next)(IEnumClusCfgIPAddresses *This,ULONG cNumberRequestedIn,IClusCfgIPAddressInfo **rgpIPAddressInfoOut,ULONG *pcNumberFetchedOut);
      HRESULT (WINAPI *Skip)(IEnumClusCfgIPAddresses *This,ULONG cNumberToSkipIn);
      HRESULT (WINAPI *Reset)(IEnumClusCfgIPAddresses *This);
      HRESULT (WINAPI *Clone)(IEnumClusCfgIPAddresses *This,IEnumClusCfgIPAddresses **ppEnumIPAddressesOut);
      HRESULT (WINAPI *Count)(IEnumClusCfgIPAddresses *This,DWORD *pnCountOut);
    END_INTERFACE
  } IEnumClusCfgIPAddressesVtbl;
  struct IEnumClusCfgIPAddresses {
    CONST_VTBL struct IEnumClusCfgIPAddressesVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IEnumClusCfgIPAddresses_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumClusCfgIPAddresses_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumClusCfgIPAddresses_Release(This) (This)->lpVtbl->Release(This)
#define IEnumClusCfgIPAddresses_Next(This,cNumberRequestedIn,rgpIPAddressInfoOut,pcNumberFetchedOut) (This)->lpVtbl->Next(This,cNumberRequestedIn,rgpIPAddressInfoOut,pcNumberFetchedOut)
#define IEnumClusCfgIPAddresses_Skip(This,cNumberToSkipIn) (This)->lpVtbl->Skip(This,cNumberToSkipIn)
#define IEnumClusCfgIPAddresses_Reset(This) (This)->lpVtbl->Reset(This)
#define IEnumClusCfgIPAddresses_Clone(This,ppEnumIPAddressesOut) (This)->lpVtbl->Clone(This,ppEnumIPAddressesOut)
#define IEnumClusCfgIPAddresses_Count(This,pnCountOut) (This)->lpVtbl->Count(This,pnCountOut)
#endif
#endif
  HRESULT WINAPI IEnumClusCfgIPAddresses_Next_Proxy(IEnumClusCfgIPAddresses *This,ULONG cNumberRequestedIn,IClusCfgIPAddressInfo **rgpIPAddressInfoOut,ULONG *pcNumberFetchedOut);
  void __RPC_STUB IEnumClusCfgIPAddresses_Next_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEnumClusCfgIPAddresses_Skip_Proxy(IEnumClusCfgIPAddresses *This,ULONG cNumberToSkipIn);
  void __RPC_STUB IEnumClusCfgIPAddresses_Skip_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEnumClusCfgIPAddresses_Reset_Proxy(IEnumClusCfgIPAddresses *This);
  void __RPC_STUB IEnumClusCfgIPAddresses_Reset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEnumClusCfgIPAddresses_Clone_Proxy(IEnumClusCfgIPAddresses *This,IEnumClusCfgIPAddresses **ppEnumIPAddressesOut);
  void __RPC_STUB IEnumClusCfgIPAddresses_Clone_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IEnumClusCfgIPAddresses_Count_Proxy(IEnumClusCfgIPAddresses *This,DWORD *pnCountOut);
  void __RPC_STUB IEnumClusCfgIPAddresses_Count_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __AsyncIEnumClusCfgIPAddresses_INTERFACE_DEFINED__
#define __AsyncIEnumClusCfgIPAddresses_INTERFACE_DEFINED__
  EXTERN_C const IID IID_AsyncIEnumClusCfgIPAddresses;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct AsyncIEnumClusCfgIPAddresses : public IUnknown {
  public:
    virtual HRESULT WINAPI Begin_Next(ULONG cNumberRequestedIn) = 0;
    virtual HRESULT WINAPI Finish_Next(IClusCfgIPAddressInfo **rgpIPAddressInfoOut,ULONG *pcNumberFetchedOut) = 0;
    virtual HRESULT WINAPI Begin_Skip(ULONG cNumberToSkipIn) = 0;
    virtual HRESULT WINAPI Finish_Skip(void) = 0;
    virtual HRESULT WINAPI Begin_Reset(void) = 0;
    virtual HRESULT WINAPI Finish_Reset(void) = 0;
    virtual HRESULT WINAPI Begin_Clone(void) = 0;
    virtual HRESULT WINAPI Finish_Clone(IEnumClusCfgIPAddresses **ppEnumIPAddressesOut) = 0;
    virtual HRESULT WINAPI Begin_Count(void) = 0;
    virtual HRESULT WINAPI Finish_Count(DWORD *pnCountOut) = 0;
  };
#else
  typedef struct AsyncIEnumClusCfgIPAddressesVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(AsyncIEnumClusCfgIPAddresses *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(AsyncIEnumClusCfgIPAddresses *This);
      ULONG (WINAPI *Release)(AsyncIEnumClusCfgIPAddresses *This);
      HRESULT (WINAPI *Begin_Next)(AsyncIEnumClusCfgIPAddresses *This,ULONG cNumberRequestedIn);
      HRESULT (WINAPI *Finish_Next)(AsyncIEnumClusCfgIPAddresses *This,IClusCfgIPAddressInfo **rgpIPAddressInfoOut,ULONG *pcNumberFetchedOut);
      HRESULT (WINAPI *Begin_Skip)(AsyncIEnumClusCfgIPAddresses *This,ULONG cNumberToSkipIn);
      HRESULT (WINAPI *Finish_Skip)(AsyncIEnumClusCfgIPAddresses *This);
      HRESULT (WINAPI *Begin_Reset)(AsyncIEnumClusCfgIPAddresses *This);
      HRESULT (WINAPI *Finish_Reset)(AsyncIEnumClusCfgIPAddresses *This);
      HRESULT (WINAPI *Begin_Clone)(AsyncIEnumClusCfgIPAddresses *This);
      HRESULT (WINAPI *Finish_Clone)(AsyncIEnumClusCfgIPAddresses *This,IEnumClusCfgIPAddresses **ppEnumIPAddressesOut);
      HRESULT (WINAPI *Begin_Count)(AsyncIEnumClusCfgIPAddresses *This);
      HRESULT (WINAPI *Finish_Count)(AsyncIEnumClusCfgIPAddresses *This,DWORD *pnCountOut);
    END_INTERFACE
  } AsyncIEnumClusCfgIPAddressesVtbl;
  struct AsyncIEnumClusCfgIPAddresses {
    CONST_VTBL struct AsyncIEnumClusCfgIPAddressesVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define AsyncIEnumClusCfgIPAddresses_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define AsyncIEnumClusCfgIPAddresses_AddRef(This) (This)->lpVtbl->AddRef(This)
#define AsyncIEnumClusCfgIPAddresses_Release(This) (This)->lpVtbl->Release(This)
#define AsyncIEnumClusCfgIPAddresses_Begin_Next(This,cNumberRequestedIn) (This)->lpVtbl->Begin_Next(This,cNumberRequestedIn)
#define AsyncIEnumClusCfgIPAddresses_Finish_Next(This,rgpIPAddressInfoOut,pcNumberFetchedOut) (This)->lpVtbl->Finish_Next(This,rgpIPAddressInfoOut,pcNumberFetchedOut)
#define AsyncIEnumClusCfgIPAddresses_Begin_Skip(This,cNumberToSkipIn) (This)->lpVtbl->Begin_Skip(This,cNumberToSkipIn)
#define AsyncIEnumClusCfgIPAddresses_Finish_Skip(This) (This)->lpVtbl->Finish_Skip(This)
#define AsyncIEnumClusCfgIPAddresses_Begin_Reset(This) (This)->lpVtbl->Begin_Reset(This)
#define AsyncIEnumClusCfgIPAddresses_Finish_Reset(This) (This)->lpVtbl->Finish_Reset(This)
#define AsyncIEnumClusCfgIPAddresses_Begin_Clone(This) (This)->lpVtbl->Begin_Clone(This)
#define AsyncIEnumClusCfgIPAddresses_Finish_Clone(This,ppEnumIPAddressesOut) (This)->lpVtbl->Finish_Clone(This,ppEnumIPAddressesOut)
#define AsyncIEnumClusCfgIPAddresses_Begin_Count(This) (This)->lpVtbl->Begin_Count(This)
#define AsyncIEnumClusCfgIPAddresses_Finish_Count(This,pnCountOut) (This)->lpVtbl->Finish_Count(This,pnCountOut)
#endif
#endif
  HRESULT WINAPI AsyncIEnumClusCfgIPAddresses_Begin_Next_Proxy(AsyncIEnumClusCfgIPAddresses *This,ULONG cNumberRequestedIn);
  void __RPC_STUB AsyncIEnumClusCfgIPAddresses_Begin_Next_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIEnumClusCfgIPAddresses_Finish_Next_Proxy(AsyncIEnumClusCfgIPAddresses *This,IClusCfgIPAddressInfo **rgpIPAddressInfoOut,ULONG *pcNumberFetchedOut);
  void __RPC_STUB AsyncIEnumClusCfgIPAddresses_Finish_Next_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIEnumClusCfgIPAddresses_Begin_Skip_Proxy(AsyncIEnumClusCfgIPAddresses *This,ULONG cNumberToSkipIn);
  void __RPC_STUB AsyncIEnumClusCfgIPAddresses_Begin_Skip_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIEnumClusCfgIPAddresses_Finish_Skip_Proxy(AsyncIEnumClusCfgIPAddresses *This);
  void __RPC_STUB AsyncIEnumClusCfgIPAddresses_Finish_Skip_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIEnumClusCfgIPAddresses_Begin_Reset_Proxy(AsyncIEnumClusCfgIPAddresses *This);
  void __RPC_STUB AsyncIEnumClusCfgIPAddresses_Begin_Reset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIEnumClusCfgIPAddresses_Finish_Reset_Proxy(AsyncIEnumClusCfgIPAddresses *This);
  void __RPC_STUB AsyncIEnumClusCfgIPAddresses_Finish_Reset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIEnumClusCfgIPAddresses_Begin_Clone_Proxy(AsyncIEnumClusCfgIPAddresses *This);
  void __RPC_STUB AsyncIEnumClusCfgIPAddresses_Begin_Clone_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIEnumClusCfgIPAddresses_Finish_Clone_Proxy(AsyncIEnumClusCfgIPAddresses *This,IEnumClusCfgIPAddresses **ppEnumIPAddressesOut);
  void __RPC_STUB AsyncIEnumClusCfgIPAddresses_Finish_Clone_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIEnumClusCfgIPAddresses_Begin_Count_Proxy(AsyncIEnumClusCfgIPAddresses *This);
  void __RPC_STUB AsyncIEnumClusCfgIPAddresses_Begin_Count_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIEnumClusCfgIPAddresses_Finish_Count_Proxy(AsyncIEnumClusCfgIPAddresses *This,DWORD *pnCountOut);
  void __RPC_STUB AsyncIEnumClusCfgIPAddresses_Finish_Count_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IClusCfgIPAddressInfo_INTERFACE_DEFINED__
#define __IClusCfgIPAddressInfo_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IClusCfgIPAddressInfo;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IClusCfgIPAddressInfo : public IUnknown {
  public:
    virtual HRESULT WINAPI GetUID(BSTR *pbstrUIDOut) = 0;
    virtual HRESULT WINAPI GetIPAddress(ULONG *pulDottedQuadOut) = 0;
    virtual HRESULT WINAPI SetIPAddress(ULONG ulDottedQuadIn) = 0;
    virtual HRESULT WINAPI GetSubnetMask(ULONG *pulDottedQuadOut) = 0;
    virtual HRESULT WINAPI SetSubnetMask(ULONG ulDottedQuadIn) = 0;
  };
#else
  typedef struct IClusCfgIPAddressInfoVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IClusCfgIPAddressInfo *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IClusCfgIPAddressInfo *This);
      ULONG (WINAPI *Release)(IClusCfgIPAddressInfo *This);
      HRESULT (WINAPI *GetUID)(IClusCfgIPAddressInfo *This,BSTR *pbstrUIDOut);
      HRESULT (WINAPI *GetIPAddress)(IClusCfgIPAddressInfo *This,ULONG *pulDottedQuadOut);
      HRESULT (WINAPI *SetIPAddress)(IClusCfgIPAddressInfo *This,ULONG ulDottedQuadIn);
      HRESULT (WINAPI *GetSubnetMask)(IClusCfgIPAddressInfo *This,ULONG *pulDottedQuadOut);
      HRESULT (WINAPI *SetSubnetMask)(IClusCfgIPAddressInfo *This,ULONG ulDottedQuadIn);
    END_INTERFACE
  } IClusCfgIPAddressInfoVtbl;
  struct IClusCfgIPAddressInfo {
    CONST_VTBL struct IClusCfgIPAddressInfoVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IClusCfgIPAddressInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IClusCfgIPAddressInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IClusCfgIPAddressInfo_Release(This) (This)->lpVtbl->Release(This)
#define IClusCfgIPAddressInfo_GetUID(This,pbstrUIDOut) (This)->lpVtbl->GetUID(This,pbstrUIDOut)
#define IClusCfgIPAddressInfo_GetIPAddress(This,pulDottedQuadOut) (This)->lpVtbl->GetIPAddress(This,pulDottedQuadOut)
#define IClusCfgIPAddressInfo_SetIPAddress(This,ulDottedQuadIn) (This)->lpVtbl->SetIPAddress(This,ulDottedQuadIn)
#define IClusCfgIPAddressInfo_GetSubnetMask(This,pulDottedQuadOut) (This)->lpVtbl->GetSubnetMask(This,pulDottedQuadOut)
#define IClusCfgIPAddressInfo_SetSubnetMask(This,ulDottedQuadIn) (This)->lpVtbl->SetSubnetMask(This,ulDottedQuadIn)
#endif
#endif
  HRESULT WINAPI IClusCfgIPAddressInfo_GetUID_Proxy(IClusCfgIPAddressInfo *This,BSTR *pbstrUIDOut);
  void __RPC_STUB IClusCfgIPAddressInfo_GetUID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgIPAddressInfo_GetIPAddress_Proxy(IClusCfgIPAddressInfo *This,ULONG *pulDottedQuadOut);
  void __RPC_STUB IClusCfgIPAddressInfo_GetIPAddress_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgIPAddressInfo_SetIPAddress_Proxy(IClusCfgIPAddressInfo *This,ULONG ulDottedQuadIn);
  void __RPC_STUB IClusCfgIPAddressInfo_SetIPAddress_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgIPAddressInfo_GetSubnetMask_Proxy(IClusCfgIPAddressInfo *This,ULONG *pulDottedQuadOut);
  void __RPC_STUB IClusCfgIPAddressInfo_GetSubnetMask_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgIPAddressInfo_SetSubnetMask_Proxy(IClusCfgIPAddressInfo *This,ULONG ulDottedQuadIn);
  void __RPC_STUB IClusCfgIPAddressInfo_SetSubnetMask_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __AsyncIClusCfgIPAddressInfo_INTERFACE_DEFINED__
#define __AsyncIClusCfgIPAddressInfo_INTERFACE_DEFINED__
  EXTERN_C const IID IID_AsyncIClusCfgIPAddressInfo;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct AsyncIClusCfgIPAddressInfo : public IUnknown {
  public:
    virtual HRESULT WINAPI Begin_GetUID(void) = 0;
    virtual HRESULT WINAPI Finish_GetUID(BSTR *pbstrUIDOut) = 0;
    virtual HRESULT WINAPI Begin_GetIPAddress(void) = 0;
    virtual HRESULT WINAPI Finish_GetIPAddress(ULONG *pulDottedQuadOut) = 0;
    virtual HRESULT WINAPI Begin_SetIPAddress(ULONG ulDottedQuadIn) = 0;
    virtual HRESULT WINAPI Finish_SetIPAddress(void) = 0;
    virtual HRESULT WINAPI Begin_GetSubnetMask(void) = 0;
    virtual HRESULT WINAPI Finish_GetSubnetMask(ULONG *pulDottedQuadOut) = 0;
    virtual HRESULT WINAPI Begin_SetSubnetMask(ULONG ulDottedQuadIn) = 0;
    virtual HRESULT WINAPI Finish_SetSubnetMask(void) = 0;
  };
#else
  typedef struct AsyncIClusCfgIPAddressInfoVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(AsyncIClusCfgIPAddressInfo *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(AsyncIClusCfgIPAddressInfo *This);
      ULONG (WINAPI *Release)(AsyncIClusCfgIPAddressInfo *This);
      HRESULT (WINAPI *Begin_GetUID)(AsyncIClusCfgIPAddressInfo *This);
      HRESULT (WINAPI *Finish_GetUID)(AsyncIClusCfgIPAddressInfo *This,BSTR *pbstrUIDOut);
      HRESULT (WINAPI *Begin_GetIPAddress)(AsyncIClusCfgIPAddressInfo *This);
      HRESULT (WINAPI *Finish_GetIPAddress)(AsyncIClusCfgIPAddressInfo *This,ULONG *pulDottedQuadOut);
      HRESULT (WINAPI *Begin_SetIPAddress)(AsyncIClusCfgIPAddressInfo *This,ULONG ulDottedQuadIn);
      HRESULT (WINAPI *Finish_SetIPAddress)(AsyncIClusCfgIPAddressInfo *This);
      HRESULT (WINAPI *Begin_GetSubnetMask)(AsyncIClusCfgIPAddressInfo *This);
      HRESULT (WINAPI *Finish_GetSubnetMask)(AsyncIClusCfgIPAddressInfo *This,ULONG *pulDottedQuadOut);
      HRESULT (WINAPI *Begin_SetSubnetMask)(AsyncIClusCfgIPAddressInfo *This,ULONG ulDottedQuadIn);
      HRESULT (WINAPI *Finish_SetSubnetMask)(AsyncIClusCfgIPAddressInfo *This);
    END_INTERFACE
  } AsyncIClusCfgIPAddressInfoVtbl;
  struct AsyncIClusCfgIPAddressInfo {
    CONST_VTBL struct AsyncIClusCfgIPAddressInfoVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define AsyncIClusCfgIPAddressInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define AsyncIClusCfgIPAddressInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define AsyncIClusCfgIPAddressInfo_Release(This) (This)->lpVtbl->Release(This)
#define AsyncIClusCfgIPAddressInfo_Begin_GetUID(This) (This)->lpVtbl->Begin_GetUID(This)
#define AsyncIClusCfgIPAddressInfo_Finish_GetUID(This,pbstrUIDOut) (This)->lpVtbl->Finish_GetUID(This,pbstrUIDOut)
#define AsyncIClusCfgIPAddressInfo_Begin_GetIPAddress(This) (This)->lpVtbl->Begin_GetIPAddress(This)
#define AsyncIClusCfgIPAddressInfo_Finish_GetIPAddress(This,pulDottedQuadOut) (This)->lpVtbl->Finish_GetIPAddress(This,pulDottedQuadOut)
#define AsyncIClusCfgIPAddressInfo_Begin_SetIPAddress(This,ulDottedQuadIn) (This)->lpVtbl->Begin_SetIPAddress(This,ulDottedQuadIn)
#define AsyncIClusCfgIPAddressInfo_Finish_SetIPAddress(This) (This)->lpVtbl->Finish_SetIPAddress(This)
#define AsyncIClusCfgIPAddressInfo_Begin_GetSubnetMask(This) (This)->lpVtbl->Begin_GetSubnetMask(This)
#define AsyncIClusCfgIPAddressInfo_Finish_GetSubnetMask(This,pulDottedQuadOut) (This)->lpVtbl->Finish_GetSubnetMask(This,pulDottedQuadOut)
#define AsyncIClusCfgIPAddressInfo_Begin_SetSubnetMask(This,ulDottedQuadIn) (This)->lpVtbl->Begin_SetSubnetMask(This,ulDottedQuadIn)
#define AsyncIClusCfgIPAddressInfo_Finish_SetSubnetMask(This) (This)->lpVtbl->Finish_SetSubnetMask(This)
#endif
#endif
  HRESULT WINAPI AsyncIClusCfgIPAddressInfo_Begin_GetUID_Proxy(AsyncIClusCfgIPAddressInfo *This);
  void __RPC_STUB AsyncIClusCfgIPAddressInfo_Begin_GetUID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgIPAddressInfo_Finish_GetUID_Proxy(AsyncIClusCfgIPAddressInfo *This,BSTR *pbstrUIDOut);
  void __RPC_STUB AsyncIClusCfgIPAddressInfo_Finish_GetUID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgIPAddressInfo_Begin_GetIPAddress_Proxy(AsyncIClusCfgIPAddressInfo *This);
  void __RPC_STUB AsyncIClusCfgIPAddressInfo_Begin_GetIPAddress_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgIPAddressInfo_Finish_GetIPAddress_Proxy(AsyncIClusCfgIPAddressInfo *This,ULONG *pulDottedQuadOut);
  void __RPC_STUB AsyncIClusCfgIPAddressInfo_Finish_GetIPAddress_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgIPAddressInfo_Begin_SetIPAddress_Proxy(AsyncIClusCfgIPAddressInfo *This,ULONG ulDottedQuadIn);
  void __RPC_STUB AsyncIClusCfgIPAddressInfo_Begin_SetIPAddress_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgIPAddressInfo_Finish_SetIPAddress_Proxy(AsyncIClusCfgIPAddressInfo *This);
  void __RPC_STUB AsyncIClusCfgIPAddressInfo_Finish_SetIPAddress_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgIPAddressInfo_Begin_GetSubnetMask_Proxy(AsyncIClusCfgIPAddressInfo *This);
  void __RPC_STUB AsyncIClusCfgIPAddressInfo_Begin_GetSubnetMask_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgIPAddressInfo_Finish_GetSubnetMask_Proxy(AsyncIClusCfgIPAddressInfo *This,ULONG *pulDottedQuadOut);
  void __RPC_STUB AsyncIClusCfgIPAddressInfo_Finish_GetSubnetMask_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgIPAddressInfo_Begin_SetSubnetMask_Proxy(AsyncIClusCfgIPAddressInfo *This,ULONG ulDottedQuadIn);
  void __RPC_STUB AsyncIClusCfgIPAddressInfo_Begin_SetSubnetMask_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgIPAddressInfo_Finish_SetSubnetMask_Proxy(AsyncIClusCfgIPAddressInfo *This);
  void __RPC_STUB AsyncIClusCfgIPAddressInfo_Finish_SetSubnetMask_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IClusCfgNetworkInfo_INTERFACE_DEFINED__
#define __IClusCfgNetworkInfo_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IClusCfgNetworkInfo;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IClusCfgNetworkInfo : public IUnknown {
  public:
    virtual HRESULT WINAPI GetUID(BSTR *pbstrUIDOut) = 0;
    virtual HRESULT WINAPI GetName(BSTR *pbstrNameOut) = 0;
    virtual HRESULT WINAPI SetName(LPCWSTR pcszNameIn) = 0;
    virtual HRESULT WINAPI GetDescription(BSTR *pbstrDescriptionOut) = 0;
    virtual HRESULT WINAPI SetDescription(LPCWSTR pcszDescriptionIn) = 0;
    virtual HRESULT WINAPI GetPrimaryNetworkAddress(IClusCfgIPAddressInfo **ppIPAddressOut) = 0;
    virtual HRESULT WINAPI SetPrimaryNetworkAddress(IClusCfgIPAddressInfo *pIPAddressIn) = 0;
    virtual HRESULT WINAPI IsPublic(void) = 0;
    virtual HRESULT WINAPI SetPublic(WINBOOL fIsPublicIn) = 0;
    virtual HRESULT WINAPI IsPrivate(void) = 0;
    virtual HRESULT WINAPI SetPrivate(WINBOOL fIsPrivateIn) = 0;
  };
#else
  typedef struct IClusCfgNetworkInfoVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IClusCfgNetworkInfo *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IClusCfgNetworkInfo *This);
      ULONG (WINAPI *Release)(IClusCfgNetworkInfo *This);
      HRESULT (WINAPI *GetUID)(IClusCfgNetworkInfo *This,BSTR *pbstrUIDOut);
      HRESULT (WINAPI *GetName)(IClusCfgNetworkInfo *This,BSTR *pbstrNameOut);
      HRESULT (WINAPI *SetName)(IClusCfgNetworkInfo *This,LPCWSTR pcszNameIn);
      HRESULT (WINAPI *GetDescription)(IClusCfgNetworkInfo *This,BSTR *pbstrDescriptionOut);
      HRESULT (WINAPI *SetDescription)(IClusCfgNetworkInfo *This,LPCWSTR pcszDescriptionIn);
      HRESULT (WINAPI *GetPrimaryNetworkAddress)(IClusCfgNetworkInfo *This,IClusCfgIPAddressInfo **ppIPAddressOut);
      HRESULT (WINAPI *SetPrimaryNetworkAddress)(IClusCfgNetworkInfo *This,IClusCfgIPAddressInfo *pIPAddressIn);
      HRESULT (WINAPI *IsPublic)(IClusCfgNetworkInfo *This);
      HRESULT (WINAPI *SetPublic)(IClusCfgNetworkInfo *This,WINBOOL fIsPublicIn);
      HRESULT (WINAPI *IsPrivate)(IClusCfgNetworkInfo *This);
      HRESULT (WINAPI *SetPrivate)(IClusCfgNetworkInfo *This,WINBOOL fIsPrivateIn);
    END_INTERFACE
  } IClusCfgNetworkInfoVtbl;
  struct IClusCfgNetworkInfo {
    CONST_VTBL struct IClusCfgNetworkInfoVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IClusCfgNetworkInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IClusCfgNetworkInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IClusCfgNetworkInfo_Release(This) (This)->lpVtbl->Release(This)
#define IClusCfgNetworkInfo_GetUID(This,pbstrUIDOut) (This)->lpVtbl->GetUID(This,pbstrUIDOut)
#define IClusCfgNetworkInfo_GetName(This,pbstrNameOut) (This)->lpVtbl->GetName(This,pbstrNameOut)
#define IClusCfgNetworkInfo_SetName(This,pcszNameIn) (This)->lpVtbl->SetName(This,pcszNameIn)
#define IClusCfgNetworkInfo_GetDescription(This,pbstrDescriptionOut) (This)->lpVtbl->GetDescription(This,pbstrDescriptionOut)
#define IClusCfgNetworkInfo_SetDescription(This,pcszDescriptionIn) (This)->lpVtbl->SetDescription(This,pcszDescriptionIn)
#define IClusCfgNetworkInfo_GetPrimaryNetworkAddress(This,ppIPAddressOut) (This)->lpVtbl->GetPrimaryNetworkAddress(This,ppIPAddressOut)
#define IClusCfgNetworkInfo_SetPrimaryNetworkAddress(This,pIPAddressIn) (This)->lpVtbl->SetPrimaryNetworkAddress(This,pIPAddressIn)
#define IClusCfgNetworkInfo_IsPublic(This) (This)->lpVtbl->IsPublic(This)
#define IClusCfgNetworkInfo_SetPublic(This,fIsPublicIn) (This)->lpVtbl->SetPublic(This,fIsPublicIn)
#define IClusCfgNetworkInfo_IsPrivate(This) (This)->lpVtbl->IsPrivate(This)
#define IClusCfgNetworkInfo_SetPrivate(This,fIsPrivateIn) (This)->lpVtbl->SetPrivate(This,fIsPrivateIn)
#endif
#endif
  HRESULT WINAPI IClusCfgNetworkInfo_GetUID_Proxy(IClusCfgNetworkInfo *This,BSTR *pbstrUIDOut);
  void __RPC_STUB IClusCfgNetworkInfo_GetUID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgNetworkInfo_GetName_Proxy(IClusCfgNetworkInfo *This,BSTR *pbstrNameOut);
  void __RPC_STUB IClusCfgNetworkInfo_GetName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgNetworkInfo_SetName_Proxy(IClusCfgNetworkInfo *This,LPCWSTR pcszNameIn);
  void __RPC_STUB IClusCfgNetworkInfo_SetName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgNetworkInfo_GetDescription_Proxy(IClusCfgNetworkInfo *This,BSTR *pbstrDescriptionOut);
  void __RPC_STUB IClusCfgNetworkInfo_GetDescription_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgNetworkInfo_SetDescription_Proxy(IClusCfgNetworkInfo *This,LPCWSTR pcszDescriptionIn);
  void __RPC_STUB IClusCfgNetworkInfo_SetDescription_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgNetworkInfo_GetPrimaryNetworkAddress_Proxy(IClusCfgNetworkInfo *This,IClusCfgIPAddressInfo **ppIPAddressOut);
  void __RPC_STUB IClusCfgNetworkInfo_GetPrimaryNetworkAddress_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgNetworkInfo_SetPrimaryNetworkAddress_Proxy(IClusCfgNetworkInfo *This,IClusCfgIPAddressInfo *pIPAddressIn);
  void __RPC_STUB IClusCfgNetworkInfo_SetPrimaryNetworkAddress_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgNetworkInfo_IsPublic_Proxy(IClusCfgNetworkInfo *This);
  void __RPC_STUB IClusCfgNetworkInfo_IsPublic_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgNetworkInfo_SetPublic_Proxy(IClusCfgNetworkInfo *This,WINBOOL fIsPublicIn);
  void __RPC_STUB IClusCfgNetworkInfo_SetPublic_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgNetworkInfo_IsPrivate_Proxy(IClusCfgNetworkInfo *This);
  void __RPC_STUB IClusCfgNetworkInfo_IsPrivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgNetworkInfo_SetPrivate_Proxy(IClusCfgNetworkInfo *This,WINBOOL fIsPrivateIn);
  void __RPC_STUB IClusCfgNetworkInfo_SetPrivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __AsyncIClusCfgNetworkInfo_INTERFACE_DEFINED__
#define __AsyncIClusCfgNetworkInfo_INTERFACE_DEFINED__
  EXTERN_C const IID IID_AsyncIClusCfgNetworkInfo;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct AsyncIClusCfgNetworkInfo : public IUnknown {
  public:
    virtual HRESULT WINAPI Begin_GetUID(void) = 0;
    virtual HRESULT WINAPI Finish_GetUID(BSTR *pbstrUIDOut) = 0;
    virtual HRESULT WINAPI Begin_GetName(void) = 0;
    virtual HRESULT WINAPI Finish_GetName(BSTR *pbstrNameOut) = 0;
    virtual HRESULT WINAPI Begin_SetName(LPCWSTR pcszNameIn) = 0;
    virtual HRESULT WINAPI Finish_SetName(void) = 0;
    virtual HRESULT WINAPI Begin_GetDescription(void) = 0;
    virtual HRESULT WINAPI Finish_GetDescription(BSTR *pbstrDescriptionOut) = 0;
    virtual HRESULT WINAPI Begin_SetDescription(LPCWSTR pcszDescriptionIn) = 0;
    virtual HRESULT WINAPI Finish_SetDescription(void) = 0;
    virtual HRESULT WINAPI Begin_GetPrimaryNetworkAddress(void) = 0;
    virtual HRESULT WINAPI Finish_GetPrimaryNetworkAddress(IClusCfgIPAddressInfo **ppIPAddressOut) = 0;
    virtual HRESULT WINAPI Begin_SetPrimaryNetworkAddress(IClusCfgIPAddressInfo *pIPAddressIn) = 0;
    virtual HRESULT WINAPI Finish_SetPrimaryNetworkAddress(void) = 0;
    virtual HRESULT WINAPI Begin_IsPublic(void) = 0;
    virtual HRESULT WINAPI Finish_IsPublic(void) = 0;
    virtual HRESULT WINAPI Begin_SetPublic(WINBOOL fIsPublicIn) = 0;
    virtual HRESULT WINAPI Finish_SetPublic(void) = 0;
    virtual HRESULT WINAPI Begin_IsPrivate(void) = 0;
    virtual HRESULT WINAPI Finish_IsPrivate(void) = 0;
    virtual HRESULT WINAPI Begin_SetPrivate(WINBOOL fIsPrivateIn) = 0;
    virtual HRESULT WINAPI Finish_SetPrivate(void) = 0;
  };
#else
  typedef struct AsyncIClusCfgNetworkInfoVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(AsyncIClusCfgNetworkInfo *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(AsyncIClusCfgNetworkInfo *This);
      ULONG (WINAPI *Release)(AsyncIClusCfgNetworkInfo *This);
      HRESULT (WINAPI *Begin_GetUID)(AsyncIClusCfgNetworkInfo *This);
      HRESULT (WINAPI *Finish_GetUID)(AsyncIClusCfgNetworkInfo *This,BSTR *pbstrUIDOut);
      HRESULT (WINAPI *Begin_GetName)(AsyncIClusCfgNetworkInfo *This);
      HRESULT (WINAPI *Finish_GetName)(AsyncIClusCfgNetworkInfo *This,BSTR *pbstrNameOut);
      HRESULT (WINAPI *Begin_SetName)(AsyncIClusCfgNetworkInfo *This,LPCWSTR pcszNameIn);
      HRESULT (WINAPI *Finish_SetName)(AsyncIClusCfgNetworkInfo *This);
      HRESULT (WINAPI *Begin_GetDescription)(AsyncIClusCfgNetworkInfo *This);
      HRESULT (WINAPI *Finish_GetDescription)(AsyncIClusCfgNetworkInfo *This,BSTR *pbstrDescriptionOut);
      HRESULT (WINAPI *Begin_SetDescription)(AsyncIClusCfgNetworkInfo *This,LPCWSTR pcszDescriptionIn);
      HRESULT (WINAPI *Finish_SetDescription)(AsyncIClusCfgNetworkInfo *This);
      HRESULT (WINAPI *Begin_GetPrimaryNetworkAddress)(AsyncIClusCfgNetworkInfo *This);
      HRESULT (WINAPI *Finish_GetPrimaryNetworkAddress)(AsyncIClusCfgNetworkInfo *This,IClusCfgIPAddressInfo **ppIPAddressOut);
      HRESULT (WINAPI *Begin_SetPrimaryNetworkAddress)(AsyncIClusCfgNetworkInfo *This,IClusCfgIPAddressInfo *pIPAddressIn);
      HRESULT (WINAPI *Finish_SetPrimaryNetworkAddress)(AsyncIClusCfgNetworkInfo *This);
      HRESULT (WINAPI *Begin_IsPublic)(AsyncIClusCfgNetworkInfo *This);
      HRESULT (WINAPI *Finish_IsPublic)(AsyncIClusCfgNetworkInfo *This);
      HRESULT (WINAPI *Begin_SetPublic)(AsyncIClusCfgNetworkInfo *This,WINBOOL fIsPublicIn);
      HRESULT (WINAPI *Finish_SetPublic)(AsyncIClusCfgNetworkInfo *This);
      HRESULT (WINAPI *Begin_IsPrivate)(AsyncIClusCfgNetworkInfo *This);
      HRESULT (WINAPI *Finish_IsPrivate)(AsyncIClusCfgNetworkInfo *This);
      HRESULT (WINAPI *Begin_SetPrivate)(AsyncIClusCfgNetworkInfo *This,WINBOOL fIsPrivateIn);
      HRESULT (WINAPI *Finish_SetPrivate)(AsyncIClusCfgNetworkInfo *This);
    END_INTERFACE
  } AsyncIClusCfgNetworkInfoVtbl;
  struct AsyncIClusCfgNetworkInfo {
    CONST_VTBL struct AsyncIClusCfgNetworkInfoVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define AsyncIClusCfgNetworkInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define AsyncIClusCfgNetworkInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define AsyncIClusCfgNetworkInfo_Release(This) (This)->lpVtbl->Release(This)
#define AsyncIClusCfgNetworkInfo_Begin_GetUID(This) (This)->lpVtbl->Begin_GetUID(This)
#define AsyncIClusCfgNetworkInfo_Finish_GetUID(This,pbstrUIDOut) (This)->lpVtbl->Finish_GetUID(This,pbstrUIDOut)
#define AsyncIClusCfgNetworkInfo_Begin_GetName(This) (This)->lpVtbl->Begin_GetName(This)
#define AsyncIClusCfgNetworkInfo_Finish_GetName(This,pbstrNameOut) (This)->lpVtbl->Finish_GetName(This,pbstrNameOut)
#define AsyncIClusCfgNetworkInfo_Begin_SetName(This,pcszNameIn) (This)->lpVtbl->Begin_SetName(This,pcszNameIn)
#define AsyncIClusCfgNetworkInfo_Finish_SetName(This) (This)->lpVtbl->Finish_SetName(This)
#define AsyncIClusCfgNetworkInfo_Begin_GetDescription(This) (This)->lpVtbl->Begin_GetDescription(This)
#define AsyncIClusCfgNetworkInfo_Finish_GetDescription(This,pbstrDescriptionOut) (This)->lpVtbl->Finish_GetDescription(This,pbstrDescriptionOut)
#define AsyncIClusCfgNetworkInfo_Begin_SetDescription(This,pcszDescriptionIn) (This)->lpVtbl->Begin_SetDescription(This,pcszDescriptionIn)
#define AsyncIClusCfgNetworkInfo_Finish_SetDescription(This) (This)->lpVtbl->Finish_SetDescription(This)
#define AsyncIClusCfgNetworkInfo_Begin_GetPrimaryNetworkAddress(This) (This)->lpVtbl->Begin_GetPrimaryNetworkAddress(This)
#define AsyncIClusCfgNetworkInfo_Finish_GetPrimaryNetworkAddress(This,ppIPAddressOut) (This)->lpVtbl->Finish_GetPrimaryNetworkAddress(This,ppIPAddressOut)
#define AsyncIClusCfgNetworkInfo_Begin_SetPrimaryNetworkAddress(This,pIPAddressIn) (This)->lpVtbl->Begin_SetPrimaryNetworkAddress(This,pIPAddressIn)
#define AsyncIClusCfgNetworkInfo_Finish_SetPrimaryNetworkAddress(This) (This)->lpVtbl->Finish_SetPrimaryNetworkAddress(This)
#define AsyncIClusCfgNetworkInfo_Begin_IsPublic(This) (This)->lpVtbl->Begin_IsPublic(This)
#define AsyncIClusCfgNetworkInfo_Finish_IsPublic(This) (This)->lpVtbl->Finish_IsPublic(This)
#define AsyncIClusCfgNetworkInfo_Begin_SetPublic(This,fIsPublicIn) (This)->lpVtbl->Begin_SetPublic(This,fIsPublicIn)
#define AsyncIClusCfgNetworkInfo_Finish_SetPublic(This) (This)->lpVtbl->Finish_SetPublic(This)
#define AsyncIClusCfgNetworkInfo_Begin_IsPrivate(This) (This)->lpVtbl->Begin_IsPrivate(This)
#define AsyncIClusCfgNetworkInfo_Finish_IsPrivate(This) (This)->lpVtbl->Finish_IsPrivate(This)
#define AsyncIClusCfgNetworkInfo_Begin_SetPrivate(This,fIsPrivateIn) (This)->lpVtbl->Begin_SetPrivate(This,fIsPrivateIn)
#define AsyncIClusCfgNetworkInfo_Finish_SetPrivate(This) (This)->lpVtbl->Finish_SetPrivate(This)
#endif
#endif
  HRESULT WINAPI AsyncIClusCfgNetworkInfo_Begin_GetUID_Proxy(AsyncIClusCfgNetworkInfo *This);
  void __RPC_STUB AsyncIClusCfgNetworkInfo_Begin_GetUID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgNetworkInfo_Finish_GetUID_Proxy(AsyncIClusCfgNetworkInfo *This,BSTR *pbstrUIDOut);
  void __RPC_STUB AsyncIClusCfgNetworkInfo_Finish_GetUID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgNetworkInfo_Begin_GetName_Proxy(AsyncIClusCfgNetworkInfo *This);
  void __RPC_STUB AsyncIClusCfgNetworkInfo_Begin_GetName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgNetworkInfo_Finish_GetName_Proxy(AsyncIClusCfgNetworkInfo *This,BSTR *pbstrNameOut);
  void __RPC_STUB AsyncIClusCfgNetworkInfo_Finish_GetName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgNetworkInfo_Begin_SetName_Proxy(AsyncIClusCfgNetworkInfo *This,LPCWSTR pcszNameIn);
  void __RPC_STUB AsyncIClusCfgNetworkInfo_Begin_SetName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgNetworkInfo_Finish_SetName_Proxy(AsyncIClusCfgNetworkInfo *This);
  void __RPC_STUB AsyncIClusCfgNetworkInfo_Finish_SetName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgNetworkInfo_Begin_GetDescription_Proxy(AsyncIClusCfgNetworkInfo *This);
  void __RPC_STUB AsyncIClusCfgNetworkInfo_Begin_GetDescription_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgNetworkInfo_Finish_GetDescription_Proxy(AsyncIClusCfgNetworkInfo *This,BSTR *pbstrDescriptionOut);
  void __RPC_STUB AsyncIClusCfgNetworkInfo_Finish_GetDescription_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgNetworkInfo_Begin_SetDescription_Proxy(AsyncIClusCfgNetworkInfo *This,LPCWSTR pcszDescriptionIn);
  void __RPC_STUB AsyncIClusCfgNetworkInfo_Begin_SetDescription_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgNetworkInfo_Finish_SetDescription_Proxy(AsyncIClusCfgNetworkInfo *This);
  void __RPC_STUB AsyncIClusCfgNetworkInfo_Finish_SetDescription_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgNetworkInfo_Begin_GetPrimaryNetworkAddress_Proxy(AsyncIClusCfgNetworkInfo *This);
  void __RPC_STUB AsyncIClusCfgNetworkInfo_Begin_GetPrimaryNetworkAddress_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgNetworkInfo_Finish_GetPrimaryNetworkAddress_Proxy(AsyncIClusCfgNetworkInfo *This,IClusCfgIPAddressInfo **ppIPAddressOut);
  void __RPC_STUB AsyncIClusCfgNetworkInfo_Finish_GetPrimaryNetworkAddress_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgNetworkInfo_Begin_SetPrimaryNetworkAddress_Proxy(AsyncIClusCfgNetworkInfo *This,IClusCfgIPAddressInfo *pIPAddressIn);
  void __RPC_STUB AsyncIClusCfgNetworkInfo_Begin_SetPrimaryNetworkAddress_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgNetworkInfo_Finish_SetPrimaryNetworkAddress_Proxy(AsyncIClusCfgNetworkInfo *This);
  void __RPC_STUB AsyncIClusCfgNetworkInfo_Finish_SetPrimaryNetworkAddress_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgNetworkInfo_Begin_IsPublic_Proxy(AsyncIClusCfgNetworkInfo *This);
  void __RPC_STUB AsyncIClusCfgNetworkInfo_Begin_IsPublic_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgNetworkInfo_Finish_IsPublic_Proxy(AsyncIClusCfgNetworkInfo *This);
  void __RPC_STUB AsyncIClusCfgNetworkInfo_Finish_IsPublic_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgNetworkInfo_Begin_SetPublic_Proxy(AsyncIClusCfgNetworkInfo *This,WINBOOL fIsPublicIn);
  void __RPC_STUB AsyncIClusCfgNetworkInfo_Begin_SetPublic_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgNetworkInfo_Finish_SetPublic_Proxy(AsyncIClusCfgNetworkInfo *This);
  void __RPC_STUB AsyncIClusCfgNetworkInfo_Finish_SetPublic_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgNetworkInfo_Begin_IsPrivate_Proxy(AsyncIClusCfgNetworkInfo *This);
  void __RPC_STUB AsyncIClusCfgNetworkInfo_Begin_IsPrivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgNetworkInfo_Finish_IsPrivate_Proxy(AsyncIClusCfgNetworkInfo *This);
  void __RPC_STUB AsyncIClusCfgNetworkInfo_Finish_IsPrivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgNetworkInfo_Begin_SetPrivate_Proxy(AsyncIClusCfgNetworkInfo *This,WINBOOL fIsPrivateIn);
  void __RPC_STUB AsyncIClusCfgNetworkInfo_Begin_SetPrivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgNetworkInfo_Finish_SetPrivate_Proxy(AsyncIClusCfgNetworkInfo *This);
  void __RPC_STUB AsyncIClusCfgNetworkInfo_Finish_SetPrivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IClusCfgClusterInfo_INTERFACE_DEFINED__
#define __IClusCfgClusterInfo_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IClusCfgClusterInfo;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IClusCfgClusterInfo : public IUnknown {
  public:
    virtual HRESULT WINAPI SetCommitMode(ECommitMode ecmNewModeIn) = 0;
    virtual HRESULT WINAPI GetCommitMode(ECommitMode *pecmCurrentModeOut) = 0;
    virtual HRESULT WINAPI GetName(BSTR *pbstrNameOut) = 0;
    virtual HRESULT WINAPI SetName(LPCWSTR pcszNameIn) = 0;
    virtual HRESULT WINAPI GetIPAddress(ULONG *pulDottedQuadOut) = 0;
    virtual HRESULT WINAPI SetIPAddress(ULONG ulDottedQuadIn) = 0;
    virtual HRESULT WINAPI GetSubnetMask(ULONG *pulDottedQuadOut) = 0;
    virtual HRESULT WINAPI SetSubnetMask(ULONG ulDottedQuadIn) = 0;
    virtual HRESULT WINAPI GetNetworkInfo(IClusCfgNetworkInfo **ppiccniOut) = 0;
    virtual HRESULT WINAPI SetNetworkInfo(IClusCfgNetworkInfo *piccniIn) = 0;
    virtual HRESULT WINAPI GetClusterServiceAccountCredentials(IClusCfgCredentials **ppicccCredentialsOut) = 0;
    virtual HRESULT WINAPI GetBindingString(BSTR *pbstrBindingStringOut) = 0;
    virtual HRESULT WINAPI SetBindingString(LPCWSTR pcszBindingStringIn) = 0;
    virtual HRESULT WINAPI GetMaxNodeCount(DWORD *pcMaxNodesOut) = 0;
  };
#else
  typedef struct IClusCfgClusterInfoVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IClusCfgClusterInfo *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IClusCfgClusterInfo *This);
      ULONG (WINAPI *Release)(IClusCfgClusterInfo *This);
      HRESULT (WINAPI *SetCommitMode)(IClusCfgClusterInfo *This,ECommitMode ecmNewModeIn);
      HRESULT (WINAPI *GetCommitMode)(IClusCfgClusterInfo *This,ECommitMode *pecmCurrentModeOut);
      HRESULT (WINAPI *GetName)(IClusCfgClusterInfo *This,BSTR *pbstrNameOut);
      HRESULT (WINAPI *SetName)(IClusCfgClusterInfo *This,LPCWSTR pcszNameIn);
      HRESULT (WINAPI *GetIPAddress)(IClusCfgClusterInfo *This,ULONG *pulDottedQuadOut);
      HRESULT (WINAPI *SetIPAddress)(IClusCfgClusterInfo *This,ULONG ulDottedQuadIn);
      HRESULT (WINAPI *GetSubnetMask)(IClusCfgClusterInfo *This,ULONG *pulDottedQuadOut);
      HRESULT (WINAPI *SetSubnetMask)(IClusCfgClusterInfo *This,ULONG ulDottedQuadIn);
      HRESULT (WINAPI *GetNetworkInfo)(IClusCfgClusterInfo *This,IClusCfgNetworkInfo **ppiccniOut);
      HRESULT (WINAPI *SetNetworkInfo)(IClusCfgClusterInfo *This,IClusCfgNetworkInfo *piccniIn);
      HRESULT (WINAPI *GetClusterServiceAccountCredentials)(IClusCfgClusterInfo *This,IClusCfgCredentials **ppicccCredentialsOut);
      HRESULT (WINAPI *GetBindingString)(IClusCfgClusterInfo *This,BSTR *pbstrBindingStringOut);
      HRESULT (WINAPI *SetBindingString)(IClusCfgClusterInfo *This,LPCWSTR pcszBindingStringIn);
      HRESULT (WINAPI *GetMaxNodeCount)(IClusCfgClusterInfo *This,DWORD *pcMaxNodesOut);
    END_INTERFACE
  } IClusCfgClusterInfoVtbl;
  struct IClusCfgClusterInfo {
    CONST_VTBL struct IClusCfgClusterInfoVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IClusCfgClusterInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IClusCfgClusterInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IClusCfgClusterInfo_Release(This) (This)->lpVtbl->Release(This)
#define IClusCfgClusterInfo_SetCommitMode(This,ecmNewModeIn) (This)->lpVtbl->SetCommitMode(This,ecmNewModeIn)
#define IClusCfgClusterInfo_GetCommitMode(This,pecmCurrentModeOut) (This)->lpVtbl->GetCommitMode(This,pecmCurrentModeOut)
#define IClusCfgClusterInfo_GetName(This,pbstrNameOut) (This)->lpVtbl->GetName(This,pbstrNameOut)
#define IClusCfgClusterInfo_SetName(This,pcszNameIn) (This)->lpVtbl->SetName(This,pcszNameIn)
#define IClusCfgClusterInfo_GetIPAddress(This,pulDottedQuadOut) (This)->lpVtbl->GetIPAddress(This,pulDottedQuadOut)
#define IClusCfgClusterInfo_SetIPAddress(This,ulDottedQuadIn) (This)->lpVtbl->SetIPAddress(This,ulDottedQuadIn)
#define IClusCfgClusterInfo_GetSubnetMask(This,pulDottedQuadOut) (This)->lpVtbl->GetSubnetMask(This,pulDottedQuadOut)
#define IClusCfgClusterInfo_SetSubnetMask(This,ulDottedQuadIn) (This)->lpVtbl->SetSubnetMask(This,ulDottedQuadIn)
#define IClusCfgClusterInfo_GetNetworkInfo(This,ppiccniOut) (This)->lpVtbl->GetNetworkInfo(This,ppiccniOut)
#define IClusCfgClusterInfo_SetNetworkInfo(This,piccniIn) (This)->lpVtbl->SetNetworkInfo(This,piccniIn)
#define IClusCfgClusterInfo_GetClusterServiceAccountCredentials(This,ppicccCredentialsOut) (This)->lpVtbl->GetClusterServiceAccountCredentials(This,ppicccCredentialsOut)
#define IClusCfgClusterInfo_GetBindingString(This,pbstrBindingStringOut) (This)->lpVtbl->GetBindingString(This,pbstrBindingStringOut)
#define IClusCfgClusterInfo_SetBindingString(This,pcszBindingStringIn) (This)->lpVtbl->SetBindingString(This,pcszBindingStringIn)
#define IClusCfgClusterInfo_GetMaxNodeCount(This,pcMaxNodesOut) (This)->lpVtbl->GetMaxNodeCount(This,pcMaxNodesOut)
#endif
#endif
  HRESULT WINAPI IClusCfgClusterInfo_SetCommitMode_Proxy(IClusCfgClusterInfo *This,ECommitMode ecmNewModeIn);
  void __RPC_STUB IClusCfgClusterInfo_SetCommitMode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgClusterInfo_GetCommitMode_Proxy(IClusCfgClusterInfo *This,ECommitMode *pecmCurrentModeOut);
  void __RPC_STUB IClusCfgClusterInfo_GetCommitMode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgClusterInfo_GetName_Proxy(IClusCfgClusterInfo *This,BSTR *pbstrNameOut);
  void __RPC_STUB IClusCfgClusterInfo_GetName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgClusterInfo_SetName_Proxy(IClusCfgClusterInfo *This,LPCWSTR pcszNameIn);
  void __RPC_STUB IClusCfgClusterInfo_SetName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgClusterInfo_GetIPAddress_Proxy(IClusCfgClusterInfo *This,ULONG *pulDottedQuadOut);
  void __RPC_STUB IClusCfgClusterInfo_GetIPAddress_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgClusterInfo_SetIPAddress_Proxy(IClusCfgClusterInfo *This,ULONG ulDottedQuadIn);
  void __RPC_STUB IClusCfgClusterInfo_SetIPAddress_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgClusterInfo_GetSubnetMask_Proxy(IClusCfgClusterInfo *This,ULONG *pulDottedQuadOut);
  void __RPC_STUB IClusCfgClusterInfo_GetSubnetMask_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgClusterInfo_SetSubnetMask_Proxy(IClusCfgClusterInfo *This,ULONG ulDottedQuadIn);
  void __RPC_STUB IClusCfgClusterInfo_SetSubnetMask_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgClusterInfo_GetNetworkInfo_Proxy(IClusCfgClusterInfo *This,IClusCfgNetworkInfo **ppiccniOut);
  void __RPC_STUB IClusCfgClusterInfo_GetNetworkInfo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgClusterInfo_SetNetworkInfo_Proxy(IClusCfgClusterInfo *This,IClusCfgNetworkInfo *piccniIn);
  void __RPC_STUB IClusCfgClusterInfo_SetNetworkInfo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgClusterInfo_GetClusterServiceAccountCredentials_Proxy(IClusCfgClusterInfo *This,IClusCfgCredentials **ppicccCredentialsOut);
  void __RPC_STUB IClusCfgClusterInfo_GetClusterServiceAccountCredentials_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgClusterInfo_GetBindingString_Proxy(IClusCfgClusterInfo *This,BSTR *pbstrBindingStringOut);
  void __RPC_STUB IClusCfgClusterInfo_GetBindingString_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgClusterInfo_SetBindingString_Proxy(IClusCfgClusterInfo *This,LPCWSTR pcszBindingStringIn);
  void __RPC_STUB IClusCfgClusterInfo_SetBindingString_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgClusterInfo_GetMaxNodeCount_Proxy(IClusCfgClusterInfo *This,DWORD *pcMaxNodesOut);
  void __RPC_STUB IClusCfgClusterInfo_GetMaxNodeCount_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __AsyncIClusCfgClusterInfo_INTERFACE_DEFINED__
#define __AsyncIClusCfgClusterInfo_INTERFACE_DEFINED__
  EXTERN_C const IID IID_AsyncIClusCfgClusterInfo;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct AsyncIClusCfgClusterInfo : public IUnknown {
  public:
    virtual HRESULT WINAPI Begin_SetCommitMode(ECommitMode ecmNewModeIn) = 0;
    virtual HRESULT WINAPI Finish_SetCommitMode(void) = 0;
    virtual HRESULT WINAPI Begin_GetCommitMode(void) = 0;
    virtual HRESULT WINAPI Finish_GetCommitMode(ECommitMode *pecmCurrentModeOut) = 0;
    virtual HRESULT WINAPI Begin_GetName(void) = 0;
    virtual HRESULT WINAPI Finish_GetName(BSTR *pbstrNameOut) = 0;
    virtual HRESULT WINAPI Begin_SetName(LPCWSTR pcszNameIn) = 0;
    virtual HRESULT WINAPI Finish_SetName(void) = 0;
    virtual HRESULT WINAPI Begin_GetIPAddress(void) = 0;
    virtual HRESULT WINAPI Finish_GetIPAddress(ULONG *pulDottedQuadOut) = 0;
    virtual HRESULT WINAPI Begin_SetIPAddress(ULONG ulDottedQuadIn) = 0;
    virtual HRESULT WINAPI Finish_SetIPAddress(void) = 0;
    virtual HRESULT WINAPI Begin_GetSubnetMask(void) = 0;
    virtual HRESULT WINAPI Finish_GetSubnetMask(ULONG *pulDottedQuadOut) = 0;
    virtual HRESULT WINAPI Begin_SetSubnetMask(ULONG ulDottedQuadIn) = 0;
    virtual HRESULT WINAPI Finish_SetSubnetMask(void) = 0;
    virtual HRESULT WINAPI Begin_GetNetworkInfo(void) = 0;
    virtual HRESULT WINAPI Finish_GetNetworkInfo(IClusCfgNetworkInfo **ppiccniOut) = 0;
    virtual HRESULT WINAPI Begin_SetNetworkInfo(IClusCfgNetworkInfo *piccniIn) = 0;
    virtual HRESULT WINAPI Finish_SetNetworkInfo(void) = 0;
    virtual HRESULT WINAPI Begin_GetClusterServiceAccountCredentials(void) = 0;
    virtual HRESULT WINAPI Finish_GetClusterServiceAccountCredentials(IClusCfgCredentials **ppicccCredentialsOut) = 0;
    virtual HRESULT WINAPI Begin_GetBindingString(void) = 0;
    virtual HRESULT WINAPI Finish_GetBindingString(BSTR *pbstrBindingStringOut) = 0;
    virtual HRESULT WINAPI Begin_SetBindingString(LPCWSTR pcszBindingStringIn) = 0;
    virtual HRESULT WINAPI Finish_SetBindingString(void) = 0;
    virtual HRESULT WINAPI Begin_GetMaxNodeCount(void) = 0;
    virtual HRESULT WINAPI Finish_GetMaxNodeCount(DWORD *pcMaxNodesOut) = 0;
  };
#else
  typedef struct AsyncIClusCfgClusterInfoVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(AsyncIClusCfgClusterInfo *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(AsyncIClusCfgClusterInfo *This);
      ULONG (WINAPI *Release)(AsyncIClusCfgClusterInfo *This);
      HRESULT (WINAPI *Begin_SetCommitMode)(AsyncIClusCfgClusterInfo *This,ECommitMode ecmNewModeIn);
      HRESULT (WINAPI *Finish_SetCommitMode)(AsyncIClusCfgClusterInfo *This);
      HRESULT (WINAPI *Begin_GetCommitMode)(AsyncIClusCfgClusterInfo *This);
      HRESULT (WINAPI *Finish_GetCommitMode)(AsyncIClusCfgClusterInfo *This,ECommitMode *pecmCurrentModeOut);
      HRESULT (WINAPI *Begin_GetName)(AsyncIClusCfgClusterInfo *This);
      HRESULT (WINAPI *Finish_GetName)(AsyncIClusCfgClusterInfo *This,BSTR *pbstrNameOut);
      HRESULT (WINAPI *Begin_SetName)(AsyncIClusCfgClusterInfo *This,LPCWSTR pcszNameIn);
      HRESULT (WINAPI *Finish_SetName)(AsyncIClusCfgClusterInfo *This);
      HRESULT (WINAPI *Begin_GetIPAddress)(AsyncIClusCfgClusterInfo *This);
      HRESULT (WINAPI *Finish_GetIPAddress)(AsyncIClusCfgClusterInfo *This,ULONG *pulDottedQuadOut);
      HRESULT (WINAPI *Begin_SetIPAddress)(AsyncIClusCfgClusterInfo *This,ULONG ulDottedQuadIn);
      HRESULT (WINAPI *Finish_SetIPAddress)(AsyncIClusCfgClusterInfo *This);
      HRESULT (WINAPI *Begin_GetSubnetMask)(AsyncIClusCfgClusterInfo *This);
      HRESULT (WINAPI *Finish_GetSubnetMask)(AsyncIClusCfgClusterInfo *This,ULONG *pulDottedQuadOut);
      HRESULT (WINAPI *Begin_SetSubnetMask)(AsyncIClusCfgClusterInfo *This,ULONG ulDottedQuadIn);
      HRESULT (WINAPI *Finish_SetSubnetMask)(AsyncIClusCfgClusterInfo *This);
      HRESULT (WINAPI *Begin_GetNetworkInfo)(AsyncIClusCfgClusterInfo *This);
      HRESULT (WINAPI *Finish_GetNetworkInfo)(AsyncIClusCfgClusterInfo *This,IClusCfgNetworkInfo **ppiccniOut);
      HRESULT (WINAPI *Begin_SetNetworkInfo)(AsyncIClusCfgClusterInfo *This,IClusCfgNetworkInfo *piccniIn);
      HRESULT (WINAPI *Finish_SetNetworkInfo)(AsyncIClusCfgClusterInfo *This);
      HRESULT (WINAPI *Begin_GetClusterServiceAccountCredentials)(AsyncIClusCfgClusterInfo *This);
      HRESULT (WINAPI *Finish_GetClusterServiceAccountCredentials)(AsyncIClusCfgClusterInfo *This,IClusCfgCredentials **ppicccCredentialsOut);
      HRESULT (WINAPI *Begin_GetBindingString)(AsyncIClusCfgClusterInfo *This);
      HRESULT (WINAPI *Finish_GetBindingString)(AsyncIClusCfgClusterInfo *This,BSTR *pbstrBindingStringOut);
      HRESULT (WINAPI *Begin_SetBindingString)(AsyncIClusCfgClusterInfo *This,LPCWSTR pcszBindingStringIn);
      HRESULT (WINAPI *Finish_SetBindingString)(AsyncIClusCfgClusterInfo *This);
      HRESULT (WINAPI *Begin_GetMaxNodeCount)(AsyncIClusCfgClusterInfo *This);
      HRESULT (WINAPI *Finish_GetMaxNodeCount)(AsyncIClusCfgClusterInfo *This,DWORD *pcMaxNodesOut);
    END_INTERFACE
  } AsyncIClusCfgClusterInfoVtbl;
  struct AsyncIClusCfgClusterInfo {
    CONST_VTBL struct AsyncIClusCfgClusterInfoVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define AsyncIClusCfgClusterInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define AsyncIClusCfgClusterInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define AsyncIClusCfgClusterInfo_Release(This) (This)->lpVtbl->Release(This)
#define AsyncIClusCfgClusterInfo_Begin_SetCommitMode(This,ecmNewModeIn) (This)->lpVtbl->Begin_SetCommitMode(This,ecmNewModeIn)
#define AsyncIClusCfgClusterInfo_Finish_SetCommitMode(This) (This)->lpVtbl->Finish_SetCommitMode(This)
#define AsyncIClusCfgClusterInfo_Begin_GetCommitMode(This) (This)->lpVtbl->Begin_GetCommitMode(This)
#define AsyncIClusCfgClusterInfo_Finish_GetCommitMode(This,pecmCurrentModeOut) (This)->lpVtbl->Finish_GetCommitMode(This,pecmCurrentModeOut)
#define AsyncIClusCfgClusterInfo_Begin_GetName(This) (This)->lpVtbl->Begin_GetName(This)
#define AsyncIClusCfgClusterInfo_Finish_GetName(This,pbstrNameOut) (This)->lpVtbl->Finish_GetName(This,pbstrNameOut)
#define AsyncIClusCfgClusterInfo_Begin_SetName(This,pcszNameIn) (This)->lpVtbl->Begin_SetName(This,pcszNameIn)
#define AsyncIClusCfgClusterInfo_Finish_SetName(This) (This)->lpVtbl->Finish_SetName(This)
#define AsyncIClusCfgClusterInfo_Begin_GetIPAddress(This) (This)->lpVtbl->Begin_GetIPAddress(This)
#define AsyncIClusCfgClusterInfo_Finish_GetIPAddress(This,pulDottedQuadOut) (This)->lpVtbl->Finish_GetIPAddress(This,pulDottedQuadOut)
#define AsyncIClusCfgClusterInfo_Begin_SetIPAddress(This,ulDottedQuadIn) (This)->lpVtbl->Begin_SetIPAddress(This,ulDottedQuadIn)
#define AsyncIClusCfgClusterInfo_Finish_SetIPAddress(This) (This)->lpVtbl->Finish_SetIPAddress(This)
#define AsyncIClusCfgClusterInfo_Begin_GetSubnetMask(This) (This)->lpVtbl->Begin_GetSubnetMask(This)
#define AsyncIClusCfgClusterInfo_Finish_GetSubnetMask(This,pulDottedQuadOut) (This)->lpVtbl->Finish_GetSubnetMask(This,pulDottedQuadOut)
#define AsyncIClusCfgClusterInfo_Begin_SetSubnetMask(This,ulDottedQuadIn) (This)->lpVtbl->Begin_SetSubnetMask(This,ulDottedQuadIn)
#define AsyncIClusCfgClusterInfo_Finish_SetSubnetMask(This) (This)->lpVtbl->Finish_SetSubnetMask(This)
#define AsyncIClusCfgClusterInfo_Begin_GetNetworkInfo(This) (This)->lpVtbl->Begin_GetNetworkInfo(This)
#define AsyncIClusCfgClusterInfo_Finish_GetNetworkInfo(This,ppiccniOut) (This)->lpVtbl->Finish_GetNetworkInfo(This,ppiccniOut)
#define AsyncIClusCfgClusterInfo_Begin_SetNetworkInfo(This,piccniIn) (This)->lpVtbl->Begin_SetNetworkInfo(This,piccniIn)
#define AsyncIClusCfgClusterInfo_Finish_SetNetworkInfo(This) (This)->lpVtbl->Finish_SetNetworkInfo(This)
#define AsyncIClusCfgClusterInfo_Begin_GetClusterServiceAccountCredentials(This) (This)->lpVtbl->Begin_GetClusterServiceAccountCredentials(This)
#define AsyncIClusCfgClusterInfo_Finish_GetClusterServiceAccountCredentials(This,ppicccCredentialsOut) (This)->lpVtbl->Finish_GetClusterServiceAccountCredentials(This,ppicccCredentialsOut)
#define AsyncIClusCfgClusterInfo_Begin_GetBindingString(This) (This)->lpVtbl->Begin_GetBindingString(This)
#define AsyncIClusCfgClusterInfo_Finish_GetBindingString(This,pbstrBindingStringOut) (This)->lpVtbl->Finish_GetBindingString(This,pbstrBindingStringOut)
#define AsyncIClusCfgClusterInfo_Begin_SetBindingString(This,pcszBindingStringIn) (This)->lpVtbl->Begin_SetBindingString(This,pcszBindingStringIn)
#define AsyncIClusCfgClusterInfo_Finish_SetBindingString(This) (This)->lpVtbl->Finish_SetBindingString(This)
#define AsyncIClusCfgClusterInfo_Begin_GetMaxNodeCount(This) (This)->lpVtbl->Begin_GetMaxNodeCount(This)
#define AsyncIClusCfgClusterInfo_Finish_GetMaxNodeCount(This,pcMaxNodesOut) (This)->lpVtbl->Finish_GetMaxNodeCount(This,pcMaxNodesOut)
#endif
#endif
  HRESULT WINAPI AsyncIClusCfgClusterInfo_Begin_SetCommitMode_Proxy(AsyncIClusCfgClusterInfo *This,ECommitMode ecmNewModeIn);
  void __RPC_STUB AsyncIClusCfgClusterInfo_Begin_SetCommitMode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgClusterInfo_Finish_SetCommitMode_Proxy(AsyncIClusCfgClusterInfo *This);
  void __RPC_STUB AsyncIClusCfgClusterInfo_Finish_SetCommitMode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgClusterInfo_Begin_GetCommitMode_Proxy(AsyncIClusCfgClusterInfo *This);
  void __RPC_STUB AsyncIClusCfgClusterInfo_Begin_GetCommitMode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgClusterInfo_Finish_GetCommitMode_Proxy(AsyncIClusCfgClusterInfo *This,ECommitMode *pecmCurrentModeOut);
  void __RPC_STUB AsyncIClusCfgClusterInfo_Finish_GetCommitMode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgClusterInfo_Begin_GetName_Proxy(AsyncIClusCfgClusterInfo *This);
  void __RPC_STUB AsyncIClusCfgClusterInfo_Begin_GetName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgClusterInfo_Finish_GetName_Proxy(AsyncIClusCfgClusterInfo *This,BSTR *pbstrNameOut);
  void __RPC_STUB AsyncIClusCfgClusterInfo_Finish_GetName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgClusterInfo_Begin_SetName_Proxy(AsyncIClusCfgClusterInfo *This,LPCWSTR pcszNameIn);
  void __RPC_STUB AsyncIClusCfgClusterInfo_Begin_SetName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgClusterInfo_Finish_SetName_Proxy(AsyncIClusCfgClusterInfo *This);
  void __RPC_STUB AsyncIClusCfgClusterInfo_Finish_SetName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgClusterInfo_Begin_GetIPAddress_Proxy(AsyncIClusCfgClusterInfo *This);
  void __RPC_STUB AsyncIClusCfgClusterInfo_Begin_GetIPAddress_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgClusterInfo_Finish_GetIPAddress_Proxy(AsyncIClusCfgClusterInfo *This,ULONG *pulDottedQuadOut);
  void __RPC_STUB AsyncIClusCfgClusterInfo_Finish_GetIPAddress_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgClusterInfo_Begin_SetIPAddress_Proxy(AsyncIClusCfgClusterInfo *This,ULONG ulDottedQuadIn);
  void __RPC_STUB AsyncIClusCfgClusterInfo_Begin_SetIPAddress_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgClusterInfo_Finish_SetIPAddress_Proxy(AsyncIClusCfgClusterInfo *This);
  void __RPC_STUB AsyncIClusCfgClusterInfo_Finish_SetIPAddress_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgClusterInfo_Begin_GetSubnetMask_Proxy(AsyncIClusCfgClusterInfo *This);
  void __RPC_STUB AsyncIClusCfgClusterInfo_Begin_GetSubnetMask_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgClusterInfo_Finish_GetSubnetMask_Proxy(AsyncIClusCfgClusterInfo *This,ULONG *pulDottedQuadOut);
  void __RPC_STUB AsyncIClusCfgClusterInfo_Finish_GetSubnetMask_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgClusterInfo_Begin_SetSubnetMask_Proxy(AsyncIClusCfgClusterInfo *This,ULONG ulDottedQuadIn);
  void __RPC_STUB AsyncIClusCfgClusterInfo_Begin_SetSubnetMask_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgClusterInfo_Finish_SetSubnetMask_Proxy(AsyncIClusCfgClusterInfo *This);
  void __RPC_STUB AsyncIClusCfgClusterInfo_Finish_SetSubnetMask_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgClusterInfo_Begin_GetNetworkInfo_Proxy(AsyncIClusCfgClusterInfo *This);
  void __RPC_STUB AsyncIClusCfgClusterInfo_Begin_GetNetworkInfo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgClusterInfo_Finish_GetNetworkInfo_Proxy(AsyncIClusCfgClusterInfo *This,IClusCfgNetworkInfo **ppiccniOut);
  void __RPC_STUB AsyncIClusCfgClusterInfo_Finish_GetNetworkInfo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgClusterInfo_Begin_SetNetworkInfo_Proxy(AsyncIClusCfgClusterInfo *This,IClusCfgNetworkInfo *piccniIn);
  void __RPC_STUB AsyncIClusCfgClusterInfo_Begin_SetNetworkInfo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgClusterInfo_Finish_SetNetworkInfo_Proxy(AsyncIClusCfgClusterInfo *This);
  void __RPC_STUB AsyncIClusCfgClusterInfo_Finish_SetNetworkInfo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgClusterInfo_Begin_GetClusterServiceAccountCredentials_Proxy(AsyncIClusCfgClusterInfo *This);
  void __RPC_STUB AsyncIClusCfgClusterInfo_Begin_GetClusterServiceAccountCredentials_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgClusterInfo_Finish_GetClusterServiceAccountCredentials_Proxy(AsyncIClusCfgClusterInfo *This,IClusCfgCredentials **ppicccCredentialsOut);
  void __RPC_STUB AsyncIClusCfgClusterInfo_Finish_GetClusterServiceAccountCredentials_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgClusterInfo_Begin_GetBindingString_Proxy(AsyncIClusCfgClusterInfo *This);
  void __RPC_STUB AsyncIClusCfgClusterInfo_Begin_GetBindingString_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgClusterInfo_Finish_GetBindingString_Proxy(AsyncIClusCfgClusterInfo *This,BSTR *pbstrBindingStringOut);
  void __RPC_STUB AsyncIClusCfgClusterInfo_Finish_GetBindingString_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgClusterInfo_Begin_SetBindingString_Proxy(AsyncIClusCfgClusterInfo *This,LPCWSTR pcszBindingStringIn);
  void __RPC_STUB AsyncIClusCfgClusterInfo_Begin_SetBindingString_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgClusterInfo_Finish_SetBindingString_Proxy(AsyncIClusCfgClusterInfo *This);
  void __RPC_STUB AsyncIClusCfgClusterInfo_Finish_SetBindingString_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgClusterInfo_Begin_GetMaxNodeCount_Proxy(AsyncIClusCfgClusterInfo *This);
  void __RPC_STUB AsyncIClusCfgClusterInfo_Begin_GetMaxNodeCount_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgClusterInfo_Finish_GetMaxNodeCount_Proxy(AsyncIClusCfgClusterInfo *This,DWORD *pcMaxNodesOut);
  void __RPC_STUB AsyncIClusCfgClusterInfo_Finish_GetMaxNodeCount_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IClusCfgInitialize_INTERFACE_DEFINED__
#define __IClusCfgInitialize_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IClusCfgInitialize;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IClusCfgInitialize : public IUnknown {
  public:
    virtual HRESULT WINAPI Initialize(IUnknown *punkCallbackIn,LCID lcidIn) = 0;
  };
#else
  typedef struct IClusCfgInitializeVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IClusCfgInitialize *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IClusCfgInitialize *This);
      ULONG (WINAPI *Release)(IClusCfgInitialize *This);
      HRESULT (WINAPI *Initialize)(IClusCfgInitialize *This,IUnknown *punkCallbackIn,LCID lcidIn);
    END_INTERFACE
  } IClusCfgInitializeVtbl;
  struct IClusCfgInitialize {
    CONST_VTBL struct IClusCfgInitializeVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IClusCfgInitialize_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IClusCfgInitialize_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IClusCfgInitialize_Release(This) (This)->lpVtbl->Release(This)
#define IClusCfgInitialize_Initialize(This,punkCallbackIn,lcidIn) (This)->lpVtbl->Initialize(This,punkCallbackIn,lcidIn)
#endif
#endif
  HRESULT WINAPI IClusCfgInitialize_Initialize_Proxy(IClusCfgInitialize *This,IUnknown *punkCallbackIn,LCID lcidIn);
  void __RPC_STUB IClusCfgInitialize_Initialize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __AsyncIClusCfgInitialize_INTERFACE_DEFINED__
#define __AsyncIClusCfgInitialize_INTERFACE_DEFINED__
  EXTERN_C const IID IID_AsyncIClusCfgInitialize;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct AsyncIClusCfgInitialize : public IUnknown {
  public:
    virtual HRESULT WINAPI Begin_Initialize(IUnknown *punkCallbackIn,LCID lcidIn) = 0;
    virtual HRESULT WINAPI Finish_Initialize(void) = 0;
  };
#else
  typedef struct AsyncIClusCfgInitializeVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(AsyncIClusCfgInitialize *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(AsyncIClusCfgInitialize *This);
      ULONG (WINAPI *Release)(AsyncIClusCfgInitialize *This);
      HRESULT (WINAPI *Begin_Initialize)(AsyncIClusCfgInitialize *This,IUnknown *punkCallbackIn,LCID lcidIn);
      HRESULT (WINAPI *Finish_Initialize)(AsyncIClusCfgInitialize *This);
    END_INTERFACE
  } AsyncIClusCfgInitializeVtbl;
  struct AsyncIClusCfgInitialize {
    CONST_VTBL struct AsyncIClusCfgInitializeVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define AsyncIClusCfgInitialize_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define AsyncIClusCfgInitialize_AddRef(This) (This)->lpVtbl->AddRef(This)
#define AsyncIClusCfgInitialize_Release(This) (This)->lpVtbl->Release(This)
#define AsyncIClusCfgInitialize_Begin_Initialize(This,punkCallbackIn,lcidIn) (This)->lpVtbl->Begin_Initialize(This,punkCallbackIn,lcidIn)
#define AsyncIClusCfgInitialize_Finish_Initialize(This) (This)->lpVtbl->Finish_Initialize(This)
#endif
#endif
  HRESULT WINAPI AsyncIClusCfgInitialize_Begin_Initialize_Proxy(AsyncIClusCfgInitialize *This,IUnknown *punkCallbackIn,LCID lcidIn);
  void __RPC_STUB AsyncIClusCfgInitialize_Begin_Initialize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgInitialize_Finish_Initialize_Proxy(AsyncIClusCfgInitialize *This);
  void __RPC_STUB AsyncIClusCfgInitialize_Finish_Initialize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IClusCfgCallback_INTERFACE_DEFINED__
#define __IClusCfgCallback_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IClusCfgCallback;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IClusCfgCallback : public IUnknown {
  public:
    virtual HRESULT WINAPI SendStatusReport(LPCWSTR pcszNodeNameIn,CLSID clsidTaskMajorIn,CLSID clsidTaskMinorIn,ULONG ulMinIn,ULONG ulMaxIn,ULONG ulCurrentIn,HRESULT hrStatusIn,LPCWSTR pcszDescriptionIn,FILETIME *pftTimeIn,LPCWSTR pcszReferenceIn) = 0;
  };
#else
  typedef struct IClusCfgCallbackVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IClusCfgCallback *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IClusCfgCallback *This);
      ULONG (WINAPI *Release)(IClusCfgCallback *This);
      HRESULT (WINAPI *SendStatusReport)(IClusCfgCallback *This,LPCWSTR pcszNodeNameIn,CLSID clsidTaskMajorIn,CLSID clsidTaskMinorIn,ULONG ulMinIn,ULONG ulMaxIn,ULONG ulCurrentIn,HRESULT hrStatusIn,LPCWSTR pcszDescriptionIn,FILETIME *pftTimeIn,LPCWSTR pcszReferenceIn);
    END_INTERFACE
  } IClusCfgCallbackVtbl;
  struct IClusCfgCallback {
    CONST_VTBL struct IClusCfgCallbackVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IClusCfgCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IClusCfgCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IClusCfgCallback_Release(This) (This)->lpVtbl->Release(This)
#define IClusCfgCallback_SendStatusReport(This,pcszNodeNameIn,clsidTaskMajorIn,clsidTaskMinorIn,ulMinIn,ulMaxIn,ulCurrentIn,hrStatusIn,pcszDescriptionIn,pftTimeIn,pcszReferenceIn) (This)->lpVtbl->SendStatusReport(This,pcszNodeNameIn,clsidTaskMajorIn,clsidTaskMinorIn,ulMinIn,ulMaxIn,ulCurrentIn,hrStatusIn,pcszDescriptionIn,pftTimeIn,pcszReferenceIn)
#endif
#endif
  HRESULT WINAPI IClusCfgCallback_SendStatusReport_Proxy(IClusCfgCallback *This,LPCWSTR pcszNodeNameIn,CLSID clsidTaskMajorIn,CLSID clsidTaskMinorIn,ULONG ulMinIn,ULONG ulMaxIn,ULONG ulCurrentIn,HRESULT hrStatusIn,LPCWSTR pcszDescriptionIn,FILETIME *pftTimeIn,LPCWSTR pcszReferenceIn);
  void __RPC_STUB IClusCfgCallback_SendStatusReport_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __AsyncIClusCfgCallback_INTERFACE_DEFINED__
#define __AsyncIClusCfgCallback_INTERFACE_DEFINED__
  EXTERN_C const IID IID_AsyncIClusCfgCallback;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct AsyncIClusCfgCallback : public IUnknown {
  public:
    virtual HRESULT WINAPI Begin_SendStatusReport(LPCWSTR pcszNodeNameIn,CLSID clsidTaskMajorIn,CLSID clsidTaskMinorIn,ULONG ulMinIn,ULONG ulMaxIn,ULONG ulCurrentIn,HRESULT hrStatusIn,LPCWSTR pcszDescriptionIn,FILETIME *pftTimeIn,LPCWSTR pcszReferenceIn) = 0;
    virtual HRESULT WINAPI Finish_SendStatusReport(void) = 0;
  };
#else
  typedef struct AsyncIClusCfgCallbackVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(AsyncIClusCfgCallback *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(AsyncIClusCfgCallback *This);
      ULONG (WINAPI *Release)(AsyncIClusCfgCallback *This);
      HRESULT (WINAPI *Begin_SendStatusReport)(AsyncIClusCfgCallback *This,LPCWSTR pcszNodeNameIn,CLSID clsidTaskMajorIn,CLSID clsidTaskMinorIn,ULONG ulMinIn,ULONG ulMaxIn,ULONG ulCurrentIn,HRESULT hrStatusIn,LPCWSTR pcszDescriptionIn,FILETIME *pftTimeIn,LPCWSTR pcszReferenceIn);
      HRESULT (WINAPI *Finish_SendStatusReport)(AsyncIClusCfgCallback *This);
    END_INTERFACE
  } AsyncIClusCfgCallbackVtbl;
  struct AsyncIClusCfgCallback {
    CONST_VTBL struct AsyncIClusCfgCallbackVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define AsyncIClusCfgCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define AsyncIClusCfgCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
#define AsyncIClusCfgCallback_Release(This) (This)->lpVtbl->Release(This)
#define AsyncIClusCfgCallback_Begin_SendStatusReport(This,pcszNodeNameIn,clsidTaskMajorIn,clsidTaskMinorIn,ulMinIn,ulMaxIn,ulCurrentIn,hrStatusIn,pcszDescriptionIn,pftTimeIn,pcszReferenceIn) (This)->lpVtbl->Begin_SendStatusReport(This,pcszNodeNameIn,clsidTaskMajorIn,clsidTaskMinorIn,ulMinIn,ulMaxIn,ulCurrentIn,hrStatusIn,pcszDescriptionIn,pftTimeIn,pcszReferenceIn)
#define AsyncIClusCfgCallback_Finish_SendStatusReport(This) (This)->lpVtbl->Finish_SendStatusReport(This)
#endif
#endif
  HRESULT WINAPI AsyncIClusCfgCallback_Begin_SendStatusReport_Proxy(AsyncIClusCfgCallback *This,LPCWSTR pcszNodeNameIn,CLSID clsidTaskMajorIn,CLSID clsidTaskMinorIn,ULONG ulMinIn,ULONG ulMaxIn,ULONG ulCurrentIn,HRESULT hrStatusIn,LPCWSTR pcszDescriptionIn,FILETIME *pftTimeIn,LPCWSTR pcszReferenceIn);
  void __RPC_STUB AsyncIClusCfgCallback_Begin_SendStatusReport_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgCallback_Finish_SendStatusReport_Proxy(AsyncIClusCfgCallback *This);
  void __RPC_STUB AsyncIClusCfgCallback_Finish_SendStatusReport_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IClusCfgCredentials_INTERFACE_DEFINED__
#define __IClusCfgCredentials_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IClusCfgCredentials;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IClusCfgCredentials : public IUnknown {
  public:
    virtual HRESULT WINAPI SetCredentials(LPCWSTR pcszUserIn,LPCWSTR pcszDomainIn,LPCWSTR pcszPasswordIn) = 0;
    virtual HRESULT WINAPI GetCredentials(BSTR *pbstrUserOut,BSTR *pbstrDomainOut,BSTR *pbstrPasswordOut) = 0;
    virtual HRESULT WINAPI GetIdentity(BSTR *pbstrUserOut,BSTR *pbstrDomainOut) = 0;
    virtual HRESULT WINAPI GetPassword(BSTR *pbstrPasswordOut) = 0;
    virtual HRESULT WINAPI AssignTo(IClusCfgCredentials *picccDestIn) = 0;
    virtual HRESULT WINAPI AssignFrom(IClusCfgCredentials *picccSourceIn) = 0;
  };
#else
  typedef struct IClusCfgCredentialsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IClusCfgCredentials *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IClusCfgCredentials *This);
      ULONG (WINAPI *Release)(IClusCfgCredentials *This);
      HRESULT (WINAPI *SetCredentials)(IClusCfgCredentials *This,LPCWSTR pcszUserIn,LPCWSTR pcszDomainIn,LPCWSTR pcszPasswordIn);
      HRESULT (WINAPI *GetCredentials)(IClusCfgCredentials *This,BSTR *pbstrUserOut,BSTR *pbstrDomainOut,BSTR *pbstrPasswordOut);

      HRESULT (WINAPI *GetIdentity)(IClusCfgCredentials *This,BSTR *pbstrUserOut,BSTR *pbstrDomainOut);
      HRESULT (WINAPI *GetPassword)(IClusCfgCredentials *This,BSTR *pbstrPasswordOut);
      HRESULT (WINAPI *AssignTo)(IClusCfgCredentials *This,IClusCfgCredentials *picccDestIn);
      HRESULT (WINAPI *AssignFrom)(IClusCfgCredentials *This,IClusCfgCredentials *picccSourceIn);
    END_INTERFACE
  } IClusCfgCredentialsVtbl;
  struct IClusCfgCredentials {
    CONST_VTBL struct IClusCfgCredentialsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IClusCfgCredentials_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IClusCfgCredentials_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IClusCfgCredentials_Release(This) (This)->lpVtbl->Release(This)
#define IClusCfgCredentials_SetCredentials(This,pcszUserIn,pcszDomainIn,pcszPasswordIn) (This)->lpVtbl->SetCredentials(This,pcszUserIn,pcszDomainIn,pcszPasswordIn)
#define IClusCfgCredentials_GetCredentials(This,pbstrUserOut,pbstrDomainOut,pbstrPasswordOut) (This)->lpVtbl->GetCredentials(This,pbstrUserOut,pbstrDomainOut,pbstrPasswordOut)
#define IClusCfgCredentials_GetIdentity(This,pbstrUserOut,pbstrDomainOut) (This)->lpVtbl->GetIdentity(This,pbstrUserOut,pbstrDomainOut)
#define IClusCfgCredentials_GetPassword(This,pbstrPasswordOut) (This)->lpVtbl->GetPassword(This,pbstrPasswordOut)
#define IClusCfgCredentials_AssignTo(This,picccDestIn) (This)->lpVtbl->AssignTo(This,picccDestIn)
#define IClusCfgCredentials_AssignFrom(This,picccSourceIn) (This)->lpVtbl->AssignFrom(This,picccSourceIn)
#endif
#endif
  HRESULT WINAPI IClusCfgCredentials_SetCredentials_Proxy(IClusCfgCredentials *This,LPCWSTR pcszUserIn,LPCWSTR pcszDomainIn,LPCWSTR pcszPasswordIn);
  void __RPC_STUB IClusCfgCredentials_SetCredentials_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgCredentials_GetCredentials_Proxy(IClusCfgCredentials *This,BSTR *pbstrUserOut,BSTR *pbstrDomainOut,BSTR *pbstrPasswordOut);
  void __RPC_STUB IClusCfgCredentials_GetCredentials_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgCredentials_GetIdentity_Proxy(IClusCfgCredentials *This,BSTR *pbstrUserOut,BSTR *pbstrDomainOut);
  void __RPC_STUB IClusCfgCredentials_GetIdentity_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgCredentials_GetPassword_Proxy(IClusCfgCredentials *This,BSTR *pbstrPasswordOut);
  void __RPC_STUB IClusCfgCredentials_GetPassword_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgCredentials_AssignTo_Proxy(IClusCfgCredentials *This,IClusCfgCredentials *picccDestIn);
  void __RPC_STUB IClusCfgCredentials_AssignTo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgCredentials_AssignFrom_Proxy(IClusCfgCredentials *This,IClusCfgCredentials *picccSourceIn);
  void __RPC_STUB IClusCfgCredentials_AssignFrom_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __AsyncIClusCfgCredentials_INTERFACE_DEFINED__
#define __AsyncIClusCfgCredentials_INTERFACE_DEFINED__
  EXTERN_C const IID IID_AsyncIClusCfgCredentials;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct AsyncIClusCfgCredentials : public IUnknown {
  public:
    virtual HRESULT WINAPI Begin_SetCredentials(LPCWSTR pcszUserIn,LPCWSTR pcszDomainIn,LPCWSTR pcszPasswordIn) = 0;
    virtual HRESULT WINAPI Finish_SetCredentials(void) = 0;
    virtual HRESULT WINAPI Begin_GetCredentials(void) = 0;
    virtual HRESULT WINAPI Finish_GetCredentials(BSTR *pbstrUserOut,BSTR *pbstrDomainOut,BSTR *pbstrPasswordOut) = 0;
    virtual HRESULT WINAPI Begin_GetIdentity(void) = 0;
    virtual HRESULT WINAPI Finish_GetIdentity(BSTR *pbstrUserOut,BSTR *pbstrDomainOut) = 0;
    virtual HRESULT WINAPI Begin_GetPassword(void) = 0;
    virtual HRESULT WINAPI Finish_GetPassword(BSTR *pbstrPasswordOut) = 0;
    virtual HRESULT WINAPI Begin_AssignTo(IClusCfgCredentials *picccDestIn) = 0;
    virtual HRESULT WINAPI Finish_AssignTo(void) = 0;
    virtual HRESULT WINAPI Begin_AssignFrom(IClusCfgCredentials *picccSourceIn) = 0;
    virtual HRESULT WINAPI Finish_AssignFrom(void) = 0;
  };
#else
  typedef struct AsyncIClusCfgCredentialsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(AsyncIClusCfgCredentials *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(AsyncIClusCfgCredentials *This);
      ULONG (WINAPI *Release)(AsyncIClusCfgCredentials *This);
      HRESULT (WINAPI *Begin_SetCredentials)(AsyncIClusCfgCredentials *This,LPCWSTR pcszUserIn,LPCWSTR pcszDomainIn,LPCWSTR pcszPasswordIn);
      HRESULT (WINAPI *Finish_SetCredentials)(AsyncIClusCfgCredentials *This);
      HRESULT (WINAPI *Begin_GetCredentials)(AsyncIClusCfgCredentials *This);
      HRESULT (WINAPI *Finish_GetCredentials)(AsyncIClusCfgCredentials *This,BSTR *pbstrUserOut,BSTR *pbstrDomainOut,BSTR *pbstrPasswordOut);
      HRESULT (WINAPI *Begin_GetIdentity)(AsyncIClusCfgCredentials *This);
      HRESULT (WINAPI *Finish_GetIdentity)(AsyncIClusCfgCredentials *This,BSTR *pbstrUserOut,BSTR *pbstrDomainOut);
      HRESULT (WINAPI *Begin_GetPassword)(AsyncIClusCfgCredentials *This);
      HRESULT (WINAPI *Finish_GetPassword)(AsyncIClusCfgCredentials *This,BSTR *pbstrPasswordOut);
      HRESULT (WINAPI *Begin_AssignTo)(AsyncIClusCfgCredentials *This,IClusCfgCredentials *picccDestIn);
      HRESULT (WINAPI *Finish_AssignTo)(AsyncIClusCfgCredentials *This);
      HRESULT (WINAPI *Begin_AssignFrom)(AsyncIClusCfgCredentials *This,IClusCfgCredentials *picccSourceIn);
      HRESULT (WINAPI *Finish_AssignFrom)(AsyncIClusCfgCredentials *This);
    END_INTERFACE
  } AsyncIClusCfgCredentialsVtbl;
  struct AsyncIClusCfgCredentials {
    CONST_VTBL struct AsyncIClusCfgCredentialsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define AsyncIClusCfgCredentials_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define AsyncIClusCfgCredentials_AddRef(This) (This)->lpVtbl->AddRef(This)
#define AsyncIClusCfgCredentials_Release(This) (This)->lpVtbl->Release(This)
#define AsyncIClusCfgCredentials_Begin_SetCredentials(This,pcszUserIn,pcszDomainIn,pcszPasswordIn) (This)->lpVtbl->Begin_SetCredentials(This,pcszUserIn,pcszDomainIn,pcszPasswordIn)
#define AsyncIClusCfgCredentials_Finish_SetCredentials(This) (This)->lpVtbl->Finish_SetCredentials(This)
#define AsyncIClusCfgCredentials_Begin_GetCredentials(This) (This)->lpVtbl->Begin_GetCredentials(This)
#define AsyncIClusCfgCredentials_Finish_GetCredentials(This,pbstrUserOut,pbstrDomainOut,pbstrPasswordOut) (This)->lpVtbl->Finish_GetCredentials(This,pbstrUserOut,pbstrDomainOut,pbstrPasswordOut)
#define AsyncIClusCfgCredentials_Begin_GetIdentity(This) (This)->lpVtbl->Begin_GetIdentity(This)
#define AsyncIClusCfgCredentials_Finish_GetIdentity(This,pbstrUserOut,pbstrDomainOut) (This)->lpVtbl->Finish_GetIdentity(This,pbstrUserOut,pbstrDomainOut)
#define AsyncIClusCfgCredentials_Begin_GetPassword(This) (This)->lpVtbl->Begin_GetPassword(This)
#define AsyncIClusCfgCredentials_Finish_GetPassword(This,pbstrPasswordOut) (This)->lpVtbl->Finish_GetPassword(This,pbstrPasswordOut)
#define AsyncIClusCfgCredentials_Begin_AssignTo(This,picccDestIn) (This)->lpVtbl->Begin_AssignTo(This,picccDestIn)
#define AsyncIClusCfgCredentials_Finish_AssignTo(This) (This)->lpVtbl->Finish_AssignTo(This)
#define AsyncIClusCfgCredentials_Begin_AssignFrom(This,picccSourceIn) (This)->lpVtbl->Begin_AssignFrom(This,picccSourceIn)
#define AsyncIClusCfgCredentials_Finish_AssignFrom(This) (This)->lpVtbl->Finish_AssignFrom(This)
#endif
#endif
  HRESULT WINAPI AsyncIClusCfgCredentials_Begin_SetCredentials_Proxy(AsyncIClusCfgCredentials *This,LPCWSTR pcszUserIn,LPCWSTR pcszDomainIn,LPCWSTR pcszPasswordIn);
  void __RPC_STUB AsyncIClusCfgCredentials_Begin_SetCredentials_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgCredentials_Finish_SetCredentials_Proxy(AsyncIClusCfgCredentials *This);
  void __RPC_STUB AsyncIClusCfgCredentials_Finish_SetCredentials_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgCredentials_Begin_GetCredentials_Proxy(AsyncIClusCfgCredentials *This);
  void __RPC_STUB AsyncIClusCfgCredentials_Begin_GetCredentials_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgCredentials_Finish_GetCredentials_Proxy(AsyncIClusCfgCredentials *This,BSTR *pbstrUserOut,BSTR *pbstrDomainOut,BSTR *pbstrPasswordOut);
  void __RPC_STUB AsyncIClusCfgCredentials_Finish_GetCredentials_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgCredentials_Begin_GetIdentity_Proxy(AsyncIClusCfgCredentials *This);
  void __RPC_STUB AsyncIClusCfgCredentials_Begin_GetIdentity_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgCredentials_Finish_GetIdentity_Proxy(AsyncIClusCfgCredentials *This,BSTR *pbstrUserOut,BSTR *pbstrDomainOut);
  void __RPC_STUB AsyncIClusCfgCredentials_Finish_GetIdentity_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgCredentials_Begin_GetPassword_Proxy(AsyncIClusCfgCredentials *This);
  void __RPC_STUB AsyncIClusCfgCredentials_Begin_GetPassword_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgCredentials_Finish_GetPassword_Proxy(AsyncIClusCfgCredentials *This,BSTR *pbstrPasswordOut);
  void __RPC_STUB AsyncIClusCfgCredentials_Finish_GetPassword_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgCredentials_Begin_AssignTo_Proxy(AsyncIClusCfgCredentials *This,IClusCfgCredentials *picccDestIn);
  void __RPC_STUB AsyncIClusCfgCredentials_Begin_AssignTo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgCredentials_Finish_AssignTo_Proxy(AsyncIClusCfgCredentials *This);
  void __RPC_STUB AsyncIClusCfgCredentials_Finish_AssignTo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgCredentials_Begin_AssignFrom_Proxy(AsyncIClusCfgCredentials *This,IClusCfgCredentials *picccSourceIn);
  void __RPC_STUB AsyncIClusCfgCredentials_Begin_AssignFrom_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgCredentials_Finish_AssignFrom_Proxy(AsyncIClusCfgCredentials *This);
  void __RPC_STUB AsyncIClusCfgCredentials_Finish_AssignFrom_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IClusCfgCapabilities_INTERFACE_DEFINED__
#define __IClusCfgCapabilities_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IClusCfgCapabilities;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IClusCfgCapabilities : public IUnknown {
  public:
    virtual HRESULT WINAPI CanNodeBeClustered(void) = 0;
  };
#else
  typedef struct IClusCfgCapabilitiesVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IClusCfgCapabilities *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IClusCfgCapabilities *This);
      ULONG (WINAPI *Release)(IClusCfgCapabilities *This);
      HRESULT (WINAPI *CanNodeBeClustered)(IClusCfgCapabilities *This);
    END_INTERFACE
  } IClusCfgCapabilitiesVtbl;
  struct IClusCfgCapabilities {
    CONST_VTBL struct IClusCfgCapabilitiesVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IClusCfgCapabilities_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IClusCfgCapabilities_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IClusCfgCapabilities_Release(This) (This)->lpVtbl->Release(This)
#define IClusCfgCapabilities_CanNodeBeClustered(This) (This)->lpVtbl->CanNodeBeClustered(This)
#endif
#endif
  HRESULT WINAPI IClusCfgCapabilities_CanNodeBeClustered_Proxy(IClusCfgCapabilities *This);
  void __RPC_STUB IClusCfgCapabilities_CanNodeBeClustered_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IClusCfgManagedResourceCfg_INTERFACE_DEFINED__
#define __IClusCfgManagedResourceCfg_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IClusCfgManagedResourceCfg;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IClusCfgManagedResourceCfg : public IUnknown {
  public:
    virtual HRESULT WINAPI PreCreate(IUnknown *punkServicesIn) = 0;
    virtual HRESULT WINAPI Create(IUnknown *punkServicesIn) = 0;
    virtual HRESULT WINAPI PostCreate(IUnknown *punkServicesIn) = 0;
    virtual HRESULT WINAPI Evict(IUnknown *punkServicesIn) = 0;
  };
#else
  typedef struct IClusCfgManagedResourceCfgVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IClusCfgManagedResourceCfg *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IClusCfgManagedResourceCfg *This);
      ULONG (WINAPI *Release)(IClusCfgManagedResourceCfg *This);
      HRESULT (WINAPI *PreCreate)(IClusCfgManagedResourceCfg *This,IUnknown *punkServicesIn);
      HRESULT (WINAPI *Create)(IClusCfgManagedResourceCfg *This,IUnknown *punkServicesIn);
      HRESULT (WINAPI *PostCreate)(IClusCfgManagedResourceCfg *This,IUnknown *punkServicesIn);
      HRESULT (WINAPI *Evict)(IClusCfgManagedResourceCfg *This,IUnknown *punkServicesIn);
    END_INTERFACE
  } IClusCfgManagedResourceCfgVtbl;
  struct IClusCfgManagedResourceCfg {
    CONST_VTBL struct IClusCfgManagedResourceCfgVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IClusCfgManagedResourceCfg_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IClusCfgManagedResourceCfg_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IClusCfgManagedResourceCfg_Release(This) (This)->lpVtbl->Release(This)
#define IClusCfgManagedResourceCfg_PreCreate(This,punkServicesIn) (This)->lpVtbl->PreCreate(This,punkServicesIn)
#define IClusCfgManagedResourceCfg_Create(This,punkServicesIn) (This)->lpVtbl->Create(This,punkServicesIn)
#define IClusCfgManagedResourceCfg_PostCreate(This,punkServicesIn) (This)->lpVtbl->PostCreate(This,punkServicesIn)
#define IClusCfgManagedResourceCfg_Evict(This,punkServicesIn) (This)->lpVtbl->Evict(This,punkServicesIn)
#endif
#endif
  HRESULT WINAPI IClusCfgManagedResourceCfg_PreCreate_Proxy(IClusCfgManagedResourceCfg *This,IUnknown *punkServicesIn);
  void __RPC_STUB IClusCfgManagedResourceCfg_PreCreate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgManagedResourceCfg_Create_Proxy(IClusCfgManagedResourceCfg *This,IUnknown *punkServicesIn);
  void __RPC_STUB IClusCfgManagedResourceCfg_Create_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgManagedResourceCfg_PostCreate_Proxy(IClusCfgManagedResourceCfg *This,IUnknown *punkServicesIn);
  void __RPC_STUB IClusCfgManagedResourceCfg_PostCreate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgManagedResourceCfg_Evict_Proxy(IClusCfgManagedResourceCfg *This,IUnknown *punkServicesIn);
  void __RPC_STUB IClusCfgManagedResourceCfg_Evict_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IClusCfgResourcePreCreate_INTERFACE_DEFINED__
#define __IClusCfgResourcePreCreate_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IClusCfgResourcePreCreate;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IClusCfgResourcePreCreate : public IUnknown {
  public:
    virtual HRESULT WINAPI SetDependency(LPCLSID pclsidDepResTypeIn,DWORD dfIn) = 0;
    virtual HRESULT WINAPI SetType(CLSID *pclsidIn) = 0;
    virtual HRESULT WINAPI SetClassType(CLSID *pclsidIn) = 0;
  };
#else
  typedef struct IClusCfgResourcePreCreateVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IClusCfgResourcePreCreate *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IClusCfgResourcePreCreate *This);
      ULONG (WINAPI *Release)(IClusCfgResourcePreCreate *This);
      HRESULT (WINAPI *SetDependency)(IClusCfgResourcePreCreate *This,LPCLSID pclsidDepResTypeIn,DWORD dfIn);
      HRESULT (WINAPI *SetType)(IClusCfgResourcePreCreate *This,CLSID *pclsidIn);
      HRESULT (WINAPI *SetClassType)(IClusCfgResourcePreCreate *This,CLSID *pclsidIn);
    END_INTERFACE
  } IClusCfgResourcePreCreateVtbl;
  struct IClusCfgResourcePreCreate {
    CONST_VTBL struct IClusCfgResourcePreCreateVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IClusCfgResourcePreCreate_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IClusCfgResourcePreCreate_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IClusCfgResourcePreCreate_Release(This) (This)->lpVtbl->Release(This)
#define IClusCfgResourcePreCreate_SetDependency(This,pclsidDepResTypeIn,dfIn) (This)->lpVtbl->SetDependency(This,pclsidDepResTypeIn,dfIn)
#define IClusCfgResourcePreCreate_SetType(This,pclsidIn) (This)->lpVtbl->SetType(This,pclsidIn)
#define IClusCfgResourcePreCreate_SetClassType(This,pclsidIn) (This)->lpVtbl->SetClassType(This,pclsidIn)
#endif
#endif
  HRESULT WINAPI IClusCfgResourcePreCreate_SetDependency_Proxy(IClusCfgResourcePreCreate *This,LPCLSID pclsidDepResTypeIn,DWORD dfIn);
  void __RPC_STUB IClusCfgResourcePreCreate_SetDependency_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgResourcePreCreate_SetType_Proxy(IClusCfgResourcePreCreate *This,CLSID *pclsidIn);
  void __RPC_STUB IClusCfgResourcePreCreate_SetType_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgResourcePreCreate_SetClassType_Proxy(IClusCfgResourcePreCreate *This,CLSID *pclsidIn);
  void __RPC_STUB IClusCfgResourcePreCreate_SetClassType_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IClusCfgResourceCreate_INTERFACE_DEFINED__
#define __IClusCfgResourceCreate_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IClusCfgResourceCreate;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IClusCfgResourceCreate : public IUnknown {
  public:
    virtual HRESULT WINAPI SetPropertyBinary(LPCWSTR pcszNameIn,const DWORD cbSizeIn,const BYTE *pbyteIn) = 0;
    virtual HRESULT WINAPI SetPropertyDWORD(LPCWSTR pcszNameIn,const DWORD dwDWORDIn) = 0;
    virtual HRESULT WINAPI SetPropertyString(LPCWSTR pcszNameIn,LPCWSTR pcszStringIn) = 0;
    virtual HRESULT WINAPI SetPropertyExpandString(LPCWSTR pcszNameIn,LPCWSTR pcszStringIn) = 0;
    virtual HRESULT WINAPI SetPropertyMultiString(LPCWSTR pcszNameIn,const DWORD cbMultiStringIn,LPCWSTR pcszMultiStringIn) = 0;
    virtual HRESULT WINAPI SetPropertyUnsignedLargeInt(LPCWSTR pcszNameIn,const ULARGE_INTEGER ulIntIn) = 0;
    virtual HRESULT WINAPI SetPropertyLong(LPCWSTR pcszNameIn,const LONG lLongIn) = 0;
    virtual HRESULT WINAPI SetPropertySecurityDescriptor(LPCWSTR pcszNameIn,const SECURITY_DESCRIPTOR *pcsdIn) = 0;
    virtual HRESULT WINAPI SetPropertyLargeInt(LPCWSTR pcszNameIn,const LARGE_INTEGER lIntIn) = 0;
    virtual HRESULT WINAPI SendResourceControl(DWORD dwControlCodeIn,LPVOID lpBufferIn,DWORD cbBufferSizeIn) = 0;
  };
#else
  typedef struct IClusCfgResourceCreateVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IClusCfgResourceCreate *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IClusCfgResourceCreate *This);
      ULONG (WINAPI *Release)(IClusCfgResourceCreate *This);
      HRESULT (WINAPI *SetPropertyBinary)(IClusCfgResourceCreate *This,LPCWSTR pcszNameIn,const DWORD cbSizeIn,const BYTE *pbyteIn);
      HRESULT (WINAPI *SetPropertyDWORD)(IClusCfgResourceCreate *This,LPCWSTR pcszNameIn,const DWORD dwDWORDIn);
      HRESULT (WINAPI *SetPropertyString)(IClusCfgResourceCreate *This,LPCWSTR pcszNameIn,LPCWSTR pcszStringIn);
      HRESULT (WINAPI *SetPropertyExpandString)(IClusCfgResourceCreate *This,LPCWSTR pcszNameIn,LPCWSTR pcszStringIn);
      HRESULT (WINAPI *SetPropertyMultiString)(IClusCfgResourceCreate *This,LPCWSTR pcszNameIn,const DWORD cbMultiStringIn,LPCWSTR pcszMultiStringIn);
      HRESULT (WINAPI *SetPropertyUnsignedLargeInt)(IClusCfgResourceCreate *This,LPCWSTR pcszNameIn,const ULARGE_INTEGER ulIntIn);
      HRESULT (WINAPI *SetPropertyLong)(IClusCfgResourceCreate *This,LPCWSTR pcszNameIn,const LONG lLongIn);
      HRESULT (WINAPI *SetPropertySecurityDescriptor)(IClusCfgResourceCreate *This,LPCWSTR pcszNameIn,const SECURITY_DESCRIPTOR *pcsdIn);
      HRESULT (WINAPI *SetPropertyLargeInt)(IClusCfgResourceCreate *This,LPCWSTR pcszNameIn,const LARGE_INTEGER lIntIn);
      HRESULT (WINAPI *SendResourceControl)(IClusCfgResourceCreate *This,DWORD dwControlCodeIn,LPVOID lpBufferIn,DWORD cbBufferSizeIn);
    END_INTERFACE
  } IClusCfgResourceCreateVtbl;
  struct IClusCfgResourceCreate {
    CONST_VTBL struct IClusCfgResourceCreateVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IClusCfgResourceCreate_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IClusCfgResourceCreate_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IClusCfgResourceCreate_Release(This) (This)->lpVtbl->Release(This)
#define IClusCfgResourceCreate_SetPropertyBinary(This,pcszNameIn,cbSizeIn,pbyteIn) (This)->lpVtbl->SetPropertyBinary(This,pcszNameIn,cbSizeIn,pbyteIn)
#define IClusCfgResourceCreate_SetPropertyDWORD(This,pcszNameIn,dwDWORDIn) (This)->lpVtbl->SetPropertyDWORD(This,pcszNameIn,dwDWORDIn)
#define IClusCfgResourceCreate_SetPropertyString(This,pcszNameIn,pcszStringIn) (This)->lpVtbl->SetPropertyString(This,pcszNameIn,pcszStringIn)
#define IClusCfgResourceCreate_SetPropertyExpandString(This,pcszNameIn,pcszStringIn) (This)->lpVtbl->SetPropertyExpandString(This,pcszNameIn,pcszStringIn)
#define IClusCfgResourceCreate_SetPropertyMultiString(This,pcszNameIn,cbMultiStringIn,pcszMultiStringIn) (This)->lpVtbl->SetPropertyMultiString(This,pcszNameIn,cbMultiStringIn,pcszMultiStringIn)
#define IClusCfgResourceCreate_SetPropertyUnsignedLargeInt(This,pcszNameIn,ulIntIn) (This)->lpVtbl->SetPropertyUnsignedLargeInt(This,pcszNameIn,ulIntIn)
#define IClusCfgResourceCreate_SetPropertyLong(This,pcszNameIn,lLongIn) (This)->lpVtbl->SetPropertyLong(This,pcszNameIn,lLongIn)
#define IClusCfgResourceCreate_SetPropertySecurityDescriptor(This,pcszNameIn,pcsdIn) (This)->lpVtbl->SetPropertySecurityDescriptor(This,pcszNameIn,pcsdIn)
#define IClusCfgResourceCreate_SetPropertyLargeInt(This,pcszNameIn,lIntIn) (This)->lpVtbl->SetPropertyLargeInt(This,pcszNameIn,lIntIn)
#define IClusCfgResourceCreate_SendResourceControl(This,dwControlCodeIn,lpBufferIn,cbBufferSizeIn) (This)->lpVtbl->SendResourceControl(This,dwControlCodeIn,lpBufferIn,cbBufferSizeIn)
#endif
#endif
  HRESULT WINAPI IClusCfgResourceCreate_SetPropertyBinary_Proxy(IClusCfgResourceCreate *This,LPCWSTR pcszNameIn,const DWORD cbSizeIn,const BYTE *pbyteIn);
  void __RPC_STUB IClusCfgResourceCreate_SetPropertyBinary_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgResourceCreate_SetPropertyDWORD_Proxy(IClusCfgResourceCreate *This,LPCWSTR pcszNameIn,const DWORD dwDWORDIn);
  void __RPC_STUB IClusCfgResourceCreate_SetPropertyDWORD_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgResourceCreate_SetPropertyString_Proxy(IClusCfgResourceCreate *This,LPCWSTR pcszNameIn,LPCWSTR pcszStringIn);
  void __RPC_STUB IClusCfgResourceCreate_SetPropertyString_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgResourceCreate_SetPropertyExpandString_Proxy(IClusCfgResourceCreate *This,LPCWSTR pcszNameIn,LPCWSTR pcszStringIn);
  void __RPC_STUB IClusCfgResourceCreate_SetPropertyExpandString_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgResourceCreate_SetPropertyMultiString_Proxy(IClusCfgResourceCreate *This,LPCWSTR pcszNameIn,const DWORD cbMultiStringIn,LPCWSTR pcszMultiStringIn);
  void __RPC_STUB IClusCfgResourceCreate_SetPropertyMultiString_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgResourceCreate_SetPropertyUnsignedLargeInt_Proxy(IClusCfgResourceCreate *This,LPCWSTR pcszNameIn,const ULARGE_INTEGER ulIntIn);
  void __RPC_STUB IClusCfgResourceCreate_SetPropertyUnsignedLargeInt_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgResourceCreate_SetPropertyLong_Proxy(IClusCfgResourceCreate *This,LPCWSTR pcszNameIn,const LONG lLongIn);
  void __RPC_STUB IClusCfgResourceCreate_SetPropertyLong_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgResourceCreate_SetPropertySecurityDescriptor_Proxy(IClusCfgResourceCreate *This,LPCWSTR pcszNameIn,const SECURITY_DESCRIPTOR *pcsdIn);
  void __RPC_STUB IClusCfgResourceCreate_SetPropertySecurityDescriptor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgResourceCreate_SetPropertyLargeInt_Proxy(IClusCfgResourceCreate *This,LPCWSTR pcszNameIn,const LARGE_INTEGER lIntIn);
  void __RPC_STUB IClusCfgResourceCreate_SetPropertyLargeInt_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgResourceCreate_SendResourceControl_Proxy(IClusCfgResourceCreate *This,DWORD dwControlCodeIn,LPVOID lpBufferIn,DWORD cbBufferSizeIn);
  void __RPC_STUB IClusCfgResourceCreate_SendResourceControl_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IClusCfgResourcePostCreate_INTERFACE_DEFINED__
#define __IClusCfgResourcePostCreate_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IClusCfgResourcePostCreate;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IClusCfgResourcePostCreate : public IUnknown {
  public:
    virtual HRESULT WINAPI ChangeName(LPCWSTR pcszNameIn) = 0;
    virtual HRESULT WINAPI SendResourceControl(DWORD dwControlCodeIn,LPVOID lpBufferIn,DWORD cbBufferSizeIn,LPVOID lBufferInout,DWORD cbOutBufferSizeIn,LPDWORD lpcbBytesReturnedOut) = 0;
  };
#else
  typedef struct IClusCfgResourcePostCreateVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IClusCfgResourcePostCreate *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IClusCfgResourcePostCreate *This);
      ULONG (WINAPI *Release)(IClusCfgResourcePostCreate *This);
      HRESULT (WINAPI *ChangeName)(IClusCfgResourcePostCreate *This,LPCWSTR pcszNameIn);
      HRESULT (WINAPI *SendResourceControl)(IClusCfgResourcePostCreate *This,DWORD dwControlCodeIn,LPVOID lpBufferIn,DWORD cbBufferSizeIn,LPVOID lBufferInout,DWORD cbOutBufferSizeIn,LPDWORD lpcbBytesReturnedOut);
    END_INTERFACE
  } IClusCfgResourcePostCreateVtbl;
  struct IClusCfgResourcePostCreate {
    CONST_VTBL struct IClusCfgResourcePostCreateVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IClusCfgResourcePostCreate_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IClusCfgResourcePostCreate_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IClusCfgResourcePostCreate_Release(This) (This)->lpVtbl->Release(This)
#define IClusCfgResourcePostCreate_ChangeName(This,pcszNameIn) (This)->lpVtbl->ChangeName(This,pcszNameIn)
#define IClusCfgResourcePostCreate_SendResourceControl(This,dwControlCodeIn,lpBufferIn,cbBufferSizeIn,lBufferInout,cbOutBufferSizeIn,lpcbBytesReturnedOut) (This)->lpVtbl->SendResourceControl(This,dwControlCodeIn,lpBufferIn,cbBufferSizeIn,lBufferInout,cbOutBufferSizeIn,lpcbBytesReturnedOut)
#endif
#endif
  HRESULT WINAPI IClusCfgResourcePostCreate_ChangeName_Proxy(IClusCfgResourcePostCreate *This,LPCWSTR pcszNameIn);
  void __RPC_STUB IClusCfgResourcePostCreate_ChangeName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgResourcePostCreate_SendResourceControl_Proxy(IClusCfgResourcePostCreate *This,DWORD dwControlCodeIn,LPVOID lpBufferIn,DWORD cbBufferSizeIn,LPVOID lBufferInout,DWORD cbOutBufferSizeIn,LPDWORD lpcbBytesReturnedOut);
  void __RPC_STUB IClusCfgResourcePostCreate_SendResourceControl_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IClusCfgGroupCfg_INTERFACE_DEFINED__
#define __IClusCfgGroupCfg_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IClusCfgGroupCfg;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IClusCfgGroupCfg : public IUnknown {
  public:
    virtual HRESULT WINAPI SetName(LPCWSTR pcszNameIn) = 0;
    virtual HRESULT WINAPI GetName(BSTR *pbstrNameOut) = 0;
  };
#else
  typedef struct IClusCfgGroupCfgVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IClusCfgGroupCfg *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IClusCfgGroupCfg *This);
      ULONG (WINAPI *Release)(IClusCfgGroupCfg *This);
      HRESULT (WINAPI *SetName)(IClusCfgGroupCfg *This,LPCWSTR pcszNameIn);
      HRESULT (WINAPI *GetName)(IClusCfgGroupCfg *This,BSTR *pbstrNameOut);
    END_INTERFACE
  } IClusCfgGroupCfgVtbl;
  struct IClusCfgGroupCfg {
    CONST_VTBL struct IClusCfgGroupCfgVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IClusCfgGroupCfg_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IClusCfgGroupCfg_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IClusCfgGroupCfg_Release(This) (This)->lpVtbl->Release(This)
#define IClusCfgGroupCfg_SetName(This,pcszNameIn) (This)->lpVtbl->SetName(This,pcszNameIn)
#define IClusCfgGroupCfg_GetName(This,pbstrNameOut) (This)->lpVtbl->GetName(This,pbstrNameOut)
#endif
#endif
  HRESULT WINAPI IClusCfgGroupCfg_SetName_Proxy(IClusCfgGroupCfg *This,LPCWSTR pcszNameIn);
  void __RPC_STUB IClusCfgGroupCfg_SetName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgGroupCfg_GetName_Proxy(IClusCfgGroupCfg *This,BSTR *pbstrNameOut);
  void __RPC_STUB IClusCfgGroupCfg_GetName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IClusCfgMemberSetChangeListener_INTERFACE_DEFINED__
#define __IClusCfgMemberSetChangeListener_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IClusCfgMemberSetChangeListener;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IClusCfgMemberSetChangeListener : public IUnknown {
  public:
    virtual HRESULT WINAPI Notify(IUnknown *punkClusterInfoIn) = 0;
  };
#else
  typedef struct IClusCfgMemberSetChangeListenerVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IClusCfgMemberSetChangeListener *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IClusCfgMemberSetChangeListener *This);
      ULONG (WINAPI *Release)(IClusCfgMemberSetChangeListener *This);
      HRESULT (WINAPI *Notify)(IClusCfgMemberSetChangeListener *This,IUnknown *punkClusterInfoIn);
    END_INTERFACE
  } IClusCfgMemberSetChangeListenerVtbl;
  struct IClusCfgMemberSetChangeListener {
    CONST_VTBL struct IClusCfgMemberSetChangeListenerVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IClusCfgMemberSetChangeListener_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IClusCfgMemberSetChangeListener_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IClusCfgMemberSetChangeListener_Release(This) (This)->lpVtbl->Release(This)
#define IClusCfgMemberSetChangeListener_Notify(This,punkClusterInfoIn) (This)->lpVtbl->Notify(This,punkClusterInfoIn)
#endif
#endif
  HRESULT WINAPI IClusCfgMemberSetChangeListener_Notify_Proxy(IClusCfgMemberSetChangeListener *This,IUnknown *punkClusterInfoIn);
  void __RPC_STUB IClusCfgMemberSetChangeListener_Notify_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __AsyncIClusCfgMemberSetChangeListener_INTERFACE_DEFINED__
#define __AsyncIClusCfgMemberSetChangeListener_INTERFACE_DEFINED__
  EXTERN_C const IID IID_AsyncIClusCfgMemberSetChangeListener;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct AsyncIClusCfgMemberSetChangeListener : public IUnknown {
  public:
    virtual HRESULT WINAPI Begin_Notify(IUnknown *punkClusterInfoIn) = 0;
    virtual HRESULT WINAPI Finish_Notify(void) = 0;
  };
#else
  typedef struct AsyncIClusCfgMemberSetChangeListenerVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(AsyncIClusCfgMemberSetChangeListener *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(AsyncIClusCfgMemberSetChangeListener *This);
      ULONG (WINAPI *Release)(AsyncIClusCfgMemberSetChangeListener *This);
      HRESULT (WINAPI *Begin_Notify)(AsyncIClusCfgMemberSetChangeListener *This,IUnknown *punkClusterInfoIn);
      HRESULT (WINAPI *Finish_Notify)(AsyncIClusCfgMemberSetChangeListener *This);
    END_INTERFACE
  } AsyncIClusCfgMemberSetChangeListenerVtbl;
  struct AsyncIClusCfgMemberSetChangeListener {
    CONST_VTBL struct AsyncIClusCfgMemberSetChangeListenerVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define AsyncIClusCfgMemberSetChangeListener_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define AsyncIClusCfgMemberSetChangeListener_AddRef(This) (This)->lpVtbl->AddRef(This)
#define AsyncIClusCfgMemberSetChangeListener_Release(This) (This)->lpVtbl->Release(This)
#define AsyncIClusCfgMemberSetChangeListener_Begin_Notify(This,punkClusterInfoIn) (This)->lpVtbl->Begin_Notify(This,punkClusterInfoIn)
#define AsyncIClusCfgMemberSetChangeListener_Finish_Notify(This) (This)->lpVtbl->Finish_Notify(This)
#endif
#endif
  HRESULT WINAPI AsyncIClusCfgMemberSetChangeListener_Begin_Notify_Proxy(AsyncIClusCfgMemberSetChangeListener *This,IUnknown *punkClusterInfoIn);
  void __RPC_STUB AsyncIClusCfgMemberSetChangeListener_Begin_Notify_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgMemberSetChangeListener_Finish_Notify_Proxy(AsyncIClusCfgMemberSetChangeListener *This);
  void __RPC_STUB AsyncIClusCfgMemberSetChangeListener_Finish_Notify_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IClusCfgResourceTypeInfo_INTERFACE_DEFINED__
#define __IClusCfgResourceTypeInfo_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IClusCfgResourceTypeInfo;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IClusCfgResourceTypeInfo : public IUnknown {
  public:
    virtual HRESULT WINAPI CommitChanges(IUnknown *punkClusterInfoIn,IUnknown *punkResTypeServicesIn) = 0;
    virtual HRESULT WINAPI GetTypeName(BSTR *pbstrTypeNameOut) = 0;
    virtual HRESULT WINAPI GetTypeGUID(GUID *pguidGUIDOut) = 0;
  };
#else
  typedef struct IClusCfgResourceTypeInfoVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IClusCfgResourceTypeInfo *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IClusCfgResourceTypeInfo *This);
      ULONG (WINAPI *Release)(IClusCfgResourceTypeInfo *This);
      HRESULT (WINAPI *CommitChanges)(IClusCfgResourceTypeInfo *This,IUnknown *punkClusterInfoIn,IUnknown *punkResTypeServicesIn);
      HRESULT (WINAPI *GetTypeName)(IClusCfgResourceTypeInfo *This,BSTR *pbstrTypeNameOut);
      HRESULT (WINAPI *GetTypeGUID)(IClusCfgResourceTypeInfo *This,GUID *pguidGUIDOut);
    END_INTERFACE
  } IClusCfgResourceTypeInfoVtbl;
  struct IClusCfgResourceTypeInfo {
    CONST_VTBL struct IClusCfgResourceTypeInfoVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IClusCfgResourceTypeInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IClusCfgResourceTypeInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IClusCfgResourceTypeInfo_Release(This) (This)->lpVtbl->Release(This)
#define IClusCfgResourceTypeInfo_CommitChanges(This,punkClusterInfoIn,punkResTypeServicesIn) (This)->lpVtbl->CommitChanges(This,punkClusterInfoIn,punkResTypeServicesIn)
#define IClusCfgResourceTypeInfo_GetTypeName(This,pbstrTypeNameOut) (This)->lpVtbl->GetTypeName(This,pbstrTypeNameOut)
#define IClusCfgResourceTypeInfo_GetTypeGUID(This,pguidGUIDOut) (This)->lpVtbl->GetTypeGUID(This,pguidGUIDOut)
#endif
#endif
  HRESULT WINAPI IClusCfgResourceTypeInfo_CommitChanges_Proxy(IClusCfgResourceTypeInfo *This,IUnknown *punkClusterInfoIn,IUnknown *punkResTypeServicesIn);
  void __RPC_STUB IClusCfgResourceTypeInfo_CommitChanges_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgResourceTypeInfo_GetTypeName_Proxy(IClusCfgResourceTypeInfo *This,BSTR *pbstrTypeNameOut);
  void __RPC_STUB IClusCfgResourceTypeInfo_GetTypeName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgResourceTypeInfo_GetTypeGUID_Proxy(IClusCfgResourceTypeInfo *This,GUID *pguidGUIDOut);
  void __RPC_STUB IClusCfgResourceTypeInfo_GetTypeGUID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __AsyncIClusCfgResourceTypeInfo_INTERFACE_DEFINED__
#define __AsyncIClusCfgResourceTypeInfo_INTERFACE_DEFINED__
  EXTERN_C const IID IID_AsyncIClusCfgResourceTypeInfo;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct AsyncIClusCfgResourceTypeInfo : public IUnknown {
  public:
    virtual HRESULT WINAPI Begin_CommitChanges(IUnknown *punkClusterInfoIn,IUnknown *punkResTypeServicesIn) = 0;
    virtual HRESULT WINAPI Finish_CommitChanges(void) = 0;
    virtual HRESULT WINAPI Begin_GetTypeName(void) = 0;
    virtual HRESULT WINAPI Finish_GetTypeName(BSTR *pbstrTypeNameOut) = 0;
    virtual HRESULT WINAPI Begin_GetTypeGUID(void) = 0;
    virtual HRESULT WINAPI Finish_GetTypeGUID(GUID *pguidGUIDOut) = 0;
  };
#else
  typedef struct AsyncIClusCfgResourceTypeInfoVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(AsyncIClusCfgResourceTypeInfo *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(AsyncIClusCfgResourceTypeInfo *This);
      ULONG (WINAPI *Release)(AsyncIClusCfgResourceTypeInfo *This);
      HRESULT (WINAPI *Begin_CommitChanges)(AsyncIClusCfgResourceTypeInfo *This,IUnknown *punkClusterInfoIn,IUnknown *punkResTypeServicesIn);
      HRESULT (WINAPI *Finish_CommitChanges)(AsyncIClusCfgResourceTypeInfo *This);
      HRESULT (WINAPI *Begin_GetTypeName)(AsyncIClusCfgResourceTypeInfo *This);
      HRESULT (WINAPI *Finish_GetTypeName)(AsyncIClusCfgResourceTypeInfo *This,BSTR *pbstrTypeNameOut);
      HRESULT (WINAPI *Begin_GetTypeGUID)(AsyncIClusCfgResourceTypeInfo *This);
      HRESULT (WINAPI *Finish_GetTypeGUID)(AsyncIClusCfgResourceTypeInfo *This,GUID *pguidGUIDOut);
    END_INTERFACE
  } AsyncIClusCfgResourceTypeInfoVtbl;
  struct AsyncIClusCfgResourceTypeInfo {
    CONST_VTBL struct AsyncIClusCfgResourceTypeInfoVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define AsyncIClusCfgResourceTypeInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define AsyncIClusCfgResourceTypeInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define AsyncIClusCfgResourceTypeInfo_Release(This) (This)->lpVtbl->Release(This)
#define AsyncIClusCfgResourceTypeInfo_Begin_CommitChanges(This,punkClusterInfoIn,punkResTypeServicesIn) (This)->lpVtbl->Begin_CommitChanges(This,punkClusterInfoIn,punkResTypeServicesIn)
#define AsyncIClusCfgResourceTypeInfo_Finish_CommitChanges(This) (This)->lpVtbl->Finish_CommitChanges(This)
#define AsyncIClusCfgResourceTypeInfo_Begin_GetTypeName(This) (This)->lpVtbl->Begin_GetTypeName(This)
#define AsyncIClusCfgResourceTypeInfo_Finish_GetTypeName(This,pbstrTypeNameOut) (This)->lpVtbl->Finish_GetTypeName(This,pbstrTypeNameOut)
#define AsyncIClusCfgResourceTypeInfo_Begin_GetTypeGUID(This) (This)->lpVtbl->Begin_GetTypeGUID(This)
#define AsyncIClusCfgResourceTypeInfo_Finish_GetTypeGUID(This,pguidGUIDOut) (This)->lpVtbl->Finish_GetTypeGUID(This,pguidGUIDOut)
#endif
#endif
  HRESULT WINAPI AsyncIClusCfgResourceTypeInfo_Begin_CommitChanges_Proxy(AsyncIClusCfgResourceTypeInfo *This,IUnknown *punkClusterInfoIn,IUnknown *punkResTypeServicesIn);
  void __RPC_STUB AsyncIClusCfgResourceTypeInfo_Begin_CommitChanges_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgResourceTypeInfo_Finish_CommitChanges_Proxy(AsyncIClusCfgResourceTypeInfo *This);
  void __RPC_STUB AsyncIClusCfgResourceTypeInfo_Finish_CommitChanges_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgResourceTypeInfo_Begin_GetTypeName_Proxy(AsyncIClusCfgResourceTypeInfo *This);
  void __RPC_STUB AsyncIClusCfgResourceTypeInfo_Begin_GetTypeName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgResourceTypeInfo_Finish_GetTypeName_Proxy(AsyncIClusCfgResourceTypeInfo *This,BSTR *pbstrTypeNameOut);
  void __RPC_STUB AsyncIClusCfgResourceTypeInfo_Finish_GetTypeName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgResourceTypeInfo_Begin_GetTypeGUID_Proxy(AsyncIClusCfgResourceTypeInfo *This);
  void __RPC_STUB AsyncIClusCfgResourceTypeInfo_Begin_GetTypeGUID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgResourceTypeInfo_Finish_GetTypeGUID_Proxy(AsyncIClusCfgResourceTypeInfo *This,GUID *pguidGUIDOut);
  void __RPC_STUB AsyncIClusCfgResourceTypeInfo_Finish_GetTypeGUID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IClusCfgResourceTypeCreate_INTERFACE_DEFINED__
#define __IClusCfgResourceTypeCreate_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IClusCfgResourceTypeCreate;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IClusCfgResourceTypeCreate : public IUnknown {
  public:
    virtual HRESULT WINAPI Create(const WCHAR *pcszResTypeNameIn,const WCHAR *pcszResTypeDisplayNameIn,const WCHAR *pcszResDllNameIn,DWORD dwLooksAliveIntervalIn,DWORD dwIsAliveIntervalIn) = 0;
    virtual HRESULT WINAPI RegisterAdminExtensions(const WCHAR *pcszResTypeNameIn,ULONG cExtClsidCountIn,const CLSID *rgclsidExtClsidsIn) = 0;
  };
#else
  typedef struct IClusCfgResourceTypeCreateVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IClusCfgResourceTypeCreate *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IClusCfgResourceTypeCreate *This);
      ULONG (WINAPI *Release)(IClusCfgResourceTypeCreate *This);
      HRESULT (WINAPI *Create)(IClusCfgResourceTypeCreate *This,const WCHAR *pcszResTypeNameIn,const WCHAR *pcszResTypeDisplayNameIn,const WCHAR *pcszResDllNameIn,DWORD dwLooksAliveIntervalIn,DWORD dwIsAliveIntervalIn);
      HRESULT (WINAPI *RegisterAdminExtensions)(IClusCfgResourceTypeCreate *This,const WCHAR *pcszResTypeNameIn,ULONG cExtClsidCountIn,const CLSID *rgclsidExtClsidsIn);
    END_INTERFACE
  } IClusCfgResourceTypeCreateVtbl;
  struct IClusCfgResourceTypeCreate {
    CONST_VTBL struct IClusCfgResourceTypeCreateVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IClusCfgResourceTypeCreate_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IClusCfgResourceTypeCreate_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IClusCfgResourceTypeCreate_Release(This) (This)->lpVtbl->Release(This)
#define IClusCfgResourceTypeCreate_Create(This,pcszResTypeNameIn,pcszResTypeDisplayNameIn,pcszResDllNameIn,dwLooksAliveIntervalIn,dwIsAliveIntervalIn) (This)->lpVtbl->Create(This,pcszResTypeNameIn,pcszResTypeDisplayNameIn,pcszResDllNameIn,dwLooksAliveIntervalIn,dwIsAliveIntervalIn)
#define IClusCfgResourceTypeCreate_RegisterAdminExtensions(This,pcszResTypeNameIn,cExtClsidCountIn,rgclsidExtClsidsIn) (This)->lpVtbl->RegisterAdminExtensions(This,pcszResTypeNameIn,cExtClsidCountIn,rgclsidExtClsidsIn)
#endif
#endif
  HRESULT WINAPI IClusCfgResourceTypeCreate_Create_Proxy(IClusCfgResourceTypeCreate *This,const WCHAR *pcszResTypeNameIn,const WCHAR *pcszResTypeDisplayNameIn,const WCHAR *pcszResDllNameIn,DWORD dwLooksAliveIntervalIn,DWORD dwIsAliveIntervalIn);
  void __RPC_STUB IClusCfgResourceTypeCreate_Create_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgResourceTypeCreate_RegisterAdminExtensions_Proxy(IClusCfgResourceTypeCreate *This,const WCHAR *pcszResTypeNameIn,ULONG cExtClsidCountIn,const CLSID *rgclsidExtClsidsIn);
  void __RPC_STUB IClusCfgResourceTypeCreate_RegisterAdminExtensions_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __AsyncIClusCfgResourceTypeCreate_INTERFACE_DEFINED__
#define __AsyncIClusCfgResourceTypeCreate_INTERFACE_DEFINED__
  EXTERN_C const IID IID_AsyncIClusCfgResourceTypeCreate;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct AsyncIClusCfgResourceTypeCreate : public IUnknown {
  public:
    virtual HRESULT WINAPI Begin_Create(const WCHAR *pcszResTypeNameIn,const WCHAR *pcszResTypeDisplayNameIn,const WCHAR *pcszResDllNameIn,DWORD dwLooksAliveIntervalIn,DWORD dwIsAliveIntervalIn) = 0;
    virtual HRESULT WINAPI Finish_Create(void) = 0;
    virtual HRESULT WINAPI Begin_RegisterAdminExtensions(const WCHAR *pcszResTypeNameIn,ULONG cExtClsidCountIn,const CLSID *rgclsidExtClsidsIn) = 0;
    virtual HRESULT WINAPI Finish_RegisterAdminExtensions(void) = 0;
  };
#else
  typedef struct AsyncIClusCfgResourceTypeCreateVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(AsyncIClusCfgResourceTypeCreate *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(AsyncIClusCfgResourceTypeCreate *This);
      ULONG (WINAPI *Release)(AsyncIClusCfgResourceTypeCreate *This);
      HRESULT (WINAPI *Begin_Create)(AsyncIClusCfgResourceTypeCreate *This,const WCHAR *pcszResTypeNameIn,const WCHAR *pcszResTypeDisplayNameIn,const WCHAR *pcszResDllNameIn,DWORD dwLooksAliveIntervalIn,DWORD dwIsAliveIntervalIn);
      HRESULT (WINAPI *Finish_Create)(AsyncIClusCfgResourceTypeCreate *This);
      HRESULT (WINAPI *Begin_RegisterAdminExtensions)(AsyncIClusCfgResourceTypeCreate *This,const WCHAR *pcszResTypeNameIn,ULONG cExtClsidCountIn,const CLSID *rgclsidExtClsidsIn);
      HRESULT (WINAPI *Finish_RegisterAdminExtensions)(AsyncIClusCfgResourceTypeCreate *This);
    END_INTERFACE
  } AsyncIClusCfgResourceTypeCreateVtbl;
  struct AsyncIClusCfgResourceTypeCreate {
    CONST_VTBL struct AsyncIClusCfgResourceTypeCreateVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define AsyncIClusCfgResourceTypeCreate_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define AsyncIClusCfgResourceTypeCreate_AddRef(This) (This)->lpVtbl->AddRef(This)
#define AsyncIClusCfgResourceTypeCreate_Release(This) (This)->lpVtbl->Release(This)
#define AsyncIClusCfgResourceTypeCreate_Begin_Create(This,pcszResTypeNameIn,pcszResTypeDisplayNameIn,pcszResDllNameIn,dwLooksAliveIntervalIn,dwIsAliveIntervalIn) (This)->lpVtbl->Begin_Create(This,pcszResTypeNameIn,pcszResTypeDisplayNameIn,pcszResDllNameIn,dwLooksAliveIntervalIn,dwIsAliveIntervalIn)
#define AsyncIClusCfgResourceTypeCreate_Finish_Create(This) (This)->lpVtbl->Finish_Create(This)
#define AsyncIClusCfgResourceTypeCreate_Begin_RegisterAdminExtensions(This,pcszResTypeNameIn,cExtClsidCountIn,rgclsidExtClsidsIn) (This)->lpVtbl->Begin_RegisterAdminExtensions(This,pcszResTypeNameIn,cExtClsidCountIn,rgclsidExtClsidsIn)
#define AsyncIClusCfgResourceTypeCreate_Finish_RegisterAdminExtensions(This) (This)->lpVtbl->Finish_RegisterAdminExtensions(This)
#endif
#endif
  HRESULT WINAPI AsyncIClusCfgResourceTypeCreate_Begin_Create_Proxy(AsyncIClusCfgResourceTypeCreate *This,const WCHAR *pcszResTypeNameIn,const WCHAR *pcszResTypeDisplayNameIn,const WCHAR *pcszResDllNameIn,DWORD dwLooksAliveIntervalIn,DWORD dwIsAliveIntervalIn);
  void __RPC_STUB AsyncIClusCfgResourceTypeCreate_Begin_Create_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgResourceTypeCreate_Finish_Create_Proxy(AsyncIClusCfgResourceTypeCreate *This);
  void __RPC_STUB AsyncIClusCfgResourceTypeCreate_Finish_Create_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgResourceTypeCreate_Begin_RegisterAdminExtensions_Proxy(AsyncIClusCfgResourceTypeCreate *This,const WCHAR *pcszResTypeNameIn,ULONG cExtClsidCountIn,const CLSID *rgclsidExtClsidsIn);
  void __RPC_STUB AsyncIClusCfgResourceTypeCreate_Begin_RegisterAdminExtensions_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgResourceTypeCreate_Finish_RegisterAdminExtensions_Proxy(AsyncIClusCfgResourceTypeCreate *This);
  void __RPC_STUB AsyncIClusCfgResourceTypeCreate_Finish_RegisterAdminExtensions_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IClusCfgEvictCleanup_INTERFACE_DEFINED__
#define __IClusCfgEvictCleanup_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IClusCfgEvictCleanup;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IClusCfgEvictCleanup : public IUnknown {
  public:
    virtual HRESULT WINAPI CleanupLocalNode(DWORD dwDelayIn) = 0;
    virtual HRESULT WINAPI CleanupRemoteNode(const WCHAR *pcszEvictedNodeNameIn,DWORD dwDelayIn) = 0;
  };
#else
  typedef struct IClusCfgEvictCleanupVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IClusCfgEvictCleanup *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IClusCfgEvictCleanup *This);
      ULONG (WINAPI *Release)(IClusCfgEvictCleanup *This);
      HRESULT (WINAPI *CleanupLocalNode)(IClusCfgEvictCleanup *This,DWORD dwDelayIn);
      HRESULT (WINAPI *CleanupRemoteNode)(IClusCfgEvictCleanup *This,const WCHAR *pcszEvictedNodeNameIn,DWORD dwDelayIn);
    END_INTERFACE
  } IClusCfgEvictCleanupVtbl;
  struct IClusCfgEvictCleanup {
    CONST_VTBL struct IClusCfgEvictCleanupVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IClusCfgEvictCleanup_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IClusCfgEvictCleanup_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IClusCfgEvictCleanup_Release(This) (This)->lpVtbl->Release(This)
#define IClusCfgEvictCleanup_CleanupLocalNode(This,dwDelayIn) (This)->lpVtbl->CleanupLocalNode(This,dwDelayIn)
#define IClusCfgEvictCleanup_CleanupRemoteNode(This,pcszEvictedNodeNameIn,dwDelayIn) (This)->lpVtbl->CleanupRemoteNode(This,pcszEvictedNodeNameIn,dwDelayIn)
#endif
#endif
  HRESULT WINAPI IClusCfgEvictCleanup_CleanupLocalNode_Proxy(IClusCfgEvictCleanup *This,DWORD dwDelayIn);
  void __RPC_STUB IClusCfgEvictCleanup_CleanupLocalNode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgEvictCleanup_CleanupRemoteNode_Proxy(IClusCfgEvictCleanup *This,const WCHAR *pcszEvictedNodeNameIn,DWORD dwDelayIn);
  void __RPC_STUB IClusCfgEvictCleanup_CleanupRemoteNode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __AsyncIClusCfgEvictCleanup_INTERFACE_DEFINED__
#define __AsyncIClusCfgEvictCleanup_INTERFACE_DEFINED__
  EXTERN_C const IID IID_AsyncIClusCfgEvictCleanup;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct AsyncIClusCfgEvictCleanup : public IUnknown {
  public:
    virtual HRESULT WINAPI Begin_CleanupLocalNode(DWORD dwDelayIn) = 0;
    virtual HRESULT WINAPI Finish_CleanupLocalNode(void) = 0;
    virtual HRESULT WINAPI Begin_CleanupRemoteNode(const WCHAR *pcszEvictedNodeNameIn,DWORD dwDelayIn) = 0;
    virtual HRESULT WINAPI Finish_CleanupRemoteNode(void) = 0;
  };
#else
  typedef struct AsyncIClusCfgEvictCleanupVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(AsyncIClusCfgEvictCleanup *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(AsyncIClusCfgEvictCleanup *This);
      ULONG (WINAPI *Release)(AsyncIClusCfgEvictCleanup *This);
      HRESULT (WINAPI *Begin_CleanupLocalNode)(AsyncIClusCfgEvictCleanup *This,DWORD dwDelayIn);
      HRESULT (WINAPI *Finish_CleanupLocalNode)(AsyncIClusCfgEvictCleanup *This);
      HRESULT (WINAPI *Begin_CleanupRemoteNode)(AsyncIClusCfgEvictCleanup *This,const WCHAR *pcszEvictedNodeNameIn,DWORD dwDelayIn);
      HRESULT (WINAPI *Finish_CleanupRemoteNode)(AsyncIClusCfgEvictCleanup *This);
    END_INTERFACE
  } AsyncIClusCfgEvictCleanupVtbl;
  struct AsyncIClusCfgEvictCleanup {
    CONST_VTBL struct AsyncIClusCfgEvictCleanupVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define AsyncIClusCfgEvictCleanup_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define AsyncIClusCfgEvictCleanup_AddRef(This) (This)->lpVtbl->AddRef(This)
#define AsyncIClusCfgEvictCleanup_Release(This) (This)->lpVtbl->Release(This)
#define AsyncIClusCfgEvictCleanup_Begin_CleanupLocalNode(This,dwDelayIn) (This)->lpVtbl->Begin_CleanupLocalNode(This,dwDelayIn)
#define AsyncIClusCfgEvictCleanup_Finish_CleanupLocalNode(This) (This)->lpVtbl->Finish_CleanupLocalNode(This)
#define AsyncIClusCfgEvictCleanup_Begin_CleanupRemoteNode(This,pcszEvictedNodeNameIn,dwDelayIn) (This)->lpVtbl->Begin_CleanupRemoteNode(This,pcszEvictedNodeNameIn,dwDelayIn)
#define AsyncIClusCfgEvictCleanup_Finish_CleanupRemoteNode(This) (This)->lpVtbl->Finish_CleanupRemoteNode(This)
#endif
#endif
  HRESULT WINAPI AsyncIClusCfgEvictCleanup_Begin_CleanupLocalNode_Proxy(AsyncIClusCfgEvictCleanup *This,DWORD dwDelayIn);
  void __RPC_STUB AsyncIClusCfgEvictCleanup_Begin_CleanupLocalNode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgEvictCleanup_Finish_CleanupLocalNode_Proxy(AsyncIClusCfgEvictCleanup *This);
  void __RPC_STUB AsyncIClusCfgEvictCleanup_Finish_CleanupLocalNode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgEvictCleanup_Begin_CleanupRemoteNode_Proxy(AsyncIClusCfgEvictCleanup *This,const WCHAR *pcszEvictedNodeNameIn,DWORD dwDelayIn);
  void __RPC_STUB AsyncIClusCfgEvictCleanup_Begin_CleanupRemoteNode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgEvictCleanup_Finish_CleanupRemoteNode_Proxy(AsyncIClusCfgEvictCleanup *This);
  void __RPC_STUB AsyncIClusCfgEvictCleanup_Finish_CleanupRemoteNode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IClusCfgStartupListener_INTERFACE_DEFINED__
#define __IClusCfgStartupListener_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IClusCfgStartupListener;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IClusCfgStartupListener : public IUnknown {
  public:
    virtual HRESULT WINAPI Notify(IUnknown *punkIn) = 0;
  };
#else
  typedef struct IClusCfgStartupListenerVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IClusCfgStartupListener *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IClusCfgStartupListener *This);
      ULONG (WINAPI *Release)(IClusCfgStartupListener *This);
      HRESULT (WINAPI *Notify)(IClusCfgStartupListener *This,IUnknown *punkIn);
    END_INTERFACE
  } IClusCfgStartupListenerVtbl;
  struct IClusCfgStartupListener {
    CONST_VTBL struct IClusCfgStartupListenerVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IClusCfgStartupListener_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IClusCfgStartupListener_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IClusCfgStartupListener_Release(This) (This)->lpVtbl->Release(This)
#define IClusCfgStartupListener_Notify(This,punkIn) (This)->lpVtbl->Notify(This,punkIn)
#endif
#endif
  HRESULT WINAPI IClusCfgStartupListener_Notify_Proxy(IClusCfgStartupListener *This,IUnknown *punkIn);
  void __RPC_STUB IClusCfgStartupListener_Notify_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __AsyncIClusCfgStartupListener_INTERFACE_DEFINED__
#define __AsyncIClusCfgStartupListener_INTERFACE_DEFINED__
  EXTERN_C const IID IID_AsyncIClusCfgStartupListener;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct AsyncIClusCfgStartupListener : public IUnknown {
  public:
    virtual HRESULT WINAPI Begin_Notify(IUnknown *punkIn) = 0;
    virtual HRESULT WINAPI Finish_Notify(void) = 0;
  };
#else
  typedef struct AsyncIClusCfgStartupListenerVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(AsyncIClusCfgStartupListener *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(AsyncIClusCfgStartupListener *This);
      ULONG (WINAPI *Release)(AsyncIClusCfgStartupListener *This);
      HRESULT (WINAPI *Begin_Notify)(AsyncIClusCfgStartupListener *This,IUnknown *punkIn);
      HRESULT (WINAPI *Finish_Notify)(AsyncIClusCfgStartupListener *This);
    END_INTERFACE
  } AsyncIClusCfgStartupListenerVtbl;
  struct AsyncIClusCfgStartupListener {
    CONST_VTBL struct AsyncIClusCfgStartupListenerVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define AsyncIClusCfgStartupListener_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define AsyncIClusCfgStartupListener_AddRef(This) (This)->lpVtbl->AddRef(This)
#define AsyncIClusCfgStartupListener_Release(This) (This)->lpVtbl->Release(This)
#define AsyncIClusCfgStartupListener_Begin_Notify(This,punkIn) (This)->lpVtbl->Begin_Notify(This,punkIn)
#define AsyncIClusCfgStartupListener_Finish_Notify(This) (This)->lpVtbl->Finish_Notify(This)
#endif
#endif
  HRESULT WINAPI AsyncIClusCfgStartupListener_Begin_Notify_Proxy(AsyncIClusCfgStartupListener *This,IUnknown *punkIn);
  void __RPC_STUB AsyncIClusCfgStartupListener_Begin_Notify_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgStartupListener_Finish_Notify_Proxy(AsyncIClusCfgStartupListener *This);
  void __RPC_STUB AsyncIClusCfgStartupListener_Finish_Notify_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IClusCfgStartupNotify_INTERFACE_DEFINED__
#define __IClusCfgStartupNotify_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IClusCfgStartupNotify;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IClusCfgStartupNotify : public IUnknown {
  public:
    virtual HRESULT WINAPI SendNotifications(void) = 0;
  };
#else
  typedef struct IClusCfgStartupNotifyVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IClusCfgStartupNotify *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IClusCfgStartupNotify *This);
      ULONG (WINAPI *Release)(IClusCfgStartupNotify *This);
      HRESULT (WINAPI *SendNotifications)(IClusCfgStartupNotify *This);
    END_INTERFACE
  } IClusCfgStartupNotifyVtbl;
  struct IClusCfgStartupNotify {
    CONST_VTBL struct IClusCfgStartupNotifyVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IClusCfgStartupNotify_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IClusCfgStartupNotify_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IClusCfgStartupNotify_Release(This) (This)->lpVtbl->Release(This)
#define IClusCfgStartupNotify_SendNotifications(This) (This)->lpVtbl->SendNotifications(This)
#endif
#endif
  HRESULT WINAPI IClusCfgStartupNotify_SendNotifications_Proxy(IClusCfgStartupNotify *This);
  void __RPC_STUB IClusCfgStartupNotify_SendNotifications_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __AsyncIClusCfgStartupNotify_INTERFACE_DEFINED__
#define __AsyncIClusCfgStartupNotify_INTERFACE_DEFINED__
  EXTERN_C const IID IID_AsyncIClusCfgStartupNotify;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct AsyncIClusCfgStartupNotify : public IUnknown {
  public:
    virtual HRESULT WINAPI Begin_SendNotifications(void) = 0;
    virtual HRESULT WINAPI Finish_SendNotifications(void) = 0;
  };
#else
  typedef struct AsyncIClusCfgStartupNotifyVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(AsyncIClusCfgStartupNotify *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(AsyncIClusCfgStartupNotify *This);
      ULONG (WINAPI *Release)(AsyncIClusCfgStartupNotify *This);
      HRESULT (WINAPI *Begin_SendNotifications)(AsyncIClusCfgStartupNotify *This);
      HRESULT (WINAPI *Finish_SendNotifications)(AsyncIClusCfgStartupNotify *This);
    END_INTERFACE
  } AsyncIClusCfgStartupNotifyVtbl;
  struct AsyncIClusCfgStartupNotify {
    CONST_VTBL struct AsyncIClusCfgStartupNotifyVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define AsyncIClusCfgStartupNotify_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define AsyncIClusCfgStartupNotify_AddRef(This) (This)->lpVtbl->AddRef(This)
#define AsyncIClusCfgStartupNotify_Release(This) (This)->lpVtbl->Release(This)
#define AsyncIClusCfgStartupNotify_Begin_SendNotifications(This) (This)->lpVtbl->Begin_SendNotifications(This)
#define AsyncIClusCfgStartupNotify_Finish_SendNotifications(This) (This)->lpVtbl->Finish_SendNotifications(This)
#endif
#endif
  HRESULT WINAPI AsyncIClusCfgStartupNotify_Begin_SendNotifications_Proxy(AsyncIClusCfgStartupNotify *This);
  void __RPC_STUB AsyncIClusCfgStartupNotify_Begin_SendNotifications_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgStartupNotify_Finish_SendNotifications_Proxy(AsyncIClusCfgStartupNotify *This);
  void __RPC_STUB AsyncIClusCfgStartupNotify_Finish_SendNotifications_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IClusCfgManagedResourceData_INTERFACE_DEFINED__
#define __IClusCfgManagedResourceData_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IClusCfgManagedResourceData;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IClusCfgManagedResourceData : public IUnknown {
  public:
    virtual HRESULT WINAPI GetResourcePrivateData(BYTE *pbBufferOut,DWORD *pcbBufferInout) = 0;
    virtual HRESULT WINAPI SetResourcePrivateData(const BYTE *pcbBufferIn,DWORD cbBufferIn) = 0;
  };
#else
  typedef struct IClusCfgManagedResourceDataVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IClusCfgManagedResourceData *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IClusCfgManagedResourceData *This);
      ULONG (WINAPI *Release)(IClusCfgManagedResourceData *This);
      HRESULT (WINAPI *GetResourcePrivateData)(IClusCfgManagedResourceData *This,BYTE *pbBufferOut,DWORD *pcbBufferInout);
      HRESULT (WINAPI *SetResourcePrivateData)(IClusCfgManagedResourceData *This,const BYTE *pcbBufferIn,DWORD cbBufferIn);
    END_INTERFACE
  } IClusCfgManagedResourceDataVtbl;
  struct IClusCfgManagedResourceData {
    CONST_VTBL struct IClusCfgManagedResourceDataVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IClusCfgManagedResourceData_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IClusCfgManagedResourceData_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IClusCfgManagedResourceData_Release(This) (This)->lpVtbl->Release(This)
#define IClusCfgManagedResourceData_GetResourcePrivateData(This,pbBufferOut,pcbBufferInout) (This)->lpVtbl->GetResourcePrivateData(This,pbBufferOut,pcbBufferInout)
#define IClusCfgManagedResourceData_SetResourcePrivateData(This,pcbBufferIn,cbBufferIn) (This)->lpVtbl->SetResourcePrivateData(This,pcbBufferIn,cbBufferIn)
#endif
#endif
  HRESULT WINAPI IClusCfgManagedResourceData_GetResourcePrivateData_Proxy(IClusCfgManagedResourceData *This,BYTE *pbBufferOut,DWORD *pcbBufferInout);
  void __RPC_STUB IClusCfgManagedResourceData_GetResourcePrivateData_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgManagedResourceData_SetResourcePrivateData_Proxy(IClusCfgManagedResourceData *This,const BYTE *pcbBufferIn,DWORD cbBufferIn);
  void __RPC_STUB IClusCfgManagedResourceData_SetResourcePrivateData_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IClusCfgVerifyQuorum_INTERFACE_DEFINED__
#define __IClusCfgVerifyQuorum_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IClusCfgVerifyQuorum;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IClusCfgVerifyQuorum : public IUnknown {
  public:
    virtual HRESULT WINAPI PrepareToHostQuorumResource(void) = 0;
    virtual HRESULT WINAPI Cleanup(EClusCfgCleanupReason cccrReasonIn) = 0;
    virtual HRESULT WINAPI IsMultiNodeCapable(void) = 0;
    virtual HRESULT WINAPI SetMultiNodeCapable(WINBOOL fMultiNodeCapableIn) = 0;
  };
#else
  typedef struct IClusCfgVerifyQuorumVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IClusCfgVerifyQuorum *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IClusCfgVerifyQuorum *This);
      ULONG (WINAPI *Release)(IClusCfgVerifyQuorum *This);
      HRESULT (WINAPI *PrepareToHostQuorumResource)(IClusCfgVerifyQuorum *This);
      HRESULT (WINAPI *Cleanup)(IClusCfgVerifyQuorum *This,EClusCfgCleanupReason cccrReasonIn);
      HRESULT (WINAPI *IsMultiNodeCapable)(IClusCfgVerifyQuorum *This);
      HRESULT (WINAPI *SetMultiNodeCapable)(IClusCfgVerifyQuorum *This,WINBOOL fMultiNodeCapableIn);
    END_INTERFACE
  } IClusCfgVerifyQuorumVtbl;
  struct IClusCfgVerifyQuorum {
    CONST_VTBL struct IClusCfgVerifyQuorumVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IClusCfgVerifyQuorum_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IClusCfgVerifyQuorum_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IClusCfgVerifyQuorum_Release(This) (This)->lpVtbl->Release(This)
#define IClusCfgVerifyQuorum_PrepareToHostQuorumResource(This) (This)->lpVtbl->PrepareToHostQuorumResource(This)
#define IClusCfgVerifyQuorum_Cleanup(This,cccrReasonIn) (This)->lpVtbl->Cleanup(This,cccrReasonIn)
#define IClusCfgVerifyQuorum_IsMultiNodeCapable(This) (This)->lpVtbl->IsMultiNodeCapable(This)
#define IClusCfgVerifyQuorum_SetMultiNodeCapable(This,fMultiNodeCapableIn) (This)->lpVtbl->SetMultiNodeCapable(This,fMultiNodeCapableIn)
#endif
#endif
  HRESULT WINAPI IClusCfgVerifyQuorum_PrepareToHostQuorumResource_Proxy(IClusCfgVerifyQuorum *This);
  void __RPC_STUB IClusCfgVerifyQuorum_PrepareToHostQuorumResource_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgVerifyQuorum_Cleanup_Proxy(IClusCfgVerifyQuorum *This,EClusCfgCleanupReason cccrReasonIn);
  void __RPC_STUB IClusCfgVerifyQuorum_Cleanup_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgVerifyQuorum_IsMultiNodeCapable_Proxy(IClusCfgVerifyQuorum *This);
  void __RPC_STUB IClusCfgVerifyQuorum_IsMultiNodeCapable_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IClusCfgVerifyQuorum_SetMultiNodeCapable_Proxy(IClusCfgVerifyQuorum *This,WINBOOL fMultiNodeCapableIn);
  void __RPC_STUB IClusCfgVerifyQuorum_SetMultiNodeCapable_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IClusCfgEvictListener_INTERFACE_DEFINED__
#define __IClusCfgEvictListener_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IClusCfgEvictListener;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IClusCfgEvictListener : public IUnknown {
  public:
    virtual HRESULT WINAPI EvictNotify(LPCWSTR pcszNodeNameIn) = 0;
  };
#else
  typedef struct IClusCfgEvictListenerVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IClusCfgEvictListener *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IClusCfgEvictListener *This);
      ULONG (WINAPI *Release)(IClusCfgEvictListener *This);
      HRESULT (WINAPI *EvictNotify)(IClusCfgEvictListener *This,LPCWSTR pcszNodeNameIn);
    END_INTERFACE
  } IClusCfgEvictListenerVtbl;
  struct IClusCfgEvictListener {
    CONST_VTBL struct IClusCfgEvictListenerVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IClusCfgEvictListener_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IClusCfgEvictListener_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IClusCfgEvictListener_Release(This) (This)->lpVtbl->Release(This)
#define IClusCfgEvictListener_EvictNotify(This,pcszNodeNameIn) (This)->lpVtbl->EvictNotify(This,pcszNodeNameIn)
#endif
#endif
  HRESULT WINAPI IClusCfgEvictListener_EvictNotify_Proxy(IClusCfgEvictListener *This,LPCWSTR pcszNodeNameIn);
  void __RPC_STUB IClusCfgEvictListener_EvictNotify_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __AsyncIClusCfgEvictListener_INTERFACE_DEFINED__
#define __AsyncIClusCfgEvictListener_INTERFACE_DEFINED__
  EXTERN_C const IID IID_AsyncIClusCfgEvictListener;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct AsyncIClusCfgEvictListener : public IUnknown {
  public:
    virtual HRESULT WINAPI Begin_EvictNotify(LPCWSTR pcszNodeNameIn) = 0;
    virtual HRESULT WINAPI Finish_EvictNotify(void) = 0;
  };
#else
  typedef struct AsyncIClusCfgEvictListenerVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(AsyncIClusCfgEvictListener *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(AsyncIClusCfgEvictListener *This);
      ULONG (WINAPI *Release)(AsyncIClusCfgEvictListener *This);
      HRESULT (WINAPI *Begin_EvictNotify)(AsyncIClusCfgEvictListener *This,LPCWSTR pcszNodeNameIn);
      HRESULT (WINAPI *Finish_EvictNotify)(AsyncIClusCfgEvictListener *This);
    END_INTERFACE
  } AsyncIClusCfgEvictListenerVtbl;
  struct AsyncIClusCfgEvictListener {
    CONST_VTBL struct AsyncIClusCfgEvictListenerVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define AsyncIClusCfgEvictListener_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define AsyncIClusCfgEvictListener_AddRef(This) (This)->lpVtbl->AddRef(This)
#define AsyncIClusCfgEvictListener_Release(This) (This)->lpVtbl->Release(This)
#define AsyncIClusCfgEvictListener_Begin_EvictNotify(This,pcszNodeNameIn) (This)->lpVtbl->Begin_EvictNotify(This,pcszNodeNameIn)
#define AsyncIClusCfgEvictListener_Finish_EvictNotify(This) (This)->lpVtbl->Finish_EvictNotify(This)
#endif
#endif
  HRESULT WINAPI AsyncIClusCfgEvictListener_Begin_EvictNotify_Proxy(AsyncIClusCfgEvictListener *This,LPCWSTR pcszNodeNameIn);
  void __RPC_STUB AsyncIClusCfgEvictListener_Begin_EvictNotify_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgEvictListener_Finish_EvictNotify_Proxy(AsyncIClusCfgEvictListener *This);
  void __RPC_STUB AsyncIClusCfgEvictListener_Finish_EvictNotify_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IClusCfgEvictNotify_INTERFACE_DEFINED__
#define __IClusCfgEvictNotify_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IClusCfgEvictNotify;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IClusCfgEvictNotify : public IUnknown {
  public:
    virtual HRESULT WINAPI SendNotifications(LPCWSTR pcszNodeNameIn) = 0;
  };
#else
  typedef struct IClusCfgEvictNotifyVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IClusCfgEvictNotify *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IClusCfgEvictNotify *This);
      ULONG (WINAPI *Release)(IClusCfgEvictNotify *This);
      HRESULT (WINAPI *SendNotifications)(IClusCfgEvictNotify *This,LPCWSTR pcszNodeNameIn);
    END_INTERFACE
  } IClusCfgEvictNotifyVtbl;
  struct IClusCfgEvictNotify {
    CONST_VTBL struct IClusCfgEvictNotifyVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IClusCfgEvictNotify_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IClusCfgEvictNotify_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IClusCfgEvictNotify_Release(This) (This)->lpVtbl->Release(This)
#define IClusCfgEvictNotify_SendNotifications(This,pcszNodeNameIn) (This)->lpVtbl->SendNotifications(This,pcszNodeNameIn)
#endif
#endif
  HRESULT WINAPI IClusCfgEvictNotify_SendNotifications_Proxy(IClusCfgEvictNotify *This,LPCWSTR pcszNodeNameIn);
  void __RPC_STUB IClusCfgEvictNotify_SendNotifications_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __AsyncIClusCfgEvictNotify_INTERFACE_DEFINED__
#define __AsyncIClusCfgEvictNotify_INTERFACE_DEFINED__
  EXTERN_C const IID IID_AsyncIClusCfgEvictNotify;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct AsyncIClusCfgEvictNotify : public IUnknown {
  public:
    virtual HRESULT WINAPI Begin_SendNotifications(LPCWSTR pcszNodeNameIn) = 0;
    virtual HRESULT WINAPI Finish_SendNotifications(void) = 0;
  };
#else
  typedef struct AsyncIClusCfgEvictNotifyVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(AsyncIClusCfgEvictNotify *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(AsyncIClusCfgEvictNotify *This);
      ULONG (WINAPI *Release)(AsyncIClusCfgEvictNotify *This);
      HRESULT (WINAPI *Begin_SendNotifications)(AsyncIClusCfgEvictNotify *This,LPCWSTR pcszNodeNameIn);
      HRESULT (WINAPI *Finish_SendNotifications)(AsyncIClusCfgEvictNotify *This);
    END_INTERFACE
  } AsyncIClusCfgEvictNotifyVtbl;
  struct AsyncIClusCfgEvictNotify {
    CONST_VTBL struct AsyncIClusCfgEvictNotifyVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define AsyncIClusCfgEvictNotify_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define AsyncIClusCfgEvictNotify_AddRef(This) (This)->lpVtbl->AddRef(This)
#define AsyncIClusCfgEvictNotify_Release(This) (This)->lpVtbl->Release(This)
#define AsyncIClusCfgEvictNotify_Begin_SendNotifications(This,pcszNodeNameIn) (This)->lpVtbl->Begin_SendNotifications(This,pcszNodeNameIn)
#define AsyncIClusCfgEvictNotify_Finish_SendNotifications(This) (This)->lpVtbl->Finish_SendNotifications(This)
#endif
#endif
  HRESULT WINAPI AsyncIClusCfgEvictNotify_Begin_SendNotifications_Proxy(AsyncIClusCfgEvictNotify *This,LPCWSTR pcszNodeNameIn);
  void __RPC_STUB AsyncIClusCfgEvictNotify_Begin_SendNotifications_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI AsyncIClusCfgEvictNotify_Finish_SendNotifications_Proxy(AsyncIClusCfgEvictNotify *This);
  void __RPC_STUB AsyncIClusCfgEvictNotify_Finish_SendNotifications_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

  unsigned long __RPC_API BSTR_UserSize(unsigned long *,unsigned long,BSTR *);
  unsigned char *__RPC_API BSTR_UserMarshal(unsigned long *,unsigned char *,BSTR *);
  unsigned char *__RPC_API BSTR_UserUnmarshal(unsigned long *,unsigned char *,BSTR *);
  void __RPC_API BSTR_UserFree(unsigned long *,BSTR *);

#ifdef __cplusplus
}
#endif
#endif
