/** Open a key by name (including the predefined key name!) */ WERROR reg_open_key_abs(TALLOC_CTX *mem_ctx, struct registry_context *handle, const char *name, struct registry_key **result) { struct registry_key *predef; WERROR error; int predeflength; char *predefname; if (strchr(name, '\\') != NULL) predeflength = strchr(name, '\\')-name; else predeflength = strlen(name); predefname = talloc_strndup(mem_ctx, name, predeflength); error = reg_get_predefined_key_by_name(handle, predefname, &predef); talloc_free(predefname); if (!W_ERROR_IS_OK(error)) { return error; } if (strchr(name, '\\')) { return reg_open_key(mem_ctx, predef, strchr(name, '\\')+1, result); } else { *result = predef; return WERR_OK; } }
/* load all available hives */ static struct tree_node *load_hives(TALLOC_CTX *mem_ctx, struct registry_context *ctx) { const char *hives[] = { "HKEY_CLASSES_ROOT", "HKEY_CURRENT_USER", "HKEY_LOCAL_MACHINE", "HKEY_PERFORMANCE_DATA", "HKEY_USERS", "HKEY_CURRENT_CONFIG", "HKEY_DYN_DATA", "HKEY_PERFORMANCE_TEXT", "HKEY_PERFORMANCE_NLSTEXT", NULL }; struct tree_node *root, *prev, *node; struct registry_key *key; WERROR rv; size_t i; root = NULL; prev = NULL; for (i = 0; hives[i] != NULL; ++i) { rv = reg_get_predefined_key_by_name(ctx, hives[i], &key); if (!W_ERROR_IS_OK(rv)) { continue; } node = tree_node_new(mem_ctx, NULL, hives[i], key); if (node == NULL) { return NULL; } if (root == NULL) { root = node; } if (prev) { tree_node_append(prev, node); } prev = node; } return root; }
static WERROR cmd_predef(struct regshell_context *ctx, int argc, char **argv) { struct registry_key *ret = NULL; if (argc < 2) { fprintf(stderr, "Usage: predef predefined-key-name\n"); } else if (!ctx) { fprintf(stderr, "No full registry loaded, no predefined keys defined\n"); } else { WERROR error = reg_get_predefined_key_by_name(ctx->registry, argv[1], &ret); if (!W_ERROR_IS_OK(error)) { fprintf(stderr, "Error opening predefined key %s: %s\n", argv[1], win_errstr(error)); return error; } ctx->predef = strupper_talloc(ctx, argv[1]); ctx->current = ret; ctx->root = ret; } return WERR_OK; }