diff options
Diffstat (limited to 'source4/torture/rpc/winreg.c')
-rw-r--r-- | source4/torture/rpc/winreg.c | 117 |
1 files changed, 87 insertions, 30 deletions
diff --git a/source4/torture/rpc/winreg.c b/source4/torture/rpc/winreg.c index 65db147e21..4e47161d7d 100644 --- a/source4/torture/rpc/winreg.c +++ b/source4/torture/rpc/winreg.c @@ -24,8 +24,13 @@ static void init_winreg_String(struct winreg_String *name, const char *s) { name->name = s; - name->name_len = 2*strlen_m(s); - name->name_size = name->name_len; + if (s) { + name->name_len = 2 * (strlen_m(s) + 1); + name->name_size = name->name_len; + } else { + name->name_len = 0; + name->name_size = 0; + } } static BOOL test_GetVersion(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, @@ -196,7 +201,6 @@ static BOOL test_EnumValue(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, uint32 type; uint32 value1, value2; - printf("\ntesting EnumValue\n"); qik.in.handle = handle; @@ -333,8 +337,83 @@ static BOOL test_OpenHKCU(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, return ret; } -typedef BOOL (*winreg_open_fn)(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, - struct policy_handle *handle); +typedef BOOL winreg_open_fn(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, + struct policy_handle *handle); + +BOOL test_Open(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, void *fn) +{ + struct policy_handle handle; + winreg_open_fn *open_fn = (winreg_open_fn *)fn; + BOOL ret = True; + struct winreg_EnumKey r; + struct winreg_EnumKeyNameRequest keyname; + struct winreg_String classname; + struct winreg_Time tm; + NTSTATUS status; + + if (!open_fn(p, mem_ctx, &handle)) + return False; + +#if 0 + if (!test_GetVersion(p, mem_ctx, &handle)) { + ret = False; + } + + if (!test_DeleteKey(p, mem_ctx, &handle, "spottyfoot")) { + ret = False; + } +#endif + + /* Enumerate keys */ + + r.in.handle = &handle; + r.in.key_index = 0; + r.in.key_name_len = r.out.key_name_len = 0; + r.in.unknown = r.out.unknown = 0x0414; + keyname.unknown = 0x0000020a; + init_winreg_String(&keyname.key_name, NULL); + init_winreg_String(&classname, NULL); + r.in.in_name = &keyname; + r.in.class = &classname; + tm.low = tm.high = 0x7fffffff; + r.in.last_changed_time = &tm; + + do { + status = dcerpc_winreg_EnumKey(p, mem_ctx, &r); + + if (W_ERROR_IS_OK(r.out.result)) { + struct policy_handle key_handle; + + if (!test_OpenKey( + p, mem_ctx, &handle, r.out.out_name->name, + &key_handle)) { + printf("OpenKey(%s) failed - %s\n", + r.out.out_name->name, + win_errstr(r.out.result)); + goto next_key; + } + + if (!test_QueryInfoKey(p, mem_ctx, &handle, NULL)) { + + } + } + next_key: + r.in.key_index++; + + } while (W_ERROR_IS_OK(r.out.result)); + +#if 0 + if (!test_EnumValue(p, mem_ctx, &handle)) { + ret = False; + } +#endif + + if (!test_CloseKey(p, mem_ctx, &handle)) { + ret = False; + } + + return ret; +} BOOL torture_rpc_winreg(int dummy) { @@ -342,7 +421,7 @@ BOOL torture_rpc_winreg(int dummy) struct dcerpc_pipe *p; TALLOC_CTX *mem_ctx; BOOL ret = True; - winreg_open_fn open_fns[] = { test_OpenHKLM }; + winreg_open_fn *open_fns[] = { test_OpenHKLM }; int i; mem_ctx = talloc_init("torture_rpc_winreg"); @@ -351,6 +430,7 @@ BOOL torture_rpc_winreg(int dummy) DCERPC_WINREG_NAME, DCERPC_WINREG_UUID, DCERPC_WINREG_VERSION); + if (!NT_STATUS_IS_OK(status)) { return False; } @@ -358,31 +438,8 @@ BOOL torture_rpc_winreg(int dummy) p->flags |= DCERPC_DEBUG_PRINT_BOTH; for (i = 0; i < ARRAY_SIZE(open_fns); i++) { - struct policy_handle handle; - - if (!open_fns[i](p, mem_ctx, &handle)) + if (!test_Open(p, mem_ctx, open_fns[i])) ret = False; - -#if 0 - if (!test_GetVersion(p, mem_ctx, &handle)) { - ret = False; - } - - if (!test_DeleteKey(p, mem_ctx, &handle, "spottyfoot")) { - ret = False; - } -#endif - if (!test_EnumKey(p, mem_ctx, &handle)) { - ret = False; - } - - if (!test_EnumValue(p, mem_ctx, &handle)) { - ret = False; - } - - if (!test_CloseKey(p, mem_ctx, &handle)) { - ret = False; - } } talloc_destroy(mem_ctx); |