/*++ Copyright (c) 1995-1997 Microsoft Corporation 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_ #ifdef __cplusplus extern "C" { #endif // // 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; #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 { DWORD dwVersionInfoSize; WORD MajorVersion; WORD MinorVersion; WORD BuildNumber; WCHAR szVendorId[64]; WCHAR szCSDVersion[64]; } CLUSTERVERSIONINFO, *LPCLUSTERVERSIONINFO; #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) #ifndef MIDL_PASS 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 lpcbClusterName, OUT OPTIONAL LPCLUSTERVERSIONINFO lpClusterInfo ); DWORD WINAPI GetClusterQuorumResource( IN HCLUSTER hCluster, OUT LPWSTR lpszResourceName, IN OUT LPDWORD lpcbResourceName, OUT LPWSTR lpszDeviceName, IN OUT LPDWORD lpcbDeviceName, OUT LPDWORD lpdwMaxQuorumLogSize ); DWORD WINAPI SetClusterQuorumResource( IN HRESOURCE hResource, IN LPCWSTR lpszDeviceName, IN DWORD dwMaxQuoLogSize ); DWORD WINAPI SetClusterNetworkPriorityOrder( IN HCLUSTER hCluster, IN DWORD NetworkCount, IN HNETWORK NetworkList[] ); #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_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_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_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 dwNotifyKey ); DWORD WINAPI RegisterClusterNotify( IN HCHANGE hChange, IN DWORD dwFilterType, IN HANDLE hObject, IN DWORD dwNotifyKey ); DWORD WINAPI GetClusterNotify( IN HCHANGE hChange, OUT LPDWORD lpdwNotifyKey, OUT LPDWORD lpdwFilterType, OUT OPTIONAL LPWSTR lpszName, IN OUT LPDWORD lpcbName, 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 ClusterEnum( IN HCLUSENUM hEnum, IN DWORD dwIndex, OUT LPDWORD lpdwType, OUT LPWSTR lpszName, IN OUT LPDWORD lpcbName ); 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_)) 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 ClusterNodeCloseEnum( IN HNODEENUM hNodeEnum ); DWORD WINAPI ClusterNodeEnum( IN HNODEENUM hNodeEnum, IN DWORD dwIndex, OUT LPDWORD lpdwType, OUT LPWSTR lpszName, IN OUT LPDWORD lpcbName ); #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 } 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 ); CLUSTER_GROUP_STATE WINAPI GetClusterGroupState( IN HGROUP hGroup, OUT OPTIONAL LPWSTR lpszNodeName, IN OUT LPDWORD lpcbNodeName ); 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 ClusterGroupEnum( IN HGROUPENUM hGroupEnum, IN DWORD dwIndex, OUT LPDWORD lpdwType, OUT LPWSTR lpszResourceName, IN OUT LPDWORD lpcbName ); 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_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 ); DWORD WINAPI DeleteClusterResource( IN HRESOURCE hResource ); CLUSTER_RESOURCE_STATE WINAPI GetClusterResourceState( IN HRESOURCE hResource, OUT OPTIONAL LPWSTR lpszNodeName, IN OUT LPDWORD lpcbNodeName, OUT OPTIONAL LPWSTR lpszGroupName, IN OUT LPDWORD lpcbGroupName ); 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_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_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_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 ), // 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 ) } 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_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_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_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_GET_LOADBAL_PROCESS_LIST = CLUSCTL_RESOURCE_CODE( CLCTL_GET_LOADBAL_PROCESS_LIST ), 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 ), // 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_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_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_REGISTRY_CHECKPOINTS = CLUSCTL_RESOURCE_TYPE_CODE( CLCTL_GET_REGISTRY_CHECKPOINTS ), CLUSCTL_RESOURCE_TYPE_STORAGE_GET_AVAILABLE_DISKS = CLUSCTL_RESOURCE_TYPE_CODE( CLCTL_STORAGE_GET_AVAILABLE_DISKS ), // 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_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_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_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_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_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_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. #pragma warning( disable : 4201 ) // nonstandard extension used : nameless struct/union typedef union CLUSPROP_SYNTAX { DWORD dw; struct { WORD wFormat; WORD wType; }; } CLUSPROP_SYNTAX, *PCLUSPROP_SYNTAX; #pragma warning( default : 4201 ) // Property value. typedef struct CLUSPROP_VALUE { CLUSPROP_SYNTAX Syntax; DWORD cbLength; } CLUSPROP_VALUE, *PCLUSPROP_VALUE; // Binary property value. #pragma warning( disable : 4200 ) // nonstandard extension used : zero-sized array in struct/union #pragma warning( disable : 4201 ) // nonstandard extension used : nameless struct/union #ifdef __cplusplus typedef struct CLUSPROP_BINARY : public CLUSPROP_VALUE { #else typedef struct CLUSPROP_BINARY { CLUSPROP_VALUE; #endif BYTE rgb[]; } CLUSPROP_BINARY, *PCLUSPROP_BINARY; #pragma warning( default : 4200 ) #pragma warning( default : 4201 ) // DWORD property value. #pragma warning( disable : 4201 ) // nonstandard extension used : nameless struct/union #ifdef __cplusplus typedef struct CLUSPROP_DWORD : public CLUSPROP_VALUE { #else typedef struct CLUSPROP_DWORD { CLUSPROP_VALUE; #endif DWORD dw; } CLUSPROP_DWORD, *PCLUSPROP_DWORD; #pragma warning( default : 4201 ) // String and multiple string property value. #pragma warning( disable : 4200 ) // nonstandard extension used : zero-sized array in struct/union #pragma warning( disable : 4201 ) // nonstandard extension used : nameless struct/union #ifdef __cplusplus typedef struct CLUSPROP_SZ : public CLUSPROP_VALUE { #else typedef struct CLUSPROP_SZ { CLUSPROP_VALUE; #endif WCHAR sz[]; } CLUSPROP_SZ, *PCLUSPROP_SZ; #pragma warning( default : 4200 ) #pragma warning( default : 4201 ) // Multiple string property value. typedef CLUSPROP_SZ CLUSPROP_MULTI_SZ, *PCLUSPROP_MULTI_SZ; // Property name. typedef CLUSPROP_SZ CLUSPROP_PROPERTY_NAME, *PCLUSPROP_PROPERTY_NAME; // Large Integer property value. #pragma warning( disable : 4201 ) // nonstandard extension used : nameless struct/union #ifdef __cplusplus typedef struct CLUSPROP_ULARGE_INTEGER : public CLUSPROP_VALUE { #else typedef struct CLUSPROP_ULARGE_INTEGER { CLUSPROP_VALUE; #endif ULARGE_INTEGER li; } CLUSPROP_LARGE_INTEGER, *PCLUSPROP_ULARGE_INTEGER; #pragma warning( default : 4201 ) // Resource class info returned by CLCTL_GET_CLASS_INFO control functions. #pragma warning( disable : 4201 ) // nonstandard extension used : nameless struct/union 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; #pragma warning( default : 4201 ) // Resource class property value. #pragma warning( disable : 4201 ) // nonstandard extension used : nameless struct/union #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; #pragma warning( default : 4201 ) // Resource class info property value. #pragma warning( disable : 4201 ) // nonstandard extension used : nameless struct/union #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; #pragma warning( default : 4201 ) // 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_PIFLAGS; #ifndef MIDL_PASS // 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. #pragma warning( disable : 4201 ) // nonstandard extension used : nameless struct/union #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; #pragma warning( default : 4201 ) // // FT set information. // typedef struct CLUS_FTSET_INFO { DWORD dwRootSignature; DWORD dwFtType; } CLUS_FTSET_INFO, *PCLUS_FTSET_INFO; // Disk partition information property value. #pragma warning( disable : 4201 ) // nonstandard extension used : nameless struct/union #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; #pragma warning( default : 4201 ) // Disk Signature property value. typedef CLUSPROP_DWORD CLUSPROP_DISK_SIGNATURE, *PCLUSPROP_DISK_SIGNATURE; // SCSI Address. #pragma warning( disable : 4201 ) // nonstandard extension used : nameless struct/union typedef struct CLUS_SCSI_ADDRESS { union { struct { UCHAR PortNumber; UCHAR PathId; UCHAR TargetId; UCHAR Lun; }; DWORD dw; }; } CLUS_SCSI_ADDRESS, *PCLUS_SCSI_ADDRESS; #pragma warning( default : 4201 ) // nonstandard extension used : nameless struct/union // SCSI Address property value. #pragma warning( disable : 4201 ) // nonstandard extension used : nameless struct/union #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; #pragma warning( default : 4201 ) // nonstandard extension used : nameless struct/union // 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; LPWSTR psz; PCLUSPROP_LIST pList; PCLUSPROP_SYNTAX pSyntax; PCLUSPROP_PROPERTY_NAME pName; PCLUSPROP_VALUE pValue; PCLUSPROP_BINARY pBinaryValue; PCLUSPROP_DWORD pDwordValue; PCLUSPROP_ULARGE_INTEGER pULargeIntegerValue; PCLUSPROP_SZ pStringValue; PCLUSPROP_MULTI_SZ pMultiSzValue; 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; #endif // _CLUSTER_API_TYPES_ #ifndef MIDL_PASS HRESENUM WINAPI ClusterResourceOpenEnum( IN HRESOURCE hResource, IN DWORD dwType ); DWORD WINAPI ClusterResourceEnum( IN HRESENUM hResEnum, IN DWORD dwIndex, OUT LPDWORD lpdwType, OUT LPWSTR lpszName, IN OUT LPDWORD lpcbName ); 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 ); #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 ); HNETWORKENUM WINAPI ClusterNetworkOpenEnum( IN HNETWORK hNetwork, IN DWORD dwType ); DWORD WINAPI ClusterNetworkEnum( IN HNETWORKENUM hNetworkEnum, IN DWORD dwIndex, OUT LPDWORD lpdwType, OUT LPWSTR lpszName, IN OUT LPDWORD lpcbName ); 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 lpcbInterfaceName ); BOOL WINAPI CloseClusterNetInterface( 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 lpcbName, 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 lpValueType, OUT LPBYTE lpData, IN OUT LPDWORD lpcbData ); DWORD WINAPI ClusterRegEnumValue( IN HKEY hKey, IN DWORD dwIndex, OUT LPWSTR lpszValueName, IN OUT LPDWORD lpcbValueName, OUT LPDWORD lpType, OUT LPBYTE lpData, IN OUT LPDWORD lpcbData ); LONG WINAPI ClusterRegQueryInfoKey( IN HKEY hKey, IN LPDWORD lpcSubKeys, IN LPDWORD lpcbMaxSubKeyLen, IN LPDWORD lpcValues, IN LPDWORD lpcbMaxValueNameLen, 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 ); #endif // MIDL_PASS #ifdef __cplusplus } #endif #ifndef _CLUSTER_API_TYPES_ #define _CLUSTER_API_TYPES_ #endif // _CLUSTER_API_TYPES_ #endif // _CLUSTER_API_