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