From 202f63e476fc1dc60d9f1271673b292288cfb436 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Tue, 21 Nov 2006 02:21:45 +0000 Subject: r19811: Decode REG_MULTI_SZ and REG_BINARY (This used to be commit 679330175185f8504bb5968339dcc7cb20d9140c) --- source3/include/reg_objects.h | 8 ++++---- source3/lib/util_reg.c | 2 +- source3/rpcclient/cmd_spoolss.c | 2 +- source3/utils/net_rpc_printer.c | 2 +- source3/utils/net_rpc_registry.c | 26 +++++++++++++++++++++++++- 5 files changed, 32 insertions(+), 8 deletions(-) diff --git a/source3/include/reg_objects.h b/source3/include/reg_objects.h index 6ddbb89cc7..99da22f8cd 100644 --- a/source3/include/reg_objects.h +++ b/source3/include/reg_objects.h @@ -33,9 +33,9 @@ typedef struct { } REGISTRY_VALUE; /* - * A registry string is not necessarily NULL terminated. When retrieving it - * from the net, we guarantee this however. A server might want to push it - * without the terminator though. + * A REG_SZ string is not necessarily NULL terminated. When retrieving it from + * the net, we guarantee this however. A server might want to push it without + * the terminator though. */ struct registry_string { @@ -51,7 +51,7 @@ struct registry_value { struct registry_string sz; struct { uint32 num_strings; - struct registry_string *strings; + char **strings; } multi_sz; DATA_BLOB binary; } v; diff --git a/source3/lib/util_reg.c b/source3/lib/util_reg.c index 80b52924b6..c74a573149 100644 --- a/source3/lib/util_reg.c +++ b/source3/lib/util_reg.c @@ -69,7 +69,7 @@ const char *reg_type_lookup(uint32 type) } NTSTATUS reg_pull_multi_sz(TALLOC_CTX *mem_ctx, const void *buf, size_t len, - int *num_values, char ***values) + uint32 *num_values, char ***values) { const smb_ucs2_t *p = (const smb_ucs2_t *)buf; *num_values = 0; diff --git a/source3/rpcclient/cmd_spoolss.c b/source3/rpcclient/cmd_spoolss.c index b5672cb2a1..3257ec9215 100644 --- a/source3/rpcclient/cmd_spoolss.c +++ b/source3/rpcclient/cmd_spoolss.c @@ -709,7 +709,7 @@ static void display_reg_value(REGISTRY_VALUE value) break; } case REG_MULTI_SZ: { - int i, num_values; + uint32 i, num_values; char **values; if (!NT_STATUS_IS_OK(reg_pull_multi_sz(NULL, value.data_p, diff --git a/source3/utils/net_rpc_printer.c b/source3/utils/net_rpc_printer.c index dc3cb42dbe..5a18253aaf 100644 --- a/source3/utils/net_rpc_printer.c +++ b/source3/utils/net_rpc_printer.c @@ -129,7 +129,7 @@ static void display_reg_value(const char *subkey, REGISTRY_VALUE value) break; case REG_MULTI_SZ: { - int i, num_values; + uint32 i, num_values; char **values; if (!NT_STATUS_IS_OK(reg_pull_multi_sz(NULL, value.data_p, diff --git a/source3/utils/net_rpc_registry.c b/source3/utils/net_rpc_registry.c index a04c527502..45598c49f5 100644 --- a/source3/utils/net_rpc_registry.c +++ b/source3/utils/net_rpc_registry.c @@ -197,7 +197,7 @@ static NTSTATUS registry_pull_value(TALLOC_CTX *mem_ctx, struct registry_value *value; NTSTATUS status; - if (!(value = TALLOC_P(mem_ctx, struct registry_value))) { + if (!(value = TALLOC_ZERO_P(mem_ctx, struct registry_value))) { return NT_STATUS_NO_MEMORY; } @@ -247,6 +247,18 @@ static NTSTATUS registry_pull_value(TALLOC_CTX *mem_ctx, } break; } + case REG_MULTI_SZ: + status = reg_pull_multi_sz(value, (void *)data, length, + &value->v.multi_sz.num_strings, + &value->v.multi_sz.strings); + if (!(NT_STATUS_IS_OK(status))) { + goto error; + } + break; + case REG_BINARY: + value->v.binary.data = talloc_move(value, &data); + value->v.binary.length = length; + break; default: status = NT_STATUS_INVALID_PARAMETER; goto error; @@ -466,6 +478,18 @@ static NTSTATUS rpc_registry_enumerate_internal(const DOM_SID *domain_sid, case REG_EXPAND_SZ: d_printf("Value = \"%s\"\n", v->v.sz.str); break; + case REG_MULTI_SZ: { + uint32 j; + for (j = 0; j < v->v.multi_sz.num_strings; j++) { + d_printf("Value[%3.3d] = \"%s\"\n", j, + v->v.multi_sz.strings[j]); + } + break; + } + case REG_BINARY: + d_printf("Value = %d bytes\n", + v->v.binary.length); + break; default: d_printf("Value = \n"); break; -- cgit