summaryrefslogtreecommitdiff
path: root/source4
diff options
context:
space:
mode:
Diffstat (limited to 'source4')
-rw-r--r--source4/lib/registry/reg_backend_rpc.c27
-rw-r--r--source4/librpc/idl/winreg.idl5
-rw-r--r--source4/torture/rpc/winreg.c8
3 files changed, 32 insertions, 8 deletions
diff --git a/source4/lib/registry/reg_backend_rpc.c b/source4/lib/registry/reg_backend_rpc.c
index 16516d25b7..b14b67d609 100644
--- a/source4/lib/registry/reg_backend_rpc.c
+++ b/source4/lib/registry/reg_backend_rpc.c
@@ -259,7 +259,32 @@ static WERROR rpc_get_subkey_by_index(TALLOC_CTX *mem_ctx, struct registry_key *
static WERROR rpc_add_key(TALLOC_CTX *mem_ctx, struct registry_key *parent, const char *name, uint32_t access_mask, SEC_DESC *sec, struct registry_key **key)
{
- return WERR_NOT_SUPPORTED;
+ NTSTATUS status;
+ struct winreg_CreateKey r;
+
+ init_winreg_String(&r.in.key, name);
+ init_winreg_String(&r.in.class, NULL);
+
+ r.in.handle = parent->backend_data;
+ r.out.handle = talloc_p(mem_ctx, struct policy_handle);
+ r.in.options = 0;
+ r.in.access_mask = access_mask;
+ r.in.sec_desc = NULL;
+
+ status = dcerpc_winreg_CreateKey((struct dcerpc_pipe *)(parent->hive->backend_data), mem_ctx, &r);
+
+ if (!NT_STATUS_IS_OK(status)) {
+ DEBUG(1, ("CreateKey failed - %s\n", nt_errstr(status)));
+ return ntstatus_to_werror(status);
+ }
+
+ if (W_ERROR_IS_OK(r.out.result)) {
+ *key = talloc_p(mem_ctx, struct registry_key);
+ (*key)->name = talloc_strdup(*key, name);
+ (*key)->backend_data = r.out.handle;
+ }
+
+ return r.out.result;
}
static WERROR rpc_query_key(struct registry_key *k)
diff --git a/source4/librpc/idl/winreg.idl b/source4/librpc/idl/winreg.idl
index 5b7530aae3..a293398b89 100644
--- a/source4/librpc/idl/winreg.idl
+++ b/source4/librpc/idl/winreg.idl
@@ -75,10 +75,9 @@
[in,out,ref] policy_handle *handle,
[in] winreg_String key,
[in] winreg_String class,
- [in] uint32 reserved,
- [out] uint32 *unknown,
+ [in] uint32 options,
[in] uint32 access_mask,
- [in,ref] uint32 *sec_info,
+ [in,out,ref] uint32 *action_taken,
[in] sec_desc_buf *sec_desc
);
diff --git a/source4/torture/rpc/winreg.c b/source4/torture/rpc/winreg.c
index 2f9797e693..f842175328 100644
--- a/source4/torture/rpc/winreg.c
+++ b/source4/torture/rpc/winreg.c
@@ -67,7 +67,7 @@ static BOOL test_CreateKey(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
struct winreg_CreateKey r;
struct policy_handle newhandle;
NTSTATUS status;
- uint32_t sec_info = 0;
+ uint32_t action_taken = 0;
printf("\ntesting CreateKey\n");
@@ -75,9 +75,9 @@ static BOOL test_CreateKey(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
r.out.handle = &newhandle;
init_winreg_String(&r.in.key, name);
init_winreg_String(&r.in.class, class);
- r.in.reserved = 0x0;
+ r.in.options = 0x0;
r.in.access_mask = 0x02000000;
- r.in.sec_info = &sec_info;
+ r.in.action_taken = r.out.action_taken = &action_taken;
r.in.sec_desc = NULL;
status = dcerpc_winreg_CreateKey(p, mem_ctx, &r);
@@ -710,7 +710,7 @@ BOOL torture_rpc_winreg(void)
if (lp_parm_int(-1, "torture", "dangerous") != 1) {
printf("winreg_InitiateShutdown disabled - enable dangerous tests to use\n");
-
+ } else {
ret &= test_InitiateSystemShutdown(p, mem_ctx, "spottyfood", 30);
ret &= test_AbortSystemShutdown(p, mem_ctx);
}