summaryrefslogtreecommitdiff
path: root/source3/registry
diff options
context:
space:
mode:
Diffstat (limited to 'source3/registry')
-rw-r--r--source3/registry/reg_frontend.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/source3/registry/reg_frontend.c b/source3/registry/reg_frontend.c
index ed49cc998c..1c8859982d 100644
--- a/source3/registry/reg_frontend.c
+++ b/source3/registry/reg_frontend.c
@@ -263,6 +263,62 @@ int fetch_reg_values( REGISTRY_KEY *key, REGVAL_CTR *val )
return result;
}
+NTSTATUS registry_fetch_values(TALLOC_CTX *mem_ctx, REGISTRY_KEY *key,
+ uint32 *pnum_values, char ***pnames,
+ struct registry_value ***pvalues)
+{
+ REGVAL_CTR *ctr;
+ char **names;
+ struct registry_value **values;
+ uint32 i;
+
+ if (!(ctr = TALLOC_ZERO_P(mem_ctx, REGVAL_CTR))) {
+ return NT_STATUS_NO_MEMORY;
+ }
+
+ if (fetch_reg_values(key, ctr) == -1) {
+ TALLOC_FREE(ctr);
+ return NT_STATUS_INVALID_PARAMETER;
+ }
+
+ if (ctr->num_values == 0) {
+ *pnum_values = 0;
+ TALLOC_FREE(ctr);
+ return NT_STATUS_OK;
+ }
+
+ if ((!(names = TALLOC_ARRAY(ctr, char *, ctr->num_values))) ||
+ (!(values = TALLOC_ARRAY(ctr, struct registry_value *,
+ ctr->num_values)))) {
+ TALLOC_FREE(ctr);
+ return NT_STATUS_NO_MEMORY;
+ }
+
+ for (i=0; i<ctr->num_values; i++) {
+ REGISTRY_VALUE *val = ctr->values[i];
+ NTSTATUS status;
+
+ if (!(names[i] = talloc_strdup(names, val->valuename))) {
+ TALLOC_FREE(ctr);
+ return NT_STATUS_NO_MEMORY;
+ }
+
+ status = registry_pull_value(values, &values[i],
+ val->type, val->data_p,
+ val->size, val->size);
+ if (!NT_STATUS_IS_OK(status)) {
+ TALLOC_FREE(ctr);
+ return status;
+ }
+ }
+
+ *pnum_values = ctr->num_values;
+ *pnames = talloc_move(mem_ctx, &names);
+ *pvalues = talloc_move(mem_ctx, &values);
+
+ TALLOC_FREE(ctr);
+ return NT_STATUS_OK;
+}
/***********************************************************************
retreive a specific subkey specified by index. Caller is