diff options
-rw-r--r-- | source4/librpc/idl/winreg.idl | 7 | ||||
-rw-r--r-- | source4/rpc_server/winreg/rpc_winreg.c | 28 | ||||
-rw-r--r-- | source4/torture/rpc/winreg.c | 33 |
3 files changed, 67 insertions, 1 deletions
diff --git a/source4/librpc/idl/winreg.idl b/source4/librpc/idl/winreg.idl index a293398b89..37049142d2 100644 --- a/source4/librpc/idl/winreg.idl +++ b/source4/librpc/idl/winreg.idl @@ -181,6 +181,13 @@ /******************/ /* Function: 0x0e */ WERROR winreg_NotifyChangeKeyValue( + [in,ref] policy_handle *handle, + [in] uint8 watch_subtree, + [in] uint32 notify_filter, + [in] uint32 unknown, + [in] winreg_String string1, + [in] winreg_String string2, + [in] uint32 unknown2 ); /******************/ diff --git a/source4/rpc_server/winreg/rpc_winreg.c b/source4/rpc_server/winreg/rpc_winreg.c index 41147c089d..e8d4056b2a 100644 --- a/source4/rpc_server/winreg/rpc_winreg.c +++ b/source4/rpc_server/winreg/rpc_winreg.c @@ -240,6 +240,11 @@ static WERROR winreg_FlushKey(struct dcesrv_call_state *dce_call, TALLOC_CTX *me static WERROR winreg_GetKeySecurity(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct winreg_GetKeySecurity *r) { + struct dcesrv_handle *h; + + h = dcesrv_handle_fetch(dce_call->conn, r->in.handle, HTYPE_REGKEY); + DCESRV_CHECK_HANDLE(h); + return WERR_NOT_SUPPORTED; } @@ -341,7 +346,28 @@ static WERROR winreg_QueryInfoKey(struct dcesrv_call_state *dce_call, TALLOC_CTX static WERROR winreg_QueryValue(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct winreg_QueryValue *r) { - return WERR_NOT_SUPPORTED; + struct dcesrv_handle *h; + struct registry_key *key; + struct registry_value *val; + WERROR result; + + h = dcesrv_handle_fetch(dce_call->conn, r->in.handle, HTYPE_REGKEY); + DCESRV_CHECK_HANDLE(h); + + key = h->data; + + result = reg_key_get_value_by_name(mem_ctx, key, r->in.value_name.name, &val); + + if (!W_ERROR_IS_OK(result)) { + return result; + } + + r->out.type = &val->data_type; + r->out.size = r->in.size; + r->out.length = &val->data_len; + r->out.data = val->data_blk; + + return WERR_OK; } diff --git a/source4/torture/rpc/winreg.c b/source4/torture/rpc/winreg.c index f842175328..97bf091d51 100644 --- a/source4/torture/rpc/winreg.c +++ b/source4/torture/rpc/winreg.c @@ -60,6 +60,36 @@ static BOOL test_GetVersion(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return True; } +static BOOL test_NotifyChangeKeyValue(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, + struct policy_handle *handle) +{ + struct winreg_NotifyChangeKeyValue r; + NTSTATUS status; + + printf("\ntesting NotifyChangeKeyValue\n"); + + r.in.handle = handle; + r.in.watch_subtree = 1; + r.in.notify_filter = 0; + r.in.unknown = r.in.unknown2 = 0; + init_winreg_String(&r.in.string1, NULL); + init_winreg_String(&r.in.string2, NULL); + + status = dcerpc_winreg_NotifyChangeKeyValue(p, mem_ctx, &r); + + if (!NT_STATUS_IS_OK(status)) { + printf("NotifyChangeKeyValue failed - %s\n", nt_errstr(status)); + return False; + } + + if (!W_ERROR_IS_OK(r.out.result)) { + printf("NotifyChangeKeyValue failed - %s\n", win_errstr(r.out.result)); + return False; + } + + return True; +} + static BOOL test_CreateKey(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle, const char *name, const char *class) @@ -609,6 +639,9 @@ static BOOL test_key(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, } + if (!test_NotifyChangeKeyValue(p, mem_ctx, handle)) { + } + if (!test_GetKeySecurity(p, mem_ctx, handle)) { } |