r4155: More destinction between hives and predefined keys
authorJelmer Vernooij <jelmer@samba.org>
Sat, 11 Dec 2004 20:06:40 +0000 (20:06 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:07:20 +0000 (13:07 -0500)
(This used to be commit c37d6f3c581673d74e7ec6a644ab6a7d13a55535)

source4/gtk/tools/gregedit.c
source4/include/registry.h
source4/lib/registry/README
source4/lib/registry/common/reg_interface.c
source4/lib/registry/reg_backend_rpc.c
source4/lib/registry/reg_samba.c
source4/lib/registry/tools/regdiff.c
source4/lib/registry/tools/regshell.c
source4/lib/registry/tools/regtree.c
source4/rpc_server/winreg/rpc_winreg.c

index 7aed4101e565a9070df2f8fa4035cea82b74ca54..a8684d11344c724b2ee333a5d68b2039c8c4b3aa 100644 (file)
@@ -315,7 +315,7 @@ static void registry_load_root(void)
 
        for(i = HKEY_CLASSES_ROOT; i <= HKEY_PERFORMANCE_NLSTEXT; i++) 
        {
-               if (!W_ERROR_IS_OK(reg_get_hive(registry, i, &root))) { continue; }
+               if (!W_ERROR_IS_OK(reg_get_predefined_key(registry, i, &root))) { continue; }
 
                registry_load_hive(root);
        }
index e3b7eeb902eca4e994e2e60c063b1fa81f37d38e..345d6fac4381428c7d8e40fd6a053716b818b36f 100644 (file)
@@ -150,14 +150,13 @@ struct registry_hive {
        struct registry_key *root;
        void *backend_data;
        const char *location;
-       struct registry_context *reg_ctx;
 };
 
 /* Handle to a full registry
  * contains zero or more hives */
 struct registry_context {
     void *backend_data;
-       WERROR (*get_hive) (struct registry_context *, uint32 hkey, struct registry_key **);
+       WERROR (*get_predefined_key) (struct registry_context *, uint32 hkey, struct registry_key **);
 };
 
 struct reg_init_function_entry {
index 757029cdc2148e0121b5ea134259fbae6eb8d99a..c91d361acd0604fc1ba2e9d3f69c9a3cf2d1f3a2 100644 (file)
@@ -1,6 +1,5 @@
 This is the registry library. The registry is basically a bunch of hives 
-(HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, etc) that can be loaded from 
-different places.
+that can be loaded from different places.
 
 The various registry backends provide support for loading/saving specific types 
 of hives:
@@ -28,3 +27,15 @@ registry:HKEY_CURRENT_USER = nt4:NTUSER.DAT
 registry:HKEY_LOCAL_MACHINE = ldb:tdb://registry.tdb
 
 WERR_NOT_SUPPORTED will be returned for all hives that haven't been set.
+
+On Windows the various registry hives are loaded from:
+
+HKEY_CURRENT_CONFIG: %SystemRoot%\System32\Config\System
+HKEY_CURRENT_USER: %Profile%\NTUser.dat
+HKEY_LOCAL_MACHINE\SAM: %SystemRoot%\System32\Config\Sam
+HKEY_LOCAL_MACHINE\Security: %SystemRoot%\System32\Config\Security
+HKEY_LOCAL_MACHINE\Software: %SystemRoot%\System32\Config\Software
+HKEY_LOCAL_MACHINE\System: %SystemRoot%\System32\Config\System
+HKEY_USERS\.DEFAULT: %SystemRoot%\System32\Config\Default
+HKEY_LOCAL_MACHINE\HARDWARE: is autogenerated
+
index ba65e570c46a7dc5eae76d7507eed72b3e1f5d0b..ee140e150fb030fc6f39c1187dd5061501f7059f 100644 (file)
@@ -74,9 +74,9 @@ BOOL reg_has_backend(const char *backend)
 }
 
 static struct {
-       enum reg_predefined_key handle;
+       uint32_t handle;
        const char *name;
-} hkey_names[] = 
+} predef_names[] = 
 {
        {HKEY_CLASSES_ROOT,"HKEY_CLASSES_ROOT" },
        {HKEY_CURRENT_USER,"HKEY_CURRENT_USER" },
@@ -90,39 +90,39 @@ static struct {
        { 0, NULL }
 };
 
-int reg_list_predefs(TALLOC_CTX *mem_ctx, char ***hives, enum reg_predefined_key **hkeys)
+int reg_list_predefs(TALLOC_CTX *mem_ctx, char ***predefs, uint32_t **hkeys)
 {
        int i;
-       *hives = talloc_array_p(mem_ctx, char *, ARRAY_SIZE(hkey_names));
-       *hkeys = talloc_array_p(mem_ctx, enum reg_predefined_key, ARRAY_SIZE(hkey_names));
+       *predefs = talloc_array_p(mem_ctx, char *, ARRAY_SIZE(predef_names));
+       *hkeys = talloc_array_p(mem_ctx, uint32_t, ARRAY_SIZE(predef_names));
 
-       for (i = 0; hkey_names[i].name; i++) {
-               (*hives)[i] = talloc_strdup(mem_ctx, hkey_names[i].name);
-               (*hkeys)[i] = hkey_names[i].handle;
+       for (i = 0; predef_names[i].name; i++) {
+               (*predefs)[i] = talloc_strdup(mem_ctx, predef_names[i].name);
+               (*hkeys)[i] = predef_names[i].handle;
        }
 
        return i;
 }
 
-const char *reg_get_hkey_name(enum reg_predefined_key hkey)
+const char *reg_get_predef_name(uint32_t hkey)
 {
        int i;
-       for (i = 0; hkey_names[i].name; i++) {
-               if (hkey_names[i].handle == hkey) return hkey_names[i].name;
+       for (i = 0; predef_names[i].name; i++) {
+               if (predef_names[i].handle == hkey) return predef_names[i].name;
        }
 
        return NULL;
 }
 
-WERROR reg_get_hive_by_name(struct registry_context *ctx, const char *name, struct registry_key **key)
+WERROR reg_get_predefined_key_by_name(struct registry_context *ctx, const char *name, struct registry_key **key)
 {
        int i;
        
-       for (i = 0; hkey_names[i].name; i++) {
-               if (!strcmp(hkey_names[i].name, name)) return reg_get_hive(ctx, hkey_names[i].handle, key);
+       for (i = 0; predef_names[i].name; i++) {
+               if (!strcmp(predef_names[i].name, name)) return reg_get_predefined_key(ctx, predef_names[i].handle, key);
        }
 
-       DEBUG(1, ("No hive with name '%s'\n", name));
+       DEBUG(1, ("No predefined key with name '%s'\n", name));
        
        return WERR_BADFILE;
 }
@@ -134,12 +134,12 @@ WERROR reg_close (struct registry_context *ctx)
        return WERR_OK;
 }
 
-WERROR reg_get_hive(struct registry_context *ctx, enum reg_predefined_key hkey, struct registry_key **key)
+WERROR reg_get_predefined_key(struct registry_context *ctx, uint32_t hkey, struct registry_key **key)
 {
-       WERROR ret = ctx->get_hive(ctx, hkey, key);
+       WERROR ret = ctx->get_predefined_key(ctx, hkey, key);
 
        if (W_ERROR_IS_OK(ret)) {
-               (*key)->name = talloc_strdup(*key, reg_get_hkey_name(hkey));
+               (*key)->name = talloc_strdup(*key, reg_get_predef_name(hkey));
                (*key)->path = ""; 
        }
 
@@ -147,7 +147,7 @@ WERROR reg_get_hive(struct registry_context *ctx, enum reg_predefined_key hkey,
 }
 
 /* Open a registry file/host/etc */
-WERROR reg_open_hive(struct registry_context *parent_ctx, const char *backend, const char *location, const char *credentials, struct registry_key **root)
+WERROR reg_open_hive(TALLOC_CTX *parent_ctx, const char *backend, const char *location, const char *credentials, struct registry_key **root)
 {
        struct registry_hive *rethive;
        struct registry_key *retkey = NULL;
@@ -169,7 +169,6 @@ WERROR reg_open_hive(struct registry_context *parent_ctx, const char *backend, c
        rethive->location = location?talloc_strdup(rethive, location):NULL;
        rethive->functions = entry->hive_functions;
        rethive->backend_data = NULL;
-       rethive->reg_ctx = parent_ctx;
 
        werr = entry->hive_functions->open_hive(rethive, &retkey);
 
@@ -193,26 +192,26 @@ WERROR reg_open_hive(struct registry_context *parent_ctx, const char *backend, c
        return WERR_OK;
 }
 
-/* Open a key by name (including the hive name!) */
+/* 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 *hive;
+       struct registry_key *predef;
        WERROR error;
-       int hivelength;
-       char *hivename;
+       int predeflength;
+       char *predefname;
 
-       if(strchr(name, '\\')) hivelength = strchr(name, '\\')-name;
-       else hivelength = strlen(name);
+       if(strchr(name, '\\')) predeflength = strchr(name, '\\')-name;
+       else predeflength = strlen(name);
 
-       hivename = strndup(name, hivelength);
-       error = reg_get_hive_by_name(handle, hivename, &hive);
-       SAFE_FREE(hivename);
+       predefname = strndup(name, predeflength);
+       error = reg_get_predefined_key_by_name(handle, predefname, &predef);
+       SAFE_FREE(predefname);
 
        if(!W_ERROR_IS_OK(error)) {
                return error;
        }
 
-       return reg_open_key(mem_ctx, hive, name, result);
+       return reg_open_key(mem_ctx, predef, name, result);
 }
 
 /* Open a key 
@@ -484,7 +483,7 @@ WERROR reg_key_add_name_recursive_abs(struct registry_context *handle, const cha
        else hivelength = strlen(name);
 
        hivename = strndup(name, hivelength);
-       error = reg_get_hive_by_name(handle, hivename, &hive);
+       error = reg_get_predefined_key_by_name(handle, hivename, &hive);
        SAFE_FREE(hivename);
 
        if(!W_ERROR_IS_OK(error)) return error;
index 927ed7fcaac8c76b7f26cffd995cad9147d7d064..78c45f636547687d235bad3c2e2cfb4a410ec41d 100644 (file)
@@ -93,7 +93,7 @@ struct {
 
 static WERROR rpc_query_key(struct registry_key *k);
 
-static WERROR rpc_get_hive (struct registry_context *ctx, uint32 hkey_type, struct registry_key **k)
+static WERROR rpc_get_predefined_key (struct registry_context *ctx, uint32 hkey_type, struct registry_key **k)
 {
        int n;
        struct registry_hive *h;
@@ -113,7 +113,6 @@ static WERROR rpc_get_hive (struct registry_context *ctx, uint32 hkey_type, stru
        h->functions = &reg_backend_rpc;
        h->location = NULL;
        h->backend_data = ctx->backend_data;
-       h->reg_ctx = ctx;
        
        (*k) = h->root = talloc_p(h, struct registry_key);
        (*k)->hive = h;
@@ -380,7 +379,7 @@ WERROR reg_open_remote (struct registry_context **ctx, const char *user, const c
                return ntstatus_to_werror(status);
        }
 
-       (*ctx)->get_hive = rpc_get_hive;
+       (*ctx)->get_predefined_key = rpc_get_predefined_key;
 
        talloc_set_destructor(*ctx, rpc_close);
 
index a19029524d6eb47456ea454c55dd8fa2d89cb939..62973a14ab438e265b1d9d68cdc91c7dd39de012 100644 (file)
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_REGISTRY
 
-static WERROR reg_samba_get_hive (struct registry_context *ctx, uint32 hkey, struct registry_key **k)
+static WERROR reg_samba_get_predef (struct registry_context *ctx, uint32 hkey, struct registry_key **k)
 {
        WERROR error;
        const char *conf;
        char *backend, *location;
-       const char *hivename = reg_get_hkey_name(hkey);
+       const char *hivename = reg_get_predef_name(hkey);
 
        *k = NULL;
 
@@ -45,7 +45,18 @@ static WERROR reg_samba_get_hive (struct registry_context *ctx, uint32 hkey, str
                *location = '\0';
                location++;
        }
-       
+
+       /* FIXME: Different hive backend for HKEY_CLASSES_ROOT: merged view of HKEY_LOCAL_MACHINE\Software\Classes
+        * and HKEY_CURRENT_USER\Software\Classes */
+
+       /* FIXME: HKEY_CURRENT_CONFIG is an alias for HKEY_LOCAL_MACHINE\System\CurrentControlSet\Hardware Profiles\Current */
+
+       /* FIXME: HKEY_PERFORMANCE_DATA is dynamically generated */
+
+       /* FIXME: HKEY_LOCAL_MACHINE\Hardware is autogenerated */
+
+       /* FIXME: HKEY_LOCAL_MACHINE\Security\SAM is an alias for HKEY_LOCAL_MACHINE\SAM */
+
        error = reg_open_hive(ctx, backend, location, NULL, k);
 
        talloc_destroy(backend);
@@ -56,7 +67,7 @@ static WERROR reg_samba_get_hive (struct registry_context *ctx, uint32 hkey, str
 WERROR reg_open_local (struct registry_context **ctx)
 {
        *ctx = talloc_p(NULL, struct registry_context);
-       (*ctx)->get_hive = reg_samba_get_hive;
+       (*ctx)->get_predefined_key = reg_samba_get_predef;
        
        return WERR_OK;
 }
index dfa85d636ff0073fcab098145e6c4828712fd82b..8d88cafe59cf46fb56e0d85f7ecadb7d90ebb4b2 100644 (file)
@@ -175,15 +175,15 @@ static void writediff(struct registry_key *oldkey, struct registry_key *newkey,
 
        for(i = HKEY_CLASSES_ROOT; i <= HKEY_PERFORMANCE_NLSTEXT; i++) {
                struct registry_key *r1, *r2;
-               error = reg_get_hive(h1, i, &r1);
+               error = reg_get_predefined_key(h1, i, &r1);
                if (!W_ERROR_IS_OK(error)) {
-                       DEBUG(0, ("Unable to open hive %s for backend 1\n", reg_get_hkey_name(i)));
+                       DEBUG(0, ("Unable to open hive %s for backend 1\n", reg_get_predef_name(i)));
                        continue;
                }
                
-               error = reg_get_hive(h2, i, &r2);
+               error = reg_get_predefined_key(h2, i, &r2);
                if (!W_ERROR_IS_OK(error)) {
-                       DEBUG(0, ("Unable to open hive %s for backend 2\n", reg_get_hkey_name(i)));
+                       DEBUG(0, ("Unable to open hive %s for backend 2\n", reg_get_predef_name(i)));
                        continue;
                }
 
index 3fd9dab2688c63288ec30d3b9246f1a06b52b5bd..47d84c1f623f4f683ef99c40b6cd3bbcd9ab5719 100644 (file)
@@ -162,28 +162,6 @@ static struct registry_key *cmd_rmval(TALLOC_CTX *mem_ctx, struct registry_key *
        return NULL; 
 }
 
-static struct registry_key *cmd_hive(TALLOC_CTX *mem_ctx, struct registry_key *cur, int argc, char **argv)
-{
-       if (!cur->hive->reg_ctx) {
-               fprintf(stderr, "Only one hive loaded\n");
-               return cur;
-       }
-
-       if (argc == 1) {
-               printf("%s\n", cur->hive->root->name);
-       } else {
-               struct registry_key *newroot;
-               WERROR error = reg_get_hive_by_name(cur->hive->reg_ctx, argv[1], &newroot);
-               if (W_ERROR_IS_OK(error)) {
-                       return newroot;
-               } else {
-                       fprintf(stderr, "Can't switch to hive %s: %s\n", cur->hive->root->name, win_errstr(error));
-               }
-       }
-
-       return NULL;
-}
-
 static struct registry_key *cmd_exit(TALLOC_CTX *mem_ctx, struct registry_key *cur, int argc, char **argv)
 {
        exit(0);
@@ -199,7 +177,6 @@ struct {
        struct registry_key *(*handle)(TALLOC_CTX *mem_ctx, struct registry_key *, int argc, char **argv);
 } regshell_cmds[] = {
        {"ck", "cd", "Change current key", cmd_ck },
-       {"ch", "hive", "Change current hive", cmd_hive },
        {"info", "i", "Show detailed information of a key", cmd_info },
        {"list", "ls", "List values/keys in current key", cmd_ls },
        {"mkkey", "mkdir", "Make new key", cmd_mkkey },
@@ -407,7 +384,7 @@ static char **reg_completion(const char *text, int start, int end)
 
        if (h) {
                /*FIXME: What if HKEY_CLASSES_ROOT is not present ? */
-               reg_get_hive(h, HKEY_CLASSES_ROOT, &curkey);
+               reg_get_predefined_key(h, HKEY_CLASSES_ROOT, &curkey);
        }
        
        poptFreeContext(pc);
index 7adeeea731d6f2289a9749bc8dcee8ea57f26ce4..a6beb2b484cbcc6d33cb0919a625d94daa2ad2da 100644 (file)
@@ -124,9 +124,9 @@ static void print_tree(int l, struct registry_key *p, int fullpath, int novals)
                print_tree(0, root, fullpath, no_values);
        } else {
                for(i = HKEY_CLASSES_ROOT; i < HKEY_PERFORMANCE_NLSTEXT; i++) {
-                       error = reg_get_hive(h, i, &root);
+                       error = reg_get_predefined_key(h, i, &root);
                        if (!W_ERROR_IS_OK(error)) {
-                               fprintf(stderr, "Skipping %s\n", reg_get_hkey_name(i));
+                               fprintf(stderr, "Skipping %s\n", reg_get_predef_name(i));
                                continue;
                        }
                        print_tree(0, root, fullpath, no_values);
index a5c6effa2ffc542251eb8fb34ba8ebe0949588b3..478c6c1d86d5cb9fc0d3bcf91f3d5a7850e9f750 100644 (file)
@@ -48,7 +48,7 @@ static WERROR winreg_openhive (struct dcesrv_call_state *dce_call, TALLOC_CTX *m
 
        h = dcesrv_handle_new(dce_call->conn, HTYPE_REGKEY); 
 
-       error = reg_get_hive(ctx, hkey, (struct registry_key **)&h->data);
+       error = reg_get_predefined_key(ctx, hkey, (struct registry_key **)&h->data);
        if (!W_ERROR_IS_OK(error)) {
                return error;
        }