/*++ Copyright (c) Microsoft Corporation. All rights reserved. Module Name: clusapi.h Abstract: This module defines the common management and application interface to the Microsoft Cluster Server services. Revision History: --*/ #ifndef _CLUSTER_API_ #define _CLUSTER_API_ #define CLUSAPI_VERSION 0x0500 #if _MSC_VER > 1000 #pragma once #endif #ifdef __cplusplus extern "C" { #endif #ifndef MIDL_PASS #if _MSC_VER >= 1200 #pragma warning(push) #endif #pragma warning( disable : 4200 ) // nonstandard extension used : zero-sized array in struct/union #pragma warning( disable : 4201 ) // nonstandard extension used : nameless struct/union #endif // MIDL_PASS // // General cluster definitions // #ifndef _CLUSTER_API_TYPES_ // // Defined cluster handle types. // typedef struct _HCLUSTER *HCLUSTER; typedef struct _HNODE *HNODE; typedef struct _HRESOURCE *HRESOURCE; typedef struct _HGROUP *HGROUP; //typedef struct _HRESTYPE *HRESTYPE; typedef struct _HNETWORK *HNETWORK; typedef struct _HNETINTERFACE *HNETINTERFACE; typedef struct _HCHANGE *HCHANGE; typedef struct _HCLUSENUM *HCLUSENUM; typedef struct _HGROUPENUM *HGROUPENUM; typedef struct _HRESENUM *HRESENUM; typedef struct _HNETWORKENUM *HNETWORKENUM; typedef struct _HNODEENUM *HNODEENUM; typedef struct _HRESTYPEENUM *HRESTYPEENUM; #endif // _CLUSTER_API_TYPES_ // // Definitions used in cluster management routines. // #define MAX_CLUSTERNAME_LENGTH MAX_COMPUTERNAME_LENGTH #ifndef _CLUSTER_API_TYPES_ // // Cluster-related structures and types // typedef enum CLUSTER_QUORUM_TYPE { OperationalQuorum, ModifyQuorum } CLUSTER_QUORUM_TYPE; #ifndef MIDL_PASS typedef struct CLUSTERVERSIONINFO_NT4 { DWORD dwVersionInfoSize; WORD MajorVersion; WORD MinorVersion; WORD BuildNumber; WCHAR szVendorId[64]; WCHAR szCSDVersion[64]; }CLUSTERVERSIONINFO_NT4, *PCLUSTERVERSIONINFO_NT4; typedef struct CLUSTERVERSIONINFO { DWORD dwVersionInfoSize; WORD MajorVersion; WORD MinorVersion; WORD BuildNumber; WCHAR szVendorId[64]; WCHAR szCSDVersion[64]; DWORD dwClusterHighestVersion; DWORD dwClusterLowestVersion; DWORD dwFlags; DWORD dwReserved; } CLUSTERVERSIONINFO, *LPCLUSTERVERSIONINFO, *PCLUSTERVERSIONINFO; typedef struct CLUS_STARTING_PARAMS { DWORD dwSize; BOOL bForm; BOOL bFirst; } CLUS_STARTING_PARAMS, * PCLUS_STARTING_PARAMS; #define CLUSTER_VERSION_FLAG_MIXED_MODE 0x00000001 #define NT4_MAJOR_VERSION 1 #define NT4SP4_MAJOR_VERSION 2 #define NT5_MAJOR_VERSION 3 #define NT51_MAJOR_VERSION 4 #define CLUSTER_VERSION_UNKNOWN 0xFFFFFFFF // // Version number macros // #define CLUSTER_MAKE_VERSION( _maj, _min ) ((( _maj ) << 16 ) | ( _min )) #define CLUSTER_GET_MAJOR_VERSION( _ver ) (( _ver ) >> 16 ) #define CLUSTER_GET_MINOR_VERSION( _ver ) (( _ver ) & 0xFFFF ) #endif // MIDL_PASS // // Interfaces for the cluster state on a node // #define CLUSTER_INSTALLED 0x00000001 #define CLUSTER_CONFIGURED 0x00000002 #define CLUSTER_RUNNING 0x00000010 typedef enum NODE_CLUSTER_STATE { ClusterStateNotInstalled = 0x00000000, ClusterStateNotConfigured = CLUSTER_INSTALLED, ClusterStateNotRunning = CLUSTER_INSTALLED | CLUSTER_CONFIGURED, ClusterStateRunning = CLUSTER_INSTALLED | CLUSTER_CONFIGURED | CLUSTER_RUNNING } NODE_CLUSTER_STATE; // // Resource state change reason related types and defines // #define CLUSCTL_RESOURCE_STATE_CHANGE_REASON_VERSION_1 1 typedef enum CLUSTER_RESOURCE_STATE_CHANGE_REASON { eResourceStateChangeReasonUnknown, eResourceStateChangeReasonMove, eResourceStateChangeReasonFailover, eResourceStateChangeReasonFailedMove, eResourceStateChangeReasonShutdown, eResourceStateChangeReasonRundown } CLUSTER_RESOURCE_STATE_CHANGE_REASON; #ifndef MIDL_PASS typedef struct _CLUSCTL_RESOURCE_STATE_CHANGE_REASON_STRUCT { DWORD dwSize; DWORD dwVersion; CLUSTER_RESOURCE_STATE_CHANGE_REASON eReason; } CLUSCTL_RESOURCE_STATE_CHANGE_REASON_STRUCT, *PCLUSCTL_RESOURCE_STATE_CHANGE_REASON_STRUCT; #endif // MIDL_PASS #endif // _CLUSTER_API_TYPES_ // // Interfaces for managing clusters // // // Cluster API Specific Access Rights // #define CLUSAPI_READ_ACCESS 0x00000001L #define CLUSAPI_CHANGE_ACCESS 0x00000002L #define CLUSAPI_NO_ACCESS 0x00000004L #define CLUSAPI_ALL_ACCESS (CLUSAPI_READ_ACCESS | CLUSAPI_CHANGE_ACCESS) // // Flags that control the behavior of SetClusterServiceAccountPassword // typedef enum CLUSTER_SET_PASSWORD_FLAGS { CLUSTER_SET_PASSWORD_IGNORE_DOWN_NODES = 1 } CLUSTER_SET_PASSWORD_FLAGS; #ifndef MIDL_PASS // // Structure used to return the status of a request to set the // password on the account used by the Cluster Service on each // cluster node. // typedef struct CLUSTER_SET_PASSWORD_STATUS { DWORD NodeId; BOOLEAN SetAttempted; DWORD ReturnStatus; } CLUSTER_SET_PASSWORD_STATUS, *PCLUSTER_SET_PASSWORD_STATUS; DWORD WINAPI GetNodeClusterState( IN LPCWSTR lpszNodeName, OUT DWORD *pdwClusterState ); HCLUSTER WINAPI OpenCluster( IN LPCWSTR lpszClusterName ); BOOL WINAPI CloseCluster( IN HCLUSTER hCluster ); DWORD WINAPI SetClusterName( IN HCLUSTER hCluster, IN LPCWSTR lpszNewClusterName ); DWORD WINAPI GetClusterInformation( __in HCLUSTER hCluster, __out_ecount_part(*lpcchClusterName, *lpcchClusterName + 1) LPWSTR lpszClusterName, __inout LPDWORD lpcchClusterName, __out_opt LPCLUSTERVERSIONINFO lpClusterInfo ); DWORD WINAPI GetClusterQuorumResource( __in HCLUSTER hCluster, __out_ecount_part(*lpcchResourceName, *lpcchResourceName + 1) LPWSTR lpszResourceName, __inout LPDWORD lpcchResourceName, __out_ecount_part(*lpcchDeviceName, *lpcchDeviceName + 1) LPWSTR lpszDeviceName, __inout LPDWORD lpcchDeviceName, __out LPDWORD lpdwMaxQuorumLogSize ); DWORD WINAPI SetClusterQuorumResource( IN HRESOURCE hResource, IN LPCWSTR lpszDeviceName, IN DWORD dwMaxQuoLogSize ); DWORD WINAPI BackupClusterDatabase( IN HCLUSTER hCluster, IN LPCWSTR lpszPathName ); DWORD WINAPI RestoreClusterDatabase( IN LPCWSTR lpszPathName, IN BOOL bForce, IN OPTIONAL LPCWSTR lpszQuorumDriveLetter ); DWORD WINAPI SetClusterNetworkPriorityOrder( IN HCLUSTER hCluster, IN DWORD NetworkCount, IN HNETWORK NetworkList[] ); DWORD WINAPI SetClusterServiceAccountPassword( __in LPCWSTR lpszClusterName, __in LPCWSTR lpszNewPassword, __in DWORD dwFlags, __out_bcount_part_opt(*lpcbReturnStatusBufferSize, *lpcbReturnStatusBufferSize) PCLUSTER_SET_PASSWORD_STATUS lpReturnStatusBuffer, __inout LPDWORD lpcbReturnStatusBufferSize ); DWORD WINAPI ClusterControl( __in HCLUSTER hCluster, __in_opt HNODE hHostNode, __in DWORD dwControlCode, __in_bcount_opt(nInBufferSize) LPVOID lpInBuffer, __in DWORD nInBufferSize, __out_bcount_part_opt(nOutBufferSize, *lpBytesReturned) LPVOID lpOutBuffer, __in DWORD nOutBufferSize, __out LPDWORD lpBytesReturned ); #endif // MIDL_PASS // // Cluster Event Notification API // #ifndef _CLUSTER_API_TYPES_ // // Cluster event filter flags. // typedef enum CLUSTER_CHANGE { CLUSTER_CHANGE_NODE_STATE = 0x00000001, CLUSTER_CHANGE_NODE_DELETED = 0x00000002, CLUSTER_CHANGE_NODE_ADDED = 0x00000004, CLUSTER_CHANGE_NODE_PROPERTY = 0x00000008, CLUSTER_CHANGE_REGISTRY_NAME = 0x00000010, CLUSTER_CHANGE_REGISTRY_ATTRIBUTES = 0x00000020, CLUSTER_CHANGE_REGISTRY_VALUE = 0x00000040, CLUSTER_CHANGE_REGISTRY_SUBTREE = 0x00000080, CLUSTER_CHANGE_RESOURCE_STATE = 0x00000100, CLUSTER_CHANGE_RESOURCE_DELETED = 0x00000200, CLUSTER_CHANGE_RESOURCE_ADDED = 0x00000400, CLUSTER_CHANGE_RESOURCE_PROPERTY = 0x00000800, CLUSTER_CHANGE_GROUP_STATE = 0x00001000, CLUSTER_CHANGE_GROUP_DELETED = 0x00002000, CLUSTER_CHANGE_GROUP_ADDED = 0x00004000, CLUSTER_CHANGE_GROUP_PROPERTY = 0x00008000, CLUSTER_CHANGE_RESOURCE_TYPE_DELETED = 0x00010000, CLUSTER_CHANGE_RESOURCE_TYPE_ADDED = 0x00020000, CLUSTER_CHANGE_RESOURCE_TYPE_PROPERTY = 0x00040000, CLUSTER_CHANGE_CLUSTER_RECONNECT = 0x00080000, CLUSTER_CHANGE_NETWORK_STATE = 0x00100000, CLUSTER_CHANGE_NETWORK_DELETED = 0x00200000, CLUSTER_CHANGE_NETWORK_ADDED = 0x00400000, CLUSTER_CHANGE_NETWORK_PROPERTY = 0x00800000, CLUSTER_CHANGE_NETINTERFACE_STATE = 0x01000000, CLUSTER_CHANGE_NETINTERFACE_DELETED = 0x02000000, CLUSTER_CHANGE_NETINTERFACE_ADDED = 0x04000000, CLUSTER_CHANGE_NETINTERFACE_PROPERTY = 0x08000000, CLUSTER_CHANGE_QUORUM_STATE = 0x10000000, CLUSTER_CHANGE_CLUSTER_STATE = 0x20000000, CLUSTER_CHANGE_CLUSTER_PROPERTY = 0x40000000, CLUSTER_CHANGE_HANDLE_CLOSE = 0x80000000, CLUSTER_CHANGE_ALL = (CLUSTER_CHANGE_NODE_STATE | CLUSTER_CHANGE_NODE_DELETED | CLUSTER_CHANGE_NODE_ADDED | CLUSTER_CHANGE_NODE_PROPERTY | CLUSTER_CHANGE_REGISTRY_NAME | CLUSTER_CHANGE_REGISTRY_ATTRIBUTES | CLUSTER_CHANGE_REGISTRY_VALUE | CLUSTER_CHANGE_REGISTRY_SUBTREE | CLUSTER_CHANGE_RESOURCE_STATE | CLUSTER_CHANGE_RESOURCE_DELETED | CLUSTER_CHANGE_RESOURCE_ADDED | CLUSTER_CHANGE_RESOURCE_PROPERTY | CLUSTER_CHANGE_GROUP_STATE | CLUSTER_CHANGE_GROUP_DELETED | CLUSTER_CHANGE_GROUP_ADDED | CLUSTER_CHANGE_GROUP_PROPERTY | CLUSTER_CHANGE_RESOURCE_TYPE_DELETED | CLUSTER_CHANGE_RESOURCE_TYPE_ADDED | CLUSTER_CHANGE_RESOURCE_TYPE_PROPERTY | CLUSTER_CHANGE_NETWORK_STATE | CLUSTER_CHANGE_NETWORK_DELETED | CLUSTER_CHANGE_NETWORK_ADDED | CLUSTER_CHANGE_NETWORK_PROPERTY | CLUSTER_CHANGE_NETINTERFACE_STATE | CLUSTER_CHANGE_NETINTERFACE_DELETED | CLUSTER_CHANGE_NETINTERFACE_ADDED | CLUSTER_CHANGE_NETINTERFACE_PROPERTY | CLUSTER_CHANGE_QUORUM_STATE | CLUSTER_CHANGE_CLUSTER_STATE | CLUSTER_CHANGE_CLUSTER_PROPERTY | CLUSTER_CHANGE_CLUSTER_RECONNECT | CLUSTER_CHANGE_HANDLE_CLOSE) } CLUSTER_CHANGE; #endif // _CLUSTER_API_TYPES_ #ifndef MIDL_PASS HCHANGE WINAPI CreateClusterNotifyPort( IN OPTIONAL HCHANGE hChange, IN OPTIONAL HCLUSTER hCluster, IN DWORD dwFilter, IN DWORD_PTR dwNotifyKey ); DWORD WINAPI RegisterClusterNotify( IN HCHANGE hChange, IN DWORD dwFilterType, IN HANDLE hObject, IN DWORD_PTR dwNotifyKey ); DWORD WINAPI GetClusterNotify( __in HCHANGE hChange, __out DWORD_PTR *lpdwNotifyKey, __out LPDWORD lpdwFilterType, __out_ecount_part_opt(*lpcchName, *lpcchName + 1) LPWSTR lpszName, __inout LPDWORD lpcchName, __in DWORD dwMilliseconds ); BOOL WINAPI CloseClusterNotifyPort( IN HCHANGE hChange ); #endif // MIDL_PASS // // Enumeration routines // #ifndef _CLUSTER_API_TYPES_ // // Define enumerable types // typedef enum CLUSTER_ENUM { CLUSTER_ENUM_NODE = 0x00000001, CLUSTER_ENUM_RESTYPE = 0x00000002, CLUSTER_ENUM_RESOURCE = 0x00000004, CLUSTER_ENUM_GROUP = 0x00000008, CLUSTER_ENUM_NETWORK = 0x00000010, CLUSTER_ENUM_NETINTERFACE = 0x00000020, CLUSTER_ENUM_INTERNAL_NETWORK = 0x80000000, CLUSTER_ENUM_ALL = (CLUSTER_ENUM_NODE | CLUSTER_ENUM_RESTYPE | CLUSTER_ENUM_RESOURCE | CLUSTER_ENUM_GROUP | CLUSTER_ENUM_NETWORK | CLUSTER_ENUM_NETINTERFACE) } CLUSTER_ENUM; #endif // _CLUSTER_API_TYPES_ #ifndef MIDL_PASS HCLUSENUM WINAPI ClusterOpenEnum( IN HCLUSTER hCluster, IN DWORD dwType ); DWORD WINAPI ClusterGetEnumCount( IN HCLUSENUM hEnum ); DWORD WINAPI ClusterEnum( __in HCLUSENUM hEnum, __in DWORD dwIndex, __out LPDWORD lpdwType, __out_ecount_part(*lpcchName, *lpcchName + 1) LPWSTR lpszName, __inout LPDWORD lpcchName ); DWORD WINAPI ClusterCloseEnum( IN HCLUSENUM hEnum ); #endif // MIDL_PASS #ifndef _CLUSTER_API_TYPES_ // // Define enumerable node types // typedef enum CLUSTER_NODE_ENUM { CLUSTER_NODE_ENUM_NETINTERFACES = 0x00000001, CLUSTER_NODE_ENUM_ALL = (CLUSTER_NODE_ENUM_NETINTERFACES) } CLUSTER_NODE_ENUM; // // Node-related structures and types. // typedef enum CLUSTER_NODE_STATE { ClusterNodeStateUnknown = -1, ClusterNodeUp, ClusterNodeDown, ClusterNodePaused, ClusterNodeJoining } CLUSTER_NODE_STATE; #endif // _CLUSTER_API_TYPES_ // // Interfaces for managing the nodes of a cluster. // #ifndef MIDL_PASS HNODE WINAPI OpenClusterNode( IN HCLUSTER hCluster, IN LPCWSTR lpszNodeName ); BOOL WINAPI CloseClusterNode( IN HNODE hNode ); CLUSTER_NODE_STATE WINAPI GetClusterNodeState( IN HNODE hNode ); DWORD WINAPI GetClusterNodeId( __in HNODE hNode, __out_ecount_part(*lpcchName, *lpcchName + 1) LPWSTR lpszNodeId, __inout LPDWORD lpcchName ); #define GetCurrentClusterNodeId(_lpszNodeId_, _lpcchName_) \ GetClusterNodeId(NULL, (_lpszNodeId_), (_lpcchName_)) HCLUSTER WINAPI GetClusterFromNode( IN HNODE hNode ); DWORD WINAPI PauseClusterNode( IN HNODE hNode ); DWORD WINAPI ResumeClusterNode( IN HNODE hNode ); DWORD WINAPI EvictClusterNode( IN HNODE hNode ); HNODEENUM WINAPI ClusterNodeOpenEnum( IN HNODE hNode, IN DWORD dwType ); DWORD WINAPI ClusterNodeGetEnumCount( IN HNODEENUM hNodeEnum ); DWORD WINAPI ClusterNodeCloseEnum( IN HNODEENUM hNodeEnum ); DWORD WINAPI ClusterNodeEnum( __in HNODEENUM hNodeEnum, __in DWORD dwIndex, __out LPDWORD lpdwType, __out_ecount_part(*lpcchName, *lpcchName + 1) LPWSTR lpszName, __inout LPDWORD lpcchName ); DWORD WINAPI EvictClusterNodeEx( IN HNODE hNode, IN DWORD dwTimeOut, OUT HRESULT* phrCleanupStatus ); #endif // MIDL_PASS // // Interfaces for managing the resource types in a cluster // #ifndef MIDL_PASS HKEY WINAPI GetClusterResourceTypeKey( IN HCLUSTER hCluster, IN LPCWSTR lpszTypeName, IN REGSAM samDesired ); #endif // MIDL_PASS #ifndef _CLUSTER_API_TYPES_ // // Define enumerable group types // typedef enum CLUSTER_GROUP_ENUM { CLUSTER_GROUP_ENUM_CONTAINS = 0x00000001, CLUSTER_GROUP_ENUM_NODES = 0x00000002, CLUSTER_GROUP_ENUM_ALL = (CLUSTER_GROUP_ENUM_CONTAINS | CLUSTER_GROUP_ENUM_NODES) } CLUSTER_GROUP_ENUM; // // Interfaces for managing the failover groups in a cluster. // typedef enum CLUSTER_GROUP_STATE { ClusterGroupStateUnknown = -1, ClusterGroupOnline, ClusterGroupOffline, ClusterGroupFailed, ClusterGroupPartialOnline, ClusterGroupPending } CLUSTER_GROUP_STATE; typedef enum CLUSTER_GROUP_AUTOFAILBACK_TYPE { ClusterGroupPreventFailback = 0, ClusterGroupAllowFailback, ClusterGroupFailbackTypeCount } CLUSTER_GROUP_AUTOFAILBACK_TYPE, CGAFT; #endif // _CLUSTER_API_TYPES_ #ifndef MIDL_PASS HGROUP WINAPI CreateClusterGroup( IN HCLUSTER hCluster, IN LPCWSTR lpszGroupName ); HGROUP WINAPI OpenClusterGroup( IN HCLUSTER hCluster, IN LPCWSTR lpszGroupName ); BOOL WINAPI CloseClusterGroup( IN HGROUP hGroup ); HCLUSTER WINAPI GetClusterFromGroup( IN HGROUP hGroup ); CLUSTER_GROUP_STATE WINAPI GetClusterGroupState( __in HGROUP hGroup, __out_ecount_part_opt(*lpcchNodeName, *lpcchNodeName + 1) LPWSTR lpszNodeName, __inout LPDWORD lpcchNodeName ); DWORD WINAPI SetClusterGroupName( IN HGROUP hGroup, IN LPCWSTR lpszGroupName ); DWORD WINAPI SetClusterGroupNodeList( IN HGROUP hGroup, IN DWORD NodeCount, IN HNODE NodeList[] ); DWORD WINAPI OnlineClusterGroup( IN HGROUP hGroup, IN OPTIONAL HNODE hDestinationNode ); DWORD WINAPI MoveClusterGroup( IN HGROUP hGroup, IN OPTIONAL HNODE hDestinationNode ); DWORD WINAPI OfflineClusterGroup( IN HGROUP hGroup ); DWORD WINAPI DeleteClusterGroup( IN HGROUP hGroup ); HGROUPENUM WINAPI ClusterGroupOpenEnum( IN HGROUP hGroup, IN DWORD dwType ); DWORD WINAPI ClusterGroupGetEnumCount( IN HGROUPENUM hGroupEnum ); DWORD WINAPI ClusterGroupEnum( __in HGROUPENUM hGroupEnum, __in DWORD dwIndex, __out LPDWORD lpdwType, __out_ecount_part(*lpcchName, *lpcchName + 1) LPWSTR lpszResourceName, __inout LPDWORD lpcchName ); DWORD WINAPI ClusterGroupCloseEnum( IN HGROUPENUM hGroupEnum ); #endif // MIDL_PASS // // Definitions used in resource management routines. // #ifndef _CLUSTER_API_TYPES_ // // Resource-related structures and types // typedef enum CLUSTER_RESOURCE_STATE { ClusterResourceStateUnknown = -1, ClusterResourceInherited, ClusterResourceInitializing, ClusterResourceOnline, ClusterResourceOffline, ClusterResourceFailed, ClusterResourcePending = 128, ClusterResourceOnlinePending, ClusterResourceOfflinePending } CLUSTER_RESOURCE_STATE; typedef enum CLUSTER_RESOURCE_RESTART_ACTION { ClusterResourceDontRestart = 0, ClusterResourceRestartNoNotify, ClusterResourceRestartNotify, ClusterResourceRestartActionCount } CLUSTER_RESOURCE_RESTART_ACTION, CRRA; // // Flags for resource creation // typedef enum CLUSTER_RESOURCE_CREATE_FLAGS { CLUSTER_RESOURCE_DEFAULT_MONITOR = 0, CLUSTER_RESOURCE_SEPARATE_MONITOR = 1, CLUSTER_RESOURCE_VALID_FLAGS = CLUSTER_RESOURCE_SEPARATE_MONITOR } CLUSTER_RESOURCE_CREATE_FLAGS; #endif // _CLUSTER_API_TYPES_ // // Interfaces for managing the resources in a cluster // #ifndef MIDL_PASS HRESOURCE WINAPI CreateClusterResource( IN HGROUP hGroup, IN LPCWSTR lpszResourceName, IN LPCWSTR lpszResourceType, IN DWORD dwFlags ); HRESOURCE WINAPI OpenClusterResource( IN HCLUSTER hCluster, IN LPCWSTR lpszResourceName ); BOOL WINAPI CloseClusterResource( IN HRESOURCE hResource ); HCLUSTER WINAPI GetClusterFromResource( IN HRESOURCE hResource ); DWORD WINAPI DeleteClusterResource( IN HRESOURCE hResource ); CLUSTER_RESOURCE_STATE WINAPI GetClusterResourceState( __in HRESOURCE hResource, __out_ecount_part_opt(*lpcchNodeName, *lpcchNodeName + 1) LPWSTR lpszNodeName, __inout LPDWORD lpcchNodeName, __out_ecount_part_opt(*lpcchGroupName, *lpcchGroupName + 1) LPWSTR lpszGroupName, __inout LPDWORD lpcchGroupName ); DWORD WINAPI SetClusterResourceName( IN HRESOURCE hResource, IN LPCWSTR lpszResourceName ); DWORD WINAPI FailClusterResource( IN HRESOURCE hResource ); DWORD WINAPI OnlineClusterResource( IN HRESOURCE hResource ); DWORD WINAPI OfflineClusterResource( IN HRESOURCE hResource ); DWORD WINAPI ChangeClusterResourceGroup( IN HRESOURCE hResource, IN HGROUP hGroup ); DWORD WINAPI AddClusterResourceNode( IN HRESOURCE hResource, IN HNODE hNode ); DWORD WINAPI RemoveClusterResourceNode( IN HRESOURCE hResource, IN HNODE hNode ); DWORD WINAPI AddClusterResourceDependency( IN HRESOURCE hResource, IN HRESOURCE hDependsOn ); DWORD WINAPI RemoveClusterResourceDependency( IN HRESOURCE hResource, IN HRESOURCE hDependsOn ); BOOL WINAPI CanResourceBeDependent( IN HRESOURCE hResource, IN HRESOURCE hResourceDependent ); DWORD WINAPI ClusterResourceControl( __in HRESOURCE hResource, __in_opt HNODE hHostNode, __in DWORD dwControlCode, __in_bcount_opt(cbInBufferSize) LPVOID lpInBuffer, __in DWORD cbInBufferSize, __out_bcount_part_opt(cbOutBufferSize, *lpBytesReturned) LPVOID lpOutBuffer, __in DWORD cbOutBufferSize, __out LPDWORD lpBytesReturned ); DWORD WINAPI ClusterResourceTypeControl( __in HCLUSTER hCluster, __in LPCWSTR lpszResourceTypeName, __in_opt HNODE hHostNode, __in DWORD dwControlCode, __in_bcount_opt(nInBufferSize) LPVOID lpInBuffer, __in DWORD nInBufferSize, __out_bcount_part_opt(nOutBufferSize, *lpBytesReturned) LPVOID lpOutBuffer, __in DWORD nOutBufferSize, __out LPDWORD lpBytesReturned ); DWORD WINAPI ClusterGroupControl( __in HGROUP hGroup, __in_opt HNODE hHostNode, __in DWORD dwControlCode, __in_bcount_opt(nInBufferSize) LPVOID lpInBuffer, __in DWORD nInBufferSize, __out_bcount_part_opt(nOutBufferSize, *lpBytesReturned) LPVOID lpOutBuffer, __in DWORD nOutBufferSize, __out LPDWORD lpBytesReturned ); DWORD WINAPI ClusterNodeControl( __in HNODE hNode, __in_opt HNODE hHostNode, __in DWORD dwControlCode, __in_bcount_opt(nInBufferSize) LPVOID lpInBuffer, __in DWORD nInBufferSize, __out_bcount_part_opt(nOutBufferSize, *lpBytesReturned) LPVOID lpOutBuffer, __in DWORD nOutBufferSize, __out LPDWORD lpBytesReturned ); BOOL WINAPI GetClusterResourceNetworkName( __in HRESOURCE hResource, __out_ecount_part(*nSize, *nSize + 1) LPWSTR lpBuffer, __inout LPDWORD nSize ); #endif // MIDL_PASS // // Cluster control properties // #ifndef _CLUSTER_API_TYPES_ // // Cluster Control Property Data - Types (a WORD) // typedef enum CLUSTER_PROPERTY_TYPE { CLUSPROP_TYPE_UNKNOWN = -1, CLUSPROP_TYPE_ENDMARK = 0, CLUSPROP_TYPE_LIST_VALUE, CLUSPROP_TYPE_RESCLASS, CLUSPROP_TYPE_RESERVED1, CLUSPROP_TYPE_NAME, CLUSPROP_TYPE_SIGNATURE, CLUSPROP_TYPE_SCSI_ADDRESS, CLUSPROP_TYPE_DISK_NUMBER, CLUSPROP_TYPE_PARTITION_INFO, CLUSPROP_TYPE_FTSET_INFO, CLUSPROP_TYPE_DISK_SERIALNUMBER, CLUSPROP_TYPE_USER=32768 } CLUSTER_PROPERTY_TYPE; // // Cluster Control Property Data - Formats (a WORD) // typedef enum CLUSTER_PROPERTY_FORMAT { CLUSPROP_FORMAT_UNKNOWN = 0, CLUSPROP_FORMAT_BINARY, CLUSPROP_FORMAT_DWORD, CLUSPROP_FORMAT_SZ, CLUSPROP_FORMAT_EXPAND_SZ, CLUSPROP_FORMAT_MULTI_SZ, CLUSPROP_FORMAT_ULARGE_INTEGER, CLUSPROP_FORMAT_LONG, CLUSPROP_FORMAT_EXPANDED_SZ, CLUSPROP_FORMAT_SECURITY_DESCRIPTOR, CLUSPROP_FORMAT_LARGE_INTEGER, CLUSPROP_FORMAT_WORD, CLUSPROP_FORMAT_USER=32768 } CLUSTER_PROPERTY_FORMAT; #endif // _CLUSTER_API_TYPES_ // // Cluster Control Property Data - Syntax // #define CLUSPROP_SYNTAX_VALUE( type, format ) ((DWORD) ((type << 16) | format)) #ifndef _CLUSTER_API_TYPES_ typedef enum CLUSTER_PROPERTY_SYNTAX { CLUSPROP_SYNTAX_ENDMARK = CLUSPROP_SYNTAX_VALUE( CLUSPROP_TYPE_ENDMARK, CLUSPROP_FORMAT_UNKNOWN ), CLUSPROP_SYNTAX_NAME = CLUSPROP_SYNTAX_VALUE( CLUSPROP_TYPE_NAME, CLUSPROP_FORMAT_SZ ), CLUSPROP_SYNTAX_RESCLASS = CLUSPROP_SYNTAX_VALUE( CLUSPROP_TYPE_RESCLASS, CLUSPROP_FORMAT_DWORD ), CLUSPROP_SYNTAX_LIST_VALUE_SZ = CLUSPROP_SYNTAX_VALUE( CLUSPROP_TYPE_LIST_VALUE, CLUSPROP_FORMAT_SZ ), CLUSPROP_SYNTAX_LIST_VALUE_EXPAND_SZ = CLUSPROP_SYNTAX_VALUE( CLUSPROP_TYPE_LIST_VALUE, CLUSPROP_FORMAT_EXPAND_SZ ), CLUSPROP_SYNTAX_LIST_VALUE_DWORD = CLUSPROP_SYNTAX_VALUE( CLUSPROP_TYPE_LIST_VALUE, CLUSPROP_FORMAT_DWORD ), CLUSPROP_SYNTAX_LIST_VALUE_BINARY = CLUSPROP_SYNTAX_VALUE( CLUSPROP_TYPE_LIST_VALUE, CLUSPROP_FORMAT_BINARY ), CLUSPROP_SYNTAX_LIST_VALUE_MULTI_SZ = CLUSPROP_SYNTAX_VALUE( CLUSPROP_TYPE_LIST_VALUE, CLUSPROP_FORMAT_MULTI_SZ ), CLUSPROP_SYNTAX_LIST_VALUE_LONG = CLUSPROP_SYNTAX_VALUE( CLUSPROP_TYPE_LIST_VALUE, CLUSPROP_FORMAT_LONG ), CLUSPROP_SYNTAX_LIST_VALUE_EXPANDED_SZ = CLUSPROP_SYNTAX_VALUE( CLUSPROP_TYPE_LIST_VALUE, CLUSPROP_FORMAT_EXPANDED_SZ ), CLUSPROP_SYNTAX_LIST_VALUE_SECURITY_DESCRIPTOR = CLUSPROP_SYNTAX_VALUE( CLUSPROP_TYPE_LIST_VALUE, CLUSPROP_FORMAT_SECURITY_DESCRIPTOR ), CLUSPROP_SYNTAX_LIST_VALUE_LARGE_INTEGER = CLUSPROP_SYNTAX_VALUE( CLUSPROP_TYPE_LIST_VALUE, CLUSPROP_FORMAT_LARGE_INTEGER ), CLUSPROP_SYNTAX_LIST_VALUE_ULARGE_INTEGER = CLUSPROP_SYNTAX_VALUE( CLUSPROP_TYPE_LIST_VALUE, CLUSPROP_FORMAT_ULARGE_INTEGER ), // Storage syntax values CLUSPROP_SYNTAX_DISK_SIGNATURE = CLUSPROP_SYNTAX_VALUE( CLUSPROP_TYPE_SIGNATURE, CLUSPROP_FORMAT_DWORD ), CLUSPROP_SYNTAX_SCSI_ADDRESS = CLUSPROP_SYNTAX_VALUE( CLUSPROP_TYPE_SCSI_ADDRESS, CLUSPROP_FORMAT_DWORD ), CLUSPROP_SYNTAX_DISK_NUMBER = CLUSPROP_SYNTAX_VALUE( CLUSPROP_TYPE_DISK_NUMBER, CLUSPROP_FORMAT_DWORD ), CLUSPROP_SYNTAX_PARTITION_INFO = CLUSPROP_SYNTAX_VALUE( CLUSPROP_TYPE_PARTITION_INFO, CLUSPROP_FORMAT_BINARY ), CLUSPROP_SYNTAX_FTSET_INFO = CLUSPROP_SYNTAX_VALUE( CLUSPROP_TYPE_FTSET_INFO, CLUSPROP_FORMAT_BINARY ), CLUSPROP_SYNTAX_DISK_SERIALNUMBER = CLUSPROP_SYNTAX_VALUE( CLUSPROP_TYPE_DISK_SERIALNUMBER, CLUSPROP_FORMAT_SZ ) } CLUSTER_PROPERTY_SYNTAX; #endif // _CLUSTER_API_TYPES_ // // Define Cluster Control Code access methods // #define CLUS_ACCESS_ANY 0 #define CLUS_ACCESS_READ 0x01 #define CLUS_ACCESS_WRITE 0x02 // // Define Cluster Control Code modification actions // #define CLUS_NO_MODIFY 0 #define CLUS_MODIFY 0x01 // // Define Cluster Control Code Global actions // #define CLUS_NOT_GLOBAL 0 #define CLUS_GLOBAL 0x01 #ifndef _CLUSTER_API_TYPES_ // // Define Cluster Control Code target objects // typedef enum CLUSTER_CONTROL_OBJECT { CLUS_OBJECT_INVALID=0, CLUS_OBJECT_RESOURCE, CLUS_OBJECT_RESOURCE_TYPE, CLUS_OBJECT_GROUP, CLUS_OBJECT_NODE, CLUS_OBJECT_NETWORK, CLUS_OBJECT_NETINTERFACE, CLUS_OBJECT_CLUSTER, CLUS_OBJECT_USER=128 } CLUSTER_CONTROL_OBJECT; #endif // _CLUSTER_API_TYPES_ // // Macro to generate full cluster control codes // // 31 24 23 22 21 20 19 16 15 2 1 0 // +----------+--+--+--+--+-----------+-----------------------+------+ // | OBJECT |G |M |U |I CLUSTER CONTROL CODES |ACCESS| // +----------+--+--+--+--+-----------+-----------------------+------+ // // OBJECT - Object identifier (8 bits) // G - Global bit (operation must be performed on all nodes of cluster) // M - Modify bit (code causes a modification, may cause event notification) // U - User code bit (splits the control codes into 2 spaces each 2^^19 in size) // I - Internal code bit (only for non-user control codes) // CLUSTER CONTROL CODES - 2^^18 (256 thousand possible control codes) // ACCESS - Access mode (2 bits) // // // Define control code shifts // #define CLUSCTL_ACCESS_SHIFT 0 #define CLUSCTL_FUNCTION_SHIFT 2 #define CLCTL_INTERNAL_SHIFT 20 #define CLCTL_USER_SHIFT 21 #define CLCTL_MODIFY_SHIFT 22 #define CLCTL_GLOBAL_SHIFT 23 #define CLUSCTL_OBJECT_SHIFT 24 // // Define control code masks // #define CLCTL_INTERNAL_MASK (1<> CLUSCTL_ACCESS_SHIFT) & CLUSCTL_CONTROL_CODE_MASK) #define CLUSCTL_GET_ACCESS_MODE( ControlCode ) \ ((ControlCode >> CLUSCTL_ACCESS_SHIFT) & CLUSCTL_ACCESS_MODE_MASK) #define CLUSCTL_GET_CONTROL_OBJECT( ControlCode ) \ ((ControlCode >> CLUSCTL_OBJECT_SHIFT) & CLUSCTL_OBJECT_MASK) #ifndef _CLUSTER_API_TYPES_ // // Cluster Control Codes for Resources // typedef enum CLUSCTL_RESOURCE_CODES { // External CLUSCTL_RESOURCE_UNKNOWN = CLUSCTL_RESOURCE_CODE( CLCTL_UNKNOWN ), CLUSCTL_RESOURCE_GET_CHARACTERISTICS = CLUSCTL_RESOURCE_CODE( CLCTL_GET_CHARACTERISTICS ), CLUSCTL_RESOURCE_GET_FLAGS = CLUSCTL_RESOURCE_CODE( CLCTL_GET_FLAGS ), CLUSCTL_RESOURCE_GET_CLASS_INFO = CLUSCTL_RESOURCE_CODE( CLCTL_GET_CLASS_INFO ), CLUSCTL_RESOURCE_GET_REQUIRED_DEPENDENCIES = CLUSCTL_RESOURCE_CODE( CLCTL_GET_REQUIRED_DEPENDENCIES ), CLUSCTL_RESOURCE_GET_NAME = CLUSCTL_RESOURCE_CODE( CLCTL_GET_NAME ), CLUSCTL_RESOURCE_GET_ID = CLUSCTL_RESOURCE_CODE( CLCTL_GET_ID ), CLUSCTL_RESOURCE_GET_RESOURCE_TYPE = CLUSCTL_RESOURCE_CODE( CLCTL_GET_RESOURCE_TYPE ), CLUSCTL_RESOURCE_ENUM_COMMON_PROPERTIES = CLUSCTL_RESOURCE_CODE( CLCTL_ENUM_COMMON_PROPERTIES ), CLUSCTL_RESOURCE_GET_RO_COMMON_PROPERTIES = CLUSCTL_RESOURCE_CODE( CLCTL_GET_RO_COMMON_PROPERTIES ), CLUSCTL_RESOURCE_GET_COMMON_PROPERTIES = CLUSCTL_RESOURCE_CODE( CLCTL_GET_COMMON_PROPERTIES ), CLUSCTL_RESOURCE_SET_COMMON_PROPERTIES = CLUSCTL_RESOURCE_CODE( CLCTL_SET_COMMON_PROPERTIES ), CLUSCTL_RESOURCE_VALIDATE_COMMON_PROPERTIES = CLUSCTL_RESOURCE_CODE( CLCTL_VALIDATE_COMMON_PROPERTIES ), CLUSCTL_RESOURCE_GET_COMMON_PROPERTY_FMTS = CLUSCTL_RESOURCE_CODE( CLCTL_GET_COMMON_PROPERTY_FMTS ), CLUSCTL_RESOURCE_ENUM_PRIVATE_PROPERTIES = CLUSCTL_RESOURCE_CODE( CLCTL_ENUM_PRIVATE_PROPERTIES ), CLUSCTL_RESOURCE_GET_RO_PRIVATE_PROPERTIES = CLUSCTL_RESOURCE_CODE( CLCTL_GET_RO_PRIVATE_PROPERTIES ), CLUSCTL_RESOURCE_GET_PRIVATE_PROPERTIES = CLUSCTL_RESOURCE_CODE( CLCTL_GET_PRIVATE_PROPERTIES ), CLUSCTL_RESOURCE_SET_PRIVATE_PROPERTIES = CLUSCTL_RESOURCE_CODE( CLCTL_SET_PRIVATE_PROPERTIES ), CLUSCTL_RESOURCE_VALIDATE_PRIVATE_PROPERTIES = CLUSCTL_RESOURCE_CODE( CLCTL_VALIDATE_PRIVATE_PROPERTIES ), CLUSCTL_RESOURCE_GET_PRIVATE_PROPERTY_FMTS = CLUSCTL_RESOURCE_CODE( CLCTL_GET_PRIVATE_PROPERTY_FMTS ), CLUSCTL_RESOURCE_ADD_REGISTRY_CHECKPOINT = CLUSCTL_RESOURCE_CODE( CLCTL_ADD_REGISTRY_CHECKPOINT ), CLUSCTL_RESOURCE_DELETE_REGISTRY_CHECKPOINT = CLUSCTL_RESOURCE_CODE( CLCTL_DELETE_REGISTRY_CHECKPOINT ), CLUSCTL_RESOURCE_GET_REGISTRY_CHECKPOINTS = CLUSCTL_RESOURCE_CODE( CLCTL_GET_REGISTRY_CHECKPOINTS ), CLUSCTL_RESOURCE_ADD_CRYPTO_CHECKPOINT = CLUSCTL_RESOURCE_CODE( CLCTL_ADD_CRYPTO_CHECKPOINT ), CLUSCTL_RESOURCE_DELETE_CRYPTO_CHECKPOINT = CLUSCTL_RESOURCE_CODE( CLCTL_DELETE_CRYPTO_CHECKPOINT ), CLUSCTL_RESOURCE_GET_CRYPTO_CHECKPOINTS = CLUSCTL_RESOURCE_CODE( CLCTL_GET_CRYPTO_CHECKPOINTS ), CLUSCTL_RESOURCE_GET_LOADBAL_PROCESS_LIST = CLUSCTL_RESOURCE_CODE( CLCTL_GET_LOADBAL_PROCESS_LIST ), CLUSCTL_RESOURCE_GET_NETWORK_NAME = CLUSCTL_RESOURCE_CODE( CLCTL_GET_NETWORK_NAME ), CLUSCTL_RESOURCE_NETNAME_GET_VIRTUAL_SERVER_TOKEN = CLUSCTL_RESOURCE_CODE( CLCTL_NETNAME_GET_VIRTUAL_SERVER_TOKEN ), CLUSCTL_RESOURCE_NETNAME_REGISTER_DNS_RECORDS = CLUSCTL_RESOURCE_CODE( CLCTL_NETNAME_REGISTER_DNS_RECORDS ), CLUSCTL_RESOURCE_STORAGE_GET_DISK_INFO = CLUSCTL_RESOURCE_CODE( CLCTL_STORAGE_GET_DISK_INFO ), CLUSCTL_RESOURCE_STORAGE_IS_PATH_VALID = CLUSCTL_RESOURCE_CODE( CLCTL_STORAGE_IS_PATH_VALID ), CLUSCTL_RESOURCE_QUERY_DELETE = CLUSCTL_RESOURCE_CODE( CLCTL_QUERY_DELETE ), CLUSCTL_RESOURCE_UPGRADE_DLL = CLUSCTL_RESOURCE_CODE( CLCTL_RESOURCE_UPGRADE_DLL ), CLUSCTL_RESOURCE_ADD_REGISTRY_CHECKPOINT_64BIT = CLUSCTL_RESOURCE_CODE( CLCTL_ADD_REGISTRY_CHECKPOINT_64BIT ), CLUSCTL_RESOURCE_ADD_REGISTRY_CHECKPOINT_32BIT = CLUSCTL_RESOURCE_CODE( CLCTL_ADD_REGISTRY_CHECKPOINT_32BIT ), CLUSCTL_RESOURCE_QUERY_MAINTENANCE_MODE = CLUSCTL_RESOURCE_CODE( CLCTL_QUERY_MAINTENANCE_MODE ), CLUSCTL_RESOURCE_SET_MAINTENANCE_MODE = CLUSCTL_RESOURCE_CODE( CLCTL_SET_MAINTENANCE_MODE ), // Internal CLUSCTL_RESOURCE_DELETE = CLUSCTL_RESOURCE_CODE( CLCTL_DELETE ), CLUSCTL_RESOURCE_INSTALL_NODE = CLUSCTL_RESOURCE_CODE( CLCTL_INSTALL_NODE ), CLUSCTL_RESOURCE_EVICT_NODE = CLUSCTL_RESOURCE_CODE( CLCTL_EVICT_NODE ), CLUSCTL_RESOURCE_ADD_DEPENDENCY = CLUSCTL_RESOURCE_CODE( CLCTL_ADD_DEPENDENCY ), CLUSCTL_RESOURCE_REMOVE_DEPENDENCY = CLUSCTL_RESOURCE_CODE( CLCTL_REMOVE_DEPENDENCY ), CLUSCTL_RESOURCE_ADD_OWNER = CLUSCTL_RESOURCE_CODE( CLCTL_ADD_OWNER ), CLUSCTL_RESOURCE_REMOVE_OWNER = CLUSCTL_RESOURCE_CODE( CLCTL_REMOVE_OWNER ), CLUSCTL_RESOURCE_SET_NAME = CLUSCTL_RESOURCE_CODE( CLCTL_SET_NAME ), CLUSCTL_RESOURCE_CLUSTER_NAME_CHANGED = CLUSCTL_RESOURCE_CODE( CLCTL_CLUSTER_NAME_CHANGED ), CLUSCTL_RESOURCE_CLUSTER_VERSION_CHANGED = CLUSCTL_RESOURCE_CODE( CLCTL_CLUSTER_VERSION_CHANGED ), CLUSCTL_RESOURCE_FORCE_QUORUM = CLUSCTL_RESOURCE_CODE( CLCTL_FORCE_QUORUM ), CLUSCTL_RESOURCE_INITIALIZE = CLUSCTL_RESOURCE_CODE( CLCTL_INITIALIZE ), CLUSCTL_RESOURCE_STATE_CHANGE_REASON = CLUSCTL_RESOURCE_CODE( CLCTL_STATE_CHANGE_REASON ) } CLUSCTL_RESOURCE_CODES; // // Cluster Control Codes for Resource Types // typedef enum CLUSCTL_RESOURCE_TYPE_CODES { // External CLUSCTL_RESOURCE_TYPE_UNKNOWN = CLUSCTL_RESOURCE_TYPE_CODE( CLCTL_UNKNOWN ), CLUSCTL_RESOURCE_TYPE_GET_CHARACTERISTICS = CLUSCTL_RESOURCE_TYPE_CODE( CLCTL_GET_CHARACTERISTICS ), CLUSCTL_RESOURCE_TYPE_GET_FLAGS = CLUSCTL_RESOURCE_TYPE_CODE( CLCTL_GET_FLAGS ), CLUSCTL_RESOURCE_TYPE_GET_CLASS_INFO = CLUSCTL_RESOURCE_TYPE_CODE( CLCTL_GET_CLASS_INFO ), CLUSCTL_RESOURCE_TYPE_GET_REQUIRED_DEPENDENCIES = CLUSCTL_RESOURCE_TYPE_CODE( CLCTL_GET_REQUIRED_DEPENDENCIES ), CLUSCTL_RESOURCE_TYPE_GET_ARB_TIMEOUT = CLUSCTL_RESOURCE_TYPE_CODE( CLCTL_GET_ARB_TIMEOUT ), CLUSCTL_RESOURCE_TYPE_ENUM_COMMON_PROPERTIES = CLUSCTL_RESOURCE_TYPE_CODE( CLCTL_ENUM_COMMON_PROPERTIES ), CLUSCTL_RESOURCE_TYPE_GET_RO_COMMON_PROPERTIES = CLUSCTL_RESOURCE_TYPE_CODE( CLCTL_GET_RO_COMMON_PROPERTIES ), CLUSCTL_RESOURCE_TYPE_GET_COMMON_PROPERTIES = CLUSCTL_RESOURCE_TYPE_CODE( CLCTL_GET_COMMON_PROPERTIES ), CLUSCTL_RESOURCE_TYPE_VALIDATE_COMMON_PROPERTIES = CLUSCTL_RESOURCE_TYPE_CODE( CLCTL_VALIDATE_COMMON_PROPERTIES ), CLUSCTL_RESOURCE_TYPE_SET_COMMON_PROPERTIES = CLUSCTL_RESOURCE_TYPE_CODE( CLCTL_SET_COMMON_PROPERTIES ), CLUSCTL_RESOURCE_TYPE_GET_COMMON_PROPERTY_FMTS = CLUSCTL_RESOURCE_TYPE_CODE( CLCTL_GET_COMMON_PROPERTY_FMTS ), CLUSCTL_RESOURCE_TYPE_GET_COMMON_RESOURCE_PROPERTY_FMTS = CLUSCTL_RESOURCE_TYPE_CODE( CLCTL_GET_COMMON_RESOURCE_PROPERTY_FMTS ), CLUSCTL_RESOURCE_TYPE_ENUM_PRIVATE_PROPERTIES = CLUSCTL_RESOURCE_TYPE_CODE( CLCTL_ENUM_PRIVATE_PROPERTIES ), CLUSCTL_RESOURCE_TYPE_GET_RO_PRIVATE_PROPERTIES = CLUSCTL_RESOURCE_TYPE_CODE( CLCTL_GET_RO_PRIVATE_PROPERTIES ), CLUSCTL_RESOURCE_TYPE_GET_PRIVATE_PROPERTIES = CLUSCTL_RESOURCE_TYPE_CODE( CLCTL_GET_PRIVATE_PROPERTIES ), CLUSCTL_RESOURCE_TYPE_SET_PRIVATE_PROPERTIES = CLUSCTL_RESOURCE_TYPE_CODE( CLCTL_SET_PRIVATE_PROPERTIES ), CLUSCTL_RESOURCE_TYPE_VALIDATE_PRIVATE_PROPERTIES = CLUSCTL_RESOURCE_TYPE_CODE( CLCTL_VALIDATE_PRIVATE_PROPERTIES ), CLUSCTL_RESOURCE_TYPE_GET_PRIVATE_PROPERTY_FMTS = CLUSCTL_RESOURCE_TYPE_CODE( CLCTL_GET_PRIVATE_PROPERTY_FMTS ), CLUSCTL_RESOURCE_TYPE_GET_PRIVATE_RESOURCE_PROPERTY_FMTS = CLUSCTL_RESOURCE_TYPE_CODE( CLCTL_GET_PRIVATE_RESOURCE_PROPERTY_FMTS ), CLUSCTL_RESOURCE_TYPE_GET_REGISTRY_CHECKPOINTS = CLUSCTL_RESOURCE_TYPE_CODE( CLCTL_GET_REGISTRY_CHECKPOINTS ), CLUSCTL_RESOURCE_TYPE_GET_CRYPTO_CHECKPOINTS = CLUSCTL_RESOURCE_TYPE_CODE( CLCTL_GET_CRYPTO_CHECKPOINTS ), CLUSCTL_RESOURCE_TYPE_STORAGE_GET_AVAILABLE_DISKS = CLUSCTL_RESOURCE_TYPE_CODE( CLCTL_STORAGE_GET_AVAILABLE_DISKS ), CLUSCTL_RESOURCE_TYPE_QUERY_DELETE = CLUSCTL_RESOURCE_TYPE_CODE( CLCTL_QUERY_DELETE ), // Internal CLUSCTL_RESOURCE_TYPE_INSTALL_NODE = CLUSCTL_RESOURCE_TYPE_CODE( CLCTL_INSTALL_NODE ), CLUSCTL_RESOURCE_TYPE_EVICT_NODE = CLUSCTL_RESOURCE_TYPE_CODE( CLCTL_EVICT_NODE ), CLUSCTL_RESOURCE_TYPE_CLUSTER_VERSION_CHANGED = CLUSCTL_RESOURCE_TYPE_CODE( CLCTL_CLUSTER_VERSION_CHANGED ), CLUSCTL_RESOURCE_TYPE_FIXUP_ON_UPGRADE = CLUSCTL_RESOURCE_TYPE_CODE( CLCTL_FIXUP_ON_UPGRADE ), CLUSCTL_RESOURCE_TYPE_STARTING_PHASE1 = CLUSCTL_RESOURCE_TYPE_CODE( CLCTL_STARTING_PHASE1 ), CLUSCTL_RESOURCE_TYPE_STARTING_PHASE2 = CLUSCTL_RESOURCE_TYPE_CODE( CLCTL_STARTING_PHASE2 ), CLUSCTL_RESOURCE_TYPE_HOLD_IO = CLUSCTL_RESOURCE_TYPE_CODE( CLCTL_HOLD_IO ), CLUSCTL_RESOURCE_TYPE_RESUME_IO = CLUSCTL_RESOURCE_TYPE_CODE( CLCTL_RESUME_IO ) } CLUSCTL_RESOURCE_TYPE_CODES; // // Cluster Control Codes for Groups // typedef enum CLUSCTL_GROUP_CODES { // External CLUSCTL_GROUP_UNKNOWN = CLUSCTL_GROUP_CODE( CLCTL_UNKNOWN ), CLUSCTL_GROUP_GET_CHARACTERISTICS = CLUSCTL_GROUP_CODE( CLCTL_GET_CHARACTERISTICS ), CLUSCTL_GROUP_GET_FLAGS = CLUSCTL_GROUP_CODE( CLCTL_GET_FLAGS ), CLUSCTL_GROUP_GET_NAME = CLUSCTL_GROUP_CODE( CLCTL_GET_NAME ), CLUSCTL_GROUP_GET_ID = CLUSCTL_GROUP_CODE( CLCTL_GET_ID ), CLUSCTL_GROUP_ENUM_COMMON_PROPERTIES = CLUSCTL_GROUP_CODE( CLCTL_ENUM_COMMON_PROPERTIES ), CLUSCTL_GROUP_GET_RO_COMMON_PROPERTIES = CLUSCTL_GROUP_CODE( CLCTL_GET_RO_COMMON_PROPERTIES ), CLUSCTL_GROUP_GET_COMMON_PROPERTIES = CLUSCTL_GROUP_CODE( CLCTL_GET_COMMON_PROPERTIES ), CLUSCTL_GROUP_SET_COMMON_PROPERTIES = CLUSCTL_GROUP_CODE( CLCTL_SET_COMMON_PROPERTIES ), CLUSCTL_GROUP_VALIDATE_COMMON_PROPERTIES = CLUSCTL_GROUP_CODE( CLCTL_VALIDATE_COMMON_PROPERTIES ), CLUSCTL_GROUP_ENUM_PRIVATE_PROPERTIES = CLUSCTL_GROUP_CODE( CLCTL_ENUM_PRIVATE_PROPERTIES ), CLUSCTL_GROUP_GET_RO_PRIVATE_PROPERTIES = CLUSCTL_GROUP_CODE( CLCTL_GET_RO_PRIVATE_PROPERTIES ), CLUSCTL_GROUP_GET_PRIVATE_PROPERTIES = CLUSCTL_GROUP_CODE( CLCTL_GET_PRIVATE_PROPERTIES ), CLUSCTL_GROUP_SET_PRIVATE_PROPERTIES = CLUSCTL_GROUP_CODE( CLCTL_SET_PRIVATE_PROPERTIES ), CLUSCTL_GROUP_VALIDATE_PRIVATE_PROPERTIES = CLUSCTL_GROUP_CODE( CLCTL_VALIDATE_PRIVATE_PROPERTIES ), CLUSCTL_GROUP_QUERY_DELETE = CLUSCTL_GROUP_CODE( CLCTL_QUERY_DELETE ), CLUSCTL_GROUP_GET_COMMON_PROPERTY_FMTS= CLUSCTL_GROUP_CODE( CLCTL_GET_COMMON_PROPERTY_FMTS ), CLUSCTL_GROUP_GET_PRIVATE_PROPERTY_FMTS= CLUSCTL_GROUP_CODE( CLCTL_GET_PRIVATE_PROPERTY_FMTS ) // Internal } CLUSCTL_GROUP_CODES; // // Cluster Control Codes for Nodes // typedef enum CLUSCTL_NODE_CODES { // External CLUSCTL_NODE_UNKNOWN = CLUSCTL_NODE_CODE( CLCTL_UNKNOWN ), CLUSCTL_NODE_GET_CHARACTERISTICS = CLUSCTL_NODE_CODE( CLCTL_GET_CHARACTERISTICS ), CLUSCTL_NODE_GET_FLAGS = CLUSCTL_NODE_CODE( CLCTL_GET_FLAGS ), CLUSCTL_NODE_GET_NAME = CLUSCTL_NODE_CODE( CLCTL_GET_NAME ), CLUSCTL_NODE_GET_ID = CLUSCTL_NODE_CODE( CLCTL_GET_ID ), CLUSCTL_NODE_ENUM_COMMON_PROPERTIES = CLUSCTL_NODE_CODE( CLCTL_ENUM_COMMON_PROPERTIES ), CLUSCTL_NODE_GET_RO_COMMON_PROPERTIES = CLUSCTL_NODE_CODE( CLCTL_GET_RO_COMMON_PROPERTIES ), CLUSCTL_NODE_GET_COMMON_PROPERTIES = CLUSCTL_NODE_CODE( CLCTL_GET_COMMON_PROPERTIES ), CLUSCTL_NODE_SET_COMMON_PROPERTIES = CLUSCTL_NODE_CODE( CLCTL_SET_COMMON_PROPERTIES ), CLUSCTL_NODE_VALIDATE_COMMON_PROPERTIES = CLUSCTL_NODE_CODE( CLCTL_VALIDATE_COMMON_PROPERTIES ), CLUSCTL_NODE_ENUM_PRIVATE_PROPERTIES = CLUSCTL_NODE_CODE( CLCTL_ENUM_PRIVATE_PROPERTIES ), CLUSCTL_NODE_GET_RO_PRIVATE_PROPERTIES = CLUSCTL_NODE_CODE( CLCTL_GET_RO_PRIVATE_PROPERTIES ), CLUSCTL_NODE_GET_PRIVATE_PROPERTIES = CLUSCTL_NODE_CODE( CLCTL_GET_PRIVATE_PROPERTIES ), CLUSCTL_NODE_SET_PRIVATE_PROPERTIES = CLUSCTL_NODE_CODE( CLCTL_SET_PRIVATE_PROPERTIES ), CLUSCTL_NODE_VALIDATE_PRIVATE_PROPERTIES = CLUSCTL_NODE_CODE( CLCTL_VALIDATE_PRIVATE_PROPERTIES ), CLUSCTL_NODE_GET_COMMON_PROPERTY_FMTS= CLUSCTL_NODE_CODE( CLCTL_GET_COMMON_PROPERTY_FMTS ), CLUSCTL_NODE_GET_PRIVATE_PROPERTY_FMTS= CLUSCTL_NODE_CODE( CLCTL_GET_PRIVATE_PROPERTY_FMTS ), CLUSCTL_NODE_GET_CLUSTER_SERVICE_ACCOUNT_NAME = CLUSCTL_NODE_CODE( CLCTL_GET_CLUSTER_SERVICE_ACCOUNT_NAME ) } CLUSCTL_NODE_CODES; // // Cluster Control Codes for Networks // typedef enum CLUSCTL_NETWORK_CODES { // External CLUSCTL_NETWORK_UNKNOWN = CLUSCTL_NETWORK_CODE( CLCTL_UNKNOWN ), CLUSCTL_NETWORK_GET_CHARACTERISTICS = CLUSCTL_NETWORK_CODE( CLCTL_GET_CHARACTERISTICS ), CLUSCTL_NETWORK_GET_FLAGS = CLUSCTL_NETWORK_CODE( CLCTL_GET_FLAGS ), CLUSCTL_NETWORK_GET_NAME = CLUSCTL_NETWORK_CODE( CLCTL_GET_NAME ), CLUSCTL_NETWORK_GET_ID = CLUSCTL_NETWORK_CODE( CLCTL_GET_ID ), CLUSCTL_NETWORK_ENUM_COMMON_PROPERTIES = CLUSCTL_NETWORK_CODE( CLCTL_ENUM_COMMON_PROPERTIES ), CLUSCTL_NETWORK_GET_RO_COMMON_PROPERTIES = CLUSCTL_NETWORK_CODE( CLCTL_GET_RO_COMMON_PROPERTIES ), CLUSCTL_NETWORK_GET_COMMON_PROPERTIES = CLUSCTL_NETWORK_CODE( CLCTL_GET_COMMON_PROPERTIES ), CLUSCTL_NETWORK_SET_COMMON_PROPERTIES = CLUSCTL_NETWORK_CODE( CLCTL_SET_COMMON_PROPERTIES ), CLUSCTL_NETWORK_VALIDATE_COMMON_PROPERTIES = CLUSCTL_NETWORK_CODE( CLCTL_VALIDATE_COMMON_PROPERTIES ), CLUSCTL_NETWORK_ENUM_PRIVATE_PROPERTIES = CLUSCTL_NETWORK_CODE( CLCTL_ENUM_PRIVATE_PROPERTIES ), CLUSCTL_NETWORK_GET_RO_PRIVATE_PROPERTIES = CLUSCTL_NETWORK_CODE( CLCTL_GET_RO_PRIVATE_PROPERTIES ), CLUSCTL_NETWORK_GET_PRIVATE_PROPERTIES = CLUSCTL_NETWORK_CODE( CLCTL_GET_PRIVATE_PROPERTIES ), CLUSCTL_NETWORK_SET_PRIVATE_PROPERTIES = CLUSCTL_NETWORK_CODE( CLCTL_SET_PRIVATE_PROPERTIES ), CLUSCTL_NETWORK_VALIDATE_PRIVATE_PROPERTIES = CLUSCTL_NETWORK_CODE( CLCTL_VALIDATE_PRIVATE_PROPERTIES ), CLUSCTL_NETWORK_GET_COMMON_PROPERTY_FMTS= CLUSCTL_NETWORK_CODE( CLCTL_GET_COMMON_PROPERTY_FMTS ), CLUSCTL_NETWORK_GET_PRIVATE_PROPERTY_FMTS= CLUSCTL_NETWORK_CODE( CLCTL_GET_PRIVATE_PROPERTY_FMTS ) } CLUSCTL_NETWORK_CODES; // // Cluster Control Codes for Network Interfaces // typedef enum CLUSCTL_NETINTERFACE_CODES { // External CLUSCTL_NETINTERFACE_UNKNOWN = CLUSCTL_NETINTERFACE_CODE( CLCTL_UNKNOWN ), CLUSCTL_NETINTERFACE_GET_CHARACTERISTICS = CLUSCTL_NETINTERFACE_CODE( CLCTL_GET_CHARACTERISTICS ), CLUSCTL_NETINTERFACE_GET_FLAGS = CLUSCTL_NETINTERFACE_CODE( CLCTL_GET_FLAGS ), CLUSCTL_NETINTERFACE_GET_NAME = CLUSCTL_NETINTERFACE_CODE( CLCTL_GET_NAME ), CLUSCTL_NETINTERFACE_GET_ID = CLUSCTL_NETINTERFACE_CODE( CLCTL_GET_ID ), CLUSCTL_NETINTERFACE_GET_NODE = CLUSCTL_NETINTERFACE_CODE( CLCTL_GET_NODE ), CLUSCTL_NETINTERFACE_GET_NETWORK = CLUSCTL_NETINTERFACE_CODE( CLCTL_GET_NETWORK ), CLUSCTL_NETINTERFACE_ENUM_COMMON_PROPERTIES = CLUSCTL_NETINTERFACE_CODE( CLCTL_ENUM_COMMON_PROPERTIES ), CLUSCTL_NETINTERFACE_GET_RO_COMMON_PROPERTIES = CLUSCTL_NETINTERFACE_CODE( CLCTL_GET_RO_COMMON_PROPERTIES ), CLUSCTL_NETINTERFACE_GET_COMMON_PROPERTIES = CLUSCTL_NETINTERFACE_CODE( CLCTL_GET_COMMON_PROPERTIES ), CLUSCTL_NETINTERFACE_SET_COMMON_PROPERTIES = CLUSCTL_NETINTERFACE_CODE( CLCTL_SET_COMMON_PROPERTIES ), CLUSCTL_NETINTERFACE_VALIDATE_COMMON_PROPERTIES = CLUSCTL_NETINTERFACE_CODE( CLCTL_VALIDATE_COMMON_PROPERTIES ), CLUSCTL_NETINTERFACE_ENUM_PRIVATE_PROPERTIES = CLUSCTL_NETINTERFACE_CODE( CLCTL_ENUM_PRIVATE_PROPERTIES ), CLUSCTL_NETINTERFACE_GET_RO_PRIVATE_PROPERTIES = CLUSCTL_NETINTERFACE_CODE( CLCTL_GET_RO_PRIVATE_PROPERTIES ), CLUSCTL_NETINTERFACE_GET_PRIVATE_PROPERTIES = CLUSCTL_NETINTERFACE_CODE( CLCTL_GET_PRIVATE_PROPERTIES ), CLUSCTL_NETINTERFACE_SET_PRIVATE_PROPERTIES = CLUSCTL_NETINTERFACE_CODE( CLCTL_SET_PRIVATE_PROPERTIES ), CLUSCTL_NETINTERFACE_VALIDATE_PRIVATE_PROPERTIES = CLUSCTL_NETINTERFACE_CODE( CLCTL_VALIDATE_PRIVATE_PROPERTIES ), CLUSCTL_NETINTERFACE_GET_COMMON_PROPERTY_FMTS= CLUSCTL_NETINTERFACE_CODE( CLCTL_GET_COMMON_PROPERTY_FMTS ), CLUSCTL_NETINTERFACE_GET_PRIVATE_PROPERTY_FMTS= CLUSCTL_NETINTERFACE_CODE( CLCTL_GET_PRIVATE_PROPERTY_FMTS ) } CLUSCTL_NETINTERFACE_CODES; // // Cluster Control Codes for Nodes // typedef enum CLUSCTL_CLUSTER_CODES { // External CLUSCTL_CLUSTER_UNKNOWN = CLUSCTL_CLUSTER_CODE( CLCTL_UNKNOWN ), CLUSCTL_CLUSTER_GET_FQDN = CLUSCTL_CLUSTER_CODE( CLCTL_GET_FQDN ), CLUSCTL_CLUSTER_ENUM_COMMON_PROPERTIES = CLUSCTL_CLUSTER_CODE( CLCTL_ENUM_COMMON_PROPERTIES ), CLUSCTL_CLUSTER_GET_RO_COMMON_PROPERTIES = CLUSCTL_CLUSTER_CODE( CLCTL_GET_RO_COMMON_PROPERTIES ), CLUSCTL_CLUSTER_GET_COMMON_PROPERTIES = CLUSCTL_CLUSTER_CODE( CLCTL_GET_COMMON_PROPERTIES ), CLUSCTL_CLUSTER_SET_COMMON_PROPERTIES = CLUSCTL_CLUSTER_CODE( CLCTL_SET_COMMON_PROPERTIES ), CLUSCTL_CLUSTER_VALIDATE_COMMON_PROPERTIES = CLUSCTL_CLUSTER_CODE( CLCTL_VALIDATE_COMMON_PROPERTIES ), CLUSCTL_CLUSTER_ENUM_PRIVATE_PROPERTIES = CLUSCTL_CLUSTER_CODE( CLCTL_ENUM_PRIVATE_PROPERTIES ), CLUSCTL_CLUSTER_GET_RO_PRIVATE_PROPERTIES = CLUSCTL_CLUSTER_CODE( CLCTL_GET_RO_PRIVATE_PROPERTIES ), CLUSCTL_CLUSTER_GET_PRIVATE_PROPERTIES = CLUSCTL_CLUSTER_CODE( CLCTL_GET_PRIVATE_PROPERTIES ), CLUSCTL_CLUSTER_SET_PRIVATE_PROPERTIES = CLUSCTL_CLUSTER_CODE( CLCTL_SET_PRIVATE_PROPERTIES ), CLUSCTL_CLUSTER_VALIDATE_PRIVATE_PROPERTIES = CLUSCTL_CLUSTER_CODE( CLCTL_VALIDATE_PRIVATE_PROPERTIES ), CLUSCTL_CLUSTER_GET_COMMON_PROPERTY_FMTS= CLUSCTL_CLUSTER_CODE( CLCTL_GET_COMMON_PROPERTY_FMTS ), CLUSCTL_CLUSTER_GET_PRIVATE_PROPERTY_FMTS= CLUSCTL_CLUSTER_CODE( CLCTL_GET_PRIVATE_PROPERTY_FMTS ) } CLUSCTL_CLUSTER_CODES; // // Cluster Resource Class types // typedef enum CLUSTER_RESOURCE_CLASS { CLUS_RESCLASS_UNKNOWN = 0, CLUS_RESCLASS_STORAGE, CLUS_RESCLASS_USER = 32768 } CLUSTER_RESOURCE_CLASS; // // Define Resource SubClass bits // typedef enum CLUS_RESSUBCLASS { CLUS_RESSUBCLASS_SHARED = 0x80000000 } CLUS_RESSUBCLASS; // // Cluster Characteristics // typedef enum CLUS_CHARACTERISTICS { CLUS_CHAR_UNKNOWN = 0x00000000, CLUS_CHAR_QUORUM = 0x00000001, CLUS_CHAR_DELETE_REQUIRES_ALL_NODES = 0x00000002, CLUS_CHAR_LOCAL_QUORUM = 0x00000004, CLUS_CHAR_LOCAL_QUORUM_DEBUG = 0x00000008, CLUS_CHAR_REQUIRES_STATE_CHANGE_REASON = 0x00000010 } CLUS_CHARACTERISTICS; // // Cluster Flags // typedef enum CLUS_FLAGS { CLUS_FLAG_CORE = 0x00000001 } CLUS_FLAGS; // // Cluster Resource Property Helper Structures // #ifndef MIDL_PASS // Property syntax. Used for property names and values. typedef union CLUSPROP_SYNTAX { DWORD dw; struct { WORD wFormat; WORD wType; }; } CLUSPROP_SYNTAX, *PCLUSPROP_SYNTAX; // Property value. typedef struct CLUSPROP_VALUE { CLUSPROP_SYNTAX Syntax; DWORD cbLength; } CLUSPROP_VALUE, *PCLUSPROP_VALUE; // Binary property value. #ifdef __cplusplus typedef struct CLUSPROP_BINARY : public CLUSPROP_VALUE { #else typedef struct CLUSPROP_BINARY { CLUSPROP_VALUE; #endif BYTE rgb[]; } CLUSPROP_BINARY, *PCLUSPROP_BINARY; // WORD property value. #ifdef __cplusplus typedef struct CLUSPROP_WORD : public CLUSPROP_VALUE { #else typedef struct CLUSPROP_WORD { CLUSPROP_VALUE; #endif WORD w; } CLUSPROP_WORD, *PCLUSPROP_WORD; // DWORD property value. #ifdef __cplusplus typedef struct CLUSPROP_DWORD : public CLUSPROP_VALUE { #else typedef struct CLUSPROP_DWORD { CLUSPROP_VALUE; #endif DWORD dw; } CLUSPROP_DWORD, *PCLUSPROP_DWORD; // LONG property value. #ifdef __cplusplus typedef struct CLUSPROP_LONG : public CLUSPROP_VALUE { #else typedef struct CLUSPROP_LONG { CLUSPROP_VALUE; #endif LONG l; } CLUSPROP_LONG, *PCLUSPROP_LONG; // String property value. #ifdef __cplusplus typedef struct CLUSPROP_SZ : public CLUSPROP_VALUE { #else typedef struct CLUSPROP_SZ { CLUSPROP_VALUE; #endif WCHAR sz[]; } CLUSPROP_SZ, *PCLUSPROP_SZ; // Multiple string property value. typedef CLUSPROP_SZ CLUSPROP_MULTI_SZ, *PCLUSPROP_MULTI_SZ; // Property name. typedef CLUSPROP_SZ CLUSPROP_PROPERTY_NAME, *PCLUSPROP_PROPERTY_NAME; // Unsigned large Integer property value. #ifdef __cplusplus typedef struct CLUSPROP_ULARGE_INTEGER : public CLUSPROP_VALUE { #else typedef struct CLUSPROP_ULARGE_INTEGER { CLUSPROP_VALUE; #endif ULARGE_INTEGER li; } CLUSPROP_ULARGE_INTEGER, *PCLUSPROP_ULARGE_INTEGER; // Signed large Integer property value. #ifdef __cplusplus typedef struct CLUSPROP_LARGE_INTEGER : public CLUSPROP_VALUE { #else typedef struct CLUSPROP_LARGE_INTEGER { CLUSPROP_VALUE; #endif LARGE_INTEGER li; } CLUSPROP_LARGE_INTEGER, *PCLUSPROP_LARGE_INTEGER; // Security Descriptor property value. #ifdef __cplusplus typedef struct CLUSPROP_SECURITY_DESCRIPTOR : public CLUSPROP_VALUE { #else typedef struct CLUSPROP_SECURITY_DESCRIPTOR { CLUSPROP_VALUE; #endif union { SECURITY_DESCRIPTOR_RELATIVE sd; BYTE rgbSecurityDescriptor[]; }; } CLUSPROP_SECURITY_DESCRIPTOR, *PCLUSPROP_SECURITY_DESCRIPTOR; // Resource class info returned by CLCTL_GET_CLASS_INFO control functions. typedef struct CLUS_RESOURCE_CLASS_INFO { union { struct { union { DWORD dw; CLUSTER_RESOURCE_CLASS rc; }; DWORD SubClass; }; ULARGE_INTEGER li; }; } CLUS_RESOURCE_CLASS_INFO, *PCLUS_RESOURCE_CLASS_INFO; // Resource class property value. #ifdef __cplusplus typedef struct CLUSPROP_RESOURCE_CLASS : public CLUSPROP_VALUE { #else typedef struct CLUSPROP_RESOURCE_CLASS { CLUSPROP_VALUE; #endif CLUSTER_RESOURCE_CLASS rc; } CLUSPROP_RESOURCE_CLASS, *PCLUSPROP_RESOURCE_CLASS; // Resource class info property value. #ifdef __cplusplus typedef struct CLUSPROP_RESOURCE_CLASS_INFO : public CLUSPROP_VALUE , public CLUS_RESOURCE_CLASS_INFO { #else typedef struct CLUSPROP_RESOURCE_CLASS_INFO { CLUSPROP_VALUE; CLUS_RESOURCE_CLASS_INFO; #endif } CLUSPROP_RESOURCE_CLASS_INFO, *PCLUSPROP_RESOURCE_CLASS_INFO; // One entry from list returned by CLCTL_GET_REQUIRED_DEPENDENCIES control functions. typedef union CLUSPROP_REQUIRED_DEPENDENCY { CLUSPROP_VALUE Value; CLUSPROP_RESOURCE_CLASS ResClass; CLUSPROP_SZ ResTypeName; } CLUSPROP_REQUIRED_DEPENDENCY, *PCLUSPROP_REQUIRED_DEPENDENCY; typedef CLUSPROP_DWORD CLUSPROP_DISK_NUMBER, *PCLUSPROP_DISK_NUMBER; #endif // MIDL_PASS #endif // _CLUSTER_API_TYPES_ //#ifdef MIDL_PASS //#ifndef MAX_PATH //#define MAX_PATH 260 //#endif //#endif // if MIDL_PASS #ifndef _CLUSTER_API_TYPES_ // Disk partition information flags. typedef enum CLUSPROP_PIFLAGS { CLUSPROP_PIFLAG_STICKY = 0x00000001, CLUSPROP_PIFLAG_REMOVABLE = 0x00000002, CLUSPROP_PIFLAG_USABLE = 0x00000004, CLUSPROP_PIFLAG_DEFAULT_QUORUM = 0x00000008 } CLUSPROP_PIFLAGS; #ifndef MIDL_PASS //force quorum information, useful for QON type resources //to be able to continue operation without the quorum typedef struct CLUS_FORCE_QUORUM_INFO { DWORD dwSize; // size of this struct including the nodes list. DWORD dwNodeBitMask; // a bit mask representing the max assumed node set DWORD dwMaxNumberofNodes; // the number of bits set in the mask WCHAR multiszNodeList[1]; // Multi sz list of nodes } CLUS_FORCE_QUORUM_INFO, *PCLUS_FORCE_QUORUM_INFO; // Disk partition information. typedef struct CLUS_PARTITION_INFO { DWORD dwFlags; WCHAR szDeviceName[MAX_PATH]; WCHAR szVolumeLabel[MAX_PATH]; DWORD dwSerialNumber; DWORD rgdwMaximumComponentLength; DWORD dwFileSystemFlags; WCHAR szFileSystem[32]; } CLUS_PARTITION_INFO, *PCLUS_PARTITION_INFO; // Disk partition information property value. #ifdef __cplusplus typedef struct CLUSPROP_PARTITION_INFO : public CLUSPROP_VALUE , public CLUS_PARTITION_INFO { #else typedef struct CLUSPROP_PARTITION_INFO { CLUSPROP_VALUE; CLUS_PARTITION_INFO; #endif } CLUSPROP_PARTITION_INFO, *PCLUSPROP_PARTITION_INFO; // // FT set information. // typedef struct CLUS_FTSET_INFO { DWORD dwRootSignature; DWORD dwFtType; } CLUS_FTSET_INFO, *PCLUS_FTSET_INFO; // Disk partition information property value. #ifdef __cplusplus typedef struct CLUSPROP_FTSET_INFO : public CLUSPROP_VALUE , public CLUS_FTSET_INFO { #else typedef struct CLUSPROP_FTSET_INFO { CLUSPROP_VALUE; CLUS_FTSET_INFO; #endif } CLUSPROP_FTSET_INFO, *PCLUSPROP_FTSET_INFO; // Disk Signature property value. typedef CLUSPROP_DWORD CLUSPROP_DISK_SIGNATURE, *PCLUSPROP_DISK_SIGNATURE; // SCSI Address. typedef struct CLUS_SCSI_ADDRESS { union { struct { UCHAR PortNumber; UCHAR PathId; UCHAR TargetId; UCHAR Lun; }; DWORD dw; }; } CLUS_SCSI_ADDRESS, *PCLUS_SCSI_ADDRESS; // SCSI Address property value. #ifdef __cplusplus typedef struct CLUSPROP_SCSI_ADDRESS : public CLUSPROP_VALUE , public CLUS_SCSI_ADDRESS { #else typedef struct CLUSPROP_SCSI_ADDRESS { CLUSPROP_VALUE; CLUS_SCSI_ADDRESS; #endif } CLUSPROP_SCSI_ADDRESS, *PCLUSPROP_SCSI_ADDRESS; // // input structure for CLUSCTL_RESOURCE_NETNAME_GET_VIRTUAL_SERVER_TOKEN // typedef struct CLUS_NETNAME_VS_TOKEN_INFO { DWORD ProcessID; DWORD DesiredAccess; BOOL InheritHandle; } CLUS_NETNAME_VS_TOKEN_INFO, *PCLUS_NETNAME_VS_TOKEN_INFO; // // input/output structure associated with Maintenance Mode // typedef struct CLUS_MAINTENANCE_MODE_INFO { BOOL InMaintenance; } CLUS_MAINTENANCE_MODE_INFO, *PCLUS_MAINTENANCE_MODE_INFO; // Beginning of a property list. typedef struct CLUSPROP_LIST { DWORD nPropertyCount; CLUSPROP_PROPERTY_NAME PropertyName; } CLUSPROP_LIST, *PCLUSPROP_LIST; // Helper for building or parsing a property list buffer. typedef union CLUSPROP_BUFFER_HELPER { BYTE * pb; WORD * pw; DWORD * pdw; LONG * pl; LPWSTR psz; PCLUSPROP_LIST pList; PCLUSPROP_SYNTAX pSyntax; PCLUSPROP_PROPERTY_NAME pName; PCLUSPROP_VALUE pValue; PCLUSPROP_BINARY pBinaryValue; PCLUSPROP_WORD pWordValue; PCLUSPROP_DWORD pDwordValue; PCLUSPROP_LONG pLongValue; PCLUSPROP_ULARGE_INTEGER pULargeIntegerValue; PCLUSPROP_LARGE_INTEGER pLargeIntegerValue; PCLUSPROP_SZ pStringValue; PCLUSPROP_MULTI_SZ pMultiSzValue; PCLUSPROP_SECURITY_DESCRIPTOR pSecurityDescriptor; PCLUSPROP_RESOURCE_CLASS pResourceClassValue; PCLUSPROP_RESOURCE_CLASS_INFO pResourceClassInfoValue; PCLUSPROP_DISK_SIGNATURE pDiskSignatureValue; PCLUSPROP_SCSI_ADDRESS pScsiAddressValue; PCLUSPROP_DISK_NUMBER pDiskNumberValue; PCLUSPROP_PARTITION_INFO pPartitionInfoValue; PCLUSPROP_REQUIRED_DEPENDENCY pRequiredDependencyValue; } CLUSPROP_BUFFER_HELPER, *PCLUSPROP_BUFFER_HELPER; #endif // MIDL_PASS #endif // _CLUSTER_API_TYPES_ // Macro for aligning CLUSPROP buffers on a DWORD boundary. #define ALIGN_CLUSPROP( count ) ((count + 3) & ~3) // Macros for declaring array format values #define CLUSPROP_BINARY_DECLARE( name, cb ) \ struct { \ CLUSPROP_SYNTAX Syntax; \ DWORD cbLength; \ BYTE rgb[(cb + 3) & ~3]; \ } name #define CLUSPROP_SZ_DECLARE( name, cch ) \ struct { \ CLUSPROP_SYNTAX Syntax; \ DWORD cbLength; \ WCHAR sz[(cch + 1) & ~1]; \ } name #define CLUSPROP_PROPERTY_NAME_DECLARE( name, cch ) CLUSPROP_SZ_DECLARE( name, cch ) // // Cluster resource property enumeration. // #ifndef _CLUSTER_API_TYPES_ // // Define enumerable types // typedef enum CLUSTER_RESOURCE_ENUM { CLUSTER_RESOURCE_ENUM_DEPENDS = 0x00000001, CLUSTER_RESOURCE_ENUM_PROVIDES = 0x00000002, CLUSTER_RESOURCE_ENUM_NODES = 0x00000004, CLUSTER_RESOURCE_ENUM_ALL = (CLUSTER_RESOURCE_ENUM_DEPENDS | CLUSTER_RESOURCE_ENUM_PROVIDES | CLUSTER_RESOURCE_ENUM_NODES) } CLUSTER_RESOURCE_ENUM; typedef enum CLUSTER_RESOURCE_TYPE_ENUM { CLUSTER_RESOURCE_TYPE_ENUM_NODES = 0x00000001, CLUSTER_RESOURCE_TYPE_ENUM_ALL = (CLUSTER_RESOURCE_TYPE_ENUM_NODES) } CLUSTER_RESOURCE_TYPE_ENUM; #endif // _CLUSTER_API_TYPES_ #ifndef MIDL_PASS HRESENUM WINAPI ClusterResourceOpenEnum( IN HRESOURCE hResource, IN DWORD dwType ); DWORD WINAPI ClusterResourceGetEnumCount( IN HRESENUM hResEnum ); DWORD WINAPI ClusterResourceEnum( __in HRESENUM hResEnum, __in DWORD dwIndex, __out LPDWORD lpdwType, __out_ecount_part(*lpcchName, *lpcchName + 1) LPWSTR lpszName, __inout LPDWORD lpcchName ); DWORD WINAPI ClusterResourceCloseEnum( IN HRESENUM hResEnum ); DWORD WINAPI CreateClusterResourceType( IN HCLUSTER hCluster, IN LPCWSTR lpszResourceTypeName, IN LPCWSTR lpszDisplayName, IN LPCWSTR lpszResourceTypeDll, IN DWORD dwLooksAlivePollInterval, IN DWORD dwIsAlivePollInterval ); DWORD WINAPI DeleteClusterResourceType( IN HCLUSTER hCluster, IN LPCWSTR lpszResourceTypeName ); HRESTYPEENUM WINAPI ClusterResourceTypeOpenEnum( IN HCLUSTER hCluster, IN LPCWSTR lpszResourceTypeName, IN DWORD dwType ); DWORD WINAPI ClusterResourceTypeGetEnumCount( IN HRESTYPEENUM hResTypeEnum ); DWORD WINAPI ClusterResourceTypeEnum( __in HRESTYPEENUM hResTypeEnum, __in DWORD dwIndex, __out LPDWORD lpdwType, __out_ecount_part(*lpcchName, *lpcchName + 1) LPWSTR lpszName, __inout LPDWORD lpcchName ); DWORD WINAPI ClusterResourceTypeCloseEnum( IN HRESTYPEENUM hResTypeEnum ); #endif // MIDL_PASS // // Network-related structures and types. // #ifndef _CLUSTER_API_TYPES_ // // Define enumerable group types // typedef enum CLUSTER_NETWORK_ENUM { CLUSTER_NETWORK_ENUM_NETINTERFACES = 0x00000001, CLUSTER_NETWORK_ENUM_ALL = CLUSTER_NETWORK_ENUM_NETINTERFACES } CLUSTER_NETWORK_ENUM; typedef enum CLUSTER_NETWORK_STATE { ClusterNetworkStateUnknown = -1, ClusterNetworkUnavailable, ClusterNetworkDown, ClusterNetworkPartitioned, ClusterNetworkUp } CLUSTER_NETWORK_STATE; // Role the network plays in the cluster. This is a bitmask. typedef enum CLUSTER_NETWORK_ROLE { ClusterNetworkRoleNone = 0, ClusterNetworkRoleInternalUse = 0x00000001, ClusterNetworkRoleClientAccess = 0x00000002, ClusterNetworkRoleInternalAndClient = 0x00000003 } CLUSTER_NETWORK_ROLE; #endif // _CLUSTER_API_TYPES_ // // Interfaces for managing the networks of a cluster. // #ifndef MIDL_PASS HNETWORK WINAPI OpenClusterNetwork( IN HCLUSTER hCluster, IN LPCWSTR lpszNetworkName ); BOOL WINAPI CloseClusterNetwork( IN HNETWORK hNetwork ); HCLUSTER WINAPI GetClusterFromNetwork( IN HNETWORK hNetwork ); HNETWORKENUM WINAPI ClusterNetworkOpenEnum( IN HNETWORK hNetwork, IN DWORD dwType ); DWORD WINAPI ClusterNetworkGetEnumCount( IN HNETWORKENUM hNetworkEnum ); DWORD WINAPI ClusterNetworkEnum( __in HNETWORKENUM hNetworkEnum, __in DWORD dwIndex, __out LPDWORD lpdwType, __out_ecount_part(*lpcchName, *lpcchName + 1) LPWSTR lpszName, __inout LPDWORD lpcchName ); DWORD WINAPI ClusterNetworkCloseEnum( IN HNETWORKENUM hNetworkEnum ); CLUSTER_NETWORK_STATE WINAPI GetClusterNetworkState( IN HNETWORK hNetwork ); DWORD WINAPI SetClusterNetworkName( IN HNETWORK hNetwork, IN LPCWSTR lpszName ); DWORD WINAPI GetClusterNetworkId( __in HNETWORK hNetwork, __out_ecount_part(*lpcchName, *lpcchName + 1) LPWSTR lpszNetworkId, __inout LPDWORD lpcchName ); DWORD WINAPI ClusterNetworkControl( __in HNETWORK hNetwork, __in_opt HNODE hHostNode, __in DWORD dwControlCode, __in_bcount_opt(nInBufferSize) LPVOID lpInBuffer, __in DWORD nInBufferSize, __out_bcount_part_opt(nOutBufferSize, *lpBytesReturned) LPVOID lpOutBuffer, __in DWORD nOutBufferSize, __out LPDWORD lpBytesReturned ); #endif // MIDL_PASS #ifndef _CLUSTER_API_TYPES_ // // Network interface-related structures and types. // typedef enum CLUSTER_NETINTERFACE_STATE { ClusterNetInterfaceStateUnknown = -1, ClusterNetInterfaceUnavailable, ClusterNetInterfaceFailed, ClusterNetInterfaceUnreachable, ClusterNetInterfaceUp } CLUSTER_NETINTERFACE_STATE; #endif // _CLUSTER_API_TYPES_ // // Interfaces for managing the network interfaces of a cluster. // #ifndef MIDL_PASS HNETINTERFACE WINAPI OpenClusterNetInterface( IN HCLUSTER hCluster, IN LPCWSTR lpszInterfaceName ); DWORD WINAPI GetClusterNetInterface( __in HCLUSTER hCluster, __in LPCWSTR lpszNodeName, __in LPCWSTR lpszNetworkName, __out_ecount_part(*lpcchInterfaceName, *lpcchInterfaceName + 1) LPWSTR lpszInterfaceName, __inout LPDWORD lpcchInterfaceName ); BOOL WINAPI CloseClusterNetInterface( IN HNETINTERFACE hNetInterface ); HCLUSTER WINAPI GetClusterFromNetInterface( IN HNETINTERFACE hNetInterface ); CLUSTER_NETINTERFACE_STATE WINAPI GetClusterNetInterfaceState( IN HNETINTERFACE hNetInterface ); DWORD WINAPI ClusterNetInterfaceControl( __in HNETINTERFACE hNetInterface, __in_opt HNODE hHostNode, __in DWORD dwControlCode, __in_bcount_opt(nInBufferSize) LPVOID lpInBuffer, __in DWORD nInBufferSize, __out_bcount_part_opt(nOutBufferSize, *lpBytesReturned) LPVOID lpOutBuffer, __in DWORD nOutBufferSize, __out LPDWORD lpBytesReturned ); #endif // MIDL_PASS // // Cluster registry update and access routines // #ifndef MIDL_PASS HKEY WINAPI GetClusterKey( IN HCLUSTER hCluster, IN REGSAM samDesired ); HKEY WINAPI GetClusterGroupKey( IN HGROUP hGroup, IN REGSAM samDesired ); HKEY WINAPI GetClusterResourceKey( IN HRESOURCE hResource, IN REGSAM samDesired ); HKEY WINAPI GetClusterNodeKey( IN HNODE hNode, IN REGSAM samDesired ); HKEY WINAPI GetClusterNetworkKey( IN HNETWORK hNetwork, IN REGSAM samDesired ); HKEY WINAPI GetClusterNetInterfaceKey( IN HNETINTERFACE hNetInterface, IN REGSAM samDesired ); LONG WINAPI ClusterRegCreateKey( IN HKEY hKey, IN LPCWSTR lpszSubKey, IN DWORD dwOptions, IN REGSAM samDesired, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes, OUT PHKEY phkResult, OUT OPTIONAL LPDWORD lpdwDisposition ); LONG WINAPI ClusterRegOpenKey( IN HKEY hKey, IN LPCWSTR lpszSubKey, IN REGSAM samDesired, OUT PHKEY phkResult ); LONG WINAPI ClusterRegDeleteKey( IN HKEY hKey, IN LPCWSTR lpszSubKey ); LONG WINAPI ClusterRegCloseKey( IN HKEY hKey ); LONG WINAPI ClusterRegEnumKey( __in HKEY hKey, __in DWORD dwIndex, __out_ecount_part(*lpcchName, *lpcchName + 1) LPWSTR lpszName, __inout LPDWORD lpcchName, __out PFILETIME lpftLastWriteTime ); DWORD WINAPI ClusterRegSetValue( IN HKEY hKey, IN LPCWSTR lpszValueName, IN DWORD dwType, IN CONST BYTE* lpData, IN DWORD cbData ); DWORD WINAPI ClusterRegDeleteValue( IN HKEY hKey, IN LPCWSTR lpszValueName ); LONG WINAPI ClusterRegQueryValue( __in HKEY hKey, __in LPCWSTR lpszValueName, __out LPDWORD lpdwValueType, __out_bcount_part_opt(*lpcbData, *lpcbData) LPBYTE lpData, __inout_opt LPDWORD lpcbData ); DWORD WINAPI ClusterRegEnumValue( __in HKEY hKey, __in DWORD dwIndex, __out_ecount_part(*lpcchValueName, *lpcchValueName + 1) LPWSTR lpszValueName, __inout LPDWORD lpcchValueName, __out LPDWORD lpdwType, __out_bcount_part_opt(*lpcbData, *lpcbData) LPBYTE lpData, __inout_opt LPDWORD lpcbData ); LONG WINAPI ClusterRegQueryInfoKey( IN HKEY hKey, IN LPDWORD lpcSubKeys, IN LPDWORD lpcchMaxSubKeyLen, IN LPDWORD lpcValues, IN LPDWORD lpcchMaxValueNameLen, IN LPDWORD lpcbMaxValueLen, IN LPDWORD lpcbSecurityDescriptor, IN PFILETIME lpftLastWriteTime ); LONG WINAPI ClusterRegGetKeySecurity ( __in HKEY hKey, __in SECURITY_INFORMATION RequestedInformation, __out_bcount_part(*lpcbSecurityDescriptor, *lpcbSecurityDescriptor) PSECURITY_DESCRIPTOR pSecurityDescriptor, __inout LPDWORD lpcbSecurityDescriptor ); LONG WINAPI ClusterRegSetKeySecurity( IN HKEY hKey, IN SECURITY_INFORMATION SecurityInformation, IN PSECURITY_DESCRIPTOR pSecurityDescriptor ); #if _MSC_VER >= 1200 #pragma warning(pop) // restore 4200/4201 #else #pragma warning( default : 4200 ) // nonstandard extension used : zero-sized array in struct/union #pragma warning( default : 4201 ) // nonstandard extension used : nameless struct/union #endif #endif // MIDL_PASS #ifdef __cplusplus } #endif #ifndef _CLUSTER_API_TYPES_ #define _CLUSTER_API_TYPES_ #endif // _CLUSTER_API_TYPES_ #endif // _CLUSTER_API_