summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/librpc/idl/winreg.idl19
-rw-r--r--source4/torture/rpc/winreg.c36
2 files changed, 53 insertions, 2 deletions
diff --git a/source4/librpc/idl/winreg.idl b/source4/librpc/idl/winreg.idl
index 370ca828b1..c80130c9af 100644
--- a/source4/librpc/idl/winreg.idl
+++ b/source4/librpc/idl/winreg.idl
@@ -174,6 +174,9 @@
/******************/
/* Function: 0x0d */
WERROR winreg_LoadKey(
+ [in,ref] policy_handle *handle,
+ [in] winreg_String *keyname,
+ [in] winreg_String *filename
);
/******************/
@@ -237,8 +240,8 @@
/* Function: 0x15 */
WERROR winreg_SetKeySecurity(
[in,ref] policy_handle *handle,
- [in] uint32 sec_info,
- [in] sec_desc_buf *sec_desc
+ [in] uint32 access_mask,
+ [in,out,ref] KeySecurityData *data
);
/******************/
@@ -295,9 +298,21 @@
[out,ref] policy_handle *handle
);
+ typedef struct {
+ winreg_String *name;
+ uint32 type;
+ uint32 offset;
+ uint32 length;
+ } QueryMultipleValue;
+
/******************/
/* Function: 0x1d */
WERROR winreg_QueryMultipleValues(
+ [in,ref] policy_handle *key_handle,
+ [in,out,size_is(num_values),length_is(num_values),ref] QueryMultipleValue *values,
+ [in] uint32 num_values,
+ [in,out,size_is(*buffer_size),length_is(*buffer_size)] uint8 *buffer,
+ [in,out,ref] uint32 *buffer_size
);
/******************/
diff --git a/source4/torture/rpc/winreg.c b/source4/torture/rpc/winreg.c
index 183128d371..3ed7af0e29 100644
--- a/source4/torture/rpc/winreg.c
+++ b/source4/torture/rpc/winreg.c
@@ -319,6 +319,40 @@ static BOOL test_EnumKey(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
return True;
}
+static BOOL test_QueryMultipleValues(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle, const char *valuename)
+{
+ struct winreg_QueryMultipleValues r;
+ NTSTATUS status;
+
+ printf("Testing QueryMultipleValues\n");
+
+ r.in.key_handle = handle;
+ r.in.values = r.out.values = talloc_array_p(mem_ctx, struct QueryMultipleValue, 1);
+ r.in.values[0].name = talloc_p(mem_ctx, struct winreg_String);
+ r.in.values[0].name->name = valuename;
+ r.in.values[0].offset = 0;
+ r.in.values[0].length = 0;
+ r.in.values[0].type = 0;
+
+ r.in.num_values = 1;
+ r.in.buffer_size = r.out.buffer_size = talloc_p(mem_ctx, uint32);
+ *r.in.buffer_size = 0x20;
+ r.in.buffer = r.out.buffer = talloc_zero_array_p(mem_ctx, uint8, *r.in.buffer_size);
+
+ status = dcerpc_winreg_QueryMultipleValues(p, mem_ctx, &r);
+ if(NT_STATUS_IS_ERR(status)) {
+ printf("QueryMultipleValues failed - %s\n", nt_errstr(status));
+ return False;
+ }
+
+ if (!W_ERROR_IS_OK(r.out.result)) {
+ printf("QueryMultipleValues failed - %s\n", win_errstr(r.out.result));
+ return False;
+ }
+
+ return True;
+}
+
static BOOL test_QueryValue(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle, const char *valuename)
{
struct winreg_QueryValue r;
@@ -329,6 +363,7 @@ static BOOL test_QueryValue(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct p
printf("Testing QueryValue\n");
r.in.handle = handle;
+ r.in.data = NULL;
r.in.value_name.name = valuename;
r.in.type = &zero;
r.in.size = &offered;
@@ -379,6 +414,7 @@ static BOOL test_EnumValue(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
if (W_ERROR_IS_OK(r.out.result)) {
ret &= test_QueryValue(p, mem_ctx, handle, r.out.name_out.name);
+ ret &= test_QueryMultipleValues(p, mem_ctx, handle, r.out.name_out.name);
}
r.in.enum_index++;