//////////////////////////////////////////////////////////////////////////////
//
//  Copyright (c) 2000-2002 Microsoft Corporation
//
//  Module Name:
//      ClusCfgServer.idl
//
//  Description:
//      This file is the IDL file for the IClusCfgServer interface of the
//      Cluster Setup application.
//
//      The IClusCfgServer interface provides the functions required to gather
//      information about storage devices, networks, the operating
//      system, etc. on a computer. It also has functions to form a cluster
//      on this computer, to add this node to a cluster, to remove this node
//      from a cluster, etc.
//
//////////////////////////////////////////////////////////////////////////////


// Comments for generated files
cpp_quote( "//////////////////////////////////////////////////////////////////////////////" )
cpp_quote( "//" )
cpp_quote( "// Copyright (c) 2000-2001 Microsoft Corporation" )
cpp_quote( "//" )
cpp_quote( "// Remarks:" )
cpp_quote( "//     Generated file. See file ClusCfgServer.idl for more details." )
cpp_quote( "//" )
cpp_quote( "//////////////////////////////////////////////////////////////////////////////" )


//////////////////////////////////////////////////////////////////////////////
// Imported Files
//////////////////////////////////////////////////////////////////////////////

// For IUnknown
import "unknwn.idl";


////////////////////////////////////////////////////////////////////////////
// Forward Declarations
//////////////////////////////////////////////////////////////////////////////

interface IClusCfgNodeInfo;
interface IEnumClusCfgManagedResources;
interface IClusCfgManagedResourceInfo;
interface IEnumClusCfgNetworks;
interface IEnumClusCfgPartitions;
interface IClusCfgPartitionInfo;
interface IEnumClusCfgIPAddresses;
interface IClusCfgIPAddressInfo;
interface IClusCfgNetworkInfo;
interface IClusCfgClusterInfo;
interface IClusCfgInitialize;
interface IClusCfgCallback;
interface IClusCfgCredentials;
interface IClusCfgCapabilities;

interface IClusCfgManagedResourceCfg;
interface IClusCfgResourcePreCreate;
interface IClusCfgResourceCreate;
interface IClusCfgResourcePostCreate;
interface IClusCfgGroupCfg;
interface IClusCfgResourceTypeInfo;
interface IClusCfgResourceTypeCreate;
interface IClusCfgMemberSetChangeListener;
interface IClusCfgEvictCleanup;
interface IClusCfgManagedResourceData;
interface IClusCfgVerifyQuorum;

//////////////////////////////////////////////////////////////////////////////
// Type Definitions
//////////////////////////////////////////////////////////////////////////////

//
// This enumeration is used to indicate the differetnt usage
// states of a drive letter.
//
typedef enum
{
    dluUNKNOWN = 0,

    dluNO_ROOT_DIRECTORY,
    dluREMOVABLE_DISK,
    dluFIXED_DISK,
    dluNETWORK_DRIVE,
    dluCOMPACT_DISC,
    dluRAM_DISK,
    dluSYSTEM,
    dluUNUSED,

    //
    //  Disks that are on a system bus will have a usage enum that starts from here.
    //

    dluSTART_OF_SYSTEM_BUS = 50,

    dluNO_ROOT_DIRECTORY_SYSTEM_BUS,
    dluREMOVABLE_DISK_SYSTEM_BUS,
    dluFIXED_DISK_SYSTEM_BUS,
    dluNETWORK_DRIVE_SYSTEM_BUS,
    dluCOMPACT_DISC_SYSTEM_BUS,
    dluRAM_DISK_SYSTEM_BUS,
    dluSYSTEM_SYSTEM_BUS,
    dluUNUSED_SYSTEM_BUS,

    dluMAX
} EDriveLetterUsage;

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

//
// This enumeration is used to indicate the mode of the ClusCfgServer commit operation.
//
typedef enum
{
    cmUNKNOWN = 0,
    cmCREATE_CLUSTER,
    cmADD_NODE_TO_CLUSTER,
    cmCLEANUP_NODE_AFTER_EVICT,
    cmMAX
} ECommitMode;

typedef
[
    uuid( FFCF84AD-5892-4f4c-8C22-ACE041D6ACC2 ),
    helpstring( "The reason that Cleanup was called." )
]
enum EClusCfgCleanupReason {
    [ helpstring( "The operation completed successfully" ) ]                    crSUCCESS   = 0,
    [ helpstring( "The operation was cancelled" ) ]                             crCANCELLED = 1,
    [ helpstring( "The operation encountered an error and was terminated" ) ]   crERROR     = 2
} EClusCfgCleanupReason;

typedef
[
    uuid( 1DAF9692-6662-43b1-AD45-D50F7849B0CD ),
    helpstring( "Resource dependency flags" )
]
enum EDependencyFlags
{
    [ helpstring( "Unknown access" ) ]              dfUNKNOWN   = 0,
    [ helpstring( "Shared access resource" ) ]      dfSHARED    = 1,
    [ helpstring( "Exclusive access resource" ) ]   dfEXCLUSIVE = 2
} EDependencyFlags;

//////////////////////////////////////////////////////////////////////////////
// Constant Definitions
//////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////
// Interface Definitions
//////////////////////////////////////////////////////////////////////////////


//****************************************************************************
//++
//
//  interface IClusCfgNodeInfo
//
//  Description:
//      This interface contains information about the node configuration.
//
//--
//****************************************************************************
[
    object,
    uuid( E4B5FA15-DD07-439e-A623-8823524E3D19 ),
    async_uuid( 4F3BB40B-DF27-40a0-B31A-BA18324CEB9D ),
    pointer_default( unique )
]
interface IClusCfgNodeInfo : IUnknown
{
    //
    //  Name
    //

    //////////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  GetName(
    //      [ out ] BSTR * pbstrNameOut
    //      )
    //
    //  Description:
    //      Retrieves the node's fully qualified domain name. e.g.
    //      cluster1.ntdev.microsoft.com.
    //
    //  Parameter:
    //      pbstrNameOut
    //          Pointer to the name of the node. This should be freed by the caller
    //          by calling SysFreeString( ).
    //
    //  Return Values:
    //      S_OK
    //          The call succeeded.
    //
    //      E_OUTOFMEMORY
    //          Out of memory.
    //
    //      other HRESULTs
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////////
    HRESULT
        GetName( [ out ] BSTR * pbstrNameOut );

    //////////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  SetName(
    //      [ in ] LPCWSTR pcszNameIn
    //      )
    //
    //  Description:
    //      Stores the new name for the node. This does not take effect until after
    //      the changes have been commited. This is stubbed out for future
    //      functionality.
    //
    //  Parameter:
    //      pcszNameIn
    //          The new name for the node.
    //
    //  Return Values:
    //      E_NOTIMPL
    //          The call is not implemented.
    //
    //////////////////////////////////////////////////////////////////////////////
    HRESULT
        SetName( [ in, pointer_default( unique ) ] LPCWSTR pcszNameIn );

    //
    // Membership?
    //

    //////////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IsMemberOfCluster( void )
    //
    //  Description:
    //      Call this to determine if the node is part of a cluster.
    //
    //  Return Values:
    //      S_OK
    //          Call succeeded and the result is "TRUE."
    //
    //      S_FALSE
    //          Call succeeded and the result is "FALSE."
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////////
    HRESULT
        IsMemberOfCluster( void );

    //////////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  GetClusterConfigInfo(
    //      [ out ] IClusCfgClusterInfo ** ppClusCfgClusterInfoOut
    //      )
    //
    //  Description:
    //      If it is a member, use this method to obtain an interface to
    //      IClusCfgClusterInfo.
    //
    //  Parameter:
    //      ppClusCfgClusterInfoOut
    //          Pointer to the IClusCfgClusterInfo interface.
    //
    //  Return Values:
    //      S_OK
    //          The call succeeded.
    //
    //      other HRESULTs
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////////
    HRESULT
        GetClusterConfigInfo( [ out ] IClusCfgClusterInfo ** ppClusCfgClusterInfoOut );

    //////////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  GetOSVersion(
    //      [ out ] DWORD * pdwMajorVersionOut,
    //      [ out ] DWORD * pdwMinorVersionOut,
    //      [ out ] WORD *  pwSuiteMaskOut,
    //      [ out ] BYTE *  pbProductTypeOut,
    //      [ out ] BSTR *  pbstrCSDVersionOut
    //      )
    //
    //////////////////////////////////////////////////////////////////////////////
    HRESULT
        GetOSVersion(
            [ out ] DWORD * pdwMajorVersionOut,
            [ out ] DWORD * pdwMinorVersionOut,
            [ out ] WORD *  pwSuiteMaskOut,
            [ out ] BYTE *  pbProductTypeOut,
            [ out ] BSTR *  pbstrCSDVersionOut
            );

    //////////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  GetClusterVersion(
    //      [ out ] DWORD * pdwNodeHighestVersion,
    //      [ out ] DWORD * pdwNodeLowestVersion
    //      )
    //
    //  Description:
    //      Retrieves the version of the cluster.
    //
    //  Parameters:
    //      pdwNodeHighestVersion
    //          The highest version in the cluster.
    //
    //      pdwNodeLowestVersion
    //          The lowest version in the cluster.
    //
    //  Return Values:
    //      S_OK
    //          The call succeeded.
    //
    //      other HRESULTs
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////////
    HRESULT
        GetClusterVersion(
            [ out ] DWORD * pdwNodeHighestVersion,
            [ out ] DWORD * pdwNodeLowestVersion
            );

    //////////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  GetDriveLetterMappings(
    //      [ out ] SDriveLetterMapping dlmDriveLetterUsageOut
    //      )
    //
    //  Description:
    //      Retrieves the drive letter mappings on the node.
    //
    //  Parameter:
    //      rgDriveLetterUsage
    //          An array of flags representing A: thru Z: (26) drive mappings to
    //          the drives. See SDriveLetterMapping for flag values.
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        GetDriveLetterMappings( [ out ] SDriveLetterMapping * pdlmDriveLetterUsageOut );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  GetMaxNodeCount(
    //      [ out ] DWORD * pcMaxNodesOut
    //      )
    //
    //  Description:
    //      Returns the maximun number of nodes for this node's product
    //      suite type.
    //
    //  Notes:
    //
    //  Parameter:
    //      pcMaxNodesOut
    //          The maximum number of nodes allowed by this node's product
    //          suite type.
    //
    //  Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        GetMaxNodeCount(
            [ out ] DWORD * pcMaxNodesOut
            );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  GetProcessorInfo(
    //        [ out ] WORD *    pwProcessorArchitectureOut
    //      , [ out ] WORD *    pwProcessorLevelOut
    //      )
    //
    //  Description:
    //      Returns the processor information for this node.
    //
    //  Notes:
    //
    //  Parameter:
    //      pwProcessorArchitectureOut
    //          The processor architecture.
    //
    //      pwProcessorLevelOut
    //          The processor level.
    //
    //  Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULT
    //          The call failed.
    //
    //  Remarks:
    //      See SYSTEM_INFO in MSDN and/or the Platform SDK for more
    //      information.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        GetProcessorInfo(
              [ out ] WORD *    pwProcessorArchitectureOut
            , [ out ] WORD *    pwProcessorLevelOut
            );

}; //*** interface IClusCfgNodeInfo


//****************************************************************************
//++
//
//  interface IEnumClusCfgManagedResources
//
//  Description:
//      This interface enumerates all resources on this computer that the
//      cluster service can manage.
//
//--
//****************************************************************************
[
    object,
    uuid( 7DBE11EB-A5DF-4534-ABF6-8BAC7B53FC95 ),
    async_uuid( B138483F-9695-4fa6-A98F-0DE2FB355449 ),
    pointer_default( unique )
]
interface IEnumClusCfgManagedResources : IUnknown
{
    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  Next(
    //      [ in ]                                                                 ULONG                            cNumberRequestedIn,
    //      [ out, size_is( cNumberRequestedIn ), length_is(*pcNumberFetchedOut) ] IClusCfgManagedResourceInfo **   rgpManagedResourceInfoOut,
    //      [ out ]                                                                ULONG *                          pcNumberFetchedOut
    //      );
    //
    //  Description:
    //      Retrieves the next cNumberRequestedIn items in the enumeration sequence.
    //      If there are fewer than the requested number of elements left in the
    //      sequence, it retrieves the remaining elements. The number of elements
    //      actually retrieved is returned through pcNumberFetchedOut (unless the
    //      caller passed in NULL for that parameter).
    //
    //  Parameters:
    //      cNumberRequestedIn
    //          number of elements being requested.
    //
    //      rgpManagedResourceInfoOut
    //          Array of size cNumberRequestedIn (or larger) of the elements of interest.
    //          The type of this parameter depends on the item being enumerated.
    //
    //      pcNumberFetchedOut
    //          Pointer to the number of elements actually supplied in
    //          rgpManagedResourceInfoOut. Caller can pass in NULL if cNumberRequestedIn
    //          is one.
    //
    //  Return Values:
    //      S_OK
    //          The number of elements supplied is cNumberRequestedIn
    //
    //      S_FALSE
    //          The number of elements supplied is not cNumberRequestedIn
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        Next(
            [ in ]                                                                 ULONG                            cNumberRequestedIn,
            [ out, size_is( cNumberRequestedIn ), length_is(*pcNumberFetchedOut) ] IClusCfgManagedResourceInfo **   rgpManagedResourceInfoOut,
            [ out ]                                                                ULONG *                          pcNumberFetchedOut
            );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  Reset( void );
    //
    //  Description:
    //      Reset the enumeration sequence to the beginning.
    //
    //  Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        Reset( void );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  Skip(
    //      [ in ] ULONG cNumberToSkip
    //      );
    //
    //  Description:
    //      Skips over the next specified number of elements in the enumeration sequence.
    //
    //  Parameter:
    //      cNumberToSkip
    //          The number of elements to be skipped.
    //
    //  Return Value:
    //      S_OK
    //          The number of elements skipped is cNumberToSkip.
    //
    //      S_FALSE
    //          Success, but you're past the last element.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        Skip( [ in ] ULONG cNumberToSkip );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  Clone(
    //      [ out ] IEnumClusCfgManagedResources ** ppEnumManagedResources
    //      );
    //
    //  Description:
    //      Creates another enumerator that contains the same enumeration state
    //      as the current one. Using this function, a client can record a
    //      particular point in the enumeration sequence, and then return to
    //      that point at a later time. The new enumerator supports the same
    //      interface as the original one.
    //
    //  Return Values:
    //      E_INVALIDARG
    //          ppEnumManagedResources is invalid.
    //
    //      E_OUTOFMEMORY
    //          Out of memory.
    //
    //      E_UNEXPECTED
    //          Unknown error (it's in the EnumXXXX docs).
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        Clone( [ out ] IEnumClusCfgManagedResources ** ppEnumManagedResourcesOut );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  Count(
    //      [ out, ref ] DWORD * pnCountOut
    //      );
    //
    //  Description:
    //      Returns the size (possibly zero) of the enumerator's collection.
    //
    //  Return Values:
    //      E_POINTER
    //          pnCountOut was null.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        Count( [ out, ref ] DWORD * pnCountOut );

}; //*** interface IEnumClusCfgManagedResources


//****************************************************************************
//++
//
//  interface IEnumClusCfgNetworks
//
//  Description:
//      This interface enumerates the networks on this computer.
//
//--
//****************************************************************************
[
    object,
    uuid( CF3FAED8-1322-4bcb-9923-B5B745A69E36 ),
    async_uuid( F56B9B0D-E7B8-49ec-A843-5475076B947D ),
    pointer_default( unique )
]
interface IEnumClusCfgNetworks : IUnknown
{
    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  Next(
    //      [ in ]                                                                 ULONG                    cNumberRequestedIn,
    //      [ out, size_is( cNumberRequestedIn ), length_is(*pcNumberFetchedOut) ] IClusCfgNetworkInfo **   rgpNetworkInfoOut,
    //      [ out ]                                                                ULONG *                  pcNumberFetchedOut
    //      );
    //
    //  Description:
    //      Retrieves the next cNumberRequestedIn items in the enumeration sequence.
    //      If there are fewer than the requested number of elements left in the
    //      sequence, it retrieves the remaining elements. The number of elements
    //      actually retrieved is returned through pcNumberFetchedOut (unless the
    //      caller passed in NULL for that parameter).
    //
    //  Parameters:
    //      cNumberRequestedIn
    //          number of elements being requested.
    //
    //      rgpNetworkInfoOut
    //          Array of size cNumberRequestedIn (or larger) of the elements of interest.
    //          The type of this parameter depends on the item being enumerated.
    //
    //      pcNumberFetchedOut
    //          Pointer to the number of elements actually supplied in
    //          rgpNetworkInfoOut. Caller can pass in NULL if cNumberRequestedIn
    //          is one.
    //
    //  Return Values:
    //      S_OK
    //          The number of elements supplied is cNumberRequestedIn
    //
    //      S_FALSE
    //          The number of elements supplied is not cNumberRequestedIn.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        Next(
            [ in ]                                                                  ULONG                   cNumberRequestedIn,
            [ out, size_is( cNumberRequestedIn ), length_is(*pcNumberFetchedOut) ]  IClusCfgNetworkInfo **  rgpNetworkInfoOut,
            [ out ]                                                                 ULONG *                 pcNumberFetchedOut
            );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  Skip(
    //      [ in ] ULONG cNumberToSkip
    //      );
    //
    //  Description:
    //      Skips over the next specified number of elements in the enumeration sequence.
    //
    //  Parameter:
    //      cNumberToSkip
    //          The number of elements to be skipped.
    //
    //  Return Value:
    //      S_OK
    //          The number of elements skipped is cNumberToSkip.
    //
    //      S_FALSE
    //          Success, but you've past the last element.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        Skip( [ in ] ULONG cNumberToSkipIn );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  Reset( void );
    //
    //  Description:
    //      Reset the enumeration sequence to the beginning.
    //
    //  Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        Reset( void );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  Clone(
    //      [ out ] IEnumClusCfgNetworks ** ppEnumNetworksOut
    //      );
    //
    //  Description:
    //      Creates another enumerator that contains the same enumeration state
    //      as the current one. Using this function, a client can record a
    //      particular point in the enumeration sequence, and then return to
    //      that point at a later time. The new enumerator supports the same
    //      interface as the original one.
    //
    //  Parameter:
    //      ppEnumNetworksOut
    //          Address of IEnumClusCfgManagedResources * pointer variable that receives
    //          the interface pointer to the enumeration object. If the method is
    //          unsuccessful, the value of this output variable is undefined.
    //
    //  Return Values:
    //      E_INVALIDARG
    //          ppEnumNetworksOut is invalid.
    //
    //      E_OUTOFMEMORY
    //          Out of memory.
    //
    //      E_UNEXPECTED
    //          Unknown error (it's in the EnumXXXX docs).
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        Clone( [ out ] IEnumClusCfgNetworks **  ppEnumNetworksOut );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  Count(
    //      [ out, ref ] DWORD * pnCountOut
    //      );
    //
    //  Description:
    //      Returns the size (possibly zero) of the enumerator's collection.
    //
    //  Return Values:
    //      E_POINTER
    //          pnCountOut was null.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        Count( [ out, ref ] DWORD * pnCountOut );

}; //*** interface IEnumClusCfgNetworks


//****************************************************************************
//++
//
//  interface IClusCfgManagedResourceInfo
//
//  Description:
//      This interface encapsulates a manageable resource on this computer.
//
//--
//****************************************************************************
[
    object,
    uuid( 8389D687-DF99-442b-81AB-58BA5B029688 ),
    async_uuid( 0560D153-892F-4bf5-87B0-06AF2803955C ),
    pointer_default( unique )
]
interface IClusCfgManagedResourceInfo : IUnknown
{
    //
    // UID
    //


    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  GetUID(
    //      [ out ] BSTR * pbstrUIDOut
    //      )
    //
    //  Description:
    //      Retrieve the Unique IDentifier for this resource. This is not a Universally
    //      Unique IDentifier (UUID or GUID). This indentifer should match identifiers
    //      that can be generated on other nodes that can see this resource from a shared
    //      bus (such as a SCSI disk).
    //
    //  Parameters:
    //      pbstrUIDOut
    //          Pointer to the UID string. pbstrUIDOut should be freed by the caller
    //          by calling SysFreeString( ).
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      E_OUTOFMEMORY
    //          Out of memory.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        GetUID( [ out ] BSTR * pbstrUIDOut );

    //
    // Name
    //

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  GetName(
    //      [ out ] BSTR * pbstrNameOut
    //      )
    //
    //  Description:
    //      Retrieves a "user friendly" name of the resource.
    //
    //  Parameter:
    //      pbstrNameOut
    //          Pointer to resource name. This should be freed by the caller by calling
    //          SysFreeString( ).
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      E_OUTOFMEMORY
    //          Out of memory.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        GetName( [ out ] BSTR * pbstrNameOut );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  SetName(
    //      [ in ] LPCWSTR pcszNameIn
    //      )
    //
    //  Description:
    //      Stores a new name for the resource to be set when the cluster
    //      configuration is commited.
    //
    //  Parameter:
    //      pcszNameIn
    //          The name of the user wants to assigned the resource.
    //
    //  Return Value:
    //      S_OK
    //          Success.
    //
    //      E_OUTOFMEMORY
    //          Out of memory.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SetName( [ in, pointer_default( unique ) ] LPCWSTR pcszNameIn );

    //
    // Managed by cluster?
    //

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IsManaged( void )
    //
    //  Description:
    //      Call this to determine if the resource is/will be managed by the cluster.
    //
    //      A managed device will always have a resource created for it in the
    //      cluster.
    //
    //  Return Values:
    //      S_OK
    //          Call succeeded and the result is "TRUE."
    //
    //      S_FALSE
    //          Call succeeded and the result is "FALSE."
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        IsManaged( void );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  SetManaged(
    //      [ in ] BOOL fIsManagedIn
    //      )
    //
    //  Description:
    //      Setting this flag will cause the resource to be configured as being managed
    //      by the cluster.
    //
    //  Parameter:
    //      fIsManagedIn
    //          If TRUE, the resource will be marked as being managed by the cluster.
    //
    //      Setting this to TRUE will cause a resource to be created for this device
    //      in the cluster.  Setting this to FALSE will prevent a resource for for
    //      this device from being created in the cluster.
    //
    //  Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SetManaged( [ in ] BOOL fIsManagedIn );

    //
    // Quorum resource?
    //

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IsQuorumResource( void )
    //
    //  Description:
    //      Call this to determine if the resource is/will be set as the quorum
    //      resource.
    //
    //  Return Values:
    //      S_OK
    //          Call succeeded and the result is "TRUE."
    //
    //      S_FALSE
    //          Call succeeded and the result is "FALSE."
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        IsQuorumResource( void );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  SetQuorumResource(
    //      [ in ] BOOL fIsQuorumResourceIn
    //      )
    //
    //  Description:
    //      Setting this flag will cause the resource to be configured as the
    //      quorum resource in the cluster.
    //
    //  Parameter:
    //      fIsQuorumResourceIn
    //          If TRUE, the resource will be marked to be the quorum resource.
    //
    //  Return Value:
    //      S_OK
    //          Success.
    //
    //      HRESULT_FROM_WIN32( ERROR_NOT_QUORUM_CAPABLE )
    //          You tried to set a resource to be the quorum when the resource
    //          is not capable of being a quorum resource.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SetQuorumResource( [ in ] BOOL fIsQuorumResourceIn );

    //
    // Quorum Capable?
    //

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IsQuorumCapable( void )
    //
    //  Description:
    //      Call this to determine if the resource is capable be set as the quorum
    //      resource.
    //
    //  Return Values:
    //      S_OK
    //          Call succeeded and the result is "TRUE."
    //
    //      S_FALSE
    //          Call succeeded and the result is "FALSE."
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        IsQuorumCapable( void );

    //
    // Set Quorum Capable
    //

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  SetQuorumCapable(
    //      [ in ] BOOL fIsQuorumCapableIn
    //      )
    //
    //  Description:
    //      Call this to set whether the resource is capable to be the quorum
    //      resource or not.
    //
    //  Parameter:
    //      fSetQuorumCapableIn
    //          If TRUE, the resource will be marked as quorum capable.
    //
    //  Return Values:
    //      S_OK
    //          Call succeeded.
    //      E_NOTIMPL
    //          The call is not implemented.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SetQuorumCapable( [ in ] BOOL fIsQuorumCapableIn );

    //
    // Drive Letter Mapping
    //

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  GetDriveLetterMappings(
    //      [ out ] SDriveLetterMapping dlmDriveLetterMappingsOut
    //      )
    //
    //  Description:
    //      Retrieves the drive mappings for the resource (if any).
    //
    //  Parameter:
    //      rgDriveLetterMappings
    //          An array of flags representing A: thru Z: (26) drive mappings to
    //          the resource. See SDriveLetterMapping for flag values.
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        GetDriveLetterMappings( [ out ] SDriveLetterMapping * pdlmDriveLetterMappingOut );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  SetDriveLetterMappings(
    //      [ in ] SDriveLetterMapping dlmDriveLetterMappingIn
    //      )
    //
    //  Description:
    //      Stores the drive mappings for the resource. The change will not take
    //      effect until the configuration has been committed.
    //
    //  Parameter:
    //      rgDriveLetterMappings
    //          An array of flags representing A: thru Z: (26) drive mappings to
    //          the resource. See EDriveLetterUsage for flag values.
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SetDriveLetterMappings( [ in ] SDriveLetterMapping dlmDriveLetterMappingIn );

    //
    // Manageable by the cluster?
    //

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IsManagedByDefault( void )
    //
    //  Description:
    //      Call this to determine if the resource wants to be managed by default
    //      by the cluster.
    //
    //      When doing a full configuration all devices that are
    //      managed by default will be have resources created for them
    //      in the cluster and will therefore be managed by the cluster.
    //      When doing a minimum configuration resources will not be created
    //      for any devices that want to be managed by default by the cluster.
    //
    //  Return Values:
    //      S_OK
    //          Call succeeded and the result is "TRUE."
    //
    //      S_FALSE
    //          Call succeeded and the result is "FALSE."
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        IsManagedByDefault( void );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  SetManagedByDefault(
    //      [ in ] BOOL fIsManageableIn
    //      )
    //
    //  Description:
    //      Setting this flag will cause the resource to be managed by default
    //      by the cluster.
    //
    //  Parameter:
    //      fIsManagedByDefaultIn
    //          If TRUE, the resource will be marked as being managed by default
    //          by the cluster.
    //
    //      Setting this to TRUE will cause a cluster resource to be created for
    //      this device by default when doing a full configuration.  By
    //      setting this to FALSE the device will not have a resource created
    //      for it in the cluster by default.
    //
    //  Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SetManagedByDefault( [ in ] BOOL fIsManagedByDefaultIn );

}; //*** interface IClusCfgManagedResourceInfo

//****************************************************************************
//++
//
//  interface IEnumClusCfgPartitions
//
//  Description:
//      This interface enumerates the partitions on a storage device that the
//      cluster service can manage.
//
//--
//****************************************************************************
[
    object,
    uuid( 4440BB6A-B0AC-479d-B534-7265A31D6C55 ),
    async_uuid( 4440BB6A-B0AC-479d-B534-7265A31D6C56 ),
    pointer_default( unique )
]
interface IEnumClusCfgPartitions : IUnknown
{
    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  Next(
    //      [ in ]                                                                 ULONG                    cNumberRequestedIn,
    //      [ out, size_is( cNumberRequestedIn ), length_is(*pcNumberFetchedOut) ] IClusCfgPartitionInfo ** rgpPartitionInfoOut,
    //      [ out ]                                                                ULONG *                  pcNumberFetchedOut
    //      );
    //
    //  Description:
    //      Retrieves the next cNumberRequestedIn items in the enumeration sequence.
    //      If there are fewer than the requested number of elements left in the
    //      sequence, it retrieves the remaining elements. The number of elements
    //      actually retrieved is returned through pcNumberFetchedOut (unless the
    //      caller passed in NULL for that parameter).
    //
    //  Parameters:
    //      cNumberRequestedIn
    //          number of elements being requested.
    //
    //      rgpPartitionInfoOut
    //          Array of size cNumberRequestedIn (or larger) of the elements of interest.
    //          The type of this parameter depends on the item being enumerated.
    //
    //      pcNumberFetchedOut
    //          Pointer to the number of elements actually supplied in
    //          rgpPartitionInfoOut. Caller can pass in NULL if cNumberRequestedIn
    //          is one.
    //
    //  Return Values:
    //      S_OK
    //          The number of elements supplied is cNumberRequestedIn
    //
    //      S_FALSE
    //          The number of elements supplied is not cNumberRequestedIn
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        Next(
            [ in ]                                                                 ULONG                    cNumberRequestedIn,
            [ out, size_is( cNumberRequestedIn ), length_is(*pcNumberFetchedOut) ] IClusCfgPartitionInfo ** rgpPartitionInfoOut,
            [ out ]                                                                ULONG *                  pcNumberFetchedOut
            );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  Reset( void );
    //
    //  Description:
    //      Reset the enumeration sequence to the beginning.
    //
    //  Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        Reset( void );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  Skip(
    //      [ in ] ULONG cNumberToSkip
    //      );
    //
    //  Description:
    //      Skips over the next specified number of elements in the enumeration sequence.
    //
    //  Parameter:
    //      cNumberToSkip
    //          The number of elements to be skipped.
    //
    //  Return Value:
    //      S_OK
    //          The number of elements skipped is cNumberToSkip.
    //
    //      S_FALSE
    //          Success, but you've past the last element.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        Skip( [ in ] ULONG cNumberToSkip );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  Clone(
    //      [ out ] IEnumClusCfgPartitions ** ppEnumPartitions
    //      );
    //
    //  Description:
    //      Creates another enumerator that contains the same enumeration state
    //      as the current one. Using this function, a client can record a
    //      particular point in the enumeration sequence, and then return to
    //      that point at a later time. The new enumerator supports the same
    //      interface as the original one.
    //
    //  Return Values:
    //      E_INVALIDARG
    //          ppEnumPartitions is invalid.
    //
    //      E_OUTOFMEMORY
    //          Out of memory.
    //
    //      E_UNEXPECTED
    //          Unknown error (it's in the EnumXXXX docs).
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        Clone( [ out ] IEnumClusCfgPartitions ** ppEnumPartitions );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  Count(
    //      [ out, ref ] DWORD * pnCountOut
    //      );
    //
    //  Description:
    //      Returns the size (possibly zero) of the enumerator's collection.
    //
    //  Return Values:
    //      E_POINTER
    //          pnCountOut was null.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        Count( [ out, ref ] DWORD * pnCountOut );

}; //*** interface IEnumClusCfgPartitions


//****************************************************************************
//++
//
//  interface IClusCfgPartitionInfo
//
//  Description:
//      This interface provides the partition info.
//
//--
//****************************************************************************
[
    object,
    uuid( EC1EBD9F-5866-4846-8952-EC36C3961EEE ),
    async_uuid( EC1EBD9F-5866-4846-8952-EC36C3961EEF ),
    pointer_default( unique )
]
interface IClusCfgPartitionInfo : IUnknown
{
    //
    // UID
    //

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  GetUID(
    //      [ out ] BSTR * pbstrUIDOut
    //      )
    //
    //  Description:
    //      Retrieve the "Unique IDentifier" for this partition. This is not a Universally
    //      Unique IDentifier (UUID or GUID). This indentifer should match identifiers
    //      that can be generated on other nodes, but must be unique for the partition
    //      the interface (NIC) is on.
    //
    //  Parameters:
    //      pbstrUIDOut
    //          Pointer to the UID string. pbstrUIDOut should be freed by the caller
    //          by calling SysFreeString( ).
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      E_OUTOFMEMORY
    //          Out of memory.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        GetUID( [ out ] BSTR * pbstrUIDOut );

    //
    // Name
    //

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  GetName(
    //      [ out ] BSTR * pbstrNameOut
    //      )
    //
    //  Description:
    //      Retrieves a "user friendly" name of the interface.
    //
    //  Parameter:
    //      pbstrNameOut
    //          Pointer to partition interface name. This should be freed by the caller
    //          by calling SysFreeString( ).
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      E_OUTOFMEMORY
    //          Out of memory.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        GetName( [ out ] BSTR * pbstrNameOut );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  SetName(
    //      [ in ] LPCWSTR pcszNameIn
    //      )
    //
    //  Description:
    //      Stores a new name of the partition interface to be set when the cluster
    //      configuration is commited.
    //
    //  Parameter:
    //      pcszNameIn
    //          The name of the user wants to assigned the interface.
    //
    //  Return Value:
    //      S_OK
    //          Success.
    //
    //      E_OUTOFMEMORY
    //          Out of memory.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SetName( [ in, pointer_default( unique ) ] LPCWSTR pcszNameIn );

    //
    // Description
    //

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  GetDescription(
    //      [ out ] BSTR * pbstrDescriptionOut
    //      )
    //
    //  Description:
    //      Retrieves the description string for a partition interface.
    //
    //  Parameter:
    //      pbstrDescription
    //          Pointer to the description of the partition. This should be freed
    //          by the caller by calling SysFreeString( ).
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      E_OUTOFMEMORY
    //          Out of memory.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        GetDescription( [ out ] BSTR * pbstrDescriptionOut );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  SetDescription(
    //      [ in ] LPCWSTR pcszDescriptionIn
    //      )
    //
    //  Description:
    //      Stores a new name of the partition interface to be set when the cluster
    //      configuration is commited.
    //
    //  Parameter:
    //      pcszDescriptionIn
    //          The description the user wants to assign to the interface.
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      E_OUTOFMEMORY
    //          Out of memory.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SetDescription(
            [ in, pointer_default( unique ) ] LPCWSTR pcszDescriptionIn
            );

    //
    // Drive Letter Mapping
    //

    //////////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  GetDriveLetterMappings(
    //      [ out ] SDriveLetterMapping dlmDriveLetterUsageOut
    //      )
    //
    //  Description:
    //      Retrieves the drive letter mappings of the partition.
    //
    //  Parameter:
    //      rgDriveLetterUsage
    //          An array of flags representing A: thru Z: (26) drive mappings to
    //          the disk. See SDriveLetterMapping for flag values.
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        GetDriveLetterMappings( [ out ] SDriveLetterMapping * pdlmDriveLetterUsageOut );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  SetDriveLetterMappings(
    //      [ in ] SDriveLetterMapping dlmDriveLetterMappingIn
    //      )
    //
    //  Description:
    //      Stores the drive mappings for the disk. The change will not take
    //      effect until the configuration has been committed.
    //
    //  Parameter:
    //      rgDriveLetterMappings
    //          An array of flags representing A: thru Z: (26) drive mappings to
    //          the disk. See EDriveLetterUsage for flag values.
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SetDriveLetterMappings( [ in ] SDriveLetterMapping dlmDriveLetterMappingIn );

    //
    // Partition Size
    //

    //////////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  GetSize(
    //      [ out ] ULONG * pcMegaBytes
    //      )
    //
    //  Description:
    //      Retrieves the size of the partition in Megabytes.
    //
    //  Parameter:
    //      pcMegaBytes
    //          Retrieves the partition size.
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        GetSize( [ out ] ULONG * pcMegaBytes );

}; //*** interface IClusCfgPartitionInfo


//****************************************************************************
//++
//
//  interface IEnumClusCfgIPAddresses
//
//  Description:
//      This interface enumerates the IP addresses on this adapter.
//
//--
//****************************************************************************
[
    object,
    uuid( BD5F35BA-0BC0-455f-926D-C3D356419486 ),
    async_uuid( BD5F35BA-0BC0-455f-926D-C3D356419487 ),
    pointer_default( unique )
]
interface IEnumClusCfgIPAddresses : IUnknown
{
    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  Next(
    //      [ in ]                                                                 ULONG                    cNumberRequestedIn,
    //      [ out, size_is( cNumberRequestedIn ), length_is(*pcNumberFetchedOut) ] IClusCfgIPAddressInfo ** rgpIPAddressInfoOut,
    //      [ out ]                                                                ULONG *                  pcNumberFetchedOut
    //      );
    //
    //  Description:
    //      Retrieves the next cNumberRequestedIn items in the enumeration sequence.
    //      If there are fewer than the requested number of elements left in the
    //      sequence, it retrieves the remaining elements. The number of elements
    //      actually retrieved is returned through pcNumberFetchedOut (unless the
    //      caller passed in NULL for that parameter).
    //
    //  Parameters:
    //      cNumberRequestedIn
    //          number of elements being requested.
    //
    //      rgpIPAddressInfoOut
    //          Array of size cNumberRequestedIn (or larger) of the elements of interest.
    //          The type of this parameter depends on the item being enumerated.
    //
    //      pcNumberFetchedOut
    //          Pointer to the number of elements actually supplied in
    //          rgpIPAddressInfoOut. Caller can pass in NULL if cNumberRequestedIn
    //          is one.
    //
    //  Return Values:
    //      S_OK
    //          The number of elements supplied is cNumberRequestedIn
    //
    //      S_FALSE
    //          The number of elements supplied is not cNumberRequestedIn.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        Next(
            [ in ]                                                                  ULONG                       cNumberRequestedIn,
            [ out, size_is( cNumberRequestedIn ), length_is(*pcNumberFetchedOut) ]  IClusCfgIPAddressInfo **    rgpIPAddressInfoOut,
            [ out ]                                                                 ULONG *                     pcNumberFetchedOut
            );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  Skip(
    //      [ in ] ULONG cNumberToSkip
    //      );
    //
    //  Description:
    //      Skips over the next specified number of elements in the enumeration sequence.
    //
    //  Parameter:
    //      cNumberToSkip
    //          The number of elements to be skipped.
    //
    //  Return Value:
    //      S_OK
    //          The number of elements skipped is cNumberToSkip.
    //
    //      S_FALSE
    //          Success, but you've past the last element.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        Skip( [ in ] ULONG cNumberToSkipIn );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  Reset( void );
    //
    //  Description:
    //      Reset the enumeration sequence to the beginning.
    //
    //  Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        Reset( void );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  Clone(
    //      [ out ] IEnumClusCfgIPAddresses ** ppEnumIPAddressesOut
    //      );
    //
    //  Description:
    //      Creates another enumerator that contains the same enumeration state
    //      as the current one. Using this function, a client can record a
    //      particular point in the enumeration sequence, and then return to
    //      that point at a later time. The new enumerator supports the same
    //      interface as the original one.
    //
    //  Parameter:
    //      ppEnumIPAddressesOut
    //          Address of IEnumClusCfgManagedResources * pointer variable that receives
    //          the interface pointer to the enumeration object. If the method is
    //          unsuccessful, the value of this output variable is undefined.
    //
    //  Return Values:
    //      E_INVALIDARG
    //          ppEnumIPAddressesOut is invalid.
    //
    //      E_OUTOFMEMORY
    //          Out of memory.
    //
    //      E_UNEXPECTED
    //          Unknown error (it's in the EnumXXXX docs).
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        Clone( [ out ] IEnumClusCfgIPAddresses **  ppEnumIPAddressesOut );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  Count(
    //      [ out, ref ] DWORD * pnCountOut
    //      );
    //
    //  Description:
    //      Returns the size (possibly zero) of the enumerator's collection.
    //
    //  Return Values:
    //      E_POINTER
    //          pnCountOut was null.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        Count( [ out, ref ] DWORD * pnCountOut );

}; //*** interface IEnumClusCfgIPAddresses


//****************************************************************************
//++
//
//  interface IClusCfgIPAddressInfo
//
//  Description:
//      This interface encapsulates the info about an IP address.
//
//--
//****************************************************************************
[
    object,
    uuid( AAEAF0A5-E310-4604-A55E-2F9DDC4157A8 ),
    async_uuid( AAEAF0A5-E310-4604-A55E-2F9DDC4157A9 ),
    pointer_default( unique )
]
interface IClusCfgIPAddressInfo : IUnknown
{
    //
    // UID
    //

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  GetUID(
    //      [ out ] BSTR * pbstrUIDOut
    //      )
    //
    //  Description:
    //      Retrieve the "Unique IDentifier" for this IP address. This is not a Universally
    //      Unique IDentifier (UUID or GUID). This indentifer should match identifiers
    //      that can be generated on other nodes, but must be unique for the network
    //      the interface (NIC) is on.
    //
    //  Parameters:
    //      pbstrUIDOut
    //          Pointer to the UID string. pbstrUIDOut should be freed by the caller
    //          by calling SysFreeString( ).
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      E_OUTOFMEMORY
    //          Out of memory.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        GetUID( [ out ] BSTR * pbstrUIDOut );

    //
    // IP Address
    //

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  GetIPAddress(
    //      [ out ] ULONG * pulDottedQuadOut
    //      )
    //
    //  Description:
    //      Retrieves an IP Address for the network inteface.
    //
    //  Paramater:
    //      pulDottedQuadOut
    //          The IP address of the interface in dotted quad format.
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        GetIPAddress( [ out ] ULONG * pulDottedQuadOut );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  SetIPAddress(
    //      [ in ] ULONG ulDottedQuadIn
    //      )
    //
    //  Description:
    //      Stores an IP Address of the network interface to be set when the cluster
    //      configuration is committed.
    //
    //  Parameter:
    //      ulDottedQuadIn
    //          The IP address of the interface to be stored in dotted quad format.
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SetIPAddress( [ in ] ULONG ulDottedQuadIn );

    //
    // Subnet Mask
    //

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  GetSubnetMask(
    //      [ out ] ULONG * pulDottedQuadOut
    //      )
    //
    //  Description:
    //      Retrieves a subnet mask for the network interface.
    //
    //  Parameter:
    //      ulDottedQuadOut
    //          The subnet mask of the interface in dotted quad format.
    //
    //  Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        GetSubnetMask( [ out ] ULONG * pulDottedQuadOut );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  SetSubnetMask(
    //      [ in ] ULONG ulDottedQuadIn
    //      )
    //
    //  Description:
    //      Stores a subnet mask for the network interface to be set when the cluster
    //      configuration is committed.
    //
    //  Parameter:
    //      ulDottedQuadIn
    //          The subnet mask of the interface to be stored in dotted quad format.
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SetSubnetMask( [ in ] ULONG ulDottedQuadIn );

}; //*** interface IClusCfgIPAddressInfo


//****************************************************************************
//++
//
//  interface IClusCfgNetworkInfo
//
//  Description:
//      This interface enumerates the networks on this computer.
//
//--
//****************************************************************************
[
    object,
    uuid( 19FC7580-950A-44a6-966E-74B14B20918F ),
    async_uuid( ED71FD2D-AD02-4dfc-B376-5FFA5F5A7C2C ),
    pointer_default( unique )
]
interface IClusCfgNetworkInfo : IUnknown
{
    //
    // UID
    //

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  GetUID(
    //      [ out ] BSTR * pbstrUIDOut
    //      )
    //
    //  Description:
    //      Retrieve the "Unique IDentifier" for this network. This is not a Universally
    //      Unique IDentifier (UUID or GUID). This indentifer should match identifiers
    //      that can be generated on other nodes, but must be unique for the network
    //      the interface (NIC) is on.
    //
    //  Parameters:
    //      pbstrUIDOut
    //          Pointer to the UID string. pbstrUIDOut should be freed by the caller
    //          by calling SysFreeString( ).
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      E_OUTOFMEMORY
    //          Out of memory.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        GetUID( [ out ] BSTR * pbstrUIDOut );

    //
    // Name
    //

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  GetName(
    //      [ out ] BSTR * pbstrNameOut
    //      )
    //
    //  Description:
    //      Retrieves a "user friendly" name of the interface.
    //
    //  Parameter:
    //      pbstrNameOut
    //          Pointer to network interface name. This should be freed by the caller
    //          by calling SysFreeString( ).
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      E_OUTOFMEMORY
    //          Out of memory.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        GetName( [ out ] BSTR * pbstrNameOut );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  SetName(
    //      [ in ] LPCWSTR pcszNameIn
    //      )
    //
    //  Description:
    //      Stores a new name of the network interface to be set when the cluster
    //      configuration is commited.
    //
    //  Parameter:
    //      pcszNameIn
    //          The name of the user wants to assigned the interface.
    //
    //  Return Value:
    //      S_OK
    //          Success.
    //
    //      E_OUTOFMEMORY
    //          Out of memory.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SetName( [ in, pointer_default( unique ) ] LPCWSTR pcszNameIn );

    //
    // Description
    //

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  GetDescription(
    //      [ out ] BSTR * pbstrDescriptionOut
    //      )
    //
    //  Description:
    //      Retrieves the description string for a network interface.
    //
    //  Parameter:
    //      pbstrDescription
    //          Pointer to the description of the network. This should be freed
    //          by the caller by calling SysFreeString( ).
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      E_OUTOFMEMORY
    //          Out of memory.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        GetDescription( [ out ] BSTR * pbstrDescriptionOut );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  SetDescription(
    //      [ in ] LPCWSTR pcszDescriptionIn
    //      )
    //
    //  Description:
    //      Stores a new name of the network interface to be set when the cluster
    //      configuration is commited.
    //
    //  Parameter:
    //      pcszDescriptionIn
    //          The description the user wants to assign to the interface.
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      E_OUTOFMEMORY
    //          Out of memory.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SetDescription(
            [ in, pointer_default( unique ) ] LPCWSTR pcszDescriptionIn
            );

    //
    // Network Address
    //

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  GetPrimaryNetworkAddress(
    //      [ out ] IClusCfgIPAddressInfo ** ppIPAddressOut
    //      )
    //
    //  Description:
    //      Get the primary network address.
    //
    //  Parameter:
    //      ppIPAddressOut
    //          Pointer to the IClusCfgIPAddressInfo interface.
    //
    //  Return Values:
    //      S_OK
    //          The call succeeded.
    //
    //      other HRESULTs
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        GetPrimaryNetworkAddress( [ out ] IClusCfgIPAddressInfo ** ppIPAddressOut );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  SetPrimaryNetworkAddress(
    //      [ in ] IClusCfgIPAddressInfo * pIPAddressIn
    //      )
    //
    //  Description:
    //      Set the primary network address.
    //
    //  Parameter:
    //      pIPAddressIn
    //          Pointer to the IClusCfgIPAddressInfo interface.
    //
    //  Return Values:
    //      S_OK
    //          The call succeeded.
    //
    //      other HRESULTs
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SetPrimaryNetworkAddress( [ in ] IClusCfgIPAddressInfo * pIPAddressIn );

    //
    // Public?
    //

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IsPublic( void )
    //
    //  Description:
    //      Call this to determine if the network has been configured to be a
    //      public network. Note that an interface can be both public and private.
    //
    //  Return Values:
    //      S_OK
    //          Call succeeded and the result is "TRUE."
    //
    //      S_FALSE
    //          Call succeeded and the result is "FALSE."
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        IsPublic( void );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  SetPublic(
    //      [ in ] BOOL fIsPublicIn
    //      )
    //
    //  Description:
    //      Sets the "public property" of a network interface. The change will not
    //      take effect until the configuration has been committed.
    //
    //  Parameter:
    //      fIsPublicIn
    //          If TRUE, the interface will be marked to be a public interface.
    //
    //  Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SetPublic( [ in ] BOOL fIsPublicIn );

    //
    // Private?
    //

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IsPrivate( void )
    //
    //  Description:
    //      Call this to determine if the network has been configured to be a
    //      private network. Note that an interface can be both public and private.
    //
    //  Return Values:
    //      S_OK
    //          Call succeeded and the result is "TRUE."
    //      S_FALSE
    //          Call succeeded and the result is "FALSE."
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        IsPrivate( void );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  SetPrivate(
    //      [ in ] BOOL fIsPrivateIn
    //      )
    //
    //  Description:
    //      Sets the "private property" of a network interface. The change will not
    //      take effect until the configuration has been committed.
    //
    //  Parameter:
    //      fIsPrivateIn
    //          Value to set the flag to. If TRUE the interface will be marked as
    //          a private interface. If FALSE the interface will be marked as NOT
    //          a private interface.
    //
    //  Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SetPrivate( [ in ] BOOL fIsPrivateIn );

}; //*** interface IClusCfgNetworkInfo


//****************************************************************************
//++
//
//  interface IClusCfgClusterInfo
//
//  Description:
//      This interface contains information about the cluster configuration.
//
//--
//****************************************************************************
[
    object,
    uuid( 85B4BBC0-DDC4-4ae7-8268-F4850BB2A6EE ),
    async_uuid( 8BDBA247-04F5-4114-837E-B263412A4B64 ),
    pointer_default( unique )
]
interface IClusCfgClusterInfo : IUnknown
{
    //
    // CommitChanges Mode
    //

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  SetCommitMode(
    //      [ in ] ECommitMode ecmNewModeIn
    //      )
    //
    //  Description:
    //      Sets the CommitChanges processing to be the new mode that
    ///     is passed in.
    //
    //  Parameter:
    //      eccbNewModeIn
    //          The new mode to set the CommitChanges processing to.
    //
    //  Return Values:
    //      S_OK
    //          Call succeed.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SetCommitMode( [ in ] ECommitMode ecmNewModeIn );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  GetCommitMode(
    //      [ out ] ECommitMode * pecmCurrentModeOut
    //      )
    //
    //  Description:
    //      Call this to determine the operation that will be done when
    //      CommitChanges is invoked.
    //
    //  Parameter:
    //      pecmCurrentModeOut
    //          The current mode for CommitChanges processing.
    //
    //  Return Values:
    //      S_OK
    //          Call succeeded.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        GetCommitMode( [ out ] ECommitMode * pecmCurrentModeOut );

    //
    //  Cluster Name
    //

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  GetName(
    //      [ out ] BSTR * pbstrNameOut
    //      )
    //
    //  Description:
    //      Retrieves the name of the cluster to be formed or joined.
    //
    //  Notes:
    //      Name (Fully Qualified Domiain Name) e.g. cluster1.ntdev.microsoft.com
    //
    //      In Forming the cluster, this is the resulting cluster name.
    //      In Joining the cluster, this is the sponsers cluster name.
    //
    //  Parameter:
    //      pbstrNameOut
    //          Pointer to cluster name. This should be freed by the caller by calling
    //          SysFreeString( ).
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      E_OUTOFMEMORY
    //          Out of memory.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        GetName( [ out ] BSTR * pbstrNameOut );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  SetName(
    //      [ in ] LPCWSTR pcszNameIn
    //      )
    //
    //  Description:
    //      Stores a new name for the cluster to be set when the cluster
    //      configuration is commited. If the node is joining, then this will
    ///     will be the cluster to be joined.
    //
    //  Notes:
    //      Name (Fully Qualified Domiain Name) e.g. cluster1.ntdev.microsoft.com
    //
    //      In Forming the cluster, this is the resulting cluster name.
    //      In Joining the cluster, this is the sponsers cluster name.
    //
    //  Parameter:
    //      pcszNameIn
    //          The name of the user wants to assign to the cluster.
    //
    //  Return Value:
    //      S_OK
    //          Success.
    //
    //      E_OUTOFMEMORY
    //          Out of memory.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SetName( [ in, pointer_default( unique ) ] LPCWSTR pcszNameIn );

    //
    // Cluster IP Address
    //

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  GetIPAddress(
    //      [ out ] ULONG * pulDottedQuadOut
    //      )
    //
    //  Description:
    //      Retrieves the IP address of the cluster.
    //
    //  Parameter:
    //      pulDottedQuadOut
    //          The IP address of the cluster in dotted quad format.
    //
    //  Return Value:
    //      S_OK
    //          The call succeeded.
    //
    //      other HRESULTs
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        GetIPAddress( [ out ] ULONG * pulDottedQuadOut );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  SetIPAddress(
    //      [ in ] ULONG ulDottedQuadIn
    //      )
    //
    //  Description:
    //      Stores the IP address to be used to form the cluster. If joining,
    //      this is the IP address of the sponsor.
    //
    //  Parameter:
    //      ulDottedQuadIn
    //          IP address in dotted quad format.
    //
    //  Return Value:
    //      S_OK
    //          The call succeeded.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SetIPAddress( [ in ] ULONG ulDottedQuadIn );


    //
    // Cluster Subnet Mask
    //


    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  GetSubnetMask(
    //      [ out ] ULONG * pulDottedQuadOut
    //      )
    //
    //  Description:
    //      Retrieves the subnet mask to be used for the cluster.
    //
    //  Parameter:
    //      pulDottedQuadOut
    //          Subnet mask of the cluster in dotted quad format.
    //
    //  Return Values:
    //      S_OK
    //          The call succeeded.
    //
    //      other HRESULTs
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        GetSubnetMask( [ out ] ULONG * pulDottedQuadOut );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  SetSubnetMask(
    //      [ in ] ULONG ulDottedQuadIn
    //      )
    //
    //  Description:
    //      Stores the subnet mask to be used to form the cluster. If joining,
    //      this is the subnet mask of the sponsor.
    //
    //  Parameter:
    //      ulDottedQuadIn
    //          Subnet mask in dotted quad format.
    //
    //  Return Values:
    //      S_OK
    //          The call succeeded.
    //
    //      other HRESULTs
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SetSubnetMask( [ in ] ULONG ulDottedQuadIn );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  GetNetworkInfo(
    //      [ out ] IClusCfgNetworkInfo ** ppiccniOut
    //      )
    //
    //  Description:
    //      Retrieves the network to be used for the cluster IP address
    //      and name.
    //
    //  Parameter:
    //      ppiccniOut
    //          Pointer of the network to use for the cluster IP address
    //          and name.
    //
    //  Return Values:
    //      S_OK
    //          The call succeeded.
    //
    //      other HRESULTs
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        GetNetworkInfo( [ out ] IClusCfgNetworkInfo ** ppiccniOut );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  SetNetworkInfo(
    //      [ in ] IClusCfgNetworkInfo * piccniIn
    //      )
    //
    //  Description:
    //      Stores the network to be used for the cluster IP address and name.
    //
    //  Parameter:
    //      piccniIn
    //          Pointer to the network to use for the cluster IP address
    //          and name.
    //
    //  Return Values:
    //      S_OK
    //          The call succeeded.
    //
    //      other HRESULTs
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SetNetworkInfo( [ in ] IClusCfgNetworkInfo * piccniIn );

    //
    // Cluster Service Account
    //

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  GetClusterServiceAccountCredentials(
    //      [ out ] IClusCfgCredentials ** ppicccCredentialsOut
    //      )
    //
    //  Description:
    //      Retrieves the cluster service account credentials used by the
    //      cluster for authenication. The password is not available from the
    //      sponsor node and must be supplied by the user. Once supplied, it can
    //      be retrieved by calling this method.
    //
    //  Parameters:
    //      ppicccCredentialsOut
    //          An IClusCfgCredentials * that contains the cluster
    //          service account credentials.
    //
    //  Return Values:
    //      S_OK
    //          The called succeeded.
    //
    //      E_OUTOFMEMORY
    //          Out of memory.
    //
    //      other HRESULTs
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        GetClusterServiceAccountCredentials(
            [ out ] IClusCfgCredentials ** ppicccCredentialsOut
            );

    //
    //  Cluster Binding String
    //

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  GetBindingString(
    //      [ out ] BSTR * pbstrBindingStringOut
    //      )
    //
    //  Description:
    //      Retrieves the binding string (IP address) of the cluster to be
    //      formed or joined.
    //
    //  Notes:
    //
    //  Parameter:
    //      pbstrBindingStringOut
    //          Pointer to a BSTR. This should be freed by the caller by
    //          calling SysFreeString( ).
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      E_OUTOFMEMORY
    //          Out of memory.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        GetBindingString( [ out ] BSTR * pbstrBindingStringOut );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  SetBindingString(
    //      [ in ] LPCWSTR pcszBindingStringIn
    //      )
    //
    //  Description:
    //      Stores the binding string for the cluster.
    //
    //  Notes:
    //
    //  Parameter:
    //      pcszBindingStringIn
    //          The binding string to use when connecting to this cluster.
    //
    //  Return Value:
    //      S_OK
    //          Success.
    //
    //      E_OUTOFMEMORY
    //          Out of memory.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SetBindingString(
            [ in, pointer_default( unique ) ] LPCWSTR pcszBindingStringIn
            );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  GetMaxNodeCount(
    //      [ out ] DWORD * pcMaxNodesOut
    //      )
    //
    //  Description:
    //      Returns the maximun number of nodes supported in this cluster.
    //
    //  Notes:
    //
    //  Parameter:
    //      pcMaxNodesOut
    //          The maximum number of nodes allowed in this cluster.
    //
    //  Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        GetMaxNodeCount(
            [ out ] DWORD * pcMaxNodesOut
            );

}; //*** interface IClusCfgClusterInfo


//****************************************************************************
//++
//
//  interface IClusCfgInitialize
//
//  Description:
//      This interface is used to initialize a configuration object.
//
//--
//****************************************************************************
[
    object,
    uuid( 2A0EB82D-F878-492a-951E-AE000918C4A6 ),
    async_uuid( 2A0EB82E-F878-492a-951E-AE000918C4A6 ),
    pointer_default( unique )
]
interface IClusCfgInitialize : IUnknown
{
    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  Initialize(
    //      [ in ] IUnknown *   punkCallbackIn,
    //      [ in ] LCID         lcidIn
    //      )
    //
    //  Description:
    //      Register callbacks, locale id, etc.
    //
    //  Parameters:
    //      punkCallbackIn
    //          The callback interface.
    //
    //      lcidIn
    //          The locale ID to be used for strings that are passed.
    //
    //  Return Values:
    //      S_OK
    //          The initialization succeeded.
    //
    //      other HRESULTs
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        Initialize(
            [ in ] IUnknown *   punkCallbackIn,
            [ in ] LCID         lcidIn
            );

}; //*** interface IClusCfgInitialize


//****************************************************************************
//++
//
//  interface IClusCfgCallback
//
//  Description:
//      This interface is used to callback to the client to indicate
//      status or progess (or both) about a task being completed on the
//      server.
//
//--
//****************************************************************************
[
    object,
    uuid( 238DCA63-E2EF-4f32-A24D-ACBF975BE842 ),
    async_uuid( EBCE8945-AC69-4b3a-865D-E2D4EB33E41B ),
    pointer_default( unique )
]
interface IClusCfgCallback : IUnknown
{
    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  SendStatusReport(
    //      [ in ]  LPCWSTR     pcszNodeNameIn,
    //      [ in ]  CLSID       clsidTaskMajorIn
    //      [ in ]  CLSID       clsidTaskMinorIn,
    //      [ in ]  ULONG       ulMinIn,
    //      [ in ]  ULONG       ulMaxIn,
    //      [ in ]  ULONG       ulCurrentIn,
    //      [ in ]  HRESULT     hrStatusIn,
    //      [ in ]  LPCWSTR     pcszDescriptionIn,
    //      [ in ]  FILETIME *  pftTimeIn,
    //      [ in ]  LPCWSTR     pcszReferenceIn
    //      )
    //
    //  Description:
    //      Send a status report back to the user interface/script.
    //
    //  Parameters:
    //      pcszNodeNameIn
    //          The name of the node (server) that sent the report.
    //
    //      clsidTaskMajorIn
    //          CLSID of the major task item to give status about. For the
    //          wizard, this indicates which node in the tree view control
    //          to publish this status message under. If clsidTaskMajorIn
    //          equals TASKID_Major_Client_Log, TASKID_Major_Server_Log, or
    //          TASKID_Major_Client_And_Server_Log, only a log entry will be
    //          made.
    //
    //      clsidTaskMinorIn
    //          CLSID of the minor task to give status about. These should be
    //          unique to each sub-task and message.
    //
    //      ulMinIn
    //          The min value of progress.
    //
    //      ulMaxIn
    //          The max value of progress.
    //
    //      ulCurrentIn
    //          The current value of progress.
    //
    //      hrStatusIn
    //          The current status.
    //
    //      pcszDescriptionIn
    //          The description of the status. Can be NULL to indicate that nothing
    //          needs to be passed.
    //
    //      pftTimeIn
    //          UTC time of when this event was generated.
    //
    //      pcszReference
    //          Optional reference data, additional context, URL, etc. that
    //          might better help explain the problem is this is an error
    //          report.
    //
    //  Return Values:
    //      S_OK
    //          The call succeeded.
    //
    //      other HRESULTs
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SendStatusReport(
            [ in, pointer_default( unique )  ]  LPCWSTR     pcszNodeNameIn,
            [ in ]                              CLSID       clsidTaskMajorIn,
            [ in ]                              CLSID       clsidTaskMinorIn,
            [ in ]                              ULONG       ulMinIn,
            [ in ]                              ULONG       ulMaxIn,
            [ in ]                              ULONG       ulCurrentIn,
            [ in ]                              HRESULT     hrStatusIn,
            [ in, pointer_default( unique )  ]  LPCWSTR     pcszDescriptionIn,
            [ in ]                              FILETIME *  pftTimeIn,
            [ in, pointer_default( unique ) ]   LPCWSTR     pcszReferenceIn
            );

}; //*** interface IClusCfgCallback


//****************************************************************************
//++
//
//  interface IClusCfgCredentials
//
//  Description:
//      The IClusCfgCredentials interface provides the functions
//      for getting and setting user credentials.
//
//--
//****************************************************************************
[
    object,
    uuid( 54AA9406-A409-4b49-B314-5F0A0CE4C88E ),
    async_uuid( 54AA9406-A409-4b49-B314-5F0A0CE4C88F ),
    pointer_default( unique )
]
interface IClusCfgCredentials : IUnknown
{
    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //      SetCredentials(
    //          [ in ] LPCWSTR pcszUserIn,
    //          [ in ] LPCWSTR pcszDomainIn,
    //          [ in ] LPCWSTR pcszPasswordIn
    //          )
    //
    //  Description:
    //      Set the credentials.
    //
    //  Parameters:
    //      pcszUserIn
    //          The user name.
    //
    //      pcszDomainIn
    //          The domain name.
    //
    //      pcszPasswordIn
    //          The user's password.
    //
    //  Return Values:
    //      S_OK
    //          The call succeeded.
    //
    //      other HRESULTs
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SetCredentials(
              [ in, pointer_default( unique ) ] LPCWSTR pcszUserIn
            , [ in, pointer_default( unique ) ] LPCWSTR pcszDomainIn
            , [ in, pointer_default( unique ) ] LPCWSTR pcszPasswordIn
            );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //      GetCredentials(
    //          [ out ] BSTR * pbstrUserOut,
    //          [ out ] BSTR * pbstrDomainOut,
    //          [ out ] BSTR * pbstrPasswordOut
    //          )
    //
    //  Description:
    //      Get the credentials.
    //
    //  Parameters:
    //      pbstrUserOut
    //          Catches the user name.
    //
    //      pbstrDomainOut
    //          Catches the domain name.
    //
    //      pbstrPasswordOut
    //          Catches the user's password.
    //
    //  Return Values:
    //      S_OK
    //          The call succeeded.
    //
    //      other HRESULTs
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        GetCredentials(
              [ out ] BSTR * pbstrUserOut
            , [ out ] BSTR * pbstrDomainOut
            , [ out ] BSTR * pbstrPasswordOut
            );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //      GetIdentity(
    //          [ out ] BSTR * pbstrUserOut,
    //          [ out ] BSTR * pbstrDomainOut
    //          )
    //
    //  Description:
    //      Get the credentials.
    //
    //  Parameters:
    //      pbstrUserOut
    //          Catches the user name.
    //
    //      pbstrDomainOut
    //          Catches the domain name.
    //
    //  Return Values:
    //      S_OK
    //          The call succeeded.
    //
    //      other HRESULTs
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        GetIdentity(
              [ out ] BSTR * pbstrUserOut
            , [ out ] BSTR * pbstrDomainOut
            );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //      GetPassword( [ out ] BSTR * pbstrPasswordOut )
    //
    //  Description:
    //      Get the credentials.
    //
    //  Parameters:
    //
    //      pbstrPasswordOut
    //          Catches the user's password.
    //
    //  Return Values:
    //      S_OK
    //          The call succeeded.
    //
    //      other HRESULTs
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        GetPassword( [ out ] BSTR * pbstrPasswordOut );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //      AssignTo(
    //          [ in ] IClusCfgCredentials * picccDestIn
    //          )
    //
    //  Description:
    //      Write contents to another instance.
    //
    //  Parameters:
    //      picccDestIn
    //          Instance that receives contents.
    //
    //  Return Values:
    //      S_OK
    //          The call succeeded.
    //
    //      other HRESULTs
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        AssignTo(
            [ in ] IClusCfgCredentials * picccDestIn
            );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //      AssignFrom(
    //          [ in ] IClusCfgCredentials * picccSourceIn
    //          )
    //
    //  Description:
    //      Overwrite contents with those from another instance.
    //
    //  Parameters:
    //      picccSourceIn
    //          Instance from which to overwrite contents.
    //
    //  Return Values:
    //      S_OK
    //          The call succeeded.
    //
    //      other HRESULTs
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        AssignFrom(
            [ in ] IClusCfgCredentials * picccSourceIn
            );
}; //*** interface IClusCfgCredentials


//****************************************************************************
//++
//
//  interface IClusCfgCapabilities
//
//  Description:
//      The IClusCfgCapabilities interface provides the functions
//      for determining the capabilities of a node.
//
//--
//****************************************************************************
[
    object,
    uuid( D94AB253-36C7-41c1-B52E-26B451975C8D ),
    pointer_default( unique )
]
interface IClusCfgCapabilities : IUnknown
{
    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  CanNodeBeClustered( void )
    //
    //  Description:
    //      Determines if a node can be clustered.
    //
    //  Parameters:
    //      None.
    //
    //  Return Values:
    //      S_OK
    //          The call succeeded. The node can be clustered.
    //
    //      S_FALSE
    //          The call succeeded. The node can not be clustered.
    //
    //      E_NOTIMPL
    //          The call failed. This is treated as a "don't care."
    //
    //      other HRESULTs
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        CanNodeBeClustered( void );

}; //*** interface IClusCfgCapabilities


//****************************************************************************
//++
//
//  interface IClusCfgManagedResourceCfg
//
//--
//****************************************************************************
[
    object,
    uuid( 60300A0F-77E1-440c-BD94-6BFB0DBFDB3A ),
    local,
    pointer_default( unique )
]
interface IClusCfgManagedResourceCfg : IUnknown
{
    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IClusCfgManagedResourceCfg::PreCreate(
    //      IUnknown * punkServicesIn
    //      )
    //
    //  Description:
    //      This method is called by the post configuration manager to
    //      determine the requirements of the resource. Querying the
    //      punkServicesIn allows the managed resource to use services
    //      provided by the manager.
    //
    //  Arguments:
    //      punkServicesIn
    //          The resource should QI this interface for services provided
    //          by the post configuration manager and to set its dependencies.
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        PreCreate( [ in ] IUnknown * punkServicesIn );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IClusCfgManagedResourceCfg::Create(
    //      IUnknown * punkServicesIn
    //      )
    //
    //  Description:
    //      This method is called by the post configuration manager to
    //      have the resource create an instance of itself. Querying the
    //      punkServicesIn allows the managed resource to use services
    //      provided by the manager.
    //
    //  Arguments:
    //      punkServicesIn
    //          The resource should QI this interface for services provided
    //          by the post configuration manager and to create itself.
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        Create( [ in ] IUnknown * punkServicesIn );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IClusCfgManagedResourceCfg::PostCreate(
    //      IUnknown * punkServicesIn
    //      )
    //
    //  Description:
    //      This method is called by the post configuration manager to allow
    //      resources to perform any post-creation configuration that may be
    //      needed. At this point the cluster is fully configured. Querying
    //      the punkServicesIn allows the managed resource to use services
    //      provided by the manager.
    //
    //  Arguments:
    //      punkServicesIn
    //          The resource should QI this interface for services provided
    //          by the post configuration manager.
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        PostCreate( [ in ] IUnknown * punkServicesIn );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IClusCfgManagedResourceCfg::Evict(
    //      IUnknown * punkServicesIn
    //      )
    //
    //  Description:
    //      This method is called by the post configuration manager to alert
    //      the resource that this node was evicted from the cluster. The
    //      resource should do whatever cleanup it needs to do revert to a
    //      non-clustered state. Querying the  punkServicesIn allows the
    //      managed resource to uses services provided by the post
    //      configuration manager.
    //
    //  Arguments:
    //      punkServicesIn
    //          The resource should QI this interface for services provided
    //          by the post configuration manager.
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed. Errors are ignored and do not prevent a node
    //          from being evicted.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        Evict( [ in ] IUnknown * punkServicesIn );

}; //*** interface IClusCfgManagedResourceCfg


//****************************************************************************
//++
//
//  interface IClusCfgResourcePreCreate
//
//--
//****************************************************************************
[
    object,
    uuid( 4240F6A1-9D49-427e-8F3D-09384E1F59E4 ),
    local,
    pointer_default( unique )
]
interface IClusCfgResourcePreCreate : IUnknown
{
    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IClusCfgResourcePreCreate::SetDependency(
    //      LPCLSID             pclsidDepResTypeIn,
    //      EDependencyFlags    dflagIn
    //      )
    //
    //  Description:
    //      Informs the post configuration manager that a resource has a
    //      dependency on another type of resource and if the resource needs
    //      the resource for shared access or exclusive access.
    //
    //  Arguments:
    //      pclsidDepResTypeIn
    //          The CLSID of the type of resource that a resource is
    //          requesting a dependency on. These are documented in the SDK
    //          or by the 3rd party resource.
    //
    //      dfIn
    //          Flags to modify the dependency relationship. The following
    //          are defined flags:
    //
    //          dfSHARED       - the dependent resource can be shared.
    //          dfEXCLUSIVE    - the dependent resource can not be shared.
    //
    // Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SetDependency(
              [ in ] LPCLSID pclsidDepResTypeIn
            , [ in ] DWORD  dfIn
            );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IClusCfgResourcePreCreate::SetType(
    //      CLSID * pclsidIn
    //      )
    //
    //  Description:
    //      A managed resource MUST call this to indicate its resource type.
    //      Failure to call this during PreCreate will result in your
    //      resource not being created.
    //
    //  Arguments:
    //      pclsidIn
    //          Pointer to the GUID of the resource type.
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SetType( [ in ] CLSID * pclsidIn );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IClusCfgResourcePreCreate::SetClassType(
    //      CLSID * pclsidIn
    //      )
    //
    //  Description:
    //      A managed resource sets this to indicate that its resource type
    //      can be considered to be of a class of resource. You may call this
    //      multiple times to indicate all the classes you belong to.
    //
    //  Arguments:
    //      pclsidIn
    //          Pointer to the GUID of the resource class type.
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SetClassType( [ in ] CLSID * pclsidIn );

}; //*** interface IClusCfgResourcePreCreate


//****************************************************************************
//++
//
//  interface IClusCfgResourceCreate
//
//--
//****************************************************************************
[
    object,
    uuid( 0647B41A-C777-443c-9432-02CCCF4FF443 ),
    local,
    pointer_default( unique )
]
interface IClusCfgResourceCreate : IUnknown
{
    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IClusCfgResourceCreate::SetPropertyBinary(
    //        [ in ] LPCWSTR        pcszNameIn
    //      , [ in ] const DWORD    cbSizeIn
    //      , [ in ] const BYTE *   pbyteIn
    //      )
    //
    //  Description:
    //
    //  Arguments:
    //
    // Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SetPropertyBinary(
              [ in, pointer_default( unique ) ] LPCWSTR         pcszNameIn
            , [ in ]                            const DWORD     cbSizeIn
            , [ in ]                            const BYTE *    pbyteIn
            );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IClusCfgResourceCreate::SetPropertyDWORD(
    //        [ in ] LPCWSTR     pcszNameIn
    //      , [ in ] const DWORD dwDWORDIn
    //      )
    //
    //  Description:
    //
    //  Arguments:
    //
    // Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SetPropertyDWORD(
              [ in, pointer_default( unique ) ] LPCWSTR        pcszNameIn
            , [ in ]                            const DWORD    dwDWORDIn
            );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IClusCfgResourceCreate::SetPropertyString(
    //        [ in ] LPCWSTR pcszNameIn
    //      , [ in ] LPCWSTR pcszStringIn
    //      )
    //
    //  Description:
    //
    //  Arguments:
    //
    // Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SetPropertyString(
              [ in, pointer_default( unique ) ] LPCWSTR pcszNameIn
            , [ in, pointer_default( unique ) ] LPCWSTR pcszStringIn
            );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IClusCfgResourceCreate::SetPropertyExpandString(
    //        [ in ] LPCWSTR pcszNameIn
    //      , [ in ] LPCWSTR pcszStringIn
    //      )
    //
    //  Description:
    //
    //  Arguments:
    //
    // Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SetPropertyExpandString(
              [ in, pointer_default( unique ) ] LPCWSTR pcszNameIn
            , [ in, pointer_default( unique ) ] LPCWSTR pcszStringIn
            );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IClusCfgResourceCreate::SetPropertyMultiString(
    //        [ in ] LPCWSTR     pcszNameIn
    //      , [ in ] const DWORD cbMultiStringIn
    //      , [ in ] LPCWSTR     pcszMultiStringIn
    //      )
    //
    //  Description:
    //
    //  Arguments:
    //
    // Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SetPropertyMultiString(
              [ in, pointer_default( unique ) ] LPCWSTR        pcszNameIn
            , [ in ]                            const DWORD    cbMultiStringIn
            , [ in, pointer_default( unique ) ] LPCWSTR        pcszMultiStringIn
            );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IClusCfgResourceCreate::SetPropertyUnsignedLargeInt(
    //        [ in ] LPCWSTR                pcszNameIn
    //      , [ in ] const ULARGE_INTEGER   ulIntIn
    //      )
    //
    //  Description:
    //
    //  Arguments:
    //
    // Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SetPropertyUnsignedLargeInt(
              [ in, pointer_default( unique ) ] LPCWSTR                pcszNameIn
            , [ in ]                            const ULARGE_INTEGER   ulIntIn
            );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IClusCfgResourceCreate::SetPropertyLong(
    //        [ in ] LPCWSTR     pcszNameIn
    //      , [ in ] const LONG  lLongIn
    //      )
    //
    //  Description:
    //
    //  Arguments:
    //
    // Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SetPropertyLong(
              [ in, pointer_default( unique ) ] LPCWSTR    pcszNameIn
            , [ in ]                            const LONG lLongIn
            );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IClusCfgResourceCreate::SetPropertySecurityDescriptor(
    //        [ in ] LPCWSTR                     pcszNameIn
    //      , [ in ] const SECURITY_DESCRIPTOR * pcsdIn
    //      )
    //
    //  Description:
    //
    //  Arguments:
    //
    // Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SetPropertySecurityDescriptor(
              [ in, pointer_default( unique ) ] LPCWSTR  pcszNameIn
            , [ in ] const SECURITY_DESCRIPTOR *   pcsdIn );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IClusCfgResourceCreate::SetPropertyLargeInt(
    //        [ in ] LPCWSTR pcszNameIn
    //      , [ in ] const LARGE_INTEGER lIntIn
    //      )
    //
    //  Description:
    //
    //  Arguments:
    //
    // Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SetPropertyLargeInt(
              [ in, pointer_default( unique ) ] LPCWSTR             pcszNameIn
            , [ in ]                            const LARGE_INTEGER lIntIn
            );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IClusCfgResourceCreate::SendResourceControl(
    //        [ in ] DWORD   dwControlCode
    //      , [ in ] LPVOID  lpInBuffer
    //      , [ in ] DWORD   cbInBufferSize
    //      )
    //
    //  Description:
    //
    //  Arguments:
    //
    // Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SendResourceControl(
              [ in ] DWORD   dwControlCodeIn
            , [ in ] LPVOID  lpBufferIn
            , [ in ] DWORD   cbBufferSizeIn
            );

}; //*** interface IClusCfgResourceCreate


//****************************************************************************
//++
//
//  interface IClusCfgResourcePostCreate
//
//--
//****************************************************************************
[
    object,
    uuid( 72A9BF54-13B6-451f-910D-6913EBF025AB ),
    local,
    pointer_default( unique )
]
interface IClusCfgResourcePostCreate : IUnknown
{
    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IClusCfgResourcePostCreate::ChangeName(
    //      [ in ] LPCWSTR pcszNameIn
    //      )
    //
    //  Description:
    //      Changes the name of the resource.
    //
    //  Arguments:
    //      pcszNameIn
    //          The name to assign the group.
    //
    // Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        ChangeName( [ in, pointer_default( unique ) ] LPCWSTR pcszNameIn );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IClusCfgResourceCreate::SendResourceControl(
    //        [ in ]  DWORD   dwControlCode
    //      , [ in ]  LPVOID  lpInBuffer
    //      , [ in ]  DWORD   cbInBufferSize
    //      , [ in ]  LPVOID  lpOutBuffer
    //      , [ in ]  DWORD   cbOutBufferSize
    //      , [ out ] LPDWORD lpcbBytesReturned
    //      )
    //
    //  Description:
    //
    //  Arguments:
    //
    // Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SendResourceControl(
              [ in ]  DWORD   dwControlCodeIn
            , [ in ]  LPVOID  lpBufferIn
            , [ in ]  DWORD   cbBufferSizeIn
            , [ in ]  LPVOID  lBufferInout
            , [ in ]  DWORD   cbOutBufferSizeIn
            , [ out ] LPDWORD lpcbBytesReturnedOut
            );

}; //*** interface IClusCfgResourcePostCreate


//****************************************************************************
//++
//
//  interface IClusCfgGroupCfg
//
//--
//****************************************************************************
[
    object,
    uuid( DCB6D3D2-A55F-49e5-A64A-0CCFEB01ED3A ),
    local,
    pointer_default( unique )
]
interface IClusCfgGroupCfg : IUnknown
{
    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IClusCfgGroupCfg::SetName(
    //      [ in ] LPCWSTR pcszNameIn
    //      )
    //
    //  Description:
    //      Changes the name of the group in which the resource was created.
    //      Note that the last resource to set the name wins. The ordering
    //      of the last resource is the resource that doesn't have anything
    //      depending on it.
    //
    //  Arguments:
    //      pcszNameIn
    //          The name to assign the group.
    //
    // Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SetName( [ in, pointer_default( unique ) ] LPCWSTR pcszNameIn );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IClusCfgGroupCfg::GetName(
    //      BSTR * pbstrNameOut
    //      )
    //
    //  Description:
    //      Retrieves the name of the group in which the resource was created.
    //      Note that the last resource to set the name wins. The ordering
    //      of the last resource is the resource that doesn't have anything
    //      depending on it. Do not cache this value as the name may change
    //      after control has been returned to the manager.
    //
    //  Arguments:
    //      pbstrNameOut
    //          The name to assign the group.
    //
    // Return Value:
    //      S_OK
    //          Success.
    //
    //      HRESULT_FROM_WIN32( ERROR_MORE_DATA )
    //          The buffer size specified is too small.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        GetName( [ out ] BSTR * pbstrNameOut );

}; //*** interface IClusCfgGroupCfg


//****************************************************************************
//++
//
//  interface IClusCfgMemberSetChangeListener
//
//  Description:
//      This interface is implemented by an component that wishes to be notified
//      of when the local computer becomes part of a cluster or when it leaves
//      a cluster - in other words, when the member set of a cluster changes
//      as a result of a cluster configuration operation on the local computer.
//
//--
//****************************************************************************
[
    object,
    uuid( 2B64534F-2643-4ABC-A4E5-824D881B7582 ),
    async_uuid( 2B645350-2643-4ABC-A4E5-824D881B7582 ),
    pointer_default( unique )
]
interface IClusCfgMemberSetChangeListener : IUnknown
{
    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IClusCfgMemberSetChangeListener::Notify(
    //      [ in ] IUnknown * punkClusterInfoIn
    //      )
    //
    //  Description:
    //      This method is called to notify a component that this computer has
    //      either joined or left a cluster. During this call, a component typically
    //      performs operations that are required to switch it from the "clustered"
    //      to "non-clustered" mode or vice versa. For example, an application
    //      that implements this interface could use this function to create
    //      its resource type when the local computer joins a cluster.
    //
    //      If the node has just become part of a cluster, the cluster
    //      service is guaranteed to be running when this method is called.
    //      Querying the punkClusterInfoIn allows the listener to get more
    //      information about the event that caused the listener to be notified.
    //
    //  Arguments:
    //      punkClusterInfoIn
    //          The resource should QI this interface for services provided
    //          by the caller of this function. Typically, the component that
    //          this punk refers to also implements the IClusCfgClusterInfo
    //          interface.
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        Notify( [ in ] IUnknown * punkClusterInfoIn );

}; //*** interface IClusCfgMemberSetChangeListener


//****************************************************************************
//++
//
//  interface IClusCfgResourceTypeInfo
//
//  Description:
//      This interface is implemented by components that wish to configure
//      ( create, delete, etc. ) resource types during cluster configuration
//      ( cluster formation, node addition, node eviction, etc. ).
//
//--
//****************************************************************************
[
    object,
    uuid( C649A281-C847-4F5C-9841-D2F73B5AA71D ),
    async_uuid( C649A282-C847-4F5C-9841-D2F73B5AA71D ),
    pointer_default( unique )
]
interface IClusCfgResourceTypeInfo : IUnknown
{
    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IClusCfgResourceTypeInfo::CommitChanges(
    //      [ in ] IUnknown * punkClusterInfoIn
    //      )
    //
    //  Description:
    //      A component that wishes to participate in the configuration of
    //      cluster resource types should perform the configuration steps
    //      necessary for its resource type in this method.
    //
    //      This method is called by the cluster configuration server when
    //      the local computer becomes part of a cluster. The cluster service
    //      is guaranteed to be running at this stage. This method is also
    //      called when the local computer is evicted from a cluster - the
    //      cluster service will not be running if this is the case.
    //
    //      Typically, a component will create a resource type in this method
    //      during cluster formation and join and will perform any cleanup
    //      required during node evict.
    //
    //  Arguments:
    //      punkClusterInfoIn
    //          The resource type should QI this interface for services provided
    //          by the caller of this function. Typically, the component that
    //          this punk refers to also implements the IClusCfgClusterInfo
    //          interface.
    //
    //      punkResTypeServicesIn
    //          Pointer to the IUnknown interface of a component that provides
    //          methods that help configuring a resource type. For example,
    //          during a join or a form, this punk can be queried for the
    //          IClusCfgResourceTypeCreate interface, which provides methods
    //          for resource type creation.
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        CommitChanges(
            [ in ] IUnknown * punkClusterInfoIn,
            [ in ] IUnknown * punkResTypeServicesIn
            );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IClusCfgResourceTypeInfo::GetTypeName(
    //      [ out ] BSTR *  pbstrTypeNameOut
    //      )
    //
    //  Description:
    //      Get the resource type name of this resource type.
    //
    //  Arguments:
    //      pbstrTypeNameOut
    //          Pointer to the BSTR that holds the name of the resource type.
    //          This BSTR has to be freed by the caller using the function
    //          SysFreeString().
    //
    //  Return Values:
    //      S_OK
    //          The call succeeded.
    //
    //      E_OUTOFMEMORY
    //          Out of memory.
    //
    //      other HRESULTs
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        GetTypeName( [ out ] BSTR *  pbstrTypeNameOut );


    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IClusCfgResourceTypeInfo::GetTypeGUID(
    //      [ out ] GUID * pguidGUIDOut
    //      )
    //
    //  Description:
    //      Get the globally unique identifier of this resource type.
    //
    //  Arguments:
    //      pguidGUIDOut
    //          Pointer to the GUID object which will receive the GUID of this
    //          resource type.
    //
    //  Return Values:
    //      S_OK
    //          The call succeeded and the *pguidGUIDOut contains the type GUID.
    //
    //      S_FALSE
    //          The call succeeded but this resource type does not have a GUID.
    //          The value of *pguidGUIDOut is undefined after this call.
    //
    //      other HRESULTs
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        GetTypeGUID( [ out ] GUID * pguidGUIDOut );

}; //*** interface IClusCfgResourceTypeInfo


//****************************************************************************
//++
//
//  interface IClusCfgResourceTypeCreate
//
//  Description:
//      This interface provides functions that help create a resource type
//      during cluster configuration. A pointer to this interface is provided
//      to components that participate in resource type configuration during
//      cluster configuration.
//
//--
//****************************************************************************
[
    object,
    uuid( 3AFCE3B8-5F3E-4DDF-A8F4-4B4FCBF28F8F ),
    async_uuid( 3AFCE3B9-5F3E-4DDF-A8F4-4B4FCBF28F8F ),
    pointer_default( unique )
]
interface IClusCfgResourceTypeCreate : IUnknown
{
    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IClusCfgResourceTypeCreate::Create(
    //      [in, string ] const WCHAR *     pcszResTypeNameIn,
    //      [in, string ] const WCHAR *     pcszResTypeDisplayNameIn,
    //      [in, string ] const WCHAR *     pcszResDllNameIn,
    //      [in] DWORD                      dwLooksAliveIntervalIn,
    //      [in] DWORD                      dwIsAliveIntervalIn
    //      )
    //
    //  Description:
    //      This method creates a cluster resource type.
    //
    //  Arguments:
    //      pcszResTypeNameIn
    //          Name of the resource type
    //
    //      pcszResTypeDisplayNameIn
    //          Display name of the resource type
    //
    //      pcszResDllNameIn
    //          Name (with or without path information) of DLL of the resource type.
    //
    //      dwLooksAliveIntervalIn
    //          Looks-alive interval for the resource type (in milliseconds).
    //
    //      dwIsAliveIntervalIn
    //          Is-alive interval for the resource type (in milliseconds).
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        Create(
            [in, string ] const WCHAR *      pcszResTypeNameIn,
            [in, string ] const WCHAR *      pcszResTypeDisplayNameIn,
            [in, string ] const WCHAR *      pcszResDllNameIn,
            [in] DWORD                       dwLooksAliveIntervalIn,
            [in] DWORD                       dwIsAliveIntervalIn
            );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IClusCfgResourceTypeCreate::RegisterAdminExtensions(
    //      [in, string ]                           const WCHAR *       pcszResDllNameIn,
    //      [in]                                    ULONG               cExtClsidCountIn,
    //      [in, size_is( cExtClsidCountIn ) ]      const CLSID *       rgclsidExtClsidsIn
    //      )
    //
    //  Description:
    //      This method registers the cluster administrator extensions for
    //      a resource type.
    //
    //  Arguments:
    //      pcszResTypeNameIn
    //          Name of the resource type against for the extensions are to be
    //          registered.
    //
    //      cExtClsidCountIn
    //          Number of extension class ids in the next parameter.
    //
    //      rgclsidExtClsidsIn
    //          Pointer to an array of class ids of cluster administrator extensions.
    //          This can be NULL if cExtClsidCountIn is 0.
    //
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        RegisterAdminExtensions(
            [in, string ]                           const WCHAR *   pcszResTypeNameIn,
            [in]                                    ULONG           cExtClsidCountIn,
            [in, size_is( cExtClsidCountIn ) ]      const CLSID *   rgclsidExtClsidsIn
            );

}; //*** interface IClusCfgResourceTypeCreate


//****************************************************************************
//++
//
//  interface IClusCfgEvictCleanup
//
//  Description:
//      This interface can be used to cleanup a node that has been evicted from
//      a cluster.
//
//--
//****************************************************************************
[
    object,
    uuid( 6FE3E361-D373-4C5F-A0AF-1DFE8493C655 ),
    async_uuid( 6FE3E362-D373-4C5F-A0AF-1DFE8493C655 ),
    pointer_default( unique )
]
interface
IClusCfgEvictCleanup : IUnknown
{
    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IClusCfgEvictCleanup::CleanupLocal( [ in ] DWORD dwDelayIn )
    //
    //  Description:
    //      This method performs the clean up actions on the local node after
    //      it has been evicted from a cluster, so that the node can go back
    //      to its "pre-clustered" state.
    //
    //  Arguments:
    //      DWORD dwDelayIn
    //          Number of milliseconds that this method will wait before starting
    //          cleanup. If some other process cleans up this node while this thread
    //          is waiting, the wait is terminated. If this value is zero, this method
    //          will attempt to clean up this node immediately.
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      Other HRESULTs
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        CleanupLocalNode( [ in ] DWORD dwDelayIn );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IClusCfgEvictCleanup::CleanupRemoteNode(
    //        const WCHAR * pcszEvicteeNodeNameIn
    //      , DWORD dwDelayIn
    //      )
    //
    //  Description:
    //      This method performs the clean up actions on a remote node after
    //      it has been evicted from a cluster, so that the node can go back
    //      to its "pre-clustered" state.
    //
    //  Arguments:
    //      const WCHAR * pcszEvictedNodeNameIn
    //          Name of the node that has just been evicted. This can be the
    //          NetBios name of the node, the fully qualified domain name or
    //          the node IP address.
    //
    //      DWORD dwDelayIn
    //          Number of milliseconds that this method will wait before starting
    //          cleanup. If some other process cleans up this node while this thread
    //          is waiting, the wait is terminated. If this value is zero, this method
    //          will attempt to clean up this node immediately.
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      Other HRESULTs
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        CleanupRemoteNode(
              [ in, string ] const WCHAR * pcszEvictedNodeNameIn
            , [ in ] DWORD dwDelayIn
            );

}; // interface IClusCfgEvictCleanup

//****************************************************************************
//++
//
//  interface IClusCfgStartupListener
//
//  Description:
//      This interface is implemented by a component that wishes to be notified
//      when the cluster service has started.
//
//--
//****************************************************************************
[
    object,
    uuid( D282CAEF-2EDE-4ab9-A5D5-F7BDE3D23F0F ),
    async_uuid( D282CAF0-2EDE-4ab9-A5D5-F7BDE3D23F10 ),
    pointer_default( unique )
]
interface
IClusCfgStartupListener : IUnknown
{
    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IClusCfgStartupListener::Notify( [ in ] IUnknown * punkIn )
    //
    //  Description:
    //      This method is called to inform a component that the cluster service
    //      has started on the local node.
    //
    //  Arguments:
    //      IUnknown * punkIn
    //          The component that implements this Punk may also provide services
    //          that are useful to the implementor of this method. For example,
    //          this component usually implements the IClusCfgResourceTypeCreate
    //          interface.
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      Other HRESULTs
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        Notify( [ in ] IUnknown * punkIn );

}; // interface IClusCfgStartupListener


//****************************************************************************
//++
//
//  interface IClusCfgStartupNotify
//
//  Description:
//      This interface is implemented by a component that the cluster service
//      instantiates. When the cluster service calls the only method on this
//      interface, this component will enumerate the startup listeners and
//      inform them that the cluster service has started on the local node.
//
//--
//****************************************************************************
[
    object,
    uuid( C2B0D069-6353-4EE1-B253-6B0D75DB2CD3 ),
    async_uuid( C2B0D06A-6353-4EE1-B253-6B0D75DB2CD3 ),
    pointer_default( unique )
]
interface
IClusCfgStartupNotify : IUnknown
{
    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IClusCfgStartupNotify::SendNotifications( void )
    //
    //  Description:
    //      This method is called by the Cluster Service to inform the implementor
    //      of this interface to send out notification of cluster service startup
    //      to interested listeners. If this method is being called for the first
    //      time, the method waits till the post configuration steps are complete
    //      before sending out the notifications.
    //
    //  Arguments:
    //      None.
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      Other HRESULTs
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SendNotifications( void );

}; // interface IClusCfgStartupNotify


//****************************************************************************
//++
//
//  interface IClusCfgManagedResourceData
//
//  Description:
//      This inteface allows instances of resources to get, set, and exchange
//      data between instances of themselves on different nodes.
//
//--
//****************************************************************************
[
    object,
    uuid( 8447ECB7-2171-4e21-A108-0EB5B0B516DA ),
    pointer_default( unique )
]
interface IClusCfgManagedResourceData : IUnknown
{
    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IClusCfgManagedResourceData::GetResourcePrivateData(
    //        [ out ] BYTE *    pbBufferOut
    //      , [ out ] DWORD *   pcbBufferInout
    //      )
    //
    //  Description:
    //      Get an already managed resource's private state data.  This
    //      data will then be passed to the instances of that resource on all
    //      nodes that are being added to the cluster.
    //
    //  Arguments:
    //      pbBufferOut
    //          Pointer to a buffer to contain the resource's private state data.
    //
    //      pcbBufferInout
    //          On input it is the size of the buffer.  On output it is the size
    //          of the data.
    //
    //  Return Value:
    //      S_OK
    //          Success.
    //
    //  ERROR_INSUFFICIENT_BUFFER as an HRESULT
    //      When the passed in buffer is too small to hold the data.
    //      pcbBufferOutIn will contain the size required.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        GetResourcePrivateData(
              [ out, size_is( *pcbBufferInout ) ] BYTE *    pbBufferOut
            , [ in, out ] DWORD *                           pcbBufferInout
            );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IClusCfgManagedResourceData::SetResourcePrivateData(
    //        [ in ] const BYTE *   pcbBufferIn
    //      , [ in ] DWORD          cbBufferIn
    //      )
    //
    //  Description:
    //      Set the private resource data into this instance of a managed
    //      resource.
    //
    //  Arguments:
    //      pcbBufferIn
    //          Pointer to a buffer containing the resource's private data.
    //
    //      cbBufferIn
    //          The length in bytes of the data buffer.
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SetResourcePrivateData(
              [  in
               , pointer_default( unique )
               , size_is( cbBufferIn )
               ]                            const BYTE *   pcbBufferIn
            , [ in ] DWORD                  cbBufferIn
            );

}; //*** interface IClusCfgManagedResourceData


//****************************************************************************
//++
//
//  interface IClusCfgVerifyQuorum
//
//  Description:
//      Ensure that the quorum resource can be hosted on all nodes being added
//      to the cluster.
//
//      The IClusCfgManagedResourceData interface will be called just prior to
//      any calls to the methods of this interface to allow the quorum resource
//      to set all data needed for the quorum to be hosted on the nodes that
//      are being added to the cluster.
//
//--
//****************************************************************************
[
    object,
    uuid( 90A2EFAE-1B62-4ada-BF1C-BECAB56F748D ),
    pointer_default( unique )
]
interface IClusCfgVerifyQuorum : IUnknown
{
    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IClusCfgVerifyQuorum::PrepareToHostQuorumResource(
    //      void
    //      )
    //
    //  Description:
    //      This method is called when the implementing managed resource
    //      is the quorum resource.  This gives the implementer a chance
    //      to do anything required to ensure that this node can
    //      indeed host the quorum resource.
    //
    //      This method will be called after the SetResourcePrivateData()
    //      method of the IClusCfgManagedResourceData interface has been
    //      called. This allows the implementer to get the latest state data
    //      from a running instance of their resource.
    //
    //  Arguments:
    //      None.
    //
    //  Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        PrepareToHostQuorumResource( void );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IClusCfgVerifyQuorum::Cleanup(
    //      EClusCfgCleanupReason cccrReasonIn
    //      )
    //
    //  Description:
    //      This method is called when a cluster configuration task is
    //      shutting down.  The reason for the shut down is passed in
    //      the cccrReasonIn parameter.
    //
    //      It is expected that any lingering changes made in
    //      PrepareToHostQuorumResource() would be undone when the
    //      reason code in not a success code.
    //
    //  Arguments:
    //      cccrReasonIn
    //          The reason that this method was called.  See
    //          EClusCfgCleanupReason for the complete list of possbile
    //          reason codes.
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        Cleanup( [ in ] EClusCfgCleanupReason cccrReasonIn );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IsMultiNodeCapable( void )
    //
    //  Description:
    //      Call this to determine if this quorum capable resource allows
    //      other nodes to join the cluster and create a multi node cluster.
    //
    //  Return Values:
    //      S_OK
    //          Call succeeded and the result is "TRUE."
    //
    //      S_FALSE
    //          Call succeeded and the result is "FALSE."
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        IsMultiNodeCapable( void );

    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  SetMultiNodeCapable(
    //      [ in ] BOOL fMultiNodeCapableIn
    //      )
    //
    //  Description:
    //      Call this to set this quorum resource as being multi node capable.
    //
    //  Return Values:
    //      S_OK
    //          Call succeeded
    //
    //      other HRESULT
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SetMultiNodeCapable( [ in ] BOOL fMultiNodeCapableIn );

}; //*** interface IClusCfgVerifyQuorum


//****************************************************************************
//++
//
//  interface IClusCfgEvictListener
//
//  Description:
//      This interface is implemented by a component that wishes to be notified
//      when the a node has been evicted from the cluster.
//
//--
//****************************************************************************
[
    object,
    uuid( E20DDEE3-DEFC-4d54-B1F7-2AEB784C3847 ),
    async_uuid( 08609AC3-D284-4009-805F-17D3CFE4160B ),
    pointer_default( unique )
]
interface
IClusCfgEvictListener : IUnknown
{
    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IClusCfgEvictListener::EvictNotify(
    //      [ in ] LPCWSTR pcszNodeNameIn
    //      )
    //
    //  Description:
    //      This method is called to inform a component that a node has been
    //      evicted from the cluster.
    //
    //  Arguments:
    //      pcszNodeNameIn
    //          The name of the node that was evicted.
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      Other HRESULTs
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        EvictNotify(
            [ in, pointer_default( unique ) ] LPCWSTR pcszNodeNameIn
            );

}; // interface IClusCfgEvictListener


//****************************************************************************
//++
//
//  interface IClusCfgEvictNotify
//
//  Description:
//      This interface is implemented by a component that the cluster service
//      instantiates. When the cluster service calls the only method on this
//      interface, this component will enumerate the evict listeners and
//      inform them that a node has been evicted from the cluster.  These
//      components will be running on a cluster node and are capable of using
//      the cluster API in their implementation.
//
//--
//****************************************************************************
[
    object,
    uuid( 090E7745-9E5B-4d76-936E-D760CF2FF3B9 ),
    async_uuid( AD2E83CC-1D14-4d20-928E-22D344847454 ),
    pointer_default( unique )
]
interface
IClusCfgEvictNotify : IUnknown
{
    //////////////////////////////////////////////////////////////////////////
    //
    //  STDMETHOD
    //  IClusCfgEvictNotify::SendNotifications(
    //      [ in, pointer_default( unique ) ] LPCWSTR pcszNodeNameIn
    //      )
    //
    //  Description:
    //      This method is called by the Cluster Service to inform the implementor
    //      of this interface to send out notification when a node is evicted from
    //      the cluster to interested listeners.
    //
    //  Arguments:
    //      pcszNodeNameIn
    //          The name of the node that was evicted.
    //
    //  Return Values:
    //      S_OK
    //          Success.
    //
    //      Other HRESULTs
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT
        SendNotifications(
            [ in, pointer_default( unique ) ] LPCWSTR pcszNodeNameIn
            );

}; // interface IClusCfgEvictNotify
