/*++ 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 ) // // 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; #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 LPWSTR lpszClusterName, IN OUT LPDWORD lpcchClusterName, OUT OPTIONAL LPCLUSTERVERSIONINFO lpClusterInfo ); DWORD WINAPI GetClusterQuorumResource( IN HCLUSTER hCluster, OUT LPWSTR lpszResourceName, IN OUT LPDWORD lpcchResourceName, OUT LPWSTR lpszDeviceName, IN OUT 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 ClusterName, IN LPCWSTR lpszNewPassword, IN DWORD dwFlags, OUT PCLUSTER_SET_PASSWORD_STATUS ReturnStatusBuffer, IN OUT LPDWORD ReturnStatusBufferSize ); DWORD WINAPI ClusterControl( IN HCLUSTER hCluster, IN OPTIONAL HNODE hHostNode, IN DWORD dwControlCode, IN LPVOID lpInBuffer, IN DWORD nInBufferSize, OUT 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 OPTIONAL LPWSTR lpszName, IN OUT 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 LPWSTR lpszName, IN OUT 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 LPWSTR lpszNodeId, IN OUT 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 LPWSTR lpszName, IN OUT 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 OPTIONAL LPWSTR lpszNodeName, IN OUT 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 LPWSTR lpszResourceName, IN OUT 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 OPTIONAL LPWSTR lpszNodeName, IN OUT LPDWORD lpcchNodeName, OUT OPTIONAL LPWSTR lpszGroupName, IN OUT 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 OPTIONAL HNODE hHostNode, IN DWORD dwControlCode, IN LPVOID lpInBuffer, IN DWORD cbInBufferSize, OUT LPVOID lpOutBuffer, IN DWORD cbOutBufferSize, OUT LPDWORD lpcbBytesReturned ); DWORD WINAPI ClusterResourceTypeControl( IN HCLUSTER hCluster, IN LPCWSTR ResourceTypeName, IN OPTIONAL HNODE hHostNode, IN DWORD dwControlCode, IN LPVOID lpInBuffer, IN DWORD cbInBufferSize, OUT LPVOID lpOutBuffer, IN DWORD cbOutBufferSize, OUT LPDWORD lpcbBytesReturned ); DWORD WINAPI ClusterGroupControl( IN HGROUP hGroup, IN OPTIONAL HNODE hHostNode, IN DWORD dwControlCode, IN LPVOID lpInBuffer, IN DWORD cbInBufferSize, OUT LPVOID lpOutBuffer, IN DWORD cbOutBufferSize, OUT LPDWORD lpcbBytesReturned ); DWORD WINAPI ClusterNodeControl( IN HNODE hNode, IN OPTIONAL HNODE hHostNode, IN DWORD dwControlCode, IN LPVOID lpInBuffer, IN DWORD cbInBufferSize, OUT LPVOID lpOutBuffer, IN DWORD cbOutBufferSize, OUT LPDWORD lpcbBytesReturned ); BOOL WINAPI GetClusterResourceNetworkName( IN HRESOURCE hResource, OUT LPWSTR lpBuffer, IN OUT 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 ), // 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_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 ), // 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_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_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_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_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; // 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 LPWSTR lpszName, IN OUT 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 LPWSTR lpszName, IN OUT 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 LPWSTR lpszName, IN OUT 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 LPWSTR lpszNetworkId, IN OUT LPDWORD lpcchNetworkId ); DWORD WINAPI ClusterNetworkControl( IN HNETWORK hNetwork, IN OPTIONAL HNODE hHostNode, IN DWORD dwControlCode, IN LPVOID lpInBuffer, IN DWORD cbInBufferSize, OUT LPVOID lpOutBuffer, IN DWORD cbOutBufferSize, OUT LPDWORD lpcbBytesReturned ); #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 LPWSTR lpszInterfaceName, IN OUT 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 OPTIONAL HNODE hHostNode, IN DWORD dwControlCode, IN LPVOID lpInBuffer, IN DWORD cbInBufferSize, OUT LPVOID lpOutBuffer, IN DWORD cbOutBufferSize, OUT LPDWORD lpcbBytesReturned ); #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 LPWSTR lpszName, IN OUT 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 LPBYTE lpData, IN OUT LPDWORD lpcbData ); DWORD WINAPI ClusterRegEnumValue( IN HKEY hKey, IN DWORD dwIndex, OUT LPWSTR lpszValueName, IN OUT LPDWORD lpcchValueName, OUT LPDWORD lpdwType, OUT LPBYTE lpData, IN OUT 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 PSECURITY_DESCRIPTOR pSecurityDescriptor, IN 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_