Home | History | Annotate | Download | only in include
      1 /**
      2  * This file has no copyright assigned and is placed in the Public Domain.
      3  * This file is part of the mingw-w64 runtime package.
      4  * No warranty is given; refer to the file DISCLAIMER.PD within this package.
      5  */
      6 #ifndef _CLUSTER_API_
      7 #define _CLUSTER_API_
      8 
      9 #define CLUSAPI_VERSION 0x0500
     10 
     11 #ifdef __cplusplus
     12 extern "C" {
     13 #endif
     14 
     15 #ifndef _CLUSTER_API_TYPES_
     16   typedef struct _HCLUSTER *HCLUSTER;
     17   typedef struct _HNODE *HNODE;
     18   typedef struct _HRESOURCE *HRESOURCE;
     19   typedef struct _HGROUP *HGROUP;
     20   typedef struct _HNETWORK *HNETWORK;
     21   typedef struct _HNETINTERFACE *HNETINTERFACE;
     22   typedef struct _HCHANGE *HCHANGE;
     23   typedef struct _HCLUSENUM *HCLUSENUM;
     24   typedef struct _HGROUPENUM *HGROUPENUM;
     25   typedef struct _HRESENUM *HRESENUM;
     26   typedef struct _HNETWORKENUM *HNETWORKENUM;
     27   typedef struct _HNODEENUM *HNODEENUM;
     28   typedef struct _HRESTYPEENUM *HRESTYPEENUM;
     29 #endif
     30 
     31 #define MAX_CLUSTERNAME_LENGTH MAX_COMPUTERNAME_LENGTH
     32 
     33 #ifndef _CLUSTER_API_TYPES_
     34 
     35   typedef enum CLUSTER_QUORUM_TYPE {
     36     OperationalQuorum,ModifyQuorum
     37   } CLUSTER_QUORUM_TYPE;
     38 
     39   typedef struct CLUSTERVERSIONINFO_NT4 {
     40     DWORD dwVersionInfoSize;
     41     WORD MajorVersion;
     42     WORD MinorVersion;
     43     WORD BuildNumber;
     44     WCHAR szVendorId[64];
     45     WCHAR szCSDVersion[64];
     46   } CLUSTERVERSIONINFO_NT4,*PCLUSTERVERSIONINFO_NT4;
     47 
     48   typedef struct CLUSTERVERSIONINFO {
     49     DWORD dwVersionInfoSize;
     50     WORD MajorVersion;
     51     WORD MinorVersion;
     52     WORD BuildNumber;
     53     WCHAR szVendorId[64];
     54     WCHAR szCSDVersion[64];
     55     DWORD dwClusterHighestVersion;
     56     DWORD dwClusterLowestVersion;
     57     DWORD dwFlags;
     58     DWORD dwReserved;
     59   } CLUSTERVERSIONINFO,*LPCLUSTERVERSIONINFO,*PCLUSTERVERSIONINFO;
     60 
     61   typedef struct CLUS_STARTING_PARAMS {
     62     DWORD dwSize;
     63     WINBOOL bForm;
     64     WINBOOL bFirst;
     65   } CLUS_STARTING_PARAMS,*PCLUS_STARTING_PARAMS;
     66 
     67 #define CLUSTER_VERSION_FLAG_MIXED_MODE 0x00000001
     68 
     69 #define NT4_MAJOR_VERSION 1
     70 #define NT4SP4_MAJOR_VERSION 2
     71 #define NT5_MAJOR_VERSION 3
     72 #define NT51_MAJOR_VERSION 4
     73 
     74 #define CLUSTER_VERSION_UNKNOWN 0xFFFFFFFF
     75 
     76 #define CLUSTER_MAKE_VERSION(_maj,_min) (((_maj) << 16) | (_min))
     77 #define CLUSTER_GET_MAJOR_VERSION(_ver) ((_ver) >> 16)
     78 #define CLUSTER_GET_MINOR_VERSION(_ver) ((_ver) & 0xFFFF)
     79 
     80 #define CLUSTER_INSTALLED 0x00000001
     81 #define CLUSTER_CONFIGURED 0x00000002
     82 #define CLUSTER_RUNNING 0x00000010
     83 
     84   typedef enum NODE_CLUSTER_STATE {
     85     ClusterStateNotInstalled = 0x00000000,ClusterStateNotConfigured = CLUSTER_INSTALLED,ClusterStateNotRunning = CLUSTER_INSTALLED | CLUSTER_CONFIGURED,
     86     ClusterStateRunning = CLUSTER_INSTALLED | CLUSTER_CONFIGURED | CLUSTER_RUNNING
     87   } NODE_CLUSTER_STATE;
     88 
     89 #define CLUSCTL_RESOURCE_STATE_CHANGE_REASON_VERSION_1 1
     90 
     91   typedef enum CLUSTER_RESOURCE_STATE_CHANGE_REASON {
     92     eResourceStateChangeReasonUnknown = 0,eResourceStateChangeReasonMove,eResourceStateChangeReasonFailover,eResourceStateChangeReasonFailedMove,
     93     eResourceStateChangeReasonShutdown,eResourceStateChangeReasonRundown
     94   } CLUSTER_RESOURCE_STATE_CHANGE_REASON;
     95 
     96   typedef struct _CLUSCTL_RESOURCE_STATE_CHANGE_REASON_STRUCT {
     97     DWORD dwSize;
     98     DWORD dwVersion;
     99     CLUSTER_RESOURCE_STATE_CHANGE_REASON eReason;
    100   } CLUSCTL_RESOURCE_STATE_CHANGE_REASON_STRUCT,*PCLUSCTL_RESOURCE_STATE_CHANGE_REASON_STRUCT;
    101 #endif
    102 
    103 #define CLUSAPI_READ_ACCESS __MSABI_LONG(0x00000001)
    104 #define CLUSAPI_CHANGE_ACCESS __MSABI_LONG(0x00000002)
    105 #define CLUSAPI_NO_ACCESS __MSABI_LONG(0x00000004)
    106 #define CLUSAPI_ALL_ACCESS (CLUSAPI_READ_ACCESS | CLUSAPI_CHANGE_ACCESS)
    107 
    108   typedef enum CLUSTER_SET_PASSWORD_FLAGS {
    109     CLUSTER_SET_PASSWORD_IGNORE_DOWN_NODES = 1
    110   } CLUSTER_SET_PASSWORD_FLAGS;
    111 
    112   typedef struct CLUSTER_SET_PASSWORD_STATUS {
    113     DWORD NodeId;
    114     BOOLEAN SetAttempted;
    115     DWORD ReturnStatus;
    116   } CLUSTER_SET_PASSWORD_STATUS,*PCLUSTER_SET_PASSWORD_STATUS;
    117 
    118   DWORD WINAPI GetNodeClusterState(LPCWSTR lpszNodeName,DWORD *pdwClusterState);
    119   HCLUSTER WINAPI OpenCluster(LPCWSTR lpszClusterName);
    120   WINBOOL WINAPI CloseCluster(HCLUSTER hCluster);
    121   DWORD WINAPI SetClusterName(HCLUSTER hCluster,LPCWSTR lpszNewClusterName);
    122   DWORD WINAPI GetClusterInformation(HCLUSTER hCluster,LPWSTR lpszClusterName,LPDWORD lpcchClusterName,LPCLUSTERVERSIONINFO lpClusterInfo);
    123   DWORD WINAPI GetClusterQuorumResource(HCLUSTER hCluster,LPWSTR lpszResourceName,LPDWORD lpcchResourceName,LPWSTR lpszDeviceName,LPDWORD lpcchDeviceName,LPDWORD lpdwMaxQuorumLogSize);
    124   DWORD WINAPI SetClusterQuorumResource(HRESOURCE hResource,LPCWSTR lpszDeviceName,DWORD dwMaxQuoLogSize);
    125   DWORD WINAPI BackupClusterDatabase(HCLUSTER hCluster,LPCWSTR lpszPathName);
    126   DWORD WINAPI RestoreClusterDatabase(LPCWSTR lpszPathName,WINBOOL bForce,LPCWSTR lpszQuorumDriveLetter);
    127   DWORD WINAPI SetClusterNetworkPriorityOrder(HCLUSTER hCluster,DWORD NetworkCount,HNETWORK NetworkList[]);
    128   DWORD WINAPI SetClusterServiceAccountPassword(LPCWSTR lpszClusterName,LPCWSTR lpszNewPassword,DWORD dwFlags,PCLUSTER_SET_PASSWORD_STATUS lpReturnStatusBuffer,LPDWORD lpcbReturnStatusBufferSize);
    129   DWORD WINAPI ClusterControl(HCLUSTER hCluster,HNODE hHostNode,DWORD dwControlCode,LPVOID lpInBuffer,DWORD nInBufferSize,LPVOID lpOutBuffer,DWORD nOutBufferSize,LPDWORD lpBytesReturned);
    130 
    131 #ifndef _CLUSTER_API_TYPES_
    132 
    133   typedef enum CLUSTER_CHANGE {
    134     CLUSTER_CHANGE_NODE_STATE = 0x00000001,CLUSTER_CHANGE_NODE_DELETED = 0x00000002,CLUSTER_CHANGE_NODE_ADDED = 0x00000004,
    135     CLUSTER_CHANGE_NODE_PROPERTY = 0x00000008,CLUSTER_CHANGE_REGISTRY_NAME = 0x00000010,CLUSTER_CHANGE_REGISTRY_ATTRIBUTES = 0x00000020,
    136     CLUSTER_CHANGE_REGISTRY_VALUE = 0x00000040,CLUSTER_CHANGE_REGISTRY_SUBTREE = 0x00000080,CLUSTER_CHANGE_RESOURCE_STATE = 0x00000100,
    137     CLUSTER_CHANGE_RESOURCE_DELETED = 0x00000200,CLUSTER_CHANGE_RESOURCE_ADDED = 0x00000400,CLUSTER_CHANGE_RESOURCE_PROPERTY = 0x00000800,
    138     CLUSTER_CHANGE_GROUP_STATE = 0x00001000,CLUSTER_CHANGE_GROUP_DELETED = 0x00002000,CLUSTER_CHANGE_GROUP_ADDED = 0x00004000,
    139     CLUSTER_CHANGE_GROUP_PROPERTY = 0x00008000,CLUSTER_CHANGE_RESOURCE_TYPE_DELETED = 0x00010000,CLUSTER_CHANGE_RESOURCE_TYPE_ADDED = 0x00020000,
    140     CLUSTER_CHANGE_RESOURCE_TYPE_PROPERTY = 0x00040000,CLUSTER_CHANGE_CLUSTER_RECONNECT = 0x00080000,CLUSTER_CHANGE_NETWORK_STATE = 0x00100000,
    141     CLUSTER_CHANGE_NETWORK_DELETED = 0x00200000,CLUSTER_CHANGE_NETWORK_ADDED = 0x00400000,CLUSTER_CHANGE_NETWORK_PROPERTY = 0x00800000,
    142     CLUSTER_CHANGE_NETINTERFACE_STATE = 0x01000000,CLUSTER_CHANGE_NETINTERFACE_DELETED = 0x02000000,CLUSTER_CHANGE_NETINTERFACE_ADDED = 0x04000000,
    143     CLUSTER_CHANGE_NETINTERFACE_PROPERTY = 0x08000000,CLUSTER_CHANGE_QUORUM_STATE = 0x10000000,CLUSTER_CHANGE_CLUSTER_STATE = 0x20000000,
    144     CLUSTER_CHANGE_CLUSTER_PROPERTY = 0x40000000,CLUSTER_CHANGE_HANDLE_CLOSE = 0x80000000,
    145     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)
    146   } CLUSTER_CHANGE;
    147 #endif
    148 
    149   HCHANGE WINAPI CreateClusterNotifyPort(HCHANGE hChange,HCLUSTER hCluster,DWORD dwFilter,DWORD_PTR dwNotifyKey);
    150   DWORD WINAPI RegisterClusterNotify(HCHANGE hChange,DWORD dwFilterType,HANDLE hObject,DWORD_PTR dwNotifyKey);
    151   DWORD WINAPI GetClusterNotify(HCHANGE hChange,DWORD_PTR *lpdwNotifyKey,LPDWORD lpdwFilterType,LPWSTR lpszName,LPDWORD lpcchName,DWORD dwMilliseconds);
    152   WINBOOL WINAPI CloseClusterNotifyPort(HCHANGE hChange);
    153 
    154 #ifndef _CLUSTER_API_TYPES_
    155   typedef enum CLUSTER_ENUM {
    156     CLUSTER_ENUM_NODE = 0x00000001,CLUSTER_ENUM_RESTYPE = 0x00000002,CLUSTER_ENUM_RESOURCE = 0x00000004,CLUSTER_ENUM_GROUP = 0x00000008,
    157     CLUSTER_ENUM_NETWORK = 0x00000010,CLUSTER_ENUM_NETINTERFACE = 0x00000020,CLUSTER_ENUM_INTERNAL_NETWORK = 0x80000000,
    158     CLUSTER_ENUM_ALL = (CLUSTER_ENUM_NODE | CLUSTER_ENUM_RESTYPE | CLUSTER_ENUM_RESOURCE | CLUSTER_ENUM_GROUP | CLUSTER_ENUM_NETWORK | CLUSTER_ENUM_NETINTERFACE)
    159   } CLUSTER_ENUM;
    160 #endif
    161 
    162   HCLUSENUM WINAPI ClusterOpenEnum(HCLUSTER hCluster,DWORD dwType);
    163   DWORD WINAPI ClusterGetEnumCount(HCLUSENUM hEnum);
    164   DWORD WINAPI ClusterEnum(HCLUSENUM hEnum,DWORD dwIndex,LPDWORD lpdwType,LPWSTR lpszName,LPDWORD lpcchName);
    165   DWORD WINAPI ClusterCloseEnum(HCLUSENUM hEnum);
    166 
    167 #ifndef _CLUSTER_API_TYPES_
    168   typedef enum CLUSTER_NODE_ENUM {
    169     CLUSTER_NODE_ENUM_NETINTERFACES   = 0x00000001,
    170     CLUSTER_NODE_ENUM_GROUPS          = 0x00000002,
    171     CLUSTER_NODE_ENUM_ALL             = (CLUSTER_NODE_ENUM_NETINTERFACES|CLUSTER_NODE_ENUM_GROUPS)
    172   } CLUSTER_NODE_ENUM;
    173 
    174   typedef enum CLUSTER_NODE_STATE {
    175     ClusterNodeStateUnknown = -1,ClusterNodeUp,ClusterNodeDown,ClusterNodePaused,ClusterNodeJoining
    176   } CLUSTER_NODE_STATE;
    177 #endif
    178 
    179   HNODE WINAPI OpenClusterNode(HCLUSTER hCluster,LPCWSTR lpszNodeName);
    180   WINBOOL WINAPI CloseClusterNode(HNODE hNode);
    181   CLUSTER_NODE_STATE WINAPI GetClusterNodeState(HNODE hNode);
    182   DWORD WINAPI GetClusterNodeId(HNODE hNode,LPWSTR lpszNodeId,LPDWORD lpcchName);
    183 #define GetCurrentClusterNodeId(_lpszNodeId_,_lpcchName_) GetClusterNodeId(NULL,(_lpszNodeId_),(_lpcchName_))
    184   HCLUSTER WINAPI GetClusterFromNode(HNODE hNode);
    185   DWORD WINAPI PauseClusterNode(HNODE hNode);
    186   DWORD WINAPI ResumeClusterNode(HNODE hNode);
    187   DWORD WINAPI EvictClusterNode(HNODE hNode);
    188   HNODEENUM WINAPI ClusterNodeOpenEnum(HNODE hNode,DWORD dwType);
    189   DWORD WINAPI ClusterNodeGetEnumCount(HNODEENUM hNodeEnum);
    190   DWORD WINAPI ClusterNodeCloseEnum(HNODEENUM hNodeEnum);
    191   DWORD WINAPI ClusterNodeEnum(HNODEENUM hNodeEnum,DWORD dwIndex,LPDWORD lpdwType,LPWSTR lpszName,LPDWORD lpcchName);
    192   DWORD WINAPI EvictClusterNodeEx(HNODE hNode,DWORD dwTimeOut,HRESULT *phrCleanupStatus);
    193   HKEY WINAPI GetClusterResourceTypeKey(HCLUSTER hCluster,LPCWSTR lpszTypeName,REGSAM samDesired);
    194 
    195 #ifndef _CLUSTER_API_TYPES_
    196   typedef enum CLUSTER_GROUP_ENUM {
    197     CLUSTER_GROUP_ENUM_CONTAINS = 0x00000001,CLUSTER_GROUP_ENUM_NODES = 0x00000002,
    198     CLUSTER_GROUP_ENUM_ALL = (CLUSTER_GROUP_ENUM_CONTAINS | CLUSTER_GROUP_ENUM_NODES)
    199   } CLUSTER_GROUP_ENUM;
    200 
    201   typedef enum CLUSTER_GROUP_STATE {
    202     ClusterGroupStateUnknown = -1,ClusterGroupOnline,ClusterGroupOffline,ClusterGroupFailed,ClusterGroupPartialOnline,ClusterGroupPending
    203   } CLUSTER_GROUP_STATE;
    204 
    205   typedef enum CLUSTER_GROUP_AUTOFAILBACK_TYPE {
    206     ClusterGroupPreventFailback = 0,ClusterGroupAllowFailback,ClusterGroupFailbackTypeCount
    207   } CLUSTER_GROUP_AUTOFAILBACK_TYPE,CGAFT;
    208 #endif
    209 
    210   HGROUP WINAPI CreateClusterGroup(HCLUSTER hCluster,LPCWSTR lpszGroupName);
    211   HGROUP WINAPI OpenClusterGroup(HCLUSTER hCluster,LPCWSTR lpszGroupName);
    212   WINBOOL WINAPI CloseClusterGroup(HGROUP hGroup);
    213   HCLUSTER WINAPI GetClusterFromGroup(HGROUP hGroup);
    214   CLUSTER_GROUP_STATE WINAPI GetClusterGroupState(HGROUP hGroup,LPWSTR lpszNodeName,LPDWORD lpcchNodeName);
    215   DWORD WINAPI SetClusterGroupName(HGROUP hGroup,LPCWSTR lpszGroupName);
    216   DWORD WINAPI SetClusterGroupNodeList(HGROUP hGroup,DWORD NodeCount,HNODE NodeList[]);
    217   DWORD WINAPI OnlineClusterGroup(HGROUP hGroup,HNODE hDestinationNode);
    218   DWORD WINAPI MoveClusterGroup(HGROUP hGroup,HNODE hDestinationNode);
    219   DWORD WINAPI OfflineClusterGroup(HGROUP hGroup);
    220   DWORD WINAPI DeleteClusterGroup(HGROUP hGroup);
    221   HGROUPENUM WINAPI ClusterGroupOpenEnum(HGROUP hGroup,DWORD dwType);
    222   DWORD WINAPI ClusterGroupGetEnumCount(HGROUPENUM hGroupEnum);
    223   DWORD WINAPI ClusterGroupEnum(HGROUPENUM hGroupEnum,DWORD dwIndex,LPDWORD lpdwType,LPWSTR lpszResourceName,LPDWORD lpcchName);
    224   DWORD WINAPI ClusterGroupCloseEnum(HGROUPENUM hGroupEnum);
    225 
    226 #ifndef _CLUSTER_API_TYPES_
    227   typedef enum CLUSTER_RESOURCE_STATE {
    228     ClusterResourceStateUnknown = -1,ClusterResourceInherited,ClusterResourceInitializing,ClusterResourceOnline,ClusterResourceOffline,
    229     ClusterResourceFailed,ClusterResourcePending = 128,ClusterResourceOnlinePending,ClusterResourceOfflinePending
    230   } CLUSTER_RESOURCE_STATE;
    231 
    232   typedef enum CLUSTER_RESOURCE_RESTART_ACTION {
    233     ClusterResourceDontRestart = 0,ClusterResourceRestartNoNotify,ClusterResourceRestartNotify,ClusterResourceRestartActionCount
    234   } CLUSTER_RESOURCE_RESTART_ACTION,CRRA;
    235 
    236   typedef enum CLUSTER_RESOURCE_CREATE_FLAGS {
    237     CLUSTER_RESOURCE_DEFAULT_MONITOR = 0,CLUSTER_RESOURCE_SEPARATE_MONITOR = 1,CLUSTER_RESOURCE_VALID_FLAGS = CLUSTER_RESOURCE_SEPARATE_MONITOR
    238   } CLUSTER_RESOURCE_CREATE_FLAGS;
    239 #endif
    240 
    241   HRESOURCE WINAPI CreateClusterResource(HGROUP hGroup,LPCWSTR lpszResourceName,LPCWSTR lpszResourceType,DWORD dwFlags);
    242   HRESOURCE WINAPI OpenClusterResource(HCLUSTER hCluster,LPCWSTR lpszResourceName);
    243   WINBOOL WINAPI CloseClusterResource(HRESOURCE hResource);
    244   HCLUSTER WINAPI GetClusterFromResource(HRESOURCE hResource);
    245   DWORD WINAPI DeleteClusterResource(HRESOURCE hResource);
    246   CLUSTER_RESOURCE_STATE WINAPI GetClusterResourceState(HRESOURCE hResource,LPWSTR lpszNodeName,LPDWORD lpcchNodeName,LPWSTR lpszGroupName,LPDWORD lpcchGroupName);
    247   DWORD WINAPI SetClusterResourceName(HRESOURCE hResource,LPCWSTR lpszResourceName);
    248   DWORD WINAPI FailClusterResource(HRESOURCE hResource);
    249   DWORD WINAPI OnlineClusterResource(HRESOURCE hResource);
    250   DWORD WINAPI OfflineClusterResource(HRESOURCE hResource);
    251   DWORD WINAPI ChangeClusterResourceGroup(HRESOURCE hResource,HGROUP hGroup);
    252   DWORD WINAPI AddClusterResourceNode(HRESOURCE hResource,HNODE hNode);
    253   DWORD WINAPI RemoveClusterResourceNode(HRESOURCE hResource,HNODE hNode);
    254   DWORD WINAPI AddClusterResourceDependency(HRESOURCE hResource,HRESOURCE hDependsOn);
    255   DWORD WINAPI RemoveClusterResourceDependency(HRESOURCE hResource,HRESOURCE hDependsOn);
    256   WINBOOL WINAPI CanResourceBeDependent(HRESOURCE hResource,HRESOURCE hResourceDependent);
    257   DWORD WINAPI ClusterResourceControl(HRESOURCE hResource,HNODE hHostNode,DWORD dwControlCode,LPVOID lpInBuffer,DWORD cbInBufferSize,LPVOID lpOutBuffer,DWORD cbOutBufferSize,LPDWORD lpBytesReturned);
    258   DWORD WINAPI ClusterResourceTypeControl(HCLUSTER hCluster,LPCWSTR lpszResourceTypeName,HNODE hHostNode,DWORD dwControlCode,LPVOID lpInBuffer,DWORD nInBufferSize,LPVOID lpOutBuffer,DWORD nOutBufferSize,LPDWORD lpBytesReturned);
    259   DWORD WINAPI ClusterGroupControl(HGROUP hGroup,HNODE hHostNode,DWORD dwControlCode,LPVOID lpInBuffer,DWORD nInBufferSize,LPVOID lpOutBuffer,DWORD nOutBufferSize,LPDWORD lpBytesReturned);
    260   DWORD WINAPI ClusterNodeControl(HNODE hNode,HNODE hHostNode,DWORD dwControlCode,LPVOID lpInBuffer,DWORD nInBufferSize,LPVOID lpOutBuffer,DWORD nOutBufferSize,LPDWORD lpBytesReturned);
    261   WINBOOL WINAPI GetClusterResourceNetworkName(HRESOURCE hResource,LPWSTR lpBuffer,LPDWORD nSize);
    262 
    263 #ifndef _CLUSTER_API_TYPES_
    264   typedef enum CLUSTER_PROPERTY_TYPE {
    265     CLUSPROP_TYPE_UNKNOWN = -1,CLUSPROP_TYPE_ENDMARK = 0,CLUSPROP_TYPE_LIST_VALUE,CLUSPROP_TYPE_RESCLASS,CLUSPROP_TYPE_RESERVED1,CLUSPROP_TYPE_NAME,
    266     CLUSPROP_TYPE_SIGNATURE,CLUSPROP_TYPE_SCSI_ADDRESS,CLUSPROP_TYPE_DISK_NUMBER,CLUSPROP_TYPE_PARTITION_INFO,CLUSPROP_TYPE_FTSET_INFO,
    267     CLUSPROP_TYPE_DISK_SERIALNUMBER,
    268     CLUSPROP_TYPE_DISK_GUID           = 11,
    269     CLUSPROP_TYPE_DISK_SIZE           = 12,
    270     CLUSPROP_TYPE_PARTITION_INFO_EX   = 13,
    271     CLUSPROP_TYPE_USER=32768
    272   } CLUSTER_PROPERTY_TYPE;
    273 
    274   typedef enum CLUSTER_PROPERTY_FORMAT {
    275     CLUSPROP_FORMAT_UNKNOWN = 0,CLUSPROP_FORMAT_BINARY,CLUSPROP_FORMAT_DWORD,CLUSPROP_FORMAT_SZ,CLUSPROP_FORMAT_EXPAND_SZ,CLUSPROP_FORMAT_MULTI_SZ,
    276     CLUSPROP_FORMAT_ULARGE_INTEGER,CLUSPROP_FORMAT_LONG,CLUSPROP_FORMAT_EXPANDED_SZ,CLUSPROP_FORMAT_SECURITY_DESCRIPTOR,CLUSPROP_FORMAT_LARGE_INTEGER,
    277     CLUSPROP_FORMAT_WORD,
    278     CLUSPROP_FORMAT_FILETIME              = 12,
    279     CLUSPROP_FORMAT_USER=32768
    280   } CLUSTER_PROPERTY_FORMAT;
    281 #endif
    282 
    283 #define CLUSPROP_SYNTAX_VALUE(type,format) ((DWORD) ((type << 16) | format))
    284 
    285 #ifndef _CLUSTER_API_TYPES_
    286   typedef enum CLUSTER_PROPERTY_SYNTAX {
    287     CLUSPROP_SYNTAX_ENDMARK = CLUSPROP_SYNTAX_VALUE(CLUSPROP_TYPE_ENDMARK,CLUSPROP_FORMAT_UNKNOWN),
    288     CLUSPROP_SYNTAX_NAME = CLUSPROP_SYNTAX_VALUE(CLUSPROP_TYPE_NAME,CLUSPROP_FORMAT_SZ),
    289     CLUSPROP_SYNTAX_RESCLASS = CLUSPROP_SYNTAX_VALUE(CLUSPROP_TYPE_RESCLASS,CLUSPROP_FORMAT_DWORD),
    290     CLUSPROP_SYNTAX_LIST_VALUE_SZ = CLUSPROP_SYNTAX_VALUE(CLUSPROP_TYPE_LIST_VALUE,CLUSPROP_FORMAT_SZ),
    291     CLUSPROP_SYNTAX_LIST_VALUE_EXPAND_SZ = CLUSPROP_SYNTAX_VALUE(CLUSPROP_TYPE_LIST_VALUE,CLUSPROP_FORMAT_EXPAND_SZ),
    292     CLUSPROP_SYNTAX_LIST_VALUE_DWORD = CLUSPROP_SYNTAX_VALUE(CLUSPROP_TYPE_LIST_VALUE,CLUSPROP_FORMAT_DWORD),
    293     CLUSPROP_SYNTAX_LIST_VALUE_BINARY = CLUSPROP_SYNTAX_VALUE(CLUSPROP_TYPE_LIST_VALUE,CLUSPROP_FORMAT_BINARY),
    294     CLUSPROP_SYNTAX_LIST_VALUE_MULTI_SZ = CLUSPROP_SYNTAX_VALUE(CLUSPROP_TYPE_LIST_VALUE,CLUSPROP_FORMAT_MULTI_SZ),
    295     CLUSPROP_SYNTAX_LIST_VALUE_LONG = CLUSPROP_SYNTAX_VALUE(CLUSPROP_TYPE_LIST_VALUE,CLUSPROP_FORMAT_LONG),
    296     CLUSPROP_SYNTAX_LIST_VALUE_EXPANDED_SZ = CLUSPROP_SYNTAX_VALUE(CLUSPROP_TYPE_LIST_VALUE,CLUSPROP_FORMAT_EXPANDED_SZ),
    297     CLUSPROP_SYNTAX_LIST_VALUE_SECURITY_DESCRIPTOR = CLUSPROP_SYNTAX_VALUE(CLUSPROP_TYPE_LIST_VALUE,CLUSPROP_FORMAT_SECURITY_DESCRIPTOR),
    298     CLUSPROP_SYNTAX_LIST_VALUE_LARGE_INTEGER = CLUSPROP_SYNTAX_VALUE(CLUSPROP_TYPE_LIST_VALUE,CLUSPROP_FORMAT_LARGE_INTEGER),
    299     CLUSPROP_SYNTAX_LIST_VALUE_ULARGE_INTEGER = CLUSPROP_SYNTAX_VALUE(CLUSPROP_TYPE_LIST_VALUE,CLUSPROP_FORMAT_ULARGE_INTEGER),
    300     CLUSPROP_SYNTAX_DISK_SIGNATURE = CLUSPROP_SYNTAX_VALUE(CLUSPROP_TYPE_SIGNATURE,CLUSPROP_FORMAT_DWORD),
    301     CLUSPROP_SYNTAX_SCSI_ADDRESS = CLUSPROP_SYNTAX_VALUE(CLUSPROP_TYPE_SCSI_ADDRESS,CLUSPROP_FORMAT_DWORD),
    302     CLUSPROP_SYNTAX_DISK_NUMBER = CLUSPROP_SYNTAX_VALUE(CLUSPROP_TYPE_DISK_NUMBER,CLUSPROP_FORMAT_DWORD),
    303     CLUSPROP_SYNTAX_PARTITION_INFO = CLUSPROP_SYNTAX_VALUE(CLUSPROP_TYPE_PARTITION_INFO,CLUSPROP_FORMAT_BINARY),
    304     CLUSPROP_SYNTAX_FTSET_INFO = CLUSPROP_SYNTAX_VALUE(CLUSPROP_TYPE_FTSET_INFO,CLUSPROP_FORMAT_BINARY),
    305     CLUSPROP_SYNTAX_DISK_SERIALNUMBER = CLUSPROP_SYNTAX_VALUE(CLUSPROP_TYPE_DISK_SERIALNUMBER,CLUSPROP_FORMAT_SZ),
    306     CLUSPROP_SYNTAX_DISK_GUID = CLUSPROP_SYNTAX_VALUE(CLUSPROP_TYPE_DISK_GUID,CLUSPROP_FORMAT_SZ), /*0x000b0003*/
    307     CLUSPROP_SYNTAX_DISK_SIZE = CLUSPROP_SYNTAX_VALUE(CLUSPROP_TYPE_DISK_SIZE,CLUSPROP_FORMAT_ULARGE_INTEGER),/*0x000c0006*/
    308     CLUSPROP_SYNTAX_PARTITION_INFO_EX = CLUSPROP_SYNTAX_VALUE(CLUSPROP_TYPE_PARTITION_INFO_EX,CLUSPROP_FORMAT_BINARY),/*0x000d0001*/
    309     CLUSPROP_SYNTAX_LIST_VALUE_FILETIME = CLUSPROP_SYNTAX_VALUE(CLUSPROP_TYPE_LIST_VALUE,CLUSPROP_FORMAT_FILETIME) /*0x0001000c*/
    310   } CLUSTER_PROPERTY_SYNTAX;
    311 #endif
    312 
    313 #define CLUS_ACCESS_ANY 0
    314 #define CLUS_ACCESS_READ 0x01
    315 #define CLUS_ACCESS_WRITE 0x02
    316 
    317 #define CLUS_NO_MODIFY 0
    318 #define CLUS_MODIFY 0x01
    319 
    320 #define CLUS_NOT_GLOBAL 0
    321 #define CLUS_GLOBAL 0x01
    322 
    323 #ifndef _CLUSTER_API_TYPES_
    324   typedef enum CLUSTER_CONTROL_OBJECT {
    325     CLUS_OBJECT_INVALID=0,CLUS_OBJECT_RESOURCE,CLUS_OBJECT_RESOURCE_TYPE,CLUS_OBJECT_GROUP,CLUS_OBJECT_NODE,CLUS_OBJECT_NETWORK,
    326     CLUS_OBJECT_NETINTERFACE,CLUS_OBJECT_CLUSTER,CLUS_OBJECT_USER=128
    327   } CLUSTER_CONTROL_OBJECT;
    328 #endif
    329 
    330 #define CLUSCTL_ACCESS_SHIFT 0
    331 #define CLUSCTL_FUNCTION_SHIFT 2
    332 #define CLCTL_INTERNAL_SHIFT 20
    333 #define CLCTL_USER_SHIFT 21
    334 #define CLCTL_MODIFY_SHIFT 22
    335 #define CLCTL_GLOBAL_SHIFT 23
    336 #define CLUSCTL_OBJECT_SHIFT 24
    337 
    338 #define CLCTL_INTERNAL_MASK (1<<CLCTL_INTERNAL_SHIFT)
    339 #define CLCTL_USER_MASK (1<<CLCTL_USER_SHIFT)
    340 #define CLCTL_MODIFY_MASK (1<<CLCTL_MODIFY_SHIFT)
    341 #define CLCTL_GLOBAL_MASK (1<<CLCTL_GLOBAL_SHIFT)
    342 #define CLUSCTL_CONTROL_CODE_MASK 0x3FFFFF
    343 #define CLUSCTL_OBJECT_MASK 0xFF
    344 #define CLUSCTL_ACCESS_MODE_MASK 0x03
    345 
    346 #define CLCTL_CLUSTER_BASE 0
    347 #define CLCTL_USER_BASE (1<<CLCTL_USER_SHIFT)
    348 
    349 #define CLCTL_EXTERNAL_CODE(Function,Access,Modify) (((Access) << CLUSCTL_ACCESS_SHIFT) | ((CLCTL_CLUSTER_BASE + Function) << CLUSCTL_FUNCTION_SHIFT) | ((Modify) << CLCTL_MODIFY_SHIFT))
    350 #define CLCTL_INTERNAL_CODE(Function,Access,Modify) (((Access) << CLUSCTL_ACCESS_SHIFT) | CLCTL_INTERNAL_MASK | ((CLCTL_CLUSTER_BASE + Function) << CLUSCTL_FUNCTION_SHIFT) | ((Modify) << CLCTL_MODIFY_SHIFT))
    351 
    352 #ifndef _CLUSTER_API_TYPES_
    353   typedef enum CLCTL_CODES {
    354     CLCTL_UNKNOWN = CLCTL_EXTERNAL_CODE(0,CLUS_ACCESS_ANY,CLUS_NO_MODIFY),
    355     CLCTL_GET_CHARACTERISTICS = CLCTL_EXTERNAL_CODE(1,CLUS_ACCESS_READ,CLUS_NO_MODIFY),
    356     CLCTL_GET_FLAGS = CLCTL_EXTERNAL_CODE(2,CLUS_ACCESS_READ,CLUS_NO_MODIFY),
    357     CLCTL_GET_CLASS_INFO = CLCTL_EXTERNAL_CODE(3,CLUS_ACCESS_READ,CLUS_NO_MODIFY),
    358     CLCTL_GET_REQUIRED_DEPENDENCIES = CLCTL_EXTERNAL_CODE(4,CLUS_ACCESS_READ,
    359     CLUS_NO_MODIFY),CLCTL_GET_ARB_TIMEOUT = CLCTL_EXTERNAL_CODE(5,CLUS_ACCESS_READ,
    360     CLUS_NO_MODIFY),CLCTL_GET_NAME = CLCTL_EXTERNAL_CODE(10,CLUS_ACCESS_READ,
    361     CLUS_NO_MODIFY),CLCTL_GET_RESOURCE_TYPE = CLCTL_EXTERNAL_CODE(11,
    362     CLUS_ACCESS_READ,CLUS_NO_MODIFY),CLCTL_GET_NODE = CLCTL_EXTERNAL_CODE(12,CLUS_ACCESS_READ,CLUS_NO_MODIFY),
    363     CLCTL_GET_NETWORK = CLCTL_EXTERNAL_CODE(13,CLUS_ACCESS_READ,CLUS_NO_MODIFY),
    364     CLCTL_GET_ID = CLCTL_EXTERNAL_CODE(14,CLUS_ACCESS_READ,CLUS_NO_MODIFY),
    365     CLCTL_GET_FQDN = CLCTL_EXTERNAL_CODE(15,CLUS_ACCESS_READ,CLUS_NO_MODIFY),
    366     CLCTL_GET_CLUSTER_SERVICE_ACCOUNT_NAME = CLCTL_EXTERNAL_CODE(16,CLUS_ACCESS_READ,CLUS_NO_MODIFY),
    367     CLCTL_CHECK_VOTER_EVICT                    = CLCTL_EXTERNAL_CODE(17,CLUS_ACCESS_READ,CLUS_NO_MODIFY),/*0x00000045*/
    368     CLCTL_CHECK_VOTER_DOWN                     = CLCTL_EXTERNAL_CODE(18,CLUS_ACCESS_READ,CLUS_NO_MODIFY),/*0x00000049*/
    369     CLCTL_SHUTDOWN                             = CLCTL_EXTERNAL_CODE(19,CLUS_ACCESS_READ,CLUS_NO_MODIFY),/*0x0000004d*/
    370     CLCTL_ENUM_COMMON_PROPERTIES = CLCTL_EXTERNAL_CODE(20,CLUS_ACCESS_READ,CLUS_NO_MODIFY),
    371     CLCTL_GET_RO_COMMON_PROPERTIES = CLCTL_EXTERNAL_CODE(21,CLUS_ACCESS_READ,CLUS_NO_MODIFY),
    372     CLCTL_GET_COMMON_PROPERTIES = CLCTL_EXTERNAL_CODE(22,CLUS_ACCESS_READ,CLUS_NO_MODIFY),
    373     CLCTL_SET_COMMON_PROPERTIES = CLCTL_EXTERNAL_CODE(23,CLUS_ACCESS_WRITE,CLUS_MODIFY),
    374     CLCTL_VALIDATE_COMMON_PROPERTIES = CLCTL_EXTERNAL_CODE(24,CLUS_ACCESS_READ,CLUS_NO_MODIFY),
    375     CLCTL_GET_COMMON_PROPERTY_FMTS = CLCTL_EXTERNAL_CODE(25,CLUS_ACCESS_READ,CLUS_NO_MODIFY),
    376     CLCTL_GET_COMMON_RESOURCE_PROPERTY_FMTS = CLCTL_EXTERNAL_CODE(26,CLUS_ACCESS_READ,CLUS_NO_MODIFY),
    377     CLCTL_ENUM_PRIVATE_PROPERTIES = CLCTL_EXTERNAL_CODE(30,CLUS_ACCESS_READ,CLUS_NO_MODIFY),
    378     CLCTL_GET_RO_PRIVATE_PROPERTIES = CLCTL_EXTERNAL_CODE(31,CLUS_ACCESS_READ,CLUS_NO_MODIFY),
    379     CLCTL_GET_PRIVATE_PROPERTIES = CLCTL_EXTERNAL_CODE(32,CLUS_ACCESS_READ,CLUS_NO_MODIFY),
    380     CLCTL_SET_PRIVATE_PROPERTIES = CLCTL_EXTERNAL_CODE(33,CLUS_ACCESS_WRITE,CLUS_MODIFY),
    381     CLCTL_VALIDATE_PRIVATE_PROPERTIES = CLCTL_EXTERNAL_CODE(34,CLUS_ACCESS_READ,CLUS_NO_MODIFY),
    382     CLCTL_GET_PRIVATE_PROPERTY_FMTS = CLCTL_EXTERNAL_CODE(35,CLUS_ACCESS_READ,CLUS_NO_MODIFY),
    383     CLCTL_GET_PRIVATE_RESOURCE_PROPERTY_FMTS= CLCTL_EXTERNAL_CODE(36,CLUS_ACCESS_READ,CLUS_NO_MODIFY),
    384     CLCTL_ADD_REGISTRY_CHECKPOINT = CLCTL_EXTERNAL_CODE(40,CLUS_ACCESS_WRITE,CLUS_MODIFY),
    385     CLCTL_DELETE_REGISTRY_CHECKPOINT = CLCTL_EXTERNAL_CODE(41,CLUS_ACCESS_WRITE,CLUS_MODIFY),
    386     CLCTL_GET_REGISTRY_CHECKPOINTS = CLCTL_EXTERNAL_CODE(42,CLUS_ACCESS_READ,CLUS_NO_MODIFY),
    387     CLCTL_ADD_CRYPTO_CHECKPOINT = CLCTL_EXTERNAL_CODE(43,CLUS_ACCESS_WRITE,CLUS_MODIFY),
    388     CLCTL_DELETE_CRYPTO_CHECKPOINT = CLCTL_EXTERNAL_CODE(44,CLUS_ACCESS_WRITE,CLUS_MODIFY),
    389     CLCTL_GET_CRYPTO_CHECKPOINTS = CLCTL_EXTERNAL_CODE(45,CLUS_ACCESS_READ,CLUS_NO_MODIFY),
    390     CLCTL_RESOURCE_UPGRADE_DLL = CLCTL_EXTERNAL_CODE(46,CLUS_ACCESS_WRITE,CLUS_MODIFY),
    391     CLCTL_ADD_REGISTRY_CHECKPOINT_64BIT = CLCTL_EXTERNAL_CODE(47,CLUS_ACCESS_WRITE,CLUS_MODIFY),
    392     CLCTL_ADD_REGISTRY_CHECKPOINT_32BIT = CLCTL_EXTERNAL_CODE(48,CLUS_ACCESS_WRITE,CLUS_MODIFY),
    393     CLCTL_GET_LOADBAL_PROCESS_LIST = CLCTL_EXTERNAL_CODE(50,CLUS_ACCESS_READ,CLUS_NO_MODIFY),
    394     CLCTL_GET_NETWORK_NAME = CLCTL_EXTERNAL_CODE(90,CLUS_ACCESS_READ,CLUS_NO_MODIFY),
    395     CLCTL_NETNAME_GET_VIRTUAL_SERVER_TOKEN = CLCTL_EXTERNAL_CODE(91,CLUS_ACCESS_READ,
    396     CLUS_NO_MODIFY),CLCTL_NETNAME_REGISTER_DNS_RECORDS = CLCTL_EXTERNAL_CODE(92,CLUS_ACCESS_WRITE,CLUS_NO_MODIFY),
    397     CLCTL_NETNAME_CREDS_UPDATED = (CLCTL_EXTERNAL_CODE(98,CLUS_ACCESS_WRITE,CLUS_MODIFY)|CLCTL_GLOBAL_MASK),
    398     CLCTL_STORAGE_GET_DISK_INFO = CLCTL_EXTERNAL_CODE(100,CLUS_ACCESS_READ,CLUS_NO_MODIFY),
    399     CLCTL_STORAGE_GET_AVAILABLE_DISKS = CLCTL_EXTERNAL_CODE(101,CLUS_ACCESS_READ,CLUS_NO_MODIFY),
    400     CLCTL_STORAGE_IS_PATH_VALID = CLCTL_EXTERNAL_CODE(102,CLUS_ACCESS_READ,CLUS_NO_MODIFY),
    401     CLCTL_STORAGE_GET_ALL_AVAILABLE_DISKS = (CLCTL_EXTERNAL_CODE(103,CLUS_ACCESS_READ,CLUS_NO_MODIFY) | CLCTL_GLOBAL_MASK),
    402     CLCTL_QUERY_DELETE = CLCTL_EXTERNAL_CODE(110,CLUS_ACCESS_READ,CLUS_NO_MODIFY),
    403     CLCTL_QUERY_MAINTENANCE_MODE = CLCTL_EXTERNAL_CODE(120,CLUS_ACCESS_READ,CLUS_NO_MODIFY),
    404     CLCTL_SET_MAINTENANCE_MODE = CLCTL_EXTERNAL_CODE(121,CLUS_ACCESS_WRITE,CLUS_MODIFY),
    405     CLCTL_STORAGE_SET_DRIVELETTER              = CLCTL_EXTERNAL_CODE(122,CLUS_ACCESS_WRITE,CLUS_MODIFY),/*0x004001ea*/
    406     CLCTL_STORAGE_GET_DRIVELETTERS             = CLCTL_EXTERNAL_CODE(123,CLUS_ACCESS_READ,CLUS_NO_MODIFY),/*0x000001ed*/
    407     CLCTL_STORAGE_GET_DISK_INFO_EX             = CLCTL_EXTERNAL_CODE(124,CLUS_ACCESS_READ,CLUS_NO_MODIFY),/*0x000001f1*/
    408     CLCTL_STORAGE_GET_AVAILABLE_DISKS_EX       = CLCTL_EXTERNAL_CODE(125,CLUS_ACCESS_READ,CLUS_NO_MODIFY),/*0x000001f5*/
    409     CLCTL_STORAGE_REMAP_DRIVELETTER            = CLCTL_EXTERNAL_CODE(128,CLUS_ACCESS_READ,CLUS_NO_MODIFY),/*0x00000201,*/
    410     CLCTL_STORAGE_GET_DISKID                   = CLCTL_EXTERNAL_CODE(129,CLUS_ACCESS_READ,CLUS_NO_MODIFY),/*0x00000205*/
    411     CLCTL_STORAGE_IS_CLUSTERABLE               = CLCTL_EXTERNAL_CODE(130,CLUS_ACCESS_READ,CLUS_NO_MODIFY),/*0x00000209*/
    412     CLCTL_STORAGE_REMOVE_VM_OWNERSHIP          = CLCTL_EXTERNAL_CODE(131,CLUS_ACCESS_WRITE,CLUS_MODIFY),/*0x0040020e*/
    413     CLCTL_STORAGE_GET_MOUNTPOINTS              = CLCTL_EXTERNAL_CODE(132,CLUS_ACCESS_READ,CLUS_NO_MODIFY),/*0x00000211*/
    414     CLCTL_STORAGE_CLUSTER_DISK                 = (CLCTL_EXTERNAL_CODE(132,CLUS_ACCESS_WRITE,CLUS_MODIFY)|CLCTL_GLOBAL_MASK),/*0x00c00212*/
    415     CLCTL_STORAGE_GET_DIRTY                    = CLCTL_EXTERNAL_CODE(134,CLUS_ACCESS_READ,CLUS_NO_MODIFY),/*0x00000219*/
    416     CLCTL_STORAGE_GET_SHARED_VOLUME_INFO       = CLCTL_EXTERNAL_CODE(137,CLUS_ACCESS_READ,CLUS_NO_MODIFY),/* 0x00000225 */
    417     CLCTL_STORAGE_IS_CSV_FILE                  = CLCTL_EXTERNAL_CODE(138,CLUS_ACCESS_READ,CLUS_NO_MODIFY),/*0x00000229*/
    418     CLCTL_VALIDATE_PATH                        = CLCTL_EXTERNAL_CODE(140,CLUS_ACCESS_READ,CLUS_NO_MODIFY),/*0x00000231,*/
    419     CLCTL_VALIDATE_NETNAME                     = CLCTL_EXTERNAL_CODE(141,CLUS_ACCESS_READ,CLUS_NO_MODIFY),/*0x00000235*/
    420     CLCTL_VALIDATE_DIRECTORY                   = CLCTL_EXTERNAL_CODE(142,CLUS_ACCESS_READ,CLUS_NO_MODIFY),/*0x00000239*/
    421     CLCTL_BATCH_BLOCK_KEY                      = CLCTL_EXTERNAL_CODE(143,CLUS_ACCESS_WRITE,CLUS_NO_MODIFY),/*0x0000023e*/
    422     CLCTL_BATCH_UNBLOCK_KEY                    = CLCTL_EXTERNAL_CODE(144,CLUS_ACCESS_READ,CLUS_NO_MODIFY),/*0x00000241*/
    423     CLCTL_FILESERVER_SHARE_ADD                 = CLCTL_EXTERNAL_CODE(145,CLUS_ACCESS_READ,CLUS_NO_MODIFY),/*0x00400245*/
    424     CLCTL_FILESERVER_SHARE_DEL                 = CLCTL_EXTERNAL_CODE(146,CLUS_ACCESS_READ,CLUS_NO_MODIFY),/*0x00400249*/
    425     CLCTL_FILESERVER_SHARE_MODIFY              = CLCTL_EXTERNAL_CODE(147,CLUS_ACCESS_READ,CLUS_NO_MODIFY),/*0x0040024d*/
    426     CLCTL_FILESERVER_SHARE_REPORT              = CLCTL_EXTERNAL_CODE(148,CLUS_ACCESS_READ,CLUS_NO_MODIFY),/*0x00000251*/
    427     CLCTL_ENABLE_SHARED_VOLUME_DIRECTIO        = CLCTL_EXTERNAL_CODE(162,CLUS_ACCESS_WRITE,CLUS_MODIFY),/*0x0040028a*/
    428     CLCTL_DISABLE_SHARED_VOLUME_DIRECTIO       = CLCTL_EXTERNAL_CODE(163,CLUS_ACCESS_WRITE,CLUS_MODIFY),/*0x0040028e*/
    429     CLCTL_GET_SHARED_VOLUME_ID                 = CLCTL_EXTERNAL_CODE(164,CLUS_ACCESS_READ,CLUS_NO_MODIFY),/*0x00000291*/
    430     CLCTL_SET_CSV_MAINTENANCE_MODE             = CLCTL_EXTERNAL_CODE(165,CLUS_ACCESS_WRITE,CLUS_MODIFY),/*0x00400296*/
    431     CLCTL_SET_SHARED_VOLUME_BACKUP_MODE        = CLCTL_EXTERNAL_CODE(166,CLUS_ACCESS_WRITE,CLUS_MODIFY),/*0x0040029a,*/
    432     CLCTL_DELETE = CLCTL_INTERNAL_CODE(1,CLUS_ACCESS_WRITE,CLUS_MODIFY),
    433     CLCTL_INSTALL_NODE = CLCTL_INTERNAL_CODE(2,CLUS_ACCESS_WRITE,CLUS_MODIFY),
    434     CLCTL_EVICT_NODE = CLCTL_INTERNAL_CODE(3,CLUS_ACCESS_WRITE,CLUS_MODIFY),
    435     CLCTL_ADD_DEPENDENCY = CLCTL_INTERNAL_CODE(4,CLUS_ACCESS_WRITE,CLUS_MODIFY),
    436     CLCTL_REMOVE_DEPENDENCY = CLCTL_INTERNAL_CODE(5,CLUS_ACCESS_WRITE,CLUS_MODIFY),
    437     CLCTL_ADD_OWNER = CLCTL_INTERNAL_CODE(6,CLUS_ACCESS_WRITE,CLUS_MODIFY),
    438     CLCTL_REMOVE_OWNER = CLCTL_INTERNAL_CODE(7,CLUS_ACCESS_WRITE,
    439     CLUS_MODIFY),CLCTL_SET_NAME = CLCTL_INTERNAL_CODE(9,CLUS_ACCESS_WRITE,CLUS_MODIFY),
    440     CLCTL_CLUSTER_NAME_CHANGED = CLCTL_INTERNAL_CODE(10,CLUS_ACCESS_WRITE,CLUS_MODIFY),
    441     CLCTL_CLUSTER_VERSION_CHANGED = CLCTL_INTERNAL_CODE(11,CLUS_ACCESS_WRITE,CLUS_MODIFY),
    442     CLCTL_FIXUP_ON_UPGRADE = CLCTL_INTERNAL_CODE(12,CLUS_ACCESS_WRITE,CLUS_MODIFY),
    443     CLCTL_STARTING_PHASE1 = CLCTL_INTERNAL_CODE(13,CLUS_ACCESS_WRITE,CLUS_MODIFY),
    444     CLCTL_STARTING_PHASE2 = CLCTL_INTERNAL_CODE(14,CLUS_ACCESS_WRITE,CLUS_MODIFY),
    445     CLCTL_HOLD_IO = CLCTL_INTERNAL_CODE(15,CLUS_ACCESS_WRITE,CLUS_MODIFY),
    446     CLCTL_RESUME_IO = CLCTL_INTERNAL_CODE(16,CLUS_ACCESS_WRITE,CLUS_MODIFY),
    447     CLCTL_FORCE_QUORUM = CLCTL_INTERNAL_CODE(17,CLUS_ACCESS_WRITE,CLUS_MODIFY),
    448     CLCTL_INITIALIZE = CLCTL_INTERNAL_CODE(18,CLUS_ACCESS_WRITE,CLUS_MODIFY),
    449     CLCTL_STATE_CHANGE_REASON = CLCTL_INTERNAL_CODE(19,CLUS_ACCESS_WRITE,CLUS_MODIFY),
    450     CLCTL_PROVIDER_STATE_CHANGE = CLCTL_INTERNAL_CODE(20,CLUS_ACCESS_WRITE, CLUS_MODIFY),/*0x00500052*/
    451     CLCTL_LEAVING_GROUP = CLCTL_INTERNAL_CODE(21,CLUS_ACCESS_WRITE, CLUS_MODIFY),/*0x00500056,*/
    452     CLCTL_JOINING_GROUP = CLCTL_INTERNAL_CODE(22,CLUS_ACCESS_WRITE, CLUS_MODIFY),/*0x0050005a*/
    453     CLCTL_FSWITNESS_GET_EPOCH_INFO = CLCTL_INTERNAL_CODE(23,CLUS_ACCESS_READ, CLUS_NO_MODIFY),/*0x0010005d*/
    454     CLCTL_FSWITNESS_SET_EPOCH_INFO = CLCTL_INTERNAL_CODE(24,CLUS_ACCESS_WRITE, CLUS_MODIFY),/*0x00500062*/
    455     CLCTL_FSWITNESS_RELEASE_LOCK = CLCTL_INTERNAL_CODE(25,CLUS_ACCESS_WRITE, CLUS_MODIFY),/*0x00500066,*/
    456     CLCTL_NETNAME_CREDS_NOTIFYCAM = CLCTL_INTERNAL_CODE(26,CLUS_ACCESS_WRITE, CLUS_MODIFY),/*0x0050006a*/
    457     CLCTL_STORAGE_GET_DISK_NUMBER = CLCTL_INTERNAL_CODE(27,CLUS_ACCESS_READ, CLUS_NO_MODIFY) /*0x0010006d */
    458   } CLCTL_CODES;
    459 #endif
    460 
    461 #define CLUSCTL_RESOURCE_CODE(Function) (((CLUS_OBJECT_RESOURCE << CLUSCTL_OBJECT_SHIFT) | Function))
    462 #define CLUSCTL_RESOURCE_TYPE_CODE(Function) (((CLUS_OBJECT_RESOURCE_TYPE << CLUSCTL_OBJECT_SHIFT) | Function))
    463 #define CLUSCTL_GROUP_CODE(Function) (((CLUS_OBJECT_GROUP << CLUSCTL_OBJECT_SHIFT) | Function))
    464 #define CLUSCTL_NODE_CODE(Function) (((CLUS_OBJECT_NODE << CLUSCTL_OBJECT_SHIFT) | Function))
    465 #define CLUSCTL_NETWORK_CODE(Function) (((CLUS_OBJECT_NETWORK << CLUSCTL_OBJECT_SHIFT) | Function))
    466 #define CLUSCTL_NETINTERFACE_CODE(Function) (((CLUS_OBJECT_NETINTERFACE << CLUSCTL_OBJECT_SHIFT) | Function))
    467 #define CLUSCTL_CLUSTER_CODE(Function) (((CLUS_OBJECT_CLUSTER << CLUSCTL_OBJECT_SHIFT) | Function))
    468 #define CLUSCTL_USER_CODE(Function,Object) (((Object) << CLUSCTL_OBJECT_SHIFT) | ((CLCTL_USER_BASE + Function) << CLUSCTL_FUNCTION_SHIFT))
    469 #define CLUSCTL_GET_CONTROL_FUNCTION(ControlCode) ((ControlCode >> CLUSCTL_ACCESS_SHIFT) & CLUSCTL_CONTROL_CODE_MASK)
    470 #define CLUSCTL_GET_ACCESS_MODE(ControlCode) ((ControlCode >> CLUSCTL_ACCESS_SHIFT) & CLUSCTL_ACCESS_MODE_MASK)
    471 #define CLUSCTL_GET_CONTROL_OBJECT(ControlCode) ((ControlCode >> CLUSCTL_OBJECT_SHIFT) & CLUSCTL_OBJECT_MASK)
    472 
    473 #ifndef _CLUSTER_API_TYPES_
    474   typedef enum CLUSCTL_RESOURCE_CODES {
    475     CLUSCTL_RESOURCE_UNKNOWN = CLUSCTL_RESOURCE_CODE(CLCTL_UNKNOWN),
    476     CLUSCTL_RESOURCE_GET_CHARACTERISTICS = CLUSCTL_RESOURCE_CODE(CLCTL_GET_CHARACTERISTICS),
    477     CLUSCTL_RESOURCE_GET_FLAGS = CLUSCTL_RESOURCE_CODE(CLCTL_GET_FLAGS),
    478     CLUSCTL_RESOURCE_GET_CLASS_INFO = CLUSCTL_RESOURCE_CODE(CLCTL_GET_CLASS_INFO),
    479     CLUSCTL_RESOURCE_GET_REQUIRED_DEPENDENCIES = CLUSCTL_RESOURCE_CODE(CLCTL_GET_REQUIRED_DEPENDENCIES),
    480     CLUSCTL_RESOURCE_GET_NAME = CLUSCTL_RESOURCE_CODE(CLCTL_GET_NAME),
    481     CLUSCTL_RESOURCE_GET_ID = CLUSCTL_RESOURCE_CODE(CLCTL_GET_ID),
    482     CLUSCTL_RESOURCE_GET_RESOURCE_TYPE = CLUSCTL_RESOURCE_CODE(CLCTL_GET_RESOURCE_TYPE),
    483     CLUSCTL_RESOURCE_ENUM_COMMON_PROPERTIES = CLUSCTL_RESOURCE_CODE(CLCTL_ENUM_COMMON_PROPERTIES),
    484     CLUSCTL_RESOURCE_GET_RO_COMMON_PROPERTIES = CLUSCTL_RESOURCE_CODE(CLCTL_GET_RO_COMMON_PROPERTIES),
    485     CLUSCTL_RESOURCE_GET_COMMON_PROPERTIES = CLUSCTL_RESOURCE_CODE(CLCTL_GET_COMMON_PROPERTIES),
    486     CLUSCTL_RESOURCE_SET_COMMON_PROPERTIES = CLUSCTL_RESOURCE_CODE(CLCTL_SET_COMMON_PROPERTIES),
    487     CLUSCTL_RESOURCE_VALIDATE_COMMON_PROPERTIES = CLUSCTL_RESOURCE_CODE(CLCTL_VALIDATE_COMMON_PROPERTIES),
    488     CLUSCTL_RESOURCE_GET_COMMON_PROPERTY_FMTS = CLUSCTL_RESOURCE_CODE(CLCTL_GET_COMMON_PROPERTY_FMTS),
    489     CLUSCTL_RESOURCE_ENUM_PRIVATE_PROPERTIES = CLUSCTL_RESOURCE_CODE(CLCTL_ENUM_PRIVATE_PROPERTIES),
    490     CLUSCTL_RESOURCE_GET_RO_PRIVATE_PROPERTIES = CLUSCTL_RESOURCE_CODE(CLCTL_GET_RO_PRIVATE_PROPERTIES),
    491     CLUSCTL_RESOURCE_GET_PRIVATE_PROPERTIES = CLUSCTL_RESOURCE_CODE(CLCTL_GET_PRIVATE_PROPERTIES),
    492     CLUSCTL_RESOURCE_SET_PRIVATE_PROPERTIES = CLUSCTL_RESOURCE_CODE(CLCTL_SET_PRIVATE_PROPERTIES),
    493     CLUSCTL_RESOURCE_VALIDATE_PRIVATE_PROPERTIES = CLUSCTL_RESOURCE_CODE(CLCTL_VALIDATE_PRIVATE_PROPERTIES),
    494     CLUSCTL_RESOURCE_GET_PRIVATE_PROPERTY_FMTS = CLUSCTL_RESOURCE_CODE(CLCTL_GET_PRIVATE_PROPERTY_FMTS),
    495     CLUSCTL_RESOURCE_ADD_REGISTRY_CHECKPOINT = CLUSCTL_RESOURCE_CODE(CLCTL_ADD_REGISTRY_CHECKPOINT),
    496     CLUSCTL_RESOURCE_DELETE_REGISTRY_CHECKPOINT = CLUSCTL_RESOURCE_CODE(CLCTL_DELETE_REGISTRY_CHECKPOINT),
    497     CLUSCTL_RESOURCE_GET_REGISTRY_CHECKPOINTS = CLUSCTL_RESOURCE_CODE(CLCTL_GET_REGISTRY_CHECKPOINTS),
    498     CLUSCTL_RESOURCE_ADD_CRYPTO_CHECKPOINT = CLUSCTL_RESOURCE_CODE(CLCTL_ADD_CRYPTO_CHECKPOINT),
    499     CLUSCTL_RESOURCE_DELETE_CRYPTO_CHECKPOINT = CLUSCTL_RESOURCE_CODE(CLCTL_DELETE_CRYPTO_CHECKPOINT),
    500     CLUSCTL_RESOURCE_GET_CRYPTO_CHECKPOINTS = CLUSCTL_RESOURCE_CODE(CLCTL_GET_CRYPTO_CHECKPOINTS),
    501     CLUSCTL_RESOURCE_GET_LOADBAL_PROCESS_LIST = CLUSCTL_RESOURCE_CODE(CLCTL_GET_LOADBAL_PROCESS_LIST),
    502     CLUSCTL_RESOURCE_GET_NETWORK_NAME = CLUSCTL_RESOURCE_CODE(CLCTL_GET_NETWORK_NAME),
    503     CLUSCTL_RESOURCE_NETNAME_GET_VIRTUAL_SERVER_TOKEN = CLUSCTL_RESOURCE_CODE(CLCTL_NETNAME_GET_VIRTUAL_SERVER_TOKEN),
    504     CLUSCTL_RESOURCE_NETNAME_REGISTER_DNS_RECORDS = CLUSCTL_RESOURCE_CODE(CLCTL_NETNAME_REGISTER_DNS_RECORDS),
    505     CLUSCTL_RESOURCE_STORAGE_GET_DISK_INFO = CLUSCTL_RESOURCE_CODE(CLCTL_STORAGE_GET_DISK_INFO),
    506     CLUSCTL_RESOURCE_STORAGE_IS_PATH_VALID = CLUSCTL_RESOURCE_CODE(CLCTL_STORAGE_IS_PATH_VALID),
    507     CLUSCTL_RESOURCE_QUERY_DELETE = CLUSCTL_RESOURCE_CODE(CLCTL_QUERY_DELETE),
    508     CLUSCTL_RESOURCE_UPGRADE_DLL = CLUSCTL_RESOURCE_CODE(CLCTL_RESOURCE_UPGRADE_DLL),
    509     CLUSCTL_RESOURCE_ADD_REGISTRY_CHECKPOINT_64BIT = CLUSCTL_RESOURCE_CODE(CLCTL_ADD_REGISTRY_CHECKPOINT_64BIT),
    510     CLUSCTL_RESOURCE_ADD_REGISTRY_CHECKPOINT_32BIT = CLUSCTL_RESOURCE_CODE(CLCTL_ADD_REGISTRY_CHECKPOINT_32BIT),
    511     CLUSCTL_RESOURCE_QUERY_MAINTENANCE_MODE = CLUSCTL_RESOURCE_CODE(CLCTL_QUERY_MAINTENANCE_MODE),
    512     CLUSCTL_RESOURCE_SET_MAINTENANCE_MODE = CLUSCTL_RESOURCE_CODE(CLCTL_SET_MAINTENANCE_MODE),
    513     CLUSCTL_RESOURCE_STORAGE_SET_DRIVELETTER            = CLUSCTL_RESOURCE_CODE(CLCTL_STORAGE_SET_DRIVELETTER),/*0x014001ea*/
    514     CLUSCTL_RESOURCE_STORAGE_GET_DISK_INFO_EX           = CLUSCTL_RESOURCE_CODE(CLCTL_STORAGE_GET_DISK_INFO_EX),/*0x010001f1*/
    515     CLUSCTL_RESOURCE_FILESERVER_SHARE_ADD               = CLUSCTL_RESOURCE_CODE(CLCTL_FILESERVER_SHARE_ADD),/*0x01400245*/
    516     CLUSCTL_RESOURCE_FILESERVER_SHARE_DEL               = CLUSCTL_RESOURCE_CODE(CLCTL_FILESERVER_SHARE_DEL),/*0x01400249*/
    517     CLUSCTL_RESOURCE_FILESERVER_SHARE_MODIFY            = CLUSCTL_RESOURCE_CODE(CLCTL_FILESERVER_SHARE_MODIFY),/*0x0140024d*/
    518     CLUSCTL_RESOURCE_FILESERVER_SHARE_REPORT            = CLUSCTL_RESOURCE_CODE(CLCTL_FILESERVER_SHARE_REPORT),/*0x01000251*/
    519     CLUSCTL_RESOURCE_STORAGE_GET_MOUNTPOINTS            = CLUSCTL_RESOURCE_CODE(CLCTL_STORAGE_GET_MOUNTPOINTS),/*0x01000211*/
    520     CLUSCTL_RESOURCE_STORAGE_CLUSTER_DISK               = CLUSCTL_RESOURCE_CODE(CLCTL_STORAGE_CLUSTER_DISK),/*0x01c00212*/
    521     CLUSCTL_RESOURCE_STORAGE_GET_DIRTY                  = CLUSCTL_RESOURCE_CODE(CLCTL_STORAGE_GET_DIRTY),/*0x01000219*/
    522     CLUSCTL_RESOURCE_STORAGE_GET_SHARED_VOLUME_INFO     = CLUSCTL_RESOURCE_CODE(CLCTL_STORAGE_GET_SHARED_VOLUME_INFO),
    523     CLUSCTL_RESOURCE_SET_CSV_MAINTENANCE_MODE           = CLUSCTL_RESOURCE_CODE(CLCTL_SET_CSV_MAINTENANCE_MODE),/*0x00400296*/
    524     CLUSCTL_RESOURCE_ENABLE_SHARED_VOLUME_DIRECTIO      = CLUSCTL_RESOURCE_CODE(CLCTL_ENABLE_SHARED_VOLUME_DIRECTIO),/*0x0140028a*/
    525     CLUSCTL_RESOURCE_DISABLE_SHARED_VOLUME_DIRECTIO     = CLUSCTL_RESOURCE_CODE(CLCTL_DISABLE_SHARED_VOLUME_DIRECTIO),/*0x0140028e*/
    526     CLUSCTL_RESOURCE_SET_SHARED_VOLUME_BACKUP_MODE      = CLUSCTL_RESOURCE_CODE(CLCTL_SET_SHARED_VOLUME_BACKUP_MODE),/*0x0140029a*/
    527     CLUSCTL_RESOURCE_DELETE = CLUSCTL_RESOURCE_CODE(CLCTL_DELETE),
    528     CLUSCTL_RESOURCE_INSTALL_NODE = CLUSCTL_RESOURCE_CODE(CLCTL_INSTALL_NODE),
    529     CLUSCTL_RESOURCE_EVICT_NODE = CLUSCTL_RESOURCE_CODE(CLCTL_EVICT_NODE),
    530     CLUSCTL_RESOURCE_ADD_DEPENDENCY = CLUSCTL_RESOURCE_CODE(CLCTL_ADD_DEPENDENCY),
    531     CLUSCTL_RESOURCE_REMOVE_DEPENDENCY = CLUSCTL_RESOURCE_CODE(CLCTL_REMOVE_DEPENDENCY),
    532     CLUSCTL_RESOURCE_ADD_OWNER = CLUSCTL_RESOURCE_CODE(CLCTL_ADD_OWNER),
    533     CLUSCTL_RESOURCE_REMOVE_OWNER = CLUSCTL_RESOURCE_CODE(CLCTL_REMOVE_OWNER),
    534     CLUSCTL_RESOURCE_SET_NAME = CLUSCTL_RESOURCE_CODE(CLCTL_SET_NAME),
    535     CLUSCTL_RESOURCE_CLUSTER_NAME_CHANGED = CLUSCTL_RESOURCE_CODE(CLCTL_CLUSTER_NAME_CHANGED),
    536     CLUSCTL_RESOURCE_CLUSTER_VERSION_CHANGED = CLUSCTL_RESOURCE_CODE(CLCTL_CLUSTER_VERSION_CHANGED),
    537     CLUSCTL_RESOURCE_FORCE_QUORUM = CLUSCTL_RESOURCE_CODE(CLCTL_FORCE_QUORUM),
    538     CLUSCTL_RESOURCE_INITIALIZE = CLUSCTL_RESOURCE_CODE(CLCTL_INITIALIZE),
    539     CLUSCTL_RESOURCE_STATE_CHANGE_REASON = CLUSCTL_RESOURCE_CODE(CLCTL_STATE_CHANGE_REASON),
    540     CLUSCTL_RESOURCE_PROVIDER_STATE_CHANGE = CLUSCTL_RESOURCE_CODE(CLCTL_PROVIDER_STATE_CHANGE),/*0x01500052*/
    541     CLUSCTL_RESOURCE_LEAVING_GROUP = CLUSCTL_RESOURCE_CODE(CLCTL_LEAVING_GROUP),/*0x01500056*/
    542     CLUSCTL_RESOURCE_JOINING_GROUP = CLUSCTL_RESOURCE_CODE(CLCTL_JOINING_GROUP),/*0x0150005a*/
    543     CLUSCTL_RESOURCE_FSWITNESS_GET_EPOCH_INFO = CLUSCTL_RESOURCE_CODE(CLCTL_FSWITNESS_GET_EPOCH_INFO),/*0x0110005d*/
    544     CLUSCTL_RESOURCE_FSWITNESS_SET_EPOCH_INFO = CLUSCTL_RESOURCE_CODE(CLCTL_FSWITNESS_SET_EPOCH_INFO),/*0x01500062*/
    545     CLUSCTL_RESOURCE_FSWITNESS_RELEASE_LOCK = CLUSCTL_RESOURCE_CODE(CLCTL_FSWITNESS_RELEASE_LOCK),/*0x01500066*/
    546     CLUSCTL_RESOURCE_NETNAME_CREDS_UPDATED = CLUSCTL_RESOURCE_CODE(CLCTL_NETNAME_CREDS_UPDATED)/*0x01c0018a */
    547   } CLUSCTL_RESOURCE_CODES;
    548 
    549   typedef enum CLUSCTL_RESOURCE_TYPE_CODES {
    550     CLUSCTL_RESOURCE_TYPE_UNKNOWN = CLUSCTL_RESOURCE_TYPE_CODE(CLCTL_UNKNOWN),
    551     CLUSCTL_RESOURCE_TYPE_GET_CHARACTERISTICS = CLUSCTL_RESOURCE_TYPE_CODE(CLCTL_GET_CHARACTERISTICS),
    552     CLUSCTL_RESOURCE_TYPE_GET_FLAGS = CLUSCTL_RESOURCE_TYPE_CODE(CLCTL_GET_FLAGS),
    553     CLUSCTL_RESOURCE_TYPE_GET_CLASS_INFO = CLUSCTL_RESOURCE_TYPE_CODE(CLCTL_GET_CLASS_INFO),
    554     CLUSCTL_RESOURCE_TYPE_GET_REQUIRED_DEPENDENCIES = CLUSCTL_RESOURCE_TYPE_CODE(CLCTL_GET_REQUIRED_DEPENDENCIES),
    555     CLUSCTL_RESOURCE_TYPE_GET_ARB_TIMEOUT = CLUSCTL_RESOURCE_TYPE_CODE(CLCTL_GET_ARB_TIMEOUT),
    556     CLUSCTL_RESOURCE_TYPE_ENUM_COMMON_PROPERTIES = CLUSCTL_RESOURCE_TYPE_CODE(CLCTL_ENUM_COMMON_PROPERTIES),
    557     CLUSCTL_RESOURCE_TYPE_GET_RO_COMMON_PROPERTIES = CLUSCTL_RESOURCE_TYPE_CODE(CLCTL_GET_RO_COMMON_PROPERTIES),
    558     CLUSCTL_RESOURCE_TYPE_GET_COMMON_PROPERTIES = CLUSCTL_RESOURCE_TYPE_CODE(CLCTL_GET_COMMON_PROPERTIES),
    559     CLUSCTL_RESOURCE_TYPE_VALIDATE_COMMON_PROPERTIES = CLUSCTL_RESOURCE_TYPE_CODE(CLCTL_VALIDATE_COMMON_PROPERTIES),
    560     CLUSCTL_RESOURCE_TYPE_SET_COMMON_PROPERTIES = CLUSCTL_RESOURCE_TYPE_CODE(CLCTL_SET_COMMON_PROPERTIES),
    561     CLUSCTL_RESOURCE_TYPE_GET_COMMON_PROPERTY_FMTS = CLUSCTL_RESOURCE_TYPE_CODE(CLCTL_GET_COMMON_PROPERTY_FMTS),
    562     CLUSCTL_RESOURCE_TYPE_GET_COMMON_RESOURCE_PROPERTY_FMTS = CLUSCTL_RESOURCE_TYPE_CODE(CLCTL_GET_COMMON_RESOURCE_PROPERTY_FMTS),
    563     CLUSCTL_RESOURCE_TYPE_ENUM_PRIVATE_PROPERTIES = CLUSCTL_RESOURCE_TYPE_CODE(CLCTL_ENUM_PRIVATE_PROPERTIES),
    564     CLUSCTL_RESOURCE_TYPE_GET_RO_PRIVATE_PROPERTIES = CLUSCTL_RESOURCE_TYPE_CODE(CLCTL_GET_RO_PRIVATE_PROPERTIES),
    565     CLUSCTL_RESOURCE_TYPE_GET_PRIVATE_PROPERTIES = CLUSCTL_RESOURCE_TYPE_CODE(CLCTL_GET_PRIVATE_PROPERTIES),
    566     CLUSCTL_RESOURCE_TYPE_SET_PRIVATE_PROPERTIES = CLUSCTL_RESOURCE_TYPE_CODE(CLCTL_SET_PRIVATE_PROPERTIES),
    567     CLUSCTL_RESOURCE_TYPE_VALIDATE_PRIVATE_PROPERTIES = CLUSCTL_RESOURCE_TYPE_CODE(CLCTL_VALIDATE_PRIVATE_PROPERTIES),
    568     CLUSCTL_RESOURCE_TYPE_GET_PRIVATE_PROPERTY_FMTS = CLUSCTL_RESOURCE_TYPE_CODE(CLCTL_GET_PRIVATE_PROPERTY_FMTS),
    569     CLUSCTL_RESOURCE_TYPE_GET_PRIVATE_RESOURCE_PROPERTY_FMTS = CLUSCTL_RESOURCE_TYPE_CODE(CLCTL_GET_PRIVATE_RESOURCE_PROPERTY_FMTS),
    570     CLUSCTL_RESOURCE_TYPE_GET_REGISTRY_CHECKPOINTS = CLUSCTL_RESOURCE_TYPE_CODE(CLCTL_GET_REGISTRY_CHECKPOINTS),
    571     CLUSCTL_RESOURCE_TYPE_GET_CRYPTO_CHECKPOINTS = CLUSCTL_RESOURCE_TYPE_CODE(CLCTL_GET_CRYPTO_CHECKPOINTS),
    572     CLUSCTL_RESOURCE_TYPE_STORAGE_GET_AVAILABLE_DISKS = CLUSCTL_RESOURCE_TYPE_CODE(CLCTL_STORAGE_GET_AVAILABLE_DISKS),
    573     CLUSCTL_RESOURCE_TYPE_QUERY_DELETE = CLUSCTL_RESOURCE_TYPE_CODE(CLCTL_QUERY_DELETE),
    574     CLUSCTL_RESOURCE_TYPE_INSTALL_NODE = CLUSCTL_RESOURCE_TYPE_CODE(CLCTL_INSTALL_NODE),
    575     CLUSCTL_RESOURCE_TYPE_EVICT_NODE = CLUSCTL_RESOURCE_TYPE_CODE(CLCTL_EVICT_NODE),
    576     CLUSCTL_RESOURCE_TYPE_CLUSTER_VERSION_CHANGED = CLUSCTL_RESOURCE_TYPE_CODE(CLCTL_CLUSTER_VERSION_CHANGED),
    577     CLUSCTL_RESOURCE_TYPE_FIXUP_ON_UPGRADE = CLUSCTL_RESOURCE_TYPE_CODE(CLCTL_FIXUP_ON_UPGRADE),
    578     CLUSCTL_RESOURCE_TYPE_STARTING_PHASE1 = CLUSCTL_RESOURCE_TYPE_CODE(CLCTL_STARTING_PHASE1),
    579     CLUSCTL_RESOURCE_TYPE_STARTING_PHASE2 = CLUSCTL_RESOURCE_TYPE_CODE(CLCTL_STARTING_PHASE2),
    580     CLUSCTL_RESOURCE_TYPE_HOLD_IO = CLUSCTL_RESOURCE_TYPE_CODE(CLCTL_HOLD_IO),
    581     CLUSCTL_RESOURCE_TYPE_RESUME_IO = CLUSCTL_RESOURCE_TYPE_CODE(CLCTL_RESUME_IO)
    582   } CLUSCTL_RESOURCE_TYPE_CODES;
    583 
    584   typedef enum CLUSPROP_IPADDR_ENABLENETBIOS {
    585     CLUSPROP_IPADDR_ENABLENETBIOS_DISABLED    = 0,  // 0x0
    586     CLUSPROP_IPADDR_ENABLENETBIOS_ENABLED,
    587     CLUSPROP_IPADDR_ENABLENETBIOS_TRACK_NIC
    588   } CLUSPROP_IPADDR_ENABLENETBIOS;
    589 
    590   typedef enum CLUSCTL_GROUP_CODES {
    591     CLUSCTL_GROUP_UNKNOWN = CLUSCTL_GROUP_CODE(CLCTL_UNKNOWN),
    592     CLUSCTL_GROUP_GET_CHARACTERISTICS = CLUSCTL_GROUP_CODE(CLCTL_GET_CHARACTERISTICS),
    593     CLUSCTL_GROUP_GET_FLAGS = CLUSCTL_GROUP_CODE(CLCTL_GET_FLAGS),
    594     CLUSCTL_GROUP_GET_NAME = CLUSCTL_GROUP_CODE(CLCTL_GET_NAME),
    595     CLUSCTL_GROUP_GET_ID = CLUSCTL_GROUP_CODE(CLCTL_GET_ID),
    596     CLUSCTL_GROUP_ENUM_COMMON_PROPERTIES = CLUSCTL_GROUP_CODE(CLCTL_ENUM_COMMON_PROPERTIES),
    597     CLUSCTL_GROUP_GET_RO_COMMON_PROPERTIES = CLUSCTL_GROUP_CODE(CLCTL_GET_RO_COMMON_PROPERTIES),
    598     CLUSCTL_GROUP_GET_COMMON_PROPERTIES = CLUSCTL_GROUP_CODE(CLCTL_GET_COMMON_PROPERTIES),
    599     CLUSCTL_GROUP_SET_COMMON_PROPERTIES = CLUSCTL_GROUP_CODE(CLCTL_SET_COMMON_PROPERTIES),
    600     CLUSCTL_GROUP_VALIDATE_COMMON_PROPERTIES = CLUSCTL_GROUP_CODE(CLCTL_VALIDATE_COMMON_PROPERTIES),
    601     CLUSCTL_GROUP_ENUM_PRIVATE_PROPERTIES = CLUSCTL_GROUP_CODE(CLCTL_ENUM_PRIVATE_PROPERTIES),
    602     CLUSCTL_GROUP_GET_RO_PRIVATE_PROPERTIES = CLUSCTL_GROUP_CODE(CLCTL_GET_RO_PRIVATE_PROPERTIES),
    603     CLUSCTL_GROUP_GET_PRIVATE_PROPERTIES = CLUSCTL_GROUP_CODE(CLCTL_GET_PRIVATE_PROPERTIES),
    604     CLUSCTL_GROUP_SET_PRIVATE_PROPERTIES = CLUSCTL_GROUP_CODE(CLCTL_SET_PRIVATE_PROPERTIES),
    605     CLUSCTL_GROUP_VALIDATE_PRIVATE_PROPERTIES = CLUSCTL_GROUP_CODE(CLCTL_VALIDATE_PRIVATE_PROPERTIES),
    606     CLUSCTL_GROUP_QUERY_DELETE = CLUSCTL_GROUP_CODE(CLCTL_QUERY_DELETE),
    607     CLUSCTL_GROUP_GET_COMMON_PROPERTY_FMTS = CLUSCTL_GROUP_CODE(CLCTL_GET_COMMON_PROPERTY_FMTS),
    608     CLUSCTL_GROUP_GET_PRIVATE_PROPERTY_FMTS = CLUSCTL_GROUP_CODE(CLCTL_GET_PRIVATE_PROPERTY_FMTS)
    609   } CLUSCTL_GROUP_CODES;
    610 
    611   typedef enum CLUSCTL_NODE_CODES {
    612     CLUSCTL_NODE_UNKNOWN = CLUSCTL_NODE_CODE(CLCTL_UNKNOWN),
    613     CLUSCTL_NODE_GET_CHARACTERISTICS = CLUSCTL_NODE_CODE(CLCTL_GET_CHARACTERISTICS),
    614     CLUSCTL_NODE_GET_FLAGS = CLUSCTL_NODE_CODE(CLCTL_GET_FLAGS),
    615     CLUSCTL_NODE_GET_NAME = CLUSCTL_NODE_CODE(CLCTL_GET_NAME),
    616     CLUSCTL_NODE_GET_ID = CLUSCTL_NODE_CODE(CLCTL_GET_ID),
    617     CLUSCTL_NODE_ENUM_COMMON_PROPERTIES = CLUSCTL_NODE_CODE(CLCTL_ENUM_COMMON_PROPERTIES),
    618     CLUSCTL_NODE_GET_RO_COMMON_PROPERTIES = CLUSCTL_NODE_CODE(CLCTL_GET_RO_COMMON_PROPERTIES),
    619     CLUSCTL_NODE_GET_COMMON_PROPERTIES = CLUSCTL_NODE_CODE(CLCTL_GET_COMMON_PROPERTIES),
    620     CLUSCTL_NODE_SET_COMMON_PROPERTIES = CLUSCTL_NODE_CODE(CLCTL_SET_COMMON_PROPERTIES),
    621     CLUSCTL_NODE_VALIDATE_COMMON_PROPERTIES = CLUSCTL_NODE_CODE(CLCTL_VALIDATE_COMMON_PROPERTIES),
    622     CLUSCTL_NODE_ENUM_PRIVATE_PROPERTIES = CLUSCTL_NODE_CODE(CLCTL_ENUM_PRIVATE_PROPERTIES),
    623     CLUSCTL_NODE_GET_RO_PRIVATE_PROPERTIES = CLUSCTL_NODE_CODE(CLCTL_GET_RO_PRIVATE_PROPERTIES),
    624     CLUSCTL_NODE_GET_PRIVATE_PROPERTIES = CLUSCTL_NODE_CODE(CLCTL_GET_PRIVATE_PROPERTIES),
    625     CLUSCTL_NODE_SET_PRIVATE_PROPERTIES = CLUSCTL_NODE_CODE(CLCTL_SET_PRIVATE_PROPERTIES),
    626     CLUSCTL_NODE_VALIDATE_PRIVATE_PROPERTIES = CLUSCTL_NODE_CODE(CLCTL_VALIDATE_PRIVATE_PROPERTIES),
    627     CLUSCTL_NODE_GET_COMMON_PROPERTY_FMTS = CLUSCTL_NODE_CODE(CLCTL_GET_COMMON_PROPERTY_FMTS),
    628     CLUSCTL_NODE_GET_PRIVATE_PROPERTY_FMTS = CLUSCTL_NODE_CODE(CLCTL_GET_PRIVATE_PROPERTY_FMTS),
    629     CLUSCTL_NODE_GET_CLUSTER_SERVICE_ACCOUNT_NAME = CLUSCTL_NODE_CODE(CLCTL_GET_CLUSTER_SERVICE_ACCOUNT_NAME)
    630   } CLUSCTL_NODE_CODES;
    631 
    632   typedef enum CLUSCTL_NETWORK_CODES {
    633     CLUSCTL_NETWORK_UNKNOWN = CLUSCTL_NETWORK_CODE(CLCTL_UNKNOWN),
    634     CLUSCTL_NETWORK_GET_CHARACTERISTICS = CLUSCTL_NETWORK_CODE(CLCTL_GET_CHARACTERISTICS),
    635     CLUSCTL_NETWORK_GET_FLAGS = CLUSCTL_NETWORK_CODE(CLCTL_GET_FLAGS),
    636     CLUSCTL_NETWORK_GET_NAME = CLUSCTL_NETWORK_CODE(CLCTL_GET_NAME),
    637     CLUSCTL_NETWORK_GET_ID = CLUSCTL_NETWORK_CODE(CLCTL_GET_ID),
    638     CLUSCTL_NETWORK_ENUM_COMMON_PROPERTIES = CLUSCTL_NETWORK_CODE(CLCTL_ENUM_COMMON_PROPERTIES),
    639     CLUSCTL_NETWORK_GET_RO_COMMON_PROPERTIES = CLUSCTL_NETWORK_CODE(CLCTL_GET_RO_COMMON_PROPERTIES),
    640     CLUSCTL_NETWORK_GET_COMMON_PROPERTIES = CLUSCTL_NETWORK_CODE(CLCTL_GET_COMMON_PROPERTIES),
    641     CLUSCTL_NETWORK_SET_COMMON_PROPERTIES = CLUSCTL_NETWORK_CODE(CLCTL_SET_COMMON_PROPERTIES),
    642     CLUSCTL_NETWORK_VALIDATE_COMMON_PROPERTIES = CLUSCTL_NETWORK_CODE(CLCTL_VALIDATE_COMMON_PROPERTIES),
    643     CLUSCTL_NETWORK_ENUM_PRIVATE_PROPERTIES = CLUSCTL_NETWORK_CODE(CLCTL_ENUM_PRIVATE_PROPERTIES),
    644     CLUSCTL_NETWORK_GET_RO_PRIVATE_PROPERTIES = CLUSCTL_NETWORK_CODE(CLCTL_GET_RO_PRIVATE_PROPERTIES),
    645     CLUSCTL_NETWORK_GET_PRIVATE_PROPERTIES = CLUSCTL_NETWORK_CODE(CLCTL_GET_PRIVATE_PROPERTIES),
    646     CLUSCTL_NETWORK_SET_PRIVATE_PROPERTIES = CLUSCTL_NETWORK_CODE(CLCTL_SET_PRIVATE_PROPERTIES),
    647     CLUSCTL_NETWORK_VALIDATE_PRIVATE_PROPERTIES = CLUSCTL_NETWORK_CODE(CLCTL_VALIDATE_PRIVATE_PROPERTIES),
    648     CLUSCTL_NETWORK_GET_COMMON_PROPERTY_FMTS = CLUSCTL_NETWORK_CODE(CLCTL_GET_COMMON_PROPERTY_FMTS),
    649     CLUSCTL_NETWORK_GET_PRIVATE_PROPERTY_FMTS = CLUSCTL_NETWORK_CODE(CLCTL_GET_PRIVATE_PROPERTY_FMTS)
    650   } CLUSCTL_NETWORK_CODES;
    651 
    652   typedef enum CLUSCTL_NETINTERFACE_CODES {
    653     CLUSCTL_NETINTERFACE_UNKNOWN = CLUSCTL_NETINTERFACE_CODE(CLCTL_UNKNOWN),
    654     CLUSCTL_NETINTERFACE_GET_CHARACTERISTICS = CLUSCTL_NETINTERFACE_CODE(CLCTL_GET_CHARACTERISTICS),
    655     CLUSCTL_NETINTERFACE_GET_FLAGS = CLUSCTL_NETINTERFACE_CODE(CLCTL_GET_FLAGS),
    656     CLUSCTL_NETINTERFACE_GET_NAME = CLUSCTL_NETINTERFACE_CODE(CLCTL_GET_NAME),
    657     CLUSCTL_NETINTERFACE_GET_ID = CLUSCTL_NETINTERFACE_CODE(CLCTL_GET_ID),
    658     CLUSCTL_NETINTERFACE_GET_NODE = CLUSCTL_NETINTERFACE_CODE(CLCTL_GET_NODE),
    659     CLUSCTL_NETINTERFACE_GET_NETWORK = CLUSCTL_NETINTERFACE_CODE(CLCTL_GET_NETWORK),
    660     CLUSCTL_NETINTERFACE_ENUM_COMMON_PROPERTIES = CLUSCTL_NETINTERFACE_CODE(CLCTL_ENUM_COMMON_PROPERTIES),
    661     CLUSCTL_NETINTERFACE_GET_RO_COMMON_PROPERTIES = CLUSCTL_NETINTERFACE_CODE(CLCTL_GET_RO_COMMON_PROPERTIES),
    662     CLUSCTL_NETINTERFACE_GET_COMMON_PROPERTIES = CLUSCTL_NETINTERFACE_CODE(CLCTL_GET_COMMON_PROPERTIES),
    663     CLUSCTL_NETINTERFACE_SET_COMMON_PROPERTIES = CLUSCTL_NETINTERFACE_CODE(CLCTL_SET_COMMON_PROPERTIES),
    664     CLUSCTL_NETINTERFACE_VALIDATE_COMMON_PROPERTIES = CLUSCTL_NETINTERFACE_CODE(CLCTL_VALIDATE_COMMON_PROPERTIES),
    665     CLUSCTL_NETINTERFACE_ENUM_PRIVATE_PROPERTIES = CLUSCTL_NETINTERFACE_CODE(CLCTL_ENUM_PRIVATE_PROPERTIES),
    666     CLUSCTL_NETINTERFACE_GET_RO_PRIVATE_PROPERTIES = CLUSCTL_NETINTERFACE_CODE(CLCTL_GET_RO_PRIVATE_PROPERTIES),
    667     CLUSCTL_NETINTERFACE_GET_PRIVATE_PROPERTIES = CLUSCTL_NETINTERFACE_CODE(CLCTL_GET_PRIVATE_PROPERTIES),
    668     CLUSCTL_NETINTERFACE_SET_PRIVATE_PROPERTIES = CLUSCTL_NETINTERFACE_CODE(CLCTL_SET_PRIVATE_PROPERTIES),
    669     CLUSCTL_NETINTERFACE_VALIDATE_PRIVATE_PROPERTIES = CLUSCTL_NETINTERFACE_CODE(CLCTL_VALIDATE_PRIVATE_PROPERTIES),
    670     CLUSCTL_NETINTERFACE_GET_COMMON_PROPERTY_FMTS = CLUSCTL_NETINTERFACE_CODE(CLCTL_GET_COMMON_PROPERTY_FMTS),
    671     CLUSCTL_NETINTERFACE_GET_PRIVATE_PROPERTY_FMTS = CLUSCTL_NETINTERFACE_CODE(CLCTL_GET_PRIVATE_PROPERTY_FMTS)
    672   } CLUSCTL_NETINTERFACE_CODES;
    673 
    674   typedef enum CLUSCTL_CLUSTER_CODES {
    675     CLUSCTL_CLUSTER_UNKNOWN = CLUSCTL_CLUSTER_CODE(CLCTL_UNKNOWN),
    676     CLUSCTL_CLUSTER_GET_FQDN = CLUSCTL_CLUSTER_CODE(CLCTL_GET_FQDN),
    677     CLUSCTL_CLUSTER_ENUM_COMMON_PROPERTIES = CLUSCTL_CLUSTER_CODE(CLCTL_ENUM_COMMON_PROPERTIES),
    678     CLUSCTL_CLUSTER_GET_RO_COMMON_PROPERTIES = CLUSCTL_CLUSTER_CODE(CLCTL_GET_RO_COMMON_PROPERTIES),
    679     CLUSCTL_CLUSTER_GET_COMMON_PROPERTIES = CLUSCTL_CLUSTER_CODE(CLCTL_GET_COMMON_PROPERTIES),
    680     CLUSCTL_CLUSTER_SET_COMMON_PROPERTIES = CLUSCTL_CLUSTER_CODE(CLCTL_SET_COMMON_PROPERTIES),
    681     CLUSCTL_CLUSTER_VALIDATE_COMMON_PROPERTIES = CLUSCTL_CLUSTER_CODE(CLCTL_VALIDATE_COMMON_PROPERTIES),
    682     CLUSCTL_CLUSTER_ENUM_PRIVATE_PROPERTIES = CLUSCTL_CLUSTER_CODE(CLCTL_ENUM_PRIVATE_PROPERTIES),
    683     CLUSCTL_CLUSTER_GET_RO_PRIVATE_PROPERTIES = CLUSCTL_CLUSTER_CODE(CLCTL_GET_RO_PRIVATE_PROPERTIES),
    684     CLUSCTL_CLUSTER_GET_PRIVATE_PROPERTIES = CLUSCTL_CLUSTER_CODE(CLCTL_GET_PRIVATE_PROPERTIES),
    685     CLUSCTL_CLUSTER_SET_PRIVATE_PROPERTIES = CLUSCTL_CLUSTER_CODE(CLCTL_SET_PRIVATE_PROPERTIES),
    686     CLUSCTL_CLUSTER_VALIDATE_PRIVATE_PROPERTIES = CLUSCTL_CLUSTER_CODE(CLCTL_VALIDATE_PRIVATE_PROPERTIES),
    687     CLUSCTL_CLUSTER_GET_COMMON_PROPERTY_FMTS = CLUSCTL_CLUSTER_CODE(CLCTL_GET_COMMON_PROPERTY_FMTS),
    688     CLUSCTL_CLUSTER_GET_PRIVATE_PROPERTY_FMTS = CLUSCTL_CLUSTER_CODE(CLCTL_GET_PRIVATE_PROPERTY_FMTS),
    689     CLUSCTL_CLUSTER_CHECK_VOTER_EVICT             = CLUSCTL_CLUSTER_CODE(CLCTL_CHECK_VOTER_EVICT),/*0x07000045*/
    690     CLUSCTL_CLUSTER_CHECK_VOTER_DOWN              = CLUSCTL_CLUSTER_CODE(CLCTL_CHECK_VOTER_DOWN),/*0x07000049*/
    691     CLUSCTL_CLUSTER_SHUTDOWN                      = CLUSCTL_CLUSTER_CODE(CLCTL_SHUTDOWN),/*0x0700004d*/
    692     CLUSCTL_CLUSTER_BATCH_BLOCK_KEY               = CLUSCTL_CLUSTER_CODE(CLCTL_BATCH_BLOCK_KEY),/*0x0700023e*/
    693     CLUSCTL_CLUSTER_BATCH_UNBLOCK_KEY             = CLUSCTL_CLUSTER_CODE(CLCTL_BATCH_UNBLOCK_KEY),/*0x07000241*/
    694     CLUSCTL_CLUSTER_GET_SHARED_VOLUME_ID          = CLUSCTL_CLUSTER_CODE(CLCTL_GET_SHARED_VOLUME_ID),/*0x07000291*/
    695   } CLUSCTL_CLUSTER_CODES;
    696 
    697   typedef enum CLUSTER_RESOURCE_CLASS {
    698     CLUS_RESCLASS_UNKNOWN = 0,CLUS_RESCLASS_STORAGE,CLUS_RESCLASS_USER = 32768
    699   } CLUSTER_RESOURCE_CLASS;
    700 
    701   typedef enum CLUS_RESSUBCLASS {
    702     CLUS_RESSUBCLASS_SHARED = 0x80000000
    703   } CLUS_RESSUBCLASS;
    704 
    705   typedef enum CLUS_CHARACTERISTICS {
    706     CLUS_CHAR_UNKNOWN = 0x00000000,CLUS_CHAR_QUORUM = 0x00000001,CLUS_CHAR_DELETE_REQUIRES_ALL_NODES = 0x00000002,CLUS_CHAR_LOCAL_QUORUM = 0x00000004,
    707     CLUS_CHAR_LOCAL_QUORUM_DEBUG = 0x00000008,CLUS_CHAR_REQUIRES_STATE_CHANGE_REASON = 0x00000010,
    708     CLUS_CHAR_BROADCAST_DELETE               = 0x00000020,
    709     CLUS_CHAR_SINGLE_CLUSTER_INSTANCE        = 0x00000040,
    710     CLUS_CHAR_SINGLE_GROUP_INSTANCE          = 0x00000080
    711   } CLUS_CHARACTERISTICS;
    712 
    713   typedef enum CLUS_FLAGS {
    714     CLUS_FLAG_CORE = 0x00000001
    715   } CLUS_FLAGS;
    716 
    717   typedef enum CLUS_RESSUBCLASS_NETWORK {
    718     CLUS_RESSUBCLASS_NETWORK_INTERNET_PROTOCOL   = 0x80000000
    719   } CLUS_RESSUBCLASS_NETWORK;
    720 
    721   typedef enum CLUS_RESSUBCLASS_STORAGE {
    722     CLUS_RESSUBCLASS_STORAGE_SHARED_BUS   = 0x80000000
    723   } CLUS_RESSUBCLASS_STORAGE;
    724 
    725   typedef union CLUSPROP_SYNTAX {
    726     DWORD dw;
    727     __C89_NAMELESS struct {
    728       WORD wFormat;
    729       WORD wType;
    730     };
    731   } CLUSPROP_SYNTAX,*PCLUSPROP_SYNTAX;
    732 
    733   typedef struct CLUSPROP_VALUE {
    734     CLUSPROP_SYNTAX Syntax;
    735     DWORD cbLength;
    736   } CLUSPROP_VALUE,*PCLUSPROP_VALUE;
    737 
    738   typedef struct CLUSPROP_BINARY
    739 #ifdef __cplusplus
    740     : public CLUSPROP_VALUE
    741 #endif
    742   {
    743 #ifndef __cplusplus
    744     CLUSPROP_VALUE;
    745 #endif
    746     BYTE rgb[1];
    747   } CLUSPROP_BINARY,*PCLUSPROP_BINARY;
    748 
    749   typedef struct CLUSPROP_WORD
    750 #ifdef __cplusplus
    751     : public CLUSPROP_VALUE
    752 #endif
    753   {
    754 #ifndef __cplusplus
    755     CLUSPROP_VALUE;
    756 #endif
    757     WORD w;
    758   } CLUSPROP_WORD,*PCLUSPROP_WORD;
    759 
    760   typedef struct CLUSPROP_DWORD
    761 #ifdef __cplusplus
    762     : public CLUSPROP_VALUE
    763 #endif
    764   {
    765 #ifndef __cplusplus
    766     CLUSPROP_VALUE;
    767 #endif
    768     DWORD dw;
    769   } CLUSPROP_DWORD,*PCLUSPROP_DWORD;
    770 
    771   typedef struct CLUSPROP_LONG
    772 #ifdef __cplusplus
    773     : public CLUSPROP_VALUE
    774 #endif
    775   {
    776 #ifndef __cplusplus
    777     CLUSPROP_VALUE;
    778 #endif
    779     LONG l;
    780   } CLUSPROP_LONG,*PCLUSPROP_LONG;
    781 
    782   typedef struct CLUSPROP_SZ
    783 #ifdef __cplusplus
    784     : public CLUSPROP_VALUE
    785 #endif
    786   {
    787 #ifndef __cplusplus
    788     CLUSPROP_VALUE;
    789 #endif
    790     WCHAR sz[1];
    791   } CLUSPROP_SZ,*PCLUSPROP_SZ;
    792 
    793   typedef CLUSPROP_SZ CLUSPROP_MULTI_SZ,*PCLUSPROP_MULTI_SZ;
    794   typedef CLUSPROP_SZ CLUSPROP_PROPERTY_NAME,*PCLUSPROP_PROPERTY_NAME;
    795 
    796   typedef struct CLUSPROP_ULARGE_INTEGER
    797 #ifdef __cplusplus
    798     : public CLUSPROP_VALUE
    799 #endif
    800   {
    801 #ifndef __cplusplus
    802     CLUSPROP_VALUE;
    803 #endif
    804     ULARGE_INTEGER li;
    805   } CLUSPROP_ULARGE_INTEGER,*PCLUSPROP_ULARGE_INTEGER;
    806 
    807   typedef struct CLUSPROP_LARGE_INTEGER
    808 #ifdef __cplusplus
    809     : public CLUSPROP_VALUE
    810 #endif
    811   {
    812 #ifndef __cplusplus
    813     CLUSPROP_VALUE;
    814 #endif
    815     LARGE_INTEGER li;
    816   } CLUSPROP_LARGE_INTEGER,*PCLUSPROP_LARGE_INTEGER;
    817 
    818   typedef struct CLUSPROP_SECURITY_DESCRIPTOR
    819 #ifdef __cplusplus
    820     : public CLUSPROP_VALUE
    821 #endif
    822   {
    823 #ifndef __cplusplus
    824     CLUSPROP_VALUE;
    825 #endif
    826     __C89_NAMELESS union {
    827       SECURITY_DESCRIPTOR_RELATIVE sd;
    828       BYTE rgbSecurityDescriptor[1];
    829     };
    830   } CLUSPROP_SECURITY_DESCRIPTOR,*PCLUSPROP_SECURITY_DESCRIPTOR;
    831 
    832   typedef struct CLUS_RESOURCE_CLASS_INFO {
    833     __C89_NAMELESS union {
    834       __C89_NAMELESS struct {
    835 	__C89_NAMELESS union {
    836 	  DWORD dw;
    837 	  CLUSTER_RESOURCE_CLASS rc;
    838 	};
    839 	DWORD SubClass;
    840       };
    841       ULARGE_INTEGER li;
    842     };
    843   } CLUS_RESOURCE_CLASS_INFO,*PCLUS_RESOURCE_CLASS_INFO;
    844 
    845   typedef struct CLUSPROP_RESOURCE_CLASS
    846 #ifdef __cplusplus
    847     : public CLUSPROP_VALUE
    848 #endif
    849   {
    850 #ifndef __cplusplus
    851     CLUSPROP_VALUE;
    852 #endif
    853     CLUSTER_RESOURCE_CLASS rc;
    854   } CLUSPROP_RESOURCE_CLASS,*PCLUSPROP_RESOURCE_CLASS;
    855 
    856   typedef struct CLUSPROP_RESOURCE_CLASS_INFO
    857 #ifdef __cplusplus
    858     : public CLUSPROP_VALUE,public CLUS_RESOURCE_CLASS_INFO
    859 #endif
    860   {
    861 #ifndef __cplusplus
    862     CLUSPROP_VALUE;
    863     CLUS_RESOURCE_CLASS_INFO;
    864 #endif
    865   } CLUSPROP_RESOURCE_CLASS_INFO,*PCLUSPROP_RESOURCE_CLASS_INFO;
    866 
    867   typedef union CLUSPROP_REQUIRED_DEPENDENCY {
    868     CLUSPROP_VALUE Value;
    869     CLUSPROP_RESOURCE_CLASS ResClass;
    870     CLUSPROP_SZ ResTypeName;
    871   } CLUSPROP_REQUIRED_DEPENDENCY,*PCLUSPROP_REQUIRED_DEPENDENCY;
    872 
    873   typedef CLUSPROP_DWORD CLUSPROP_DISK_NUMBER,*PCLUSPROP_DISK_NUMBER;
    874 #endif
    875 
    876 #ifndef _CLUSTER_API_TYPES_
    877   typedef enum CLUSPROP_PIFLAGS {
    878     CLUSPROP_PIFLAG_STICKY = 0x00000001,CLUSPROP_PIFLAG_REMOVABLE = 0x00000002,CLUSPROP_PIFLAG_USABLE = 0x00000004,
    879     CLUSPROP_PIFLAG_DEFAULT_QUORUM = 0x00000008
    880   } CLUSPROP_PIFLAGS;
    881 
    882   typedef struct CLUS_FORCE_QUORUM_INFO {
    883     DWORD dwSize;
    884     DWORD dwNodeBitMask;
    885     DWORD dwMaxNumberofNodes;
    886     WCHAR multiszNodeList[1];
    887   } CLUS_FORCE_QUORUM_INFO,*PCLUS_FORCE_QUORUM_INFO;
    888 
    889   typedef struct CLUS_PARTITION_INFO {
    890     DWORD dwFlags;
    891     WCHAR szDeviceName[MAX_PATH];
    892     WCHAR szVolumeLabel[MAX_PATH];
    893     DWORD dwSerialNumber;
    894     DWORD rgdwMaximumComponentLength;
    895     DWORD dwFileSystemFlags;
    896     WCHAR szFileSystem[32];
    897   } CLUS_PARTITION_INFO,*PCLUS_PARTITION_INFO;
    898 
    899   typedef struct CLUSPROP_PARTITION_INFO
    900 #ifdef __cplusplus
    901     : public CLUSPROP_VALUE,public CLUS_PARTITION_INFO
    902 #endif
    903   {
    904 #ifndef __cplusplus
    905     CLUSPROP_VALUE;
    906     CLUS_PARTITION_INFO;
    907 #endif
    908   } CLUSPROP_PARTITION_INFO,*PCLUSPROP_PARTITION_INFO;
    909 
    910   typedef struct CLUS_FTSET_INFO {
    911     DWORD dwRootSignature;
    912     DWORD dwFtType;
    913   } CLUS_FTSET_INFO,*PCLUS_FTSET_INFO;
    914 
    915   typedef struct CLUSPROP_FTSET_INFO
    916 #ifdef __cplusplus
    917     : public CLUSPROP_VALUE,public CLUS_FTSET_INFO
    918 #endif
    919   {
    920 #ifndef __cplusplus
    921     CLUSPROP_VALUE;
    922     CLUS_FTSET_INFO;
    923 #endif
    924   } CLUSPROP_FTSET_INFO,*PCLUSPROP_FTSET_INFO;
    925 
    926   typedef CLUSPROP_DWORD CLUSPROP_DISK_SIGNATURE,*PCLUSPROP_DISK_SIGNATURE;
    927   typedef struct CLUS_SCSI_ADDRESS {
    928     __C89_NAMELESS union {
    929       __C89_NAMELESS struct {
    930 	UCHAR PortNumber;
    931 	UCHAR PathId;
    932 	UCHAR TargetId;
    933 	UCHAR Lun;
    934       };
    935       DWORD dw;
    936     };
    937   } CLUS_SCSI_ADDRESS,*PCLUS_SCSI_ADDRESS;
    938 
    939   typedef struct CLUSPROP_SCSI_ADDRESS
    940 #ifdef __cplusplus
    941     : public CLUSPROP_VALUE,public CLUS_SCSI_ADDRESS
    942 #endif
    943   {
    944 #ifndef __cplusplus
    945     CLUSPROP_VALUE;
    946     CLUS_SCSI_ADDRESS;
    947 #endif
    948   } CLUSPROP_SCSI_ADDRESS,*PCLUSPROP_SCSI_ADDRESS;
    949 
    950   typedef struct CLUS_NETNAME_VS_TOKEN_INFO {
    951     DWORD ProcessID;
    952     DWORD DesiredAccess;
    953     WINBOOL InheritHandle;
    954   } CLUS_NETNAME_VS_TOKEN_INFO,*PCLUS_NETNAME_VS_TOKEN_INFO;
    955 
    956   typedef struct CLUS_MAINTENANCE_MODE_INFO {
    957     WINBOOL InMaintenance;
    958   } CLUS_MAINTENANCE_MODE_INFO,*PCLUS_MAINTENANCE_MODE_INFO;
    959 
    960   typedef struct CLUSPROP_LIST {
    961     DWORD nPropertyCount;
    962     CLUSPROP_PROPERTY_NAME PropertyName;
    963   } CLUSPROP_LIST,*PCLUSPROP_LIST;
    964 
    965   typedef union CLUSPROP_BUFFER_HELPER {
    966     BYTE *pb;
    967     WORD *pw;
    968     DWORD *pdw;
    969     LONG *pl;
    970     LPWSTR psz;
    971     PCLUSPROP_LIST pList;
    972     PCLUSPROP_SYNTAX pSyntax;
    973     PCLUSPROP_PROPERTY_NAME pName;
    974     PCLUSPROP_VALUE pValue;
    975     PCLUSPROP_BINARY pBinaryValue;
    976     PCLUSPROP_WORD pWordValue;
    977     PCLUSPROP_DWORD pDwordValue;
    978     PCLUSPROP_LONG pLongValue;
    979     PCLUSPROP_ULARGE_INTEGER pULargeIntegerValue;
    980     PCLUSPROP_LARGE_INTEGER pLargeIntegerValue;
    981     PCLUSPROP_SZ pStringValue;
    982     PCLUSPROP_MULTI_SZ pMultiSzValue;
    983     PCLUSPROP_SECURITY_DESCRIPTOR pSecurityDescriptor;
    984     PCLUSPROP_RESOURCE_CLASS pResourceClassValue;
    985     PCLUSPROP_RESOURCE_CLASS_INFO pResourceClassInfoValue;
    986     PCLUSPROP_DISK_SIGNATURE pDiskSignatureValue;
    987     PCLUSPROP_SCSI_ADDRESS pScsiAddressValue;
    988     PCLUSPROP_DISK_NUMBER pDiskNumberValue;
    989     PCLUSPROP_PARTITION_INFO pPartitionInfoValue;
    990     PCLUSPROP_REQUIRED_DEPENDENCY pRequiredDependencyValue;
    991   } CLUSPROP_BUFFER_HELPER,*PCLUSPROP_BUFFER_HELPER;
    992 #endif
    993 
    994 #define ALIGN_CLUSPROP(count) ((count + 3) & ~3)
    995 #define CLUSPROP_BINARY_DECLARE(name,cb) struct { CLUSPROP_SYNTAX Syntax; DWORD cbLength; BYTE rgb[(cb + 3) & ~3]; } name
    996 #define CLUSPROP_SZ_DECLARE(name,cch) struct { CLUSPROP_SYNTAX Syntax; DWORD cbLength; WCHAR sz[(cch + 1) & ~1]; } name
    997 #define CLUSPROP_PROPERTY_NAME_DECLARE(name,cch) CLUSPROP_SZ_DECLARE(name,cch)
    998 
    999 #ifndef _CLUSTER_API_TYPES_
   1000   typedef enum CLUSTER_RESOURCE_ENUM {
   1001     CLUSTER_RESOURCE_ENUM_DEPENDS = 0x00000001,CLUSTER_RESOURCE_ENUM_PROVIDES = 0x00000002,CLUSTER_RESOURCE_ENUM_NODES = 0x00000004,
   1002     CLUSTER_RESOURCE_ENUM_ALL = (CLUSTER_RESOURCE_ENUM_DEPENDS | CLUSTER_RESOURCE_ENUM_PROVIDES | CLUSTER_RESOURCE_ENUM_NODES)
   1003   } CLUSTER_RESOURCE_ENUM;
   1004 
   1005   typedef enum CLUSTER_RESOURCE_TYPE_ENUM {
   1006     CLUSTER_RESOURCE_TYPE_ENUM_NODES = 0x00000001,
   1007     CLUSTER_RESOURCE_TYPE_ENUM_RESOURCES = 0x00000002,
   1008     CLUSTER_RESOURCE_TYPE_ENUM_ALL = (CLUSTER_RESOURCE_TYPE_ENUM_NODES | CLUSTER_RESOURCE_TYPE_ENUM_RESOURCES)
   1009   } CLUSTER_RESOURCE_TYPE_ENUM;
   1010 #endif
   1011 
   1012   HRESENUM WINAPI ClusterResourceOpenEnum(HRESOURCE hResource,DWORD dwType);
   1013   DWORD WINAPI ClusterResourceGetEnumCount(HRESENUM hResEnum);
   1014   DWORD WINAPI ClusterResourceEnum(HRESENUM hResEnum,DWORD dwIndex,LPDWORD lpdwType,LPWSTR lpszName,LPDWORD lpcchName);
   1015   DWORD WINAPI ClusterResourceCloseEnum(HRESENUM hResEnum);
   1016   DWORD WINAPI CreateClusterResourceType(HCLUSTER hCluster,LPCWSTR lpszResourceTypeName,LPCWSTR lpszDisplayName,LPCWSTR lpszResourceTypeDll,DWORD dwLooksAlivePollInterval,DWORD dwIsAlivePollInterval);
   1017   DWORD WINAPI DeleteClusterResourceType(HCLUSTER hCluster,LPCWSTR lpszResourceTypeName);
   1018   HRESTYPEENUM WINAPI ClusterResourceTypeOpenEnum(HCLUSTER hCluster,LPCWSTR lpszResourceTypeName,DWORD dwType);
   1019   DWORD WINAPI ClusterResourceTypeGetEnumCount(HRESTYPEENUM hResTypeEnum);
   1020   DWORD WINAPI ClusterResourceTypeEnum(HRESTYPEENUM hResTypeEnum,DWORD dwIndex,LPDWORD lpdwType,LPWSTR lpszName,LPDWORD lpcchName);
   1021   DWORD WINAPI ClusterResourceTypeCloseEnum(HRESTYPEENUM hResTypeEnum);
   1022 
   1023 #ifndef _CLUSTER_API_TYPES_
   1024   typedef enum CLUSTER_NETWORK_ENUM {
   1025     CLUSTER_NETWORK_ENUM_NETINTERFACES = 0x00000001,CLUSTER_NETWORK_ENUM_ALL = CLUSTER_NETWORK_ENUM_NETINTERFACES
   1026   } CLUSTER_NETWORK_ENUM;
   1027 
   1028   typedef enum CLUSTER_NETWORK_STATE {
   1029     ClusterNetworkStateUnknown = -1,ClusterNetworkUnavailable,ClusterNetworkDown,ClusterNetworkPartitioned,ClusterNetworkUp
   1030   } CLUSTER_NETWORK_STATE;
   1031 
   1032   typedef enum CLUSTER_NETWORK_ROLE {
   1033     ClusterNetworkRoleNone = 0,ClusterNetworkRoleInternalUse = 0x00000001,ClusterNetworkRoleClientAccess = 0x00000002,
   1034     ClusterNetworkRoleInternalAndClient = 0x00000003
   1035   } CLUSTER_NETWORK_ROLE;
   1036 #endif
   1037 
   1038   HNETWORK WINAPI OpenClusterNetwork(HCLUSTER hCluster,LPCWSTR lpszNetworkName);
   1039   WINBOOL WINAPI CloseClusterNetwork(HNETWORK hNetwork);
   1040   HCLUSTER WINAPI GetClusterFromNetwork(HNETWORK hNetwork);
   1041   HNETWORKENUM WINAPI ClusterNetworkOpenEnum(HNETWORK hNetwork,DWORD dwType);
   1042   DWORD WINAPI ClusterNetworkGetEnumCount(HNETWORKENUM hNetworkEnum);
   1043   DWORD WINAPI ClusterNetworkEnum(HNETWORKENUM hNetworkEnum,DWORD dwIndex,LPDWORD lpdwType,LPWSTR lpszName,LPDWORD lpcchName);
   1044   DWORD WINAPI ClusterNetworkCloseEnum(HNETWORKENUM hNetworkEnum);
   1045   CLUSTER_NETWORK_STATE WINAPI GetClusterNetworkState(HNETWORK hNetwork);
   1046   DWORD WINAPI SetClusterNetworkName(HNETWORK hNetwork,LPCWSTR lpszName);
   1047   DWORD WINAPI GetClusterNetworkId(HNETWORK hNetwork,LPWSTR lpszNetworkId,LPDWORD lpcchName);
   1048   DWORD WINAPI ClusterNetworkControl(HNETWORK hNetwork,HNODE hHostNode,DWORD dwControlCode,LPVOID lpInBuffer,DWORD nInBufferSize,LPVOID lpOutBuffer,DWORD nOutBufferSize,LPDWORD lpBytesReturned);
   1049 
   1050 #ifndef _CLUSTER_API_TYPES_
   1051   typedef enum CLUSTER_NETINTERFACE_STATE {
   1052     ClusterNetInterfaceStateUnknown = -1,ClusterNetInterfaceUnavailable,ClusterNetInterfaceFailed,ClusterNetInterfaceUnreachable,ClusterNetInterfaceUp
   1053   } CLUSTER_NETINTERFACE_STATE;
   1054 #endif
   1055 
   1056   HNETINTERFACE WINAPI OpenClusterNetInterface(HCLUSTER hCluster,LPCWSTR lpszInterfaceName);
   1057   DWORD WINAPI GetClusterNetInterface(HCLUSTER hCluster,LPCWSTR lpszNodeName,LPCWSTR lpszNetworkName,LPWSTR lpszInterfaceName,LPDWORD lpcchInterfaceName);
   1058   WINBOOL WINAPI CloseClusterNetInterface(HNETINTERFACE hNetInterface);
   1059   HCLUSTER WINAPI GetClusterFromNetInterface(HNETINTERFACE hNetInterface);
   1060   CLUSTER_NETINTERFACE_STATE WINAPI GetClusterNetInterfaceState(HNETINTERFACE hNetInterface);
   1061   DWORD WINAPI ClusterNetInterfaceControl(HNETINTERFACE hNetInterface,HNODE hHostNode,DWORD dwControlCode,LPVOID lpInBuffer,DWORD nInBufferSize,LPVOID lpOutBuffer,DWORD nOutBufferSize,LPDWORD lpBytesReturned);
   1062   HKEY WINAPI GetClusterKey(HCLUSTER hCluster,REGSAM samDesired);
   1063   HKEY WINAPI GetClusterGroupKey(HGROUP hGroup,REGSAM samDesired);
   1064   HKEY WINAPI GetClusterResourceKey(HRESOURCE hResource,REGSAM samDesired);
   1065   HKEY WINAPI GetClusterNodeKey(HNODE hNode,REGSAM samDesired);
   1066   HKEY WINAPI GetClusterNetworkKey(HNETWORK hNetwork,REGSAM samDesired);
   1067   HKEY WINAPI GetClusterNetInterfaceKey(HNETINTERFACE hNetInterface,REGSAM samDesired);
   1068   LONG WINAPI ClusterRegCreateKey(HKEY hKey,LPCWSTR lpszSubKey,DWORD dwOptions,REGSAM samDesired,LPSECURITY_ATTRIBUTES lpSecurityAttributes,PHKEY phkResult,LPDWORD lpdwDisposition);
   1069   LONG WINAPI ClusterRegOpenKey(HKEY hKey,LPCWSTR lpszSubKey,REGSAM samDesired,PHKEY phkResult);
   1070   LONG WINAPI ClusterRegDeleteKey(HKEY hKey,LPCWSTR lpszSubKey);
   1071   LONG WINAPI ClusterRegCloseKey(HKEY hKey);
   1072   LONG WINAPI ClusterRegEnumKey(HKEY hKey,DWORD dwIndex,LPWSTR lpszName,LPDWORD lpcchName,PFILETIME lpftLastWriteTime);
   1073   DWORD WINAPI ClusterRegSetValue(HKEY hKey,LPCWSTR lpszValueName,DWORD dwType,CONST BYTE *lpData,DWORD cbData);
   1074   DWORD WINAPI ClusterRegDeleteValue(HKEY hKey,LPCWSTR lpszValueName);
   1075   LONG WINAPI ClusterRegQueryValue(HKEY hKey,LPCWSTR lpszValueName,LPDWORD lpdwValueType,LPBYTE lpData,LPDWORD lpcbData);
   1076   DWORD WINAPI ClusterRegEnumValue(HKEY hKey,DWORD dwIndex,LPWSTR lpszValueName,LPDWORD lpcchValueName,LPDWORD lpdwType,LPBYTE lpData,LPDWORD lpcbData);
   1077   LONG WINAPI ClusterRegQueryInfoKey(HKEY hKey,LPDWORD lpcSubKeys,LPDWORD lpcchMaxSubKeyLen,LPDWORD lpcValues,LPDWORD lpcchMaxValueNameLen,LPDWORD lpcbMaxValueLen,LPDWORD lpcbSecurityDescriptor,PFILETIME lpftLastWriteTime);
   1078   LONG WINAPI ClusterRegGetKeySecurity (HKEY hKey,SECURITY_INFORMATION RequestedInformation,PSECURITY_DESCRIPTOR pSecurityDescriptor,LPDWORD lpcbSecurityDescriptor);
   1079   LONG WINAPI ClusterRegSetKeySecurity(HKEY hKey,SECURITY_INFORMATION SecurityInformation,PSECURITY_DESCRIPTOR pSecurityDescriptor);
   1080 
   1081 typedef HCLUSTER (WINAPI *PCLUSAPI_OPEN_CLUSTER)(
   1082   LPCWSTR lpszClusterName
   1083 );
   1084 
   1085 #if (_WIN32_WINNT >= 0x0600)
   1086 #define FS_CASE_SENSITIVE 1
   1087 #define FS_CASE_IS_PRESERVED 2
   1088 #define FS_UNICODE_STORED_ON_DISK 3
   1089 #define FS_PERSISTENT_ACLS 4
   1090 
   1091 typedef enum _MAINTENANCE_MODE_TYPE_ENUM {
   1092   MaintenanceModeTypeDisableIsAliveCheck   = 1,
   1093   MaintenanceModeTypeOfflineResource       = 2,
   1094   MaintenanceModeTypeUnclusterResource     = 3
   1095 } MAINTENANCE_MODE_TYPE_ENUM, *PMAINTENANCE_MODE_TYPE_ENUM;
   1096 
   1097 typedef enum CLUSTER_RESOURCE_STATE {
   1098   ClusterResourceStateUnknown     = -1,
   1099   ClusterResourceInherited        = 0,
   1100   ClusterResourceInitializing     = 1,
   1101   ClusterResourceOnline           = 2,
   1102   ClusterResourceOffline          = 3,
   1103   ClusterResourceFailed           = 4,
   1104   ClusterResourcePending          = 128,  // 0x80
   1105   ClusterResourceOnlinePending    = 129,  // 0x81
   1106   ClusterResourceOfflinePending   = 130   // 0x82
   1107 } CLUSTER_RESOURCE_STATE;
   1108 
   1109 typedef enum _CLUSTER_REG_COMMAND {
   1110   CLUSREG_COMMAND_NONE       = 0,
   1111   CLUSREG_SET_VALUE          = 1,
   1112   CLUSREG_CREATE_KEY         = 2,
   1113   CLUSREG_DELETE_KEY         = 3,
   1114   CLUSREG_DELETE_VALUE       = 4,
   1115   CLUSREG_SET_KEY_SECURITY   = 5,
   1116   CLUSREG_VALUE_DELETED      = 6,
   1117   CLUSREG_LAST_COMMAND       = 7
   1118 } CLUSTER_REG_COMMAND;
   1119 
   1120 typedef enum CLUSTER_GROUP_STATE {
   1121   ClusterGroupStateUnknown    = -1,
   1122   ClusterGroupOnline          = 0,
   1123   ClusterGroupOffline         = 1,
   1124   ClusterGroupFailed          = 2,
   1125   ClusterGroupPartialOnline   = 3,
   1126   ClusterGroupPending         = 4
   1127 } CLUSTER_GROUP_STATE;
   1128 
   1129 typedef enum CLUSTER_QUORUM_TYPE {
   1130   OperationalQuorum   = 0,
   1131   ModifyQuorum        = 1
   1132 } CLUSTER_QUORUM_TYPE;
   1133 
   1134 typedef enum CLUSTER_QUORUM_VALUE {
   1135   CLUSTER_QUORUM_MAINTAINED   = 0,
   1136   CLUSTER_QUORUM_LOST         = 1
   1137 } CLUSTER_QUORUM_VALUE;
   1138 
   1139 typedef enum CLUSTER_RESOURCE_CLASS {
   1140   CLUS_RESCLASS_UNKNOWN   = 0,
   1141   CLUS_RESCLASS_STORAGE   = 1,
   1142   CLUS_RESCLASS_NETWORK   = 2,
   1143   CLUS_RESCLASS_USER      = 32768
   1144 } CLUSTER_RESOURCE_CLASS;
   1145 
   1146 typedef enum CLUSTER_RESOURCE_CREATE_FLAGS {
   1147   CLUSTER_RESOURCE_DEFAULT_MONITOR    = 0,
   1148   CLUSTER_RESOURCE_SEPARATE_MONITOR   = 1,
   1149   CLUSTER_RESOURCE_VALID_FLAGS        = 1
   1150 } CLUSTER_RESOURCE_CREATE_FLAGS;
   1151 
   1152 typedef enum _CLUSTER_SETUP_PHASE {
   1153   ClusterSetupPhaseInitialize                   = 1,
   1154   ClusterSetupPhaseValidateNodeState            = 100,
   1155   ClusterSetupPhaseValidateNetft                = 102,
   1156   ClusterSetupPhaseValidateClusDisk             = 103,
   1157   ClusterSetupPhaseConfigureClusSvc             = 104,
   1158   ClusterSetupPhaseStartingClusSvc              = 105,
   1159   ClusterSetupPhaseQueryClusterNameAccount      = 106,
   1160   ClusterSetupPhaseValidateClusterNameAccount   = 107,
   1161   ClusterSetupPhaseCreateClusterAccount         = 108,
   1162   ClusterSetupPhaseConfigureClusterAccount      = 109,
   1163   ClusterSetupPhaseFormingCluster               = 200,
   1164   ClusterSetupPhaseAddClusterProperties         = 201,
   1165   ClusterSetupPhaseCreateResourceTypes          = 202,
   1166   ClusterSetupPhaseCreateGroups                 = 203,
   1167   ClusterSetupPhaseCreateIPAddressResources     = 204,
   1168   ClusterSetupPhaseCreateNetworkName            = 205,
   1169   ClusterSetupPhaseClusterGroupOnline           = 206,
   1170   ClusterSetupPhaseGettingCurrentMembership     = 300,
   1171   ClusterSetupPhaseAddNodeToCluster             = 301,
   1172   ClusterSetupPhaseNodeUp                       = 302,
   1173   ClusterSetupPhaseMoveGroup                    = 400,
   1174   ClusterSetupPhaseDeleteGroup                  = 401,
   1175   ClusterSetupPhaseCleanupCOs                   = 402,
   1176   ClusterSetupPhaseOfflineGroup                 = 403,
   1177   ClusterSetupPhaseEvictNode                    = 404,
   1178   ClusterSetupPhaseCleanupNode                  = 405,
   1179   ClusterSetupPhaseCoreGroupCleanup             = 406,
   1180   ClusterSetupPhaseFailureCleanup               = 999
   1181 } CLUSTER_SETUP_PHASE;
   1182 
   1183 typedef enum _CLUSTER_SETUP_PHASE_TYPE {
   1184   ClusterSetupPhaseStart      = 1,
   1185   ClusterSetupPhaseContinue   = 2,
   1186   ClusterSetupPhaseEnd        = 3
   1187 } CLUSTER_SETUP_PHASE_TYPE;
   1188 
   1189 typedef enum _CLUSTER_SETUP_PHASE_SEVERITY {
   1190   ClusterSetupPhaseInformational   = 1,
   1191   ClusterSetupPhaseWarning         = 2,
   1192   ClusterSetupPhaseFatal           = 3
   1193 } CLUSTER_SETUP_PHASE_SEVERITY;
   1194 
   1195 typedef struct _CLUSPROP_FILETIME {
   1196   CLUSPROP_SYNTAX Syntax;
   1197   DWORD           cbLength;
   1198   FILETIME        ft;
   1199 } CLUSPROP_FILETIME, *PCLUSPROP_FILETIME;
   1200 
   1201 typedef struct _CLUS_MAINTENANCE_MODE_INFOEX {
   1202   WINBOOL                    InMaintenance;
   1203   MAINTENANCE_MODE_TYPE_ENUM MaintainenceModeType;
   1204   CLUSTER_RESOURCE_STATE     InternalState;
   1205   DWORD                      Signature;
   1206 } CLUS_MAINTENANCE_MODE_INFOEX, *PCLUS_MAINTENANCE_MODE_INFOEX;
   1207 
   1208 typedef struct CLUS_NETNAME_PWD_INFO {
   1209   DWORD Flags;
   1210   WCHAR Password[MAX_CO_PASSWORD_LENGTH];
   1211   WCHAR CreatingDC[MAX_CREATINGDC_LENGTH+2];
   1212   WCHAR ObjectGuid[MAX_OBJECTID];
   1213 } CLUS_NETNAME_PWD_INFO, *PCLUS_NETNAME_PWD_INFO;
   1214 
   1215 typedef struct CLUS_NETNAME_VS_TOKEN_INFO {
   1216   DWORD   ProcessID;
   1217   DWORD   DesiredAccess;
   1218   WINBOOL InheritHandle;
   1219 } CLUS_NETNAME_VS_TOKEN_INFO, *PCLUS_NETNAME_VS_TOKEN_INFO;
   1220 
   1221 typedef struct CLUS_PARTITION_INFO_EX {
   1222   DWORD          dwFlags;
   1223   WCHAR          szDeviceName[MAX_PATH];
   1224   WCHAR          szVolumeLabel[MAX_PATH];
   1225   DWORD          dwSerialNumber;
   1226   DWORD          rgdwMaximumComponentLength;
   1227   DWORD          dwFileSystemFlags;
   1228   WCHAR          szFileSystem[32];
   1229   ULARGE_INTEGER TotalSizeInBytes;
   1230   ULARGE_INTEGER FreeSizeInBytes;
   1231   DWORD          DeviceNumber;
   1232   DWORD          PartitionNumber;
   1233   GUID           VolumeGuid;
   1234 } CLUS_PARTITION_INFO_EX, *PCLUS_PARTITION_INFO_EX;
   1235 
   1236 typedef struct _CLUS_PROVIDER_STATE_CHANGE_INFO {
   1237   DWORD                  dwSize;
   1238   CLUSTER_RESOURCE_STATE resourceState;
   1239   WCHAR                  szProviderId[1];
   1240 } CLUS_PROVIDER_STATE_CHANGE_INFO, *PCLUS_PROVIDER_STATE_CHANGE_INFO;
   1241 
   1242 typedef struct _CLUS_STORAGE_GET_AVAILABLE_DRIVELETTERS {
   1243   DWORD AvailDrivelettersMask;
   1244 } CLUS_STORAGE_GET_AVAILABLE_DRIVELETTERS, *PCLUS_STORAGE_GET_AVAILABLE_DRIVELETTERS;
   1245 
   1246 typedef struct _CLUS_STORAGE_REMAP_DRIVELETTER {
   1247   DWORD CurrentDriveLetterMask;
   1248   DWORD TargetDriveLetterMask;
   1249 } CLUS_STORAGE_REMAP_DRIVELETTER, *PCLUS_STORAGE_REMAP_DRIVELETTER;
   1250 
   1251 typedef struct _CLUS_STORAGE_SET_DRIVELETTER {
   1252   DWORD PartitionNumber;
   1253   DWORD DriveLetterMask;
   1254 } CLUS_STORAGE_SET_DRIVELETTER, *PCLUS_STORAGE_SET_DRIVELETTER;
   1255 
   1256 typedef struct _CLUSPROP_PARTITION_INFO_EX {
   1257   CLUSPROP_SYNTAX Syntax;
   1258   DWORD           cbLength;
   1259   DWORD           dwFlags;
   1260   WCHAR           szDeviceName[MAX_PATH];
   1261   WCHAR           szVolumeLabel[MAX_PATH];
   1262   DWORD           dwSerialNumber;
   1263   DWORD           rgdwMaximumComponentLength;
   1264   DWORD           dwFileSystemFlags;
   1265   WCHAR           szFileSystem[32];
   1266   ULARGE_INTEGER  TotalSizeInBytes;
   1267   ULARGE_INTEGER  FreeSizeInBytes;
   1268   DWORD           DeviceNumber;
   1269   DWORD           PartitionNumber;
   1270   GUID            VolumeGuid;
   1271 } CLUSPROP_PARTITION_INFO_EX, *PCLUSPROP_PARTITION_INFO_EX;
   1272 
   1273 typedef struct _CLUSTER_BATCH_COMMAND {
   1274   CLUSTER_REG_COMMAND Command;
   1275   DWORD               dwOptions;
   1276   LPCWSTR             wzName;
   1277   BYTE CONST *        lpData;
   1278   DWORD               cbData;
   1279 } CLUSTER_BATCH_COMMAND;
   1280 
   1281 typedef struct _CLUSTER_IP_ENTRY {
   1282   PCWSTR lpszIpAddress;
   1283   DWORD  dwPrefixLength;
   1284 } CLUSTER_IP_ENTRY, *PCLUSTER_IP_ENTRY;
   1285 
   1286 typedef struct _CREATE_CLUSTER_CONFIG {
   1287   DWORD             dwVersion;
   1288   PCWSTR            lpszClusterName;
   1289   DWORD             cNodes;
   1290   PCWSTR            *ppszNodeNames;
   1291   DWORD             cIpEntries;
   1292   PCLUSTER_IP_ENTRY pIpEntries;
   1293   BOOLEAN           fEmptyCluster;
   1294 } CREATE_CLUSTER_CONFIG, *PCREATE_CLUSTER_CONFIG;
   1295 
   1296 typedef struct _CLUSTER_VALIDATE_DIRECTORY {
   1297   __MINGW_EXTENSION WCHAR szPath[0];
   1298 } CLUSTER_VALIDATE_DIRECTORY, *PCLUSTER_VALIDATE_DIRECTORY;
   1299 
   1300 typedef struct _CLUSTER_VALIDATE_NETNAME {
   1301   __MINGW_EXTENSION WCHAR szNetworkName[0];
   1302 } CLUSTER_VALIDATE_NETNAME, *PCLUSTER_VALIDATE_NETNAME;
   1303 
   1304 typedef struct _CLUSTER_VALIDATE_PATH {
   1305   __MINGW_EXTENSION WCHAR szPath[0];
   1306 } CLUSTER_VALIDATE_PATH, *PCLUSTER_VALIDATE_PATH;
   1307 
   1308 typedef LPVOID HREGBATCH;
   1309 typedef LPVOID HREGBATCHPORT;
   1310 typedef LPVOID HREGBATCHNOTIFICATION;
   1311 
   1312 LONG ClusterRegBatchAddCommand(
   1313   HREGBATCH hRegBatch,
   1314   CLUSTER_REG_COMMAND dwCommand,
   1315   LPCWSTR wzName,
   1316   DWORD dwOptions,
   1317   VOID CONST *lpData,
   1318   DWORD cbData
   1319 );
   1320 
   1321 LONG WINAPI ClusterRegBatchCloseNotification(
   1322   HREGBATCHNOTIFICATION hBatchNotification
   1323 );
   1324 
   1325 LONG WINAPI ClusterRegBatchReadCommand(
   1326   HREGBATCHNOTIFICATION hBatchNotification,
   1327   CLUSTER_BATCH_COMMAND *pBatchCommand
   1328 );
   1329 
   1330 LONG WINAPI ClusterRegCloseBatch(
   1331   HREGBATCH hRegBatch,
   1332   WINBOOL bCommit,
   1333   INT *failedCommandNumber
   1334 );
   1335 
   1336 LONG WINAPI ClusterRegCloseBatchNotifyPort(
   1337   HREGBATCHPORT hBatchNotifyPort
   1338 );
   1339 
   1340 typedef LONG (WINAPI *PCLUSTER_REG_CREATE_BATCH)(
   1341   HKEY hKey,
   1342   HREGBATCH *pHREGBATCH
   1343 );
   1344 
   1345 LONG WINAPI ClusterRegCreateBatch(
   1346   HKEY hKey,
   1347   HREGBATCH *pHREGBATCH
   1348 );
   1349 
   1350 typedef LONG (WINAPI *PCLUSTER_REG_CREATE_BATCH_NOTIFY_PORT)(
   1351   HKEY hKey,
   1352   HREGBATCHPORT *phBatchNotifyPort
   1353 );
   1354 
   1355 LONG WINAPI ClusterRegCreateBatchNotifyPort(
   1356   HKEY hKey,
   1357   HREGBATCHPORT *phBatchNotifyPort
   1358 );
   1359 
   1360 typedef LONG (WINAPI *PCLUSTER_REG_GET_BATCH_NOTIFICATION)(
   1361   HREGBATCHPORT hBatchNotify,
   1362   HREGBATCHNOTIFICATION *phBatchNotification
   1363 );
   1364 
   1365 LONG WINAPI ClusterRegGetBatchNotification(
   1366   HREGBATCHPORT hBatchNotify,
   1367   HREGBATCHNOTIFICATION *phBatchNotification
   1368 );
   1369 
   1370 typedef WINBOOL (WINAPI *PCLUSTER_SETUP_PROGRESS_CALLBACK)(
   1371   PVOID pvCallbackArg,
   1372   CLUSTER_SETUP_PHASE eSetupPhase,
   1373   CLUSTER_SETUP_PHASE_TYPE ePhaseType,
   1374   CLUSTER_SETUP_PHASE_SEVERITY ePhaseSeverity,
   1375   DWORD dwPercentComplete,
   1376   PCWSTR lpszObjectName,
   1377   DWORD dwStatus
   1378 );
   1379 
   1380 HNODE WINAPI AddClusterNode(
   1381   HCLUSTER hCluster,
   1382   PCWSTR lpszNodeName,
   1383   PCLUSTER_SETUP_PROGRESS_CALLBACK pfnProgressCallback,
   1384   PVOID pvCallbackArg
   1385 );
   1386 
   1387 DWORD WINAPI DestroyCluster(
   1388   HCLUSTER hCluster,
   1389   PCLUSTER_SETUP_PROGRESS_CALLBACK pfnProgressCallback,
   1390   PVOID pvCallbackArg,
   1391   WINBOOL fdeleteVirtualComputerObjects
   1392 );
   1393 
   1394 HCLUSTER WINAPI CreateCluster(
   1395   PCREATE_CLUSTER_CONFIG pConfig,
   1396   PCLUSTER_SETUP_PROGRESS_CALLBACK pfnProgressCallback,
   1397   PVOID pvCallbackArg
   1398 );
   1399 
   1400 DWORD DestroyClusterGroup(
   1401   HGROUP hGroup
   1402 );
   1403 
   1404 typedef enum _FILESHARE_CHANGE_ENUM {
   1405   FILESHARE_CHANGE_NONE     = 0,
   1406   FILESHARE_CHANGE_ADD      = 1,
   1407   FILESHARE_CHANGE_DEL      = 2,
   1408   FILESHARE_CHANGE_MODIFY   = 3
   1409 } FILESHARE_CHANGE_ENUM;
   1410 
   1411 #define NNLEN       80                  /* Net name length (share name) */
   1412 
   1413 typedef struct _FILESHARE_CHANGE {
   1414   FILESHARE_CHANGE_ENUM Change;
   1415   WCHAR                 ShareName[NNLEN+4];
   1416 } FILESHARE_CHANGE, *PFILESHARE_CHANGE;
   1417 
   1418 typedef struct _FILESHARE_CHANGE_LIST {
   1419   DWORD            NumEntries;
   1420   __MINGW_EXTENSION FILESHARE_CHANGE ChangeEntry[0];
   1421 } FILESHARE_CHANGE_LIST, *PFILESHARE_CHANGE_LIST;
   1422 
   1423 DWORD WINAPI GetClusterResourceDependencyExpression(
   1424   HRESOURCE hResource,
   1425   LPWSTR lpszDependencyExpression,
   1426   LPDWORD lpcchDependencyExpression
   1427 );
   1428 
   1429 DWORD WINAPI SetClusterResourceDependencyExpression(
   1430   HRESOURCE hResource,
   1431   LPCWSTR lpszDependencyExpression
   1432 );
   1433 
   1434 #endif /* (_WIN32_WINNT >= 0x0600) */
   1435 #if (_WIN32_WINNT >= 0x0601)
   1436 typedef enum _CLUSTER_SHARED_VOLUME_BACKUP_STATE {
   1437   VolumeBackupNone         = 0x00000000,
   1438   VolumeBackupInProgress   = 0x00000001
   1439 } CLUSTER_SHARED_VOLUME_BACKUP_STATE, *PCLUSTER_SHARED_VOLUME_BACKUP_STATE;
   1440 #endif /* (_WIN32_WINNT >= 0x0601) */
   1441 
   1442 #ifdef __cplusplus
   1443 }
   1444 #endif
   1445 
   1446 #ifndef _CLUSTER_API_TYPES_
   1447 #define _CLUSTER_API_TYPES_
   1448 #endif
   1449 #endif
   1450