[PATCHES] more clusapi testing

Günther Deschner gd at samba.org
Wed Jul 27 15:20:36 UTC 2016


Hi,

attached some more patches for the cluster management protocol testing.

Please review & push,

Thanks,
Guenther
-- 
Günther Deschner                    GPG-ID: 8EE11688
Red Hat                         gdeschner at redhat.com
Samba Team                              gd at samba.org
-------------- next part --------------
From 5dc7b13558b25e352c0be4dd21a339dea3bf8b38 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?G=C3=BCnther=20Deschner?= <gd at samba.org>
Date: Mon, 2 May 2016 14:53:13 +0200
Subject: [PATCH 01/13] s4-torture: test multiple different cluster control
 codes.

Guenther

Signed-off-by: Guenther Deschner <gd at samba.org>
---
 source4/torture/rpc/clusapi.c | 23 +++++++++++++++++++----
 1 file changed, 19 insertions(+), 4 deletions(-)

diff --git a/source4/torture/rpc/clusapi.c b/source4/torture/rpc/clusapi.c
index d59f24f..986f263 100644
--- a/source4/torture/rpc/clusapi.c
+++ b/source4/torture/rpc/clusapi.c
@@ -2217,7 +2217,8 @@ static bool test_SetServiceAccountPassword(struct torture_context *tctx,
 
 static bool test_ClusterControl_int(struct torture_context *tctx,
 				    struct dcerpc_pipe *p,
-				    struct policy_handle *Cluster)
+				    struct policy_handle *Cluster,
+				    enum clusapi_ClusterControlCode dwControlCode)
 {
 	struct dcerpc_binding_handle *b = p->binding_handle;
 	struct clusapi_ClusterControl r;
@@ -2243,7 +2244,7 @@ static bool test_ClusterControl_int(struct torture_context *tctx,
 		WERR_INVALID_FUNCTION,
 		"ClusterControl failed");
 
-	r.in.dwControlCode = CLUSCTL_CLUSTER_GET_RO_COMMON_PROPERTIES;
+	r.in.dwControlCode = dwControlCode;
 
 	torture_assert_ntstatus_ok(tctx,
 		dcerpc_clusapi_ClusterControl_r(b, tctx, &r),
@@ -2263,7 +2264,7 @@ static bool test_ClusterControl_int(struct torture_context *tctx,
 	/* now try what happens when we query with a buffer large enough to hold
 	 * the entire packet */
 
-	r.in.nOutBufferSize = 0x400;
+	r.in.nOutBufferSize = 0xffff;
 	r.out.lpOutBuffer = talloc_zero_array(tctx, uint8_t, r.in.nOutBufferSize);
 
 	torture_assert_ntstatus_ok(tctx,
@@ -2285,13 +2286,27 @@ static bool test_ClusterControl(struct torture_context *tctx,
 		talloc_get_type_abort(data, struct torture_clusapi_context);
 	struct policy_handle Cluster;
 	bool ret;
+	uint32_t control_codes[] = {
+		CLUSCTL_CLUSTER_GET_COMMON_PROPERTIES,
+		CLUSCTL_CLUSTER_GET_RO_COMMON_PROPERTIES,
+		CLUSCTL_CLUSTER_GET_FQDN,
+		CLUSCTL_CLUSTER_GET_PRIVATE_PROPERTIES
+	};
+	int i;
 
 	if (!test_OpenCluster_int(tctx, t->p, &Cluster)) {
 		return false;
 	}
 
-	ret = test_ClusterControl_int(tctx, t->p, &Cluster);
+	for (i=0; i < ARRAY_SIZE(control_codes); i++) {
+		ret = test_ClusterControl_int(tctx, t->p, &Cluster,
+					      control_codes[i]);
+		if (!ret) {
+			goto done;
+		}
+	}
 
+ done:
 	test_CloseCluster_int(tctx, t->p, &Cluster);
 
 	return ret;
-- 
2.7.4


From 7b0df3793a817809126b35210f2329ed9f6cd095 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?G=C3=BCnther=20Deschner?= <gd at samba.org>
Date: Mon, 2 May 2016 17:07:04 +0200
Subject: [PATCH 02/13] librpc: add clusapi_ResourceTypeControlCode enum.

Guenther

Signed-off-by: Guenther Deschner <gd at samba.org>
---
 librpc/idl/clusapi.idl | 44 +++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 43 insertions(+), 1 deletion(-)

diff --git a/librpc/idl/clusapi.idl b/librpc/idl/clusapi.idl
index 8c4a227..38552c4 100644
--- a/librpc/idl/clusapi.idl
+++ b/librpc/idl/clusapi.idl
@@ -1078,11 +1078,53 @@ import "winreg.idl", "misc.idl";
 	/*****************/
 	/* Function 0x4B */
 
+	typedef [v1_enum] enum {
+		CLUSCTL_RESOURCE_TYPE_UNKNOWN				= 0x02000000,
+		CLUSCTL_RESOURCE_TYPE_GET_CHARACTERISTICS		= 0x02000005,
+		CLUSCTL_RESOURCE_TYPE_GET_FLAGS				= 0x02000009,
+		CLUSCTL_RESOURCE_TYPE_GET_CLASS_INFO			= 0x0200000D,
+		CLUSCTL_RESOURCE_TYPE_GET_REQUIRED_DEPENDENCIES		= 0x02000011,
+		CLUSCTL_RESOURCE_TYPE_GET_ARB_TIMEOUT			= 0x02000015,
+		CLUSCTL_RESOURCE_TYPE_ENUM_COMMON_PROPERTIES		= 0x02000051,
+		CLUSCTL_RESOURCE_TYPE_GET_RO_COMMON_PROPERTIES		= 0x02000055,
+		CLUSCTL_RESOURCE_TYPE_GET_COMMON_PROPERTIES		= 0x02000059,
+		CLUSCTL_RESOURCE_TYPE_SET_COMMON_PROPERTIES		= 0x0240005E,
+		CLUSCTL_RESOURCE_TYPE_VALIDATE_COMMON_PROPERTIES	= 0x02000061,
+		CLUSCTL_RESOURCE_TYPE_GET_COMMON_PROPERTY_FMTS		= 0x02000065,
+		CLUSCTL_RESOURCE_TYPE_GET_COMMON_RESOURCE_PROPERTY_FMTS = 0x02000069,
+		CLUSCTL_RESOURCE_TYPE_ENUM_PRIVATE_PROPERTIES		= 0x02000079,
+		CLUSCTL_RESOURCE_TYPE_GET_RO_PRIVATE_PROPERTIES		= 0x0200007D,
+		CLUSCTL_RESOURCE_TYPE_GET_PRIVATE_PROPERTIES		= 0x02000081,
+		CLUSCTL_RESOURCE_TYPE_SET_PRIVATE_PROPERTIES		= 0x02400086,
+		CLUSCTL_RESOURCE_TYPE_VALIDATE_PRIVATE_PROPERTIES	= 0x02000089,
+		CLUSCTL_RESOURCE_TYPE_GET_PRIVATE_PROPERTY_FMTS		= 0x0200008D,
+		CLUSCTL_RESOURCE_TYPE_GET_PRIVATE_RESOURCE_PROPERTY_FMTS= 0x02000091,
+		CLUSCTL_RESOURCE_TYPE_STORAGE_GET_AVAILABLE_DISKS	= 0x02000195,
+		CLUSCTL_RESOURCE_TYPE_NETNAME_VALIDATE_NETNAME		= 0x02000235,
+		CLUSCTL_RESOURCE_TYPE_VALIDATE_PATH			= 0x02000231,
+		CLUSCTL_RESOURCE_TYPE_GEN_APP_VALIDATE_DIRECTORY	= 0x02000239,
+		CLUSCTL_RESOURCE_TYPE_STORAGE_GET_DRIVELETTERS		= 0x020001ED,
+		CLUSCTL_RESOURCE_TYPE_STORAGE_GET_AVAILABLE_DISKS_EX	= 0x020001F5,
+		CLUSCTL_RESOURCE_TYPE_STORAGE_REMAP_DRIVELETTER		= 0x02000201,
+		CLUSCTL_RESOURCE_TYPE_STORAGE_GET_DISKID		= 0x02000205,
+		CLUSCTL_RESOURCE_TYPE_STORAGE_IS_CLUSTERABLE		= 0x02000209,
+		CLUSCTL_RESOURCE_TYPE_STORAGE_RELEASE_OWNERSHIP		= 0x0240020E,
+		CLUSCTL_RESOURCE_TYPE_STORAGE_IS_CSV_FILE		= 0x1000229,
+		CLUSCTL_RESOURCE_TYPE_CLOUD_WITNESS_VALIDATE_CREDENTIALS= 0x020020e1,
+		CLUSCTL_RESOURCE_TYPE_REPLICATION_GET_ELIGIBLE_LOGDISKS = 0x02002149,
+		CLUSCTL_RESOURCE_TYPE_REPLICATION_GET_ELIGIBLE_TARGET_DATADISKS = 0x0200214D,
+		CLUSCTL_RESOURCE_TYPE_REPLICATION_GET_ELIGIBLE_SOURCE_DATADISKS = 0x02002151,
+		CLUSCTL_RESOURCE_TYPE_REPLICATION_GET_REPLICA_VOLUMES	= 0x02002159,
+		CLUSCTL_RESOURCE_TYPE_REPLICATION_GET_LOG_VOLUME	= 0x0200215D,
+		CLUSCTL_RESOURCE_TYPE_REPLICATION_GET_REPLICATED_DISKS	= 0x02002155,
+		CLUSCTL_RESOURCE_TYPE_REPLICATION_GET_RESOURCE_GROUP	= 0x02002161
+	} clusapi_ResourceTypeControlCode;
+
 	WERROR
 	clusapi_ResourceTypeControl(
 		[ in ] HCLUSTER_RPC hCluster,
 		[ in, string ] [charset(UTF16)] uint16 *lpszResourceTypeName,
-		[ in ] uint32 dwControlCode,
+		[ in ] clusapi_ResourceTypeControlCode dwControlCode,
 		[ in, unique, size_is(nInBufferSize) ] uint8 *lpInBuffer,
 		[ in ] uint32 nInBufferSize,
 		[ out, size_is(nOutBufferSize),
-- 
2.7.4


From 4125ed2e76d2da309ab70eed2edb0d65b662b162 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?G=C3=BCnther=20Deschner?= <gd at samba.org>
Date: Mon, 2 May 2016 17:53:38 +0200
Subject: [PATCH 03/13] s4-torture: Fix logic errors in node and group control
 clusapi tests.

Guenther

Signed-off-by: Guenther Deschner <gd at samba.org>
---
 source4/torture/rpc/clusapi.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/source4/torture/rpc/clusapi.c b/source4/torture/rpc/clusapi.c
index 986f263..7b7e06a 100644
--- a/source4/torture/rpc/clusapi.c
+++ b/source4/torture/rpc/clusapi.c
@@ -1522,12 +1522,12 @@ static bool test_NodeControl(struct torture_context *tctx,
 	}
 
 	ret = test_NodeControl_int(tctx, t->p, &hNode, CLUSCTL_NODE_GET_RO_COMMON_PROPERTIES);
-	if (ret) {
+	if (!ret) {
 		return false;
 	}
 
 	ret = test_NodeControl_int(tctx, t->p, &hNode, CLUSCTL_NODE_GET_ID);
-	if (ret) {
+	if (!ret) {
 		return false;
 	}
 
@@ -2006,12 +2006,12 @@ static bool test_GroupControl(struct torture_context *tctx,
 	}
 
 	ret = test_GroupControl_int(tctx, t->p, &hGroup, CLUSCTL_GROUP_GET_CHARACTERISTICS);
-	if (ret) {
+	if (!ret) {
 		return false;
 	}
 
 	ret = test_GroupControl_int(tctx, t->p, &hGroup, CLUSCTL_GROUP_GET_RO_COMMON_PROPERTIES);
-	if (ret) {
+	if (!ret) {
 		return false;
 	}
 
-- 
2.7.4


From 0f92e22ded9b9f8c0cba94992e0c12575fe0cdfa Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?G=C3=BCnther=20Deschner?= <gd at samba.org>
Date: Tue, 3 May 2016 11:19:38 +0200
Subject: [PATCH 04/13] s4-torture: add new tests for clusapi resourcetypes.

Guenther

Signed-off-by: Guenther Deschner <gd at samba.org>
---
 source4/torture/rpc/clusapi.c | 176 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 176 insertions(+)

diff --git a/source4/torture/rpc/clusapi.c b/source4/torture/rpc/clusapi.c
index 7b7e06a..73fb4a6 100644
--- a/source4/torture/rpc/clusapi.c
+++ b/source4/torture/rpc/clusapi.c
@@ -1148,6 +1148,129 @@ static bool test_GetResourceNetworkName(struct torture_context *tctx,
 	return ret;
 }
 
+static bool test_ResourceTypeControl_int(struct torture_context *tctx,
+					 struct dcerpc_pipe *p,
+					 struct policy_handle *Cluster,
+					 const char *resource_type,
+					 enum clusapi_ClusterControlCode dwControlCode)
+{
+	struct dcerpc_binding_handle *b = p->binding_handle;
+	struct clusapi_ResourceTypeControl r;
+	uint32_t lpBytesReturned;
+	uint32_t lpcbRequired;
+	WERROR rpc_status;
+
+	r.in.hCluster = *Cluster;
+	r.in.lpszResourceTypeName = resource_type;
+	r.in.dwControlCode = 0;
+	r.in.lpInBuffer = NULL;
+	r.in.nInBufferSize = 0;
+	r.in.nOutBufferSize = 0;
+	r.out.lpOutBuffer = NULL;
+	r.out.lpBytesReturned = &lpBytesReturned;
+	r.out.lpcbRequired = &lpcbRequired;
+	r.out.rpc_status = &rpc_status;
+
+	torture_assert_ntstatus_ok(tctx,
+		dcerpc_clusapi_ResourceTypeControl_r(b, tctx, &r),
+		"ResourceTypeControl failed");
+
+	if (strequal(r.in.lpszResourceTypeName, "MSMQ") ||
+	    strequal(r.in.lpszResourceTypeName, "MSMQTriggers")) {
+		torture_assert_werr_equal(tctx,
+			r.out.result,
+			WERR_CLUSTER_RESTYPE_NOT_SUPPORTED,
+			"ResourceTypeControl failed");
+		return true;
+	}
+
+	torture_assert_werr_equal(tctx,
+		r.out.result,
+		WERR_INVALID_FUNCTION,
+		"ResourceTypeControl failed");
+
+	r.in.dwControlCode = dwControlCode;
+
+	torture_assert_ntstatus_ok(tctx,
+		dcerpc_clusapi_ResourceTypeControl_r(b, tctx, &r),
+		"ResourceTypeControl failed");
+
+	if (W_ERROR_EQUAL(r.out.result, WERR_MORE_DATA)) {
+		r.out.lpOutBuffer = talloc_zero_array(tctx, uint8_t, *r.out.lpcbRequired);
+		r.in.nOutBufferSize = *r.out.lpcbRequired;
+		torture_assert_ntstatus_ok(tctx,
+			dcerpc_clusapi_ResourceTypeControl_r(b, tctx, &r),
+			"ResourceTypeControl failed");
+	}
+	torture_assert_werr_ok(tctx,
+		r.out.result,
+		"ResourceTypeControl failed");
+
+	/* now try what happens when we query with a buffer large enough to hold
+	 * the entire packet */
+
+	r.in.nOutBufferSize = 0x400;
+	r.out.lpOutBuffer = talloc_zero_array(tctx, uint8_t, r.in.nOutBufferSize);
+
+	torture_assert_ntstatus_ok(tctx,
+		dcerpc_clusapi_ResourceTypeControl_r(b, tctx, &r),
+		"ResourceTypeControl failed");
+	torture_assert_werr_ok(tctx,
+		r.out.result,
+		"ResourceTypeControl failed");
+	torture_assert(tctx, *r.out.lpBytesReturned < r.in.nOutBufferSize,
+		"lpBytesReturned expected to be smaller than input size nOutBufferSize");
+
+	return true;
+}
+
+static bool test_ResourceTypeControl(struct torture_context *tctx,
+				     struct dcerpc_pipe *p,
+				     const char *resourcetype_name)
+{
+	struct policy_handle Cluster;
+	bool ret;
+	uint32_t control_codes[] = {
+		CLUSCTL_RESOURCE_TYPE_GET_CLASS_INFO,
+		CLUSCTL_RESOURCE_TYPE_GET_CHARACTERISTICS,
+		CLUSCTL_RESOURCE_TYPE_GET_COMMON_PROPERTIES,
+		CLUSCTL_RESOURCE_TYPE_GET_RO_COMMON_PROPERTIES,
+		CLUSCTL_RESOURCE_TYPE_GET_PRIVATE_PROPERTIES
+	};
+	int i;
+
+	if (!test_OpenCluster_int(tctx, p, &Cluster)) {
+		return false;
+	}
+
+	for (i=0; i < ARRAY_SIZE(control_codes); i++) {
+		ret = test_ResourceTypeControl_int(tctx, p, &Cluster,
+						   resourcetype_name,
+						   control_codes[i]);
+		if (!ret) {
+			goto done;
+		}
+	}
+
+ done:
+	test_CloseCluster_int(tctx, p, &Cluster);
+
+	return ret;
+}
+
+
+
+static bool test_one_resourcetype(struct torture_context *tctx,
+				  struct dcerpc_pipe *p,
+				  const char *resourcetype_name)
+{
+	torture_assert(tctx,
+		test_ResourceTypeControl(tctx, p, resourcetype_name),
+		"failed to query ResourceTypeControl");
+
+	return true;
+}
+
 static bool test_one_resource(struct torture_context *tctx,
 			      struct dcerpc_pipe *p,
 			      const char *resource_name)
@@ -1224,6 +1347,44 @@ static bool test_all_resources(struct torture_context *tctx,
 	return true;
 }
 
+static bool test_all_resourcetypes(struct torture_context *tctx,
+				   void *data)
+{
+	struct torture_clusapi_context *t =
+		talloc_get_type_abort(data, struct torture_clusapi_context);
+	struct dcerpc_binding_handle *b = t->p->binding_handle;
+	struct clusapi_CreateEnum r;
+	uint32_t dwType = CLUSTER_ENUM_RESTYPE;
+	struct ENUM_LIST *ReturnEnum;
+	WERROR rpc_status;
+	int i;
+
+	r.in.dwType = dwType;
+	r.out.ReturnEnum = &ReturnEnum;
+	r.out.rpc_status = &rpc_status;
+
+	torture_assert_ntstatus_ok(tctx,
+		dcerpc_clusapi_CreateEnum_r(b, tctx, &r),
+		"CreateEnum failed");
+	torture_assert_werr_ok(tctx,
+		r.out.result,
+		"CreateEnum failed");
+
+	for (i=0; i < ReturnEnum->EntryCount; i++) {
+
+		struct ENUM_ENTRY e = ReturnEnum->Entry[i];
+
+		torture_assert_int_equal(tctx, e.Type, CLUSTER_ENUM_RESTYPE, "type mismatch");
+
+		torture_assert(tctx,
+			test_one_resourcetype(tctx, t->p, e.Name),
+			"failed to test one resourcetype");
+	}
+
+	return true;
+}
+
+
 static bool test_OpenNode_int(struct torture_context *tctx,
 			      struct dcerpc_pipe *p,
 			      const char *lpszNodeName,
@@ -3375,6 +3536,12 @@ void torture_tcase_resource(struct torture_tcase *tcase)
 				      test_all_resources);
 }
 
+void torture_tcase_resourcetype(struct torture_tcase *tcase)
+{
+	torture_tcase_add_simple_test(tcase, "all_resourcetypes",
+				      test_all_resourcetypes);
+}
+
 void torture_tcase_node(struct torture_tcase *tcase)
 {
 	struct torture_test *test;
@@ -3495,6 +3662,15 @@ struct torture_suite *torture_rpc_clusapi(TALLOC_CTX *mem_ctx)
 
 	torture_tcase_resource(tcase);
 
+	tcase = torture_suite_add_tcase(suite, "resourcetype");
+
+	torture_tcase_set_fixture(tcase,
+				  torture_rpc_clusapi_setup,
+				  torture_rpc_clusapi_teardown);
+
+	torture_tcase_resourcetype(tcase);
+
+
 	tcase = torture_suite_add_tcase(suite, "node");
 
 	torture_tcase_set_fixture(tcase,
-- 
2.7.4


From 1fcdab7c34a2ce4f6c41ccb9cf75242bcc667bf4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?G=C3=BCnther=20Deschner?= <gd at samba.org>
Date: Tue, 3 May 2016 12:58:07 +0200
Subject: [PATCH 05/13] librpc: add ClusterGroupEnumType enum to IDL.

Guenther

Signed-off-by: Guenther Deschner <gd at samba.org>
---
 librpc/idl/clusapi.idl | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/librpc/idl/clusapi.idl b/librpc/idl/clusapi.idl
index 38552c4..c172aaa 100644
--- a/librpc/idl/clusapi.idl
+++ b/librpc/idl/clusapi.idl
@@ -791,10 +791,15 @@ import "winreg.idl", "misc.idl";
 	/*****************/
 	/* Function 0x35 */
 
+	typedef [bitmap32bit] bitmap {
+		CLUSTER_GROUP_ENUM_CONTAINS		= 0x00000001,
+		CLUSTER_GROUP_ENUM_NODES		= 0x00000002
+	} ClusterGroupEnumType;
+
 	WERROR
 	clusapi_CreateGroupResourceEnum(
 		[ in ] HGROUP_RPC hGroup,
-		[ in ] uint32 dwType,
+		[ in ] ClusterGroupEnumType dwType,
 		[ out ] ENUM_LIST **ReturnEnum,
 		[ out ] WERROR *rpc_status
 	);
-- 
2.7.4


From 91eb4da9cf8f2dd1d6552d6fd7ea01bda60c5173 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?G=C3=BCnther=20Deschner?= <gd at samba.org>
Date: Tue, 3 May 2016 12:59:24 +0200
Subject: [PATCH 06/13] s4-torture: add test for
 clusapi_CreateGroupResourceEnum

Guenther

Signed-off-by: Guenther Deschner <gd at samba.org>
---
 source4/torture/rpc/clusapi.c | 58 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 58 insertions(+)

diff --git a/source4/torture/rpc/clusapi.c b/source4/torture/rpc/clusapi.c
index 73fb4a6..3d5ba62 100644
--- a/source4/torture/rpc/clusapi.c
+++ b/source4/torture/rpc/clusapi.c
@@ -2154,6 +2154,60 @@ static bool test_GroupControl_int(struct torture_context *tctx,
 	return true;
 }
 
+static bool test_CreateGroupResourceEnum_int(struct torture_context *tctx,
+					     struct dcerpc_pipe *p,
+					     struct policy_handle *hGroup)
+{
+	struct dcerpc_binding_handle *b = p->binding_handle;
+	struct clusapi_CreateGroupResourceEnum r;
+	uint32_t dwType[] = {
+		CLUSTER_GROUP_ENUM_CONTAINS,
+		CLUSTER_GROUP_ENUM_NODES
+	};
+	uint32_t dwType_invalid[] = {
+		0x00000040,
+		0x00000080,
+		0x00000100 /* and many more ... */
+	};
+	struct ENUM_LIST *ReturnEnum;
+	WERROR rpc_status;
+	int i;
+
+	r.in.hGroup = *hGroup;
+
+	for (i=0; i < ARRAY_SIZE(dwType); i++) {
+
+		r.in.hGroup = *hGroup;
+		r.in.dwType = dwType[i];
+		r.out.ReturnEnum = &ReturnEnum;
+		r.out.rpc_status = &rpc_status;
+
+		torture_assert_ntstatus_ok(tctx,
+			dcerpc_clusapi_CreateGroupResourceEnum_r(b, tctx, &r),
+			"CreateGroupResourceEnum failed");
+		torture_assert_werr_ok(tctx,
+			r.out.result,
+			"CreateGroupResourceEnum failed");
+	}
+
+	for (i=0; i < ARRAY_SIZE(dwType_invalid); i++) {
+
+		r.in.dwType = dwType_invalid[i];
+		r.out.ReturnEnum = &ReturnEnum;
+		r.out.rpc_status = &rpc_status;
+
+		torture_assert_ntstatus_ok(tctx,
+			dcerpc_clusapi_CreateGroupResourceEnum_r(b, tctx, &r),
+			"CreateGroupResourceEnum failed");
+		torture_assert_werr_ok(tctx,
+			r.out.result,
+			"CreateGroupResourceEnum failed");
+	}
+
+	return true;
+}
+
+
 static bool test_GroupControl(struct torture_context *tctx,
 			      void *data)
 {
@@ -2283,6 +2337,10 @@ static bool test_one_group(struct torture_context *tctx,
 		test_GetGroupState_int(tctx, p, &hGroup),
 		"failed to query group id");
 
+	torture_assert(tctx,
+		test_CreateGroupResourceEnum_int(tctx, p, &hGroup),
+		"failed to query resource enum");
+
 	test_CloseGroup_int(tctx, p, &hGroup);
 
 	return true;
-- 
2.7.4


From 568955d9821bfca39f34d5f36a362f328080b5d9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?G=C3=BCnther=20Deschner?= <gd at samba.org>
Date: Tue, 3 May 2016 17:18:40 +0200
Subject: [PATCH 07/13] librpc: add CLUS_RESOURCE_CLASS_INFO to IDL

Guenther

Signed-off-by: Guenther Deschner <gd at samba.org>
---
 librpc/idl/clusapi.idl | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/librpc/idl/clusapi.idl b/librpc/idl/clusapi.idl
index c172aaa..4988a38 100644
--- a/librpc/idl/clusapi.idl
+++ b/librpc/idl/clusapi.idl
@@ -1047,6 +1047,17 @@ import "winreg.idl", "misc.idl";
 	/*****************/
 	/* Function 0x49 */
 
+	typedef [v1_enum] enum {
+		CLUS_RESCLASS_UNKNOWN	= 0x00000000,
+		CLUS_RESCLASS_STORAGE	= 0x00000001,
+		CLUS_RESCLASS_NETWORK	= 0x00000002
+	} clusapi_ResourceClass;
+
+	typedef [public] struct {
+		clusapi_ResourceClass Class;
+		uint32 SubClass;
+	} CLUS_RESOURCE_CLASS_INFO;
+
 	WERROR
 	clusapi_ResourceControl(
 		[ in ] HRES_RPC hResource,
-- 
2.7.4


From 30ddf4a628674cf642b14d6a418082213c9abc18 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?G=C3=BCnther=20Deschner?= <gd at samba.org>
Date: Tue, 3 May 2016 17:38:29 +0200
Subject: [PATCH 08/13] s4-torture: test CLUSCTL_GROUP_GET_FLAGS GroupControl.

Guenther

Signed-off-by: Guenther Deschner <gd at samba.org>
---
 source4/torture/rpc/clusapi.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/source4/torture/rpc/clusapi.c b/source4/torture/rpc/clusapi.c
index 3d5ba62..d806dfb 100644
--- a/source4/torture/rpc/clusapi.c
+++ b/source4/torture/rpc/clusapi.c
@@ -2230,6 +2230,11 @@ static bool test_GroupControl(struct torture_context *tctx,
 		return false;
 	}
 
+	ret = test_GroupControl_int(tctx, t->p, &hGroup, CLUSCTL_GROUP_GET_FLAGS);
+	if (!ret) {
+		return false;
+	}
+
 	test_CloseGroup_int(tctx, t->p, &hGroup);
 
 	return ret;
@@ -2338,6 +2343,10 @@ static bool test_one_group(struct torture_context *tctx,
 		"failed to query group id");
 
 	torture_assert(tctx,
+		test_GroupControl_int(tctx, p, &hGroup, CLUSCTL_GROUP_GET_FLAGS),
+		"failed to query group control");
+
+	torture_assert(tctx,
 		test_CreateGroupResourceEnum_int(tctx, p, &hGroup),
 		"failed to query resource enum");
 
-- 
2.7.4


From 316f1d3c1d9806223f5ff72ce59e1504bfcf9a26 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?G=C3=BCnther=20Deschner?= <gd at samba.org>
Date: Wed, 4 May 2016 00:39:48 +0200
Subject: [PATCH 09/13] s4-torture: add test for CreateResTypeEnum().

Guenther

Signed-off-by: Guenther Deschner <gd at samba.org>
---
 source4/torture/rpc/clusapi.c | 101 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 101 insertions(+)

diff --git a/source4/torture/rpc/clusapi.c b/source4/torture/rpc/clusapi.c
index d806dfb..f8779f3 100644
--- a/source4/torture/rpc/clusapi.c
+++ b/source4/torture/rpc/clusapi.c
@@ -2540,6 +2540,105 @@ static bool test_ClusterControl(struct torture_context *tctx,
 	return ret;
 }
 
+static bool test_CreateResTypeEnum(struct torture_context *tctx,
+				   void *data)
+{
+	struct torture_clusapi_context *t =
+		talloc_get_type_abort(data, struct torture_clusapi_context);
+	struct dcerpc_binding_handle *b = t->p->binding_handle;
+	struct clusapi_CreateResTypeEnum r;
+	uint32_t dwType[] = {
+		CLUSTER_RESOURCE_TYPE_ENUM_NODES,
+		CLUSTER_RESOURCE_TYPE_ENUM_RESOURCES
+	};
+	uint32_t dwType_invalid[] = {
+		0x00000040,
+		0x00000080,
+		0x00000100 /* and many more ... */
+	};
+	const char *valid_names[] = {
+		"Physical Disk",
+		"Storage Pool"
+	};
+	const char *invalid_names[] = {
+		"INVALID_TYPE_XXXX"
+	};
+	struct ENUM_LIST *ReturnEnum;
+	WERROR rpc_status;
+	int i, s;
+
+	for (s = 0; s < ARRAY_SIZE(valid_names); s++) {
+
+		r.in.lpszTypeName = valid_names[s];
+
+		for (i=0; i < ARRAY_SIZE(dwType); i++) {
+
+			r.in.dwType = dwType[i];
+			r.out.ReturnEnum = &ReturnEnum;
+			r.out.rpc_status = &rpc_status;
+
+			torture_assert_ntstatus_ok(tctx,
+				dcerpc_clusapi_CreateResTypeEnum_r(b, tctx, &r),
+				"CreateResTypeEnum failed");
+			torture_assert_werr_ok(tctx,
+				r.out.result,
+				"CreateResTypeEnum failed");
+		}
+
+		for (i=0; i < ARRAY_SIZE(dwType_invalid); i++) {
+
+			r.in.dwType = dwType_invalid[i];
+			r.out.ReturnEnum = &ReturnEnum;
+			r.out.rpc_status = &rpc_status;
+
+			torture_assert_ntstatus_ok(tctx,
+				dcerpc_clusapi_CreateResTypeEnum_r(b, tctx, &r),
+				"CreateResTypeEnum failed");
+			torture_assert_werr_ok(tctx,
+				r.out.result,
+				"CreateResTypeEnum failed");
+		}
+	}
+
+	for (s = 0; s < ARRAY_SIZE(invalid_names); s++) {
+
+		r.in.lpszTypeName = invalid_names[s];
+
+		for (i=0; i < ARRAY_SIZE(dwType); i++) {
+
+			r.in.dwType = dwType[i];
+			r.out.ReturnEnum = &ReturnEnum;
+			r.out.rpc_status = &rpc_status;
+
+			torture_assert_ntstatus_ok(tctx,
+				dcerpc_clusapi_CreateResTypeEnum_r(b, tctx, &r),
+				"CreateResTypeEnum failed");
+			torture_assert_werr_equal(tctx,
+				r.out.result,
+				WERR_CLUSTER_RESOURCE_TYPE_NOT_FOUND,
+				"CreateResTypeEnum failed");
+		}
+
+		for (i=0; i < ARRAY_SIZE(dwType_invalid); i++) {
+
+			r.in.dwType = dwType_invalid[i];
+			r.out.ReturnEnum = &ReturnEnum;
+			r.out.rpc_status = &rpc_status;
+
+			torture_assert_ntstatus_ok(tctx,
+				dcerpc_clusapi_CreateResTypeEnum_r(b, tctx, &r),
+				"CreateResTypeEnum failed");
+			torture_assert_werr_equal(tctx,
+				r.out.result,
+				WERR_CLUSTER_RESOURCE_TYPE_NOT_FOUND,
+				"CreateResTypeEnum failed");
+		}
+	}
+
+
+	return true;
+}
+
 static bool test_OpenNetwork_int(struct torture_context *tctx,
 				 struct dcerpc_pipe *p,
 				 const char *lpszNetworkName,
@@ -3556,6 +3655,8 @@ void torture_tcase_cluster(struct torture_tcase *tcase)
 				      test_SetServiceAccountPassword);
 	torture_tcase_add_simple_test(tcase, "ClusterControl",
 				      test_ClusterControl);
+	torture_tcase_add_simple_test(tcase, "CreateResTypeEnum",
+				      test_CreateResTypeEnum);
 
 }
 
-- 
2.7.4


From b814a3a1302b505ed057de7dd580e02054839709 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?G=C3=BCnther=20Deschner?= <gd at samba.org>
Date: Wed, 4 May 2016 00:40:10 +0200
Subject: [PATCH 10/13] librpc: add ClusterResTypeEnumType to IDL.

Guenther

Signed-off-by: Guenther Deschner <gd at samba.org>
---
 librpc/idl/clusapi.idl | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/librpc/idl/clusapi.idl b/librpc/idl/clusapi.idl
index 4988a38..f4448d6 100644
--- a/librpc/idl/clusapi.idl
+++ b/librpc/idl/clusapi.idl
@@ -1565,10 +1565,15 @@ import "winreg.idl", "misc.idl";
 	/*****************/
 	/* Function 0x67 */
 
+	typedef [bitmap32bit] bitmap {
+		CLUSTER_RESOURCE_TYPE_ENUM_NODES	= 0x00000001,
+		CLUSTER_RESOURCE_TYPE_ENUM_RESOURCES	= 0x00000002
+	} ClusterResTypeEnumType;
+
 	WERROR
 	clusapi_CreateResTypeEnum(
 		[ in, string ] [charset(UTF16)] uint16 *lpszTypeName,
-		[ in ] uint32 dwType,
+		[ in ] ClusterResTypeEnumType dwType,
 		[ out ] ENUM_LIST **ReturnEnum,
 		[ out ] WERROR *rpc_status
 	);
-- 
2.7.4


From 73bf03f605c4d5f0232fbfa8be1cdccb27e0c612 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?G=C3=BCnther=20Deschner?= <gd at samba.org>
Date: Wed, 4 May 2016 01:34:20 +0200
Subject: [PATCH 11/13] s4-torture: add test for CreateGroupEnum.

Guenther

Signed-off-by: Guenther Deschner <gd at samba.org>
---
 source4/torture/rpc/clusapi.c | 114 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 114 insertions(+)

diff --git a/source4/torture/rpc/clusapi.c b/source4/torture/rpc/clusapi.c
index f8779f3..a3acb64 100644
--- a/source4/torture/rpc/clusapi.c
+++ b/source4/torture/rpc/clusapi.c
@@ -2639,6 +2639,118 @@ static bool test_CreateResTypeEnum(struct torture_context *tctx,
 	return true;
 }
 
+static bool test_CreateGroupEnum_int(struct torture_context *tctx,
+				     struct dcerpc_pipe *p,
+				     struct policy_handle *Cluster,
+				     const char **multi_sz,
+				     const char **multi_sz_ro)
+{
+	struct dcerpc_binding_handle *b = p->binding_handle;
+	struct clusapi_CreateGroupEnum r;
+	struct GROUP_ENUM_LIST *pResultList;
+	WERROR rpc_status;
+	DATA_BLOB blob = data_blob_null;
+	DATA_BLOB blob_ro = data_blob_null;
+
+	r.in.hCluster = *Cluster;
+	r.in.pProperties = blob.data;
+	r.in.cbProperties = blob.length;
+	r.in.pRoProperties = blob_ro.data;
+	r.in.cbRoProperties = blob_ro.length;
+	r.out.ppResultList = &pResultList;
+	r.out.rpc_status = &rpc_status;
+
+	torture_assert_ntstatus_ok(tctx,
+		dcerpc_clusapi_CreateGroupEnum_r(b, tctx, &r),
+		"CreateGroupEnum failed");
+	torture_assert_werr_ok(tctx,
+		r.out.result,
+		"CreateGroupEnum failed");
+
+	if (!push_reg_multi_sz(tctx, &blob, multi_sz)) {
+		return false;
+	}
+
+	if (!push_reg_multi_sz(tctx, &blob_ro, multi_sz_ro)) {
+		return false;
+	}
+
+	r.in.pProperties = blob.data;
+	r.in.cbProperties = blob.length;
+
+	r.in.pRoProperties = blob_ro.data;
+	r.in.cbRoProperties = blob_ro.length;
+
+	torture_assert_ntstatus_ok(tctx,
+		dcerpc_clusapi_CreateGroupEnum_r(b, tctx, &r),
+		"CreateGroupEnum failed");
+	torture_assert_werr_ok(tctx,
+		r.out.result,
+		"CreateGroupEnum failed");
+
+#if 0
+	{
+		int i;
+		enum ndr_err_code ndr_err;
+
+		for (i=0; i < pResultList->EntryCount; i++) {
+			struct clusapi_PROPERTY_LIST list;
+			torture_comment(tctx, "entry #%d\n", i);
+
+			blob = data_blob_const(pResultList->Entry[i].Properties,
+					       pResultList->Entry[i].cbProperties);
+
+			ndr_err = ndr_pull_struct_blob(&blob, tctx, &list,
+				(ndr_pull_flags_fn_t)ndr_pull_clusapi_PROPERTY_LIST);
+			if (NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+				NDR_PRINT_DEBUG(clusapi_PROPERTY_LIST, &list);
+			}
+
+			blob_ro = data_blob_const(pResultList->Entry[i].RoProperties,
+						  pResultList->Entry[i].cbRoProperties);
+
+			ndr_err = ndr_pull_struct_blob(&blob_ro, tctx, &list,
+				(ndr_pull_flags_fn_t)ndr_pull_clusapi_PROPERTY_LIST);
+			if (NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+				NDR_PRINT_DEBUG(clusapi_PROPERTY_LIST, &list);
+			}
+		}
+	}
+#endif
+
+	return true;
+}
+
+static bool test_CreateGroupEnum(struct torture_context *tctx,
+				 void *data)
+{
+	struct torture_clusapi_context *t =
+		talloc_get_type_abort(data, struct torture_clusapi_context);
+	struct policy_handle Cluster;
+	bool ret;
+	const char *multi_sz[] = {
+		"Priority", NULL,
+	};
+	const char *multi_sz_ro[] = {
+		"GroupType", NULL,
+	};
+
+	if (!test_OpenCluster_int(tctx, t->p, &Cluster)) {
+		return false;
+	}
+
+	ret = test_CreateGroupEnum_int(tctx, t->p, &Cluster,
+				       multi_sz, multi_sz_ro);
+	if (!ret) {
+		goto done;
+	}
+
+ done:
+	test_CloseCluster_int(tctx, t->p, &Cluster);
+
+	return ret;
+}
+
 static bool test_OpenNetwork_int(struct torture_context *tctx,
 				 struct dcerpc_pipe *p,
 				 const char *lpszNetworkName,
@@ -3657,6 +3769,8 @@ void torture_tcase_cluster(struct torture_tcase *tcase)
 				      test_ClusterControl);
 	torture_tcase_add_simple_test(tcase, "CreateResTypeEnum",
 				      test_CreateResTypeEnum);
+	torture_tcase_add_simple_test(tcase, "CreateGroupEnum",
+				      test_CreateGroupEnum);
 
 }
 
-- 
2.7.4


From c95c84eca9e083b8872b493bc598cf7091957b83 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?G=C3=BCnther=20Deschner?= <gd at samba.org>
Date: Sat, 7 May 2016 01:24:28 +0200
Subject: [PATCH 12/13] s4-torture: also test CLUSCTL_CLUSTER_CHECK_VOTER_DOWN.

Guenther

Signed-off-by: Guenther Deschner <gd at samba.org>
---
 source4/torture/rpc/clusapi.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/source4/torture/rpc/clusapi.c b/source4/torture/rpc/clusapi.c
index a3acb64..eebfa38 100644
--- a/source4/torture/rpc/clusapi.c
+++ b/source4/torture/rpc/clusapi.c
@@ -2518,7 +2518,8 @@ static bool test_ClusterControl(struct torture_context *tctx,
 		CLUSCTL_CLUSTER_GET_COMMON_PROPERTIES,
 		CLUSCTL_CLUSTER_GET_RO_COMMON_PROPERTIES,
 		CLUSCTL_CLUSTER_GET_FQDN,
-		CLUSCTL_CLUSTER_GET_PRIVATE_PROPERTIES
+		CLUSCTL_CLUSTER_GET_PRIVATE_PROPERTIES,
+		CLUSCTL_CLUSTER_CHECK_VOTER_DOWN
 	};
 	int i;
 
-- 
2.7.4


From fdbf559b12f21eea28d8c7270d20e82cb64f7b55 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?G=C3=BCnther=20Deschner?= <gd at samba.org>
Date: Wed, 11 May 2016 14:18:02 +0200
Subject: [PATCH 13/13] librpc: add clusapi_ResourceControlCode to IDL.

Guenther

Signed-off-by: Guenther Deschner <gd at samba.org>
---
 librpc/idl/clusapi.idl | 64 +++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 63 insertions(+), 1 deletion(-)

diff --git a/librpc/idl/clusapi.idl b/librpc/idl/clusapi.idl
index f4448d6..6c86f10 100644
--- a/librpc/idl/clusapi.idl
+++ b/librpc/idl/clusapi.idl
@@ -1058,10 +1058,72 @@ import "winreg.idl", "misc.idl";
 		uint32 SubClass;
 	} CLUS_RESOURCE_CLASS_INFO;
 
+	typedef [v1_enum] enum {
+		CLUSCTL_RESOURCE_UNKNOWN			= 0x01000000,
+		CLUSCTL_RESOURCE_GET_CHARACTERISTICS		= 0x01000005,
+		CLUSCTL_RESOURCE_GET_FLAGS			= 0x01000009,
+		CLUSCTL_RESOURCE_GET_CLASS_INFO			= 0x0100000D,
+		CLUSCTL_RESOURCE_GET_REQUIRED_DEPENDENCIES	= 0x01000011,
+		CLUSCTL_RESOURCE_GET_NAME			= 0x01000029,
+		CLUSCTL_RESOURCE_GET_RESOURCE_TYPE		= 0x0100002D,
+		CLUSCTL_RESOURCE_GET_ID				= 0x01000039,
+		CLUSCTL_RESOURCE_ENUM_COMMON_PROPERTIES		= 0x01000051,
+		CLUSCTL_RESOURCE_GET_RO_COMMON_PROPERTIES	= 0x01000055,
+		CLUSCTL_RESOURCE_GET_COMMON_PROPERTIES		= 0x01000059,
+		CLUSCTL_RESOURCE_SET_COMMON_PROPERTIES		= 0x0140005E,
+		CLUSCTL_RESOURCE_VALIDATE_COMMON_PROPERTIES	= 0x01000061,
+		CLUSCTL_RESOURCE_GET_COMMON_PROPERTY_FMTS	= 0x01000065,
+		CLUSCTL_RESOURCE_ENUM_PRIVATE_PROPERTIES	= 0x01000079,
+		CLUSCTL_RESOURCE_GET_RO_PRIVATE_PROPERTIES	= 0x0100007D,
+		CLUSCTL_RESOURCE_GET_PRIVATE_PROPERTIES		= 0x01000081,
+		CLUSCTL_RESOURCE_SET_PRIVATE_PROPERTIES		= 0x01400086,
+		CLUSCTL_RESOURCE_VALIDATE_PRIVATE_PROPERTIES	= 0x01000089,
+		CLUSCTL_RESOURCE_GET_PRIVATE_PROPERTY_FMTS	= 0x0100008D,
+		CLUSCTL_RESOURCE_ADD_REGISTRY_CHECKPOINT	= 0x014000A2,
+		CLUSCTL_RESOURCE_DELETE_REGISTRY_CHECKPOINT	= 0x014000A6,
+		CLUSCTL_RESOURCE_GET_REGISTRY_CHECKPOINTS	= 0x010000A9,
+		CLUSCTL_RESOURCE_ADD_CRYPTO_CHECKPOINT		= 0x014000AE,
+		CLUSCTL_RESOURCE_DELETE_CRYPTO_CHECKPOINT	= 0x014000B2,
+		CLUSCTL_RESOURCE_GET_CRYPTO_CHECKPOINTS		= 0x010000B5,
+		CLUSCTL_RESOURCE_UPGRADE_DLL			= 0x014000BA,
+		CLUSCTL_RESOURCE_ADD_REGISTRY_CHECKPOINT_64BIT	= 0x014000BE,
+		CLUSCTL_RESOURCE_ADD_REGISTRY_CHECKPOINT_32BIT	= 0x014000C2,
+		CLUSCTL_RESOURCE_GET_NETWORK_NAME		= 0x01000169,
+		CLUSCTL_RESOURCE_NETNAME_REGISTER_DNS_RECORDS	= 0x01000172,
+		CLUSCTL_RESOURCE_GET_DNS_NAME			= 0x01000175,
+		CLUSCTL_RESOURCE_NETNAME_SET_PWD_INFO		= 0x0100017A,
+		CLUSCTL_RESOURCE_NETNAME_DELETE_CO		= 0x0100017E,
+		CLUSCTL_RESOURCE_NETNAME_VALIDATE_VCO		= 0x01000181,
+		CLUSCTL_RESOURCE_NETNAME_RESET_VCO		= 0x01000185,
+		CLUSCTL_RESOURCE_NETNAME_CREDS_UPDATED		= 0x01c0018a,
+		CLUSCTL_RESOURCE_STORAGE_GET_DISK_INFO		= 0x01000191,
+		CLUSCTL_RESOURCE_STORAGE_IS_PATH_VALID		= 0x01000199,
+		CLUSCTL_RESOURCE_IPADDRESS_RENEW_LEASE		= 0x014001BE,
+		CLUSCTL_RESOURCE_IPADDRESS_RELEASE_LEASE	= 0x014001C2,
+		CLUSCTL_RESOURCE_QUERY_MAINTENANCE_MODE		= 0x010001E1,
+		CLUSCTL_RESOURCE_SET_MAINTENANCE_MODE		= 0x014001E6,
+		CLUSCTL_RESOURCE_STORAGE_SET_DRIVELETTER	= 0x014001EA,
+		CLUSCTL_RESOURCE_STORAGE_GET_DISK_INFO_EX	= 0x010001F1,
+		CLUSCTL_RESOURCE_STORAGE_GET_DIRTY		= 0x01000219,
+		CLUSCTL_RESOURCE_STORAGE_GET_MOUNTPOINTS	= 0x01000211,
+		CLUSCTL_RESOURCE_STORAGE_GET_SHARED_VOLUME_INFO = 0x01000225,
+		CLUSCTL_RESOURCE_VM_START_MIGRATION		= 0x01600004,
+		CLUSCTL_RESOURCE_VM_CANCEL_MIGRATION		= 0x01600008,
+		CLUSCTL_RESOURCE_SET_CSV_MAINTENANCE_MODE	= 0x01400296,
+		CLUSCTL_RESOURCE_ENABLE_SHARED_VOLUME_DIRECTIO	= 0x0140028a,
+		CLUSCTL_RESOURCE_DISABLE_SHARED_VOLUME_DIRECTIO	= 0x0140028e,
+		CLUSCTL_RESOURCE_SET_SHARED_VOLUME_BACKUP_MODE	= 0x0140029a,
+		CLUSCTL_RESOURCE_GET_RELATED_RESOURCE_NAMES	= 0x01001fad,
+		CLUSCTL_RESOURCE_POOL_GET_DRIVE_INFO		= 0x010002b5,
+		CLUSCTL_RESOURCE_CLOUD_WITNESS_UPDATE_TOKEN	= 0x014020e6,
+		CLUSCTL_RESOURCE_NETNAME_CHECK_OU_PERMISSIONS	= 0x07002121,
+		CLUSCTL_RESOURCE_NETNAME_CHECK_AD_STATE		= 0x07002125
+	} clusapi_ResourceControlCode;
+
 	WERROR
 	clusapi_ResourceControl(
 		[ in ] HRES_RPC hResource,
-		[ in ] uint32 dwControlCode,
+		[ in ] clusapi_ResourceControlCode dwControlCode,
 		[ in, unique, size_is(nInBufferSize) ] uint8 *lpInBuffer,
 		[ in ] uint32 nInBufferSize,
 		[ out, size_is(nOutBufferSize),
-- 
2.7.4

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: OpenPGP digital signature
URL: <http://lists.samba.org/pipermail/samba-technical/attachments/20160727/559172ba/signature.sig>


More information about the samba-technical mailing list