mirror of
https://github.com/samba-team/samba.git
synced 2025-01-12 09:18:10 +03:00
r19811: Decode REG_MULTI_SZ and REG_BINARY
This commit is contained in:
parent
40cff14498
commit
6793301751
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -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 = <unprintable>\n");
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user