static void add_reg_key(struct regedit *regedit, struct tree_node *node, bool subkey) { char *name; const char *msg; if (!subkey && !node->parent) { return; } msg = "Enter name of new key"; if (subkey) { msg = "Enter name of new subkey"; } dialog_input(regedit, &name, "New Key", msg); if (name) { WERROR rv; struct registry_key *new_key; struct tree_node *new_node; struct tree_node *list; struct tree_node *parent; if (subkey) { parent = node; list = node->child_head; } else { parent = node->parent; list = tree_node_first(node); SMB_ASSERT(list != NULL); } rv = reg_key_add_name(regedit, parent->key, name, NULL, NULL, &new_key); if (W_ERROR_IS_OK(rv)) { /* The list of subkeys may not be present in cache yet, so if not, don't bother allocating a new node for the key. */ if (list) { new_node = tree_node_new(parent, parent, name, new_key); SMB_ASSERT(new_node); tree_node_append_last(list, new_node); } list = tree_node_first(node); tree_view_clear(regedit->keys); tree_view_update(regedit->keys, list); } else { dialog_notice(regedit, DIA_ALERT, "New Key", "Failed to create key."); } talloc_free(name); } }
/* winreg_CreateKey */ static WERROR dcesrv_winreg_CreateKey(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct winreg_CreateKey *r) { struct dcesrv_handle *h, *newh; struct security_descriptor sd; struct registry_key *key; WERROR result; DCESRV_PULL_HANDLE_FAULT(h, r->in.handle, HTYPE_REGKEY); key = h->data; newh = dcesrv_handle_new(dce_call->context, HTYPE_REGKEY); switch (security_session_user_level(dce_call->conn->auth_state.session_info)) { case SECURITY_SYSTEM: case SECURITY_ADMINISTRATOR: /* the security descriptor is optional */ if (r->in.secdesc != NULL) { DATA_BLOB sdblob; enum ndr_err_code ndr_err; sdblob.data = r->in.secdesc->sd.data; sdblob.length = r->in.secdesc->sd.len; if (sdblob.data == NULL) { return WERR_INVALID_PARAM; } ndr_err = ndr_pull_struct_blob_all(&sdblob, mem_ctx, NULL, &sd, (ndr_pull_flags_fn_t)ndr_pull_security_descriptor); if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { return WERR_INVALID_PARAM; } } result = reg_key_add_name(newh, key, r->in.name.name, NULL, r->in.secdesc?&sd:NULL, (struct registry_key **)&newh->data); if (W_ERROR_IS_OK(result)) { r->out.new_handle = &newh->wire_handle; } else { talloc_free(newh); } return result; default: return WERR_ACCESS_DENIED; } }
static WERROR cmd_mkkey(struct regshell_context *ctx, int argc, char **argv) { struct registry_key *tmp; WERROR error; if(argc < 2) { fprintf(stderr, "Usage: mkkey <keyname>\n"); return WERR_INVALID_PARAM; } error = reg_key_add_name(ctx, ctx->current, argv[1], 0, NULL, &tmp); if (!W_ERROR_IS_OK(error)) { fprintf(stderr, "Error adding new subkey '%s': %s\n", argv[1], win_errstr(error)); return error; } return WERR_OK; }
WERROR reg_key_add_abs(TALLOC_CTX *mem_ctx, struct registry_context *ctx, const char *path, uint32_t access_mask, struct security_descriptor *sec_desc, struct registry_key **result) { struct registry_key *parent; const char *n; WERROR error; if (!strchr(path, '\\')) { return WERR_ALREADY_EXISTS; } error = get_abs_parent(mem_ctx, ctx, path, &parent, &n); if (!W_ERROR_IS_OK(error)) { DEBUG(2, ("Opening parent of %s failed with %s\n", path, win_errstr(error))); return error; } error = reg_key_add_name(mem_ctx, parent, n, NULL, sec_desc, result); return error; }
static void add_reg_key(struct regedit *regedit, struct tree_node *node, bool subkey) { const char *name; const char *msg; if (!subkey && tree_node_is_top_level(node)) { return; } msg = "Enter name of new key"; if (subkey) { msg = "Enter name of new subkey"; } dialog_input(regedit, &name, "New Key", msg); if (name) { WERROR rv; struct registry_key *new_key; struct tree_node *new_node; struct tree_node *list; struct tree_node *parent; if (subkey) { parent = node; list = node->child_head; } else { parent = node->parent; list = tree_node_first(node); SMB_ASSERT(list != NULL); } rv = reg_key_add_name(regedit, parent->key, name, NULL, NULL, &new_key); if (W_ERROR_IS_OK(rv)) { /* The list of subkeys may not be present in cache yet, so if not, don't bother allocating a new node for the key. */ if (list) { new_node = tree_node_new(parent, parent, name, new_key); SMB_ASSERT(new_node); tree_node_insert_sorted(list, new_node); } else { /* Reopen the parent key to make sure the new subkey will be noticed. */ tree_node_reopen_key(regedit->registry_context, parent); } list = tree_node_first(node); tree_view_clear(regedit->keys); tree_view_update(regedit->keys, list); if (!subkey) { node = new_node; } tree_view_set_current_node(regedit->keys, node); load_values(regedit); } else { msg = get_friendly_werror_msg(rv); dialog_notice(regedit, DIA_ALERT, "New Key", "Failed to create key: %s", msg); } talloc_free(discard_const(name)); } }