Control Code Architecture
If you want to create your own control codes, you will need to refer to the information in this section. You do not need to know how control codes are defined in order to use them in control code functions. However, understanding the internal architecture of control codes can help you use them more efficiently.
Control codes consist of seven smaller numbers arranged to form a 32-bit value. The bit layout is shown in the following illustration:
Object Code (bits 24 31)
The 8-bit object component indicates the type of cluster object to which the control code applies. Possible values are enumerated by the CLUSTER_CONTROL_OBJECT enumeration:
Name | Value |
---|---|
CLUS_OBJECT_CLUSTER |
0x40 |
CLUS_OBJECT_GROUP |
0x04 |
CLUS_OBJECT_NETWORK |
0x10 |
CLUS_OBJECT_NETINTERFACE |
0x20 |
CLUS_OBJECT_NODE |
0x08 |
CLUS_OBJECT_RESOURCE |
0x01 |
CLUS_OBJECT_RESOURCE_TYPE |
0x02 |
CLUS_OBJECT_USER |
0x80 |
All of the values except CLUS_OBJECT_USER represent object types defined by Windows Failover Clustering.
These values are shifted left CLCTL_OBJECT_SHIFT (24) bits in the cluster control value.
Global Bit (bit 23)
The global bit indicates whether the control code represents a global operation that must be performed on each cluster node. Their possible values are the following:
Name | Value |
---|---|
CLUS_NOT_GLOBAL |
0x0 |
CLUS_GLOBAL<<CLCTL_GLOBAL_SHIFT |
0x800000 |
The CLUSCTL_RESOURCE_STORAGE_CLUSTER_DISK and CLUSCTL_RESOURCE_NETNAME_CREDS_UPDATED control codes are the only global control codes.
Modify Bit (bit 22)
The modify bit indicates whether the control code causes a modification to data that, in turn, may generate an event notification. Possible values:
Name | Value |
---|---|
CLUS_NO_MODIFY |
0x0 |
CLUS_MODIFY<<CLCTL_MODIFY_SHIFT |
0x400000 |
User Bit (bit 21)
The user bit indicates whether the control code is user-defined or defined by Windows Failover Clustering. Possible values:
Name | Value |
---|---|
CLCTL_CLUSTER_BASE |
0x0 |
CLCTL_USER_BASE |
0x200000 |
Internal/External Bit (bit 20)
The internal/external bit categorizes the control code as either internal or external. Internal control codes set this bit; external control codes do not. An internal control code can be used only by the Cluster service, meaning that applications cannot pass internal control codes as parameters to the control functions of the Cluster API. Internal control codes are typically sent by the Cluster service to notify a resource or resource typeof an event. The external control codes are used by applications to initiate an operation. Their possible values are the following:
Name | Value |
---|---|
External |
0x0 |
Internal (1<<CLCTL_INTERNAL_SHIFT) |
0x100000 |
Operation Code (bits 0 19)
The operation code describes the operation that a control code will perform. The procedures for using control codes that have different object codes but the same operation code are nearly identical. For more information, see Using Control Codes.
The following operation codes apply to all or most cluster objects:
- CLCTL_ENUM_COMMON_PROPERTIES
- CLCTL_ENUM_PRIVATE_PROPERTIES
- CLCTL_GET_CHARACTERISTICS
- CLCTL_GET_COMMON_PROPERTIES
- CLCTL_GET_COMMON_PROPERTY_FMTS
- CLCTL_GET_FLAGS
- CLCTL_GET_ID (not for resources or resource types)
- CLCTL_GET_NAME
- CLCTL_GET_PRIVATE_PROPERTIES
- CLCTL_GET_PRIVATE_PROPERTY_FMTS
- CLCTL_GET_RO_COMMON_PROPERTIES
- CLCTL_GET_RO_PRIVATE_PROPERTIES
- CLCTL_SET_COMMON_PROPERTIES
- CLCTL_SET_PRIVATE_PROPERTIES
- CLCTL_UNKNOWN
- CLCTL_VALIDATE_COMMON_PROPERTIES
- CLCTL_VALIDATE_PRIVATE_PROPERTIES
ClusAPI.h defines other operation codes that are object-specific, particularly for resources and resource types. For a complete list, see the CLCTL_CODES enumeration.
Access Code (bits 0 1)
The access code (the lower two bits of the Operation Code) indicates whether the initiator of the request requires any specific type of access to perform the operation described by the operation code. Possible values:
Name | Value |
---|---|
CLUS_ACCESS_ANY |
0x0 |
CLUS_ACCESS_READ |
0x1 |
CLUS_ACCESS_WRITE |
0x2 |