diff options
Diffstat (limited to 'source3/registry')
-rw-r--r-- | source3/registry/reg_api.c | 430 | ||||
-rw-r--r-- | source3/registry/reg_api_regf.c | 301 | ||||
-rw-r--r-- | source3/registry/reg_api_util.c | 181 | ||||
-rw-r--r-- | source3/registry/reg_api_util.h | 46 | ||||
-rw-r--r-- | source3/registry/reg_util_legacy.c | 1 |
5 files changed, 531 insertions, 428 deletions
diff --git a/source3/registry/reg_api.c b/source3/registry/reg_api.c index 0352446e7b..1cbe4661b1 100644 --- a/source3/registry/reg_api.c +++ b/source3/registry/reg_api.c @@ -53,19 +53,18 @@ * 0x1a winreg_GetVersion reg_getversion * 0x1b winreg_OpenHKCC * 0x1c winreg_OpenHKDD - * 0x1d winreg_QueryMultipleValues + * 0x1d winreg_QueryMultipleValues reg_querymultiplevalues * 0x1e winreg_InitiateSystemShutdownEx * 0x1f winreg_SaveKeyEx * 0x20 winreg_OpenHKPT * 0x21 winreg_OpenHKPN - * 0x22 winreg_QueryMultipleValues2 + * 0x22 winreg_QueryMultipleValues2 reg_querymultiplevalues * */ #include "includes.h" #include "registry.h" #include "reg_cachehook.h" -#include "regfio.h" #include "reg_util_internal.h" #include "reg_backend_db.h" #include "reg_dispatcher.h" @@ -748,277 +747,6 @@ WERROR reg_getversion(uint32_t *version) return WERR_OK; } -/******************************************************************* - Note: topkeypat is the *full* path that this *key will be - loaded into (including the name of the key) - ********************************************************************/ - -static WERROR reg_load_tree(REGF_FILE *regfile, const char *topkeypath, - REGF_NK_REC *key) -{ - REGF_NK_REC *subkey; - struct registry_key_handle registry_key; - struct regval_ctr *values; - struct regsubkey_ctr *subkeys; - int i; - char *path = NULL; - WERROR result = WERR_OK; - - /* initialize the struct registry_key_handle structure */ - - registry_key.ops = reghook_cache_find(topkeypath); - if (!registry_key.ops) { - DEBUG(0, ("reg_load_tree: Failed to assign registry_ops " - "to [%s]\n", topkeypath)); - return WERR_BADFILE; - } - - registry_key.name = talloc_strdup(regfile->mem_ctx, topkeypath); - if (!registry_key.name) { - DEBUG(0, ("reg_load_tree: Talloc failed for reg_key.name!\n")); - return WERR_NOMEM; - } - - /* now start parsing the values and subkeys */ - - result = regsubkey_ctr_init(regfile->mem_ctx, &subkeys); - W_ERROR_NOT_OK_RETURN(result); - - result = regval_ctr_init(subkeys, &values); - W_ERROR_NOT_OK_RETURN(result); - - /* copy values into the struct regval_ctr */ - - for (i=0; i<key->num_values; i++) { - regval_ctr_addvalue(values, key->values[i].valuename, - key->values[i].type, - key->values[i].data, - (key->values[i].data_size & ~VK_DATA_IN_OFFSET)); - } - - /* copy subkeys into the struct regsubkey_ctr */ - - key->subkey_index = 0; - while ((subkey = regfio_fetch_subkey( regfile, key ))) { - result = regsubkey_ctr_addkey(subkeys, subkey->keyname); - if (!W_ERROR_IS_OK(result)) { - TALLOC_FREE(subkeys); - return result; - } - } - - /* write this key and values out */ - - if (!store_reg_values(®istry_key, values) - || !store_reg_keys(®istry_key, subkeys)) - { - DEBUG(0,("reg_load_tree: Failed to load %s!\n", topkeypath)); - result = WERR_REG_IO_FAILURE; - } - - TALLOC_FREE(subkeys); - - if (!W_ERROR_IS_OK(result)) { - return result; - } - - /* now continue to load each subkey registry tree */ - - key->subkey_index = 0; - while ((subkey = regfio_fetch_subkey(regfile, key))) { - path = talloc_asprintf(regfile->mem_ctx, - "%s\\%s", - topkeypath, - subkey->keyname); - if (path == NULL) { - return WERR_NOMEM; - } - result = reg_load_tree(regfile, path, subkey); - if (!W_ERROR_IS_OK(result)) { - break; - } - } - - return result; -} - -/******************************************************************* - ********************************************************************/ - -static WERROR restore_registry_key(struct registry_key_handle *krecord, - const char *fname) -{ - REGF_FILE *regfile; - REGF_NK_REC *rootkey; - WERROR result; - - /* open the registry file....fail if the file already exists */ - - regfile = regfio_open(fname, (O_RDONLY), 0); - if (regfile == NULL) { - DEBUG(0, ("restore_registry_key: failed to open \"%s\" (%s)\n", - fname, strerror(errno))); - return ntstatus_to_werror(map_nt_error_from_unix(errno)); - } - - /* get the rootkey from the regf file and then load the tree - via recursive calls */ - - if (!(rootkey = regfio_rootkey(regfile))) { - regfio_close(regfile); - return WERR_REG_FILE_INVALID; - } - - result = reg_load_tree(regfile, krecord->name, rootkey); - - /* cleanup */ - - regfio_close(regfile); - - return result; -} - -WERROR reg_restorekey(struct registry_key *key, const char *fname) -{ - return restore_registry_key(key->key, fname); -} - -/******************************************************************** -********************************************************************/ - -static WERROR reg_write_tree(REGF_FILE *regfile, const char *keypath, - REGF_NK_REC *parent) -{ - REGF_NK_REC *key; - struct regval_ctr *values; - struct regsubkey_ctr *subkeys; - int i, num_subkeys; - char *key_tmp = NULL; - char *keyname, *parentpath; - char *subkeypath = NULL; - char *subkeyname; - struct registry_key_handle registry_key; - WERROR result = WERR_OK; - struct security_descriptor *sec_desc = NULL; - - if (!regfile) { - return WERR_GENERAL_FAILURE; - } - - if (!keypath) { - return WERR_OBJECT_PATH_INVALID; - } - - /* split up the registry key path */ - - key_tmp = talloc_strdup(regfile->mem_ctx, keypath); - if (!key_tmp) { - return WERR_NOMEM; - } - if (!reg_split_key(key_tmp, &parentpath, &keyname)) { - return WERR_OBJECT_PATH_INVALID; - } - - if (!keyname) { - keyname = parentpath; - } - - /* we need a registry_key_handle object here to enumerate subkeys and values */ - - ZERO_STRUCT(registry_key); - - registry_key.name = talloc_strdup(regfile->mem_ctx, keypath); - if (registry_key.name == NULL) { - return WERR_NOMEM; - } - - registry_key.ops = reghook_cache_find(registry_key.name); - if (registry_key.ops == NULL) { - return WERR_BADFILE; - } - - /* lookup the values and subkeys */ - - result = regsubkey_ctr_init(regfile->mem_ctx, &subkeys); - W_ERROR_NOT_OK_RETURN(result); - - result = regval_ctr_init(subkeys, &values); - W_ERROR_NOT_OK_RETURN(result); - - fetch_reg_keys(®istry_key, subkeys); - fetch_reg_values(®istry_key, values); - - result = regkey_get_secdesc(regfile->mem_ctx, ®istry_key, &sec_desc); - if (!W_ERROR_IS_OK(result)) { - goto done; - } - - /* write out this key */ - - key = regfio_write_key(regfile, keyname, values, subkeys, sec_desc, - parent); - if (key == NULL) { - result = WERR_CAN_NOT_COMPLETE; - goto done; - } - - /* write each one of the subkeys out */ - - num_subkeys = regsubkey_ctr_numkeys(subkeys); - for (i=0; i<num_subkeys; i++) { - subkeyname = regsubkey_ctr_specific_key(subkeys, i); - subkeypath = talloc_asprintf(regfile->mem_ctx, "%s\\%s", - keypath, subkeyname); - if (subkeypath == NULL) { - result = WERR_NOMEM; - goto done; - } - result = reg_write_tree(regfile, subkeypath, key); - if (!W_ERROR_IS_OK(result)) - goto done; - } - - DEBUG(6, ("reg_write_tree: wrote key [%s]\n", keypath)); - -done: - TALLOC_FREE(subkeys); - TALLOC_FREE(registry_key.name); - - return result; -} - -static WERROR backup_registry_key(struct registry_key_handle *krecord, - const char *fname) -{ - REGF_FILE *regfile; - WERROR result; - - /* open the registry file....fail if the file already exists */ - - regfile = regfio_open(fname, (O_RDWR|O_CREAT|O_EXCL), - (S_IREAD|S_IWRITE)); - if (regfile == NULL) { - DEBUG(0,("backup_registry_key: failed to open \"%s\" (%s)\n", - fname, strerror(errno) )); - return ntstatus_to_werror(map_nt_error_from_unix(errno)); - } - - /* write the registry tree to the file */ - - result = reg_write_tree(regfile, krecord->name, NULL); - - /* cleanup */ - - regfio_close(regfile); - - return result; -} - -WERROR reg_savekey(struct registry_key *key, const char *fname) -{ - return backup_registry_key(key->key, fname); -} - /********************************************************************** * Higher level utility functions **********************************************************************/ @@ -1051,62 +779,6 @@ WERROR reg_deleteallvalues(struct registry_key *key) } /* - * Utility function to open a complete registry path including the hive prefix. - */ - -WERROR reg_open_path(TALLOC_CTX *mem_ctx, const char *orig_path, - uint32 desired_access, const struct security_token *token, - struct registry_key **pkey) -{ - struct registry_key *hive, *key; - char *path, *p; - WERROR err; - - if (!(path = SMB_STRDUP(orig_path))) { - return WERR_NOMEM; - } - - p = strchr(path, '\\'); - - if ((p == NULL) || (p[1] == '\0')) { - /* - * No key behind the hive, just return the hive - */ - - err = reg_openhive(mem_ctx, path, desired_access, token, - &hive); - if (!W_ERROR_IS_OK(err)) { - SAFE_FREE(path); - return err; - } - SAFE_FREE(path); - *pkey = hive; - return WERR_OK; - } - - *p = '\0'; - - err = reg_openhive(mem_ctx, path, KEY_ENUMERATE_SUB_KEYS, token, - &hive); - if (!W_ERROR_IS_OK(err)) { - SAFE_FREE(path); - return err; - } - - err = reg_openkey(mem_ctx, hive, p+1, desired_access, &key); - - TALLOC_FREE(hive); - SAFE_FREE(path); - - if (!W_ERROR_IS_OK(err)) { - return err; - } - - *pkey = key; - return WERR_OK; -} - -/* * Utility function to delete a registry key with all its subkeys. * Note that reg_deletekey returns ACCESS_DENIED when called on a * key that has subkeys. @@ -1212,101 +884,3 @@ WERROR reg_deletesubkeys_recursive(TALLOC_CTX *ctx, return reg_deletekey_recursive_trans(ctx, parent, path, false); } -#if 0 -/* these two functions are unused. */ - -/** - * Utility function to create a registry key without opening the hive - * before. Assumes the hive already exists. - */ - -WERROR reg_create_path(TALLOC_CTX *mem_ctx, const char *orig_path, - uint32 desired_access, - const struct security_token *token, - enum winreg_CreateAction *paction, - struct registry_key **pkey) -{ - struct registry_key *hive; - char *path, *p; - WERROR err; - - if (!(path = SMB_STRDUP(orig_path))) { - return WERR_NOMEM; - } - - p = strchr(path, '\\'); - - if ((p == NULL) || (p[1] == '\0')) { - /* - * No key behind the hive, just return the hive - */ - - err = reg_openhive(mem_ctx, path, desired_access, token, - &hive); - if (!W_ERROR_IS_OK(err)) { - SAFE_FREE(path); - return err; - } - SAFE_FREE(path); - *pkey = hive; - *paction = REG_OPENED_EXISTING_KEY; - return WERR_OK; - } - - *p = '\0'; - - err = reg_openhive(mem_ctx, path, - (strchr(p+1, '\\') != NULL) ? - KEY_ENUMERATE_SUB_KEYS : KEY_CREATE_SUB_KEY, - token, &hive); - if (!W_ERROR_IS_OK(err)) { - SAFE_FREE(path); - return err; - } - - err = reg_createkey(mem_ctx, hive, p+1, desired_access, pkey, paction); - SAFE_FREE(path); - TALLOC_FREE(hive); - return err; -} - -/* - * Utility function to create a registry key without opening the hive - * before. Will not delete a hive. - */ - -WERROR reg_delete_path(const struct security_token *token, - const char *orig_path) -{ - struct registry_key *hive; - char *path, *p; - WERROR err; - - if (!(path = SMB_STRDUP(orig_path))) { - return WERR_NOMEM; - } - - p = strchr(path, '\\'); - - if ((p == NULL) || (p[1] == '\0')) { - SAFE_FREE(path); - return WERR_INVALID_PARAM; - } - - *p = '\0'; - - err = reg_openhive(NULL, path, - (strchr(p+1, '\\') != NULL) ? - KEY_ENUMERATE_SUB_KEYS : KEY_CREATE_SUB_KEY, - token, &hive); - if (!W_ERROR_IS_OK(err)) { - SAFE_FREE(path); - return err; - } - - err = reg_deletekey(hive, p+1); - SAFE_FREE(path); - TALLOC_FREE(hive); - return err; -} -#endif /* #if 0 */ diff --git a/source3/registry/reg_api_regf.c b/source3/registry/reg_api_regf.c new file mode 100644 index 0000000000..8f249b5aa7 --- /dev/null +++ b/source3/registry/reg_api_regf.c @@ -0,0 +1,301 @@ +/* + * Unix SMB/CIFS implementation. + * Virtual Windows Registry Layer + * Copyright (C) Volker Lendecke 2006 + * Copyright (C) Michael Adam 2007-2008 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see <http://www.gnu.org/licenses/>. + */ + +#include "includes.h" +#include "registry.h" +#include "reg_cachehook.h" +#include "regfio.h" +#include "reg_util_internal.h" +#include "reg_dispatcher.h" +#include "reg_objects.h" + +#undef DBGC_CLASS +#define DBGC_CLASS DBGC_REGISTRY + +/******************************************************************* + Note: topkeypat is the *full* path that this *key will be + loaded into (including the name of the key) + ********************************************************************/ + +static WERROR reg_load_tree(REGF_FILE *regfile, const char *topkeypath, + REGF_NK_REC *key) +{ + REGF_NK_REC *subkey; + struct registry_key_handle registry_key; + struct regval_ctr *values; + struct regsubkey_ctr *subkeys; + int i; + char *path = NULL; + WERROR result = WERR_OK; + + /* initialize the struct registry_key_handle structure */ + + registry_key.ops = reghook_cache_find(topkeypath); + if (!registry_key.ops) { + DEBUG(0, ("reg_load_tree: Failed to assign registry_ops " + "to [%s]\n", topkeypath)); + return WERR_BADFILE; + } + + registry_key.name = talloc_strdup(regfile->mem_ctx, topkeypath); + if (!registry_key.name) { + DEBUG(0, ("reg_load_tree: Talloc failed for reg_key.name!\n")); + return WERR_NOMEM; + } + + /* now start parsing the values and subkeys */ + + result = regsubkey_ctr_init(regfile->mem_ctx, &subkeys); + W_ERROR_NOT_OK_RETURN(result); + + result = regval_ctr_init(subkeys, &values); + W_ERROR_NOT_OK_RETURN(result); + + /* copy values into the struct regval_ctr */ + + for (i=0; i<key->num_values; i++) { + regval_ctr_addvalue(values, key->values[i].valuename, + key->values[i].type, + key->values[i].data, + (key->values[i].data_size & ~VK_DATA_IN_OFFSET)); + } + + /* copy subkeys into the struct regsubkey_ctr */ + + key->subkey_index = 0; + while ((subkey = regfio_fetch_subkey( regfile, key ))) { + result = regsubkey_ctr_addkey(subkeys, subkey->keyname); + if (!W_ERROR_IS_OK(result)) { + TALLOC_FREE(subkeys); + return result; + } + } + + /* write this key and values out */ + + if (!store_reg_values(®istry_key, values) + || !store_reg_keys(®istry_key, subkeys)) + { + DEBUG(0,("reg_load_tree: Failed to load %s!\n", topkeypath)); + result = WERR_REG_IO_FAILURE; + } + + TALLOC_FREE(subkeys); + + if (!W_ERROR_IS_OK(result)) { + return result; + } + + /* now continue to load each subkey registry tree */ + + key->subkey_index = 0; + while ((subkey = regfio_fetch_subkey(regfile, key))) { + path = talloc_asprintf(regfile->mem_ctx, + "%s\\%s", + topkeypath, + subkey->keyname); + if (path == NULL) { + return WERR_NOMEM; + } + result = reg_load_tree(regfile, path, subkey); + if (!W_ERROR_IS_OK(result)) { + break; + } + } + + return result; +} + +/******************************************************************* + ********************************************************************/ + +static WERROR restore_registry_key(struct registry_key_handle *krecord, + const char *fname) +{ + REGF_FILE *regfile; + REGF_NK_REC *rootkey; + WERROR result; + + /* open the registry file....fail if the file already exists */ + + regfile = regfio_open(fname, (O_RDONLY), 0); + if (regfile == NULL) { + DEBUG(0, ("restore_registry_key: failed to open \"%s\" (%s)\n", + fname, strerror(errno))); + return ntstatus_to_werror(map_nt_error_from_unix(errno)); + } + + /* get the rootkey from the regf file and then load the tree + via recursive calls */ + + if (!(rootkey = regfio_rootkey(regfile))) { + regfio_close(regfile); + return WERR_REG_FILE_INVALID; + } + + result = reg_load_tree(regfile, krecord->name, rootkey); + + /* cleanup */ + + regfio_close(regfile); + + return result; +} + +WERROR reg_restorekey(struct registry_key *key, const char *fname) +{ + return restore_registry_key(key->key, fname); +} + +/******************************************************************** +********************************************************************/ + +static WERROR reg_write_tree(REGF_FILE *regfile, const char *keypath, + REGF_NK_REC *parent) +{ + REGF_NK_REC *key; + struct regval_ctr *values; + struct regsubkey_ctr *subkeys; + int i, num_subkeys; + char *key_tmp = NULL; + char *keyname, *parentpath; + char *subkeypath = NULL; + char *subkeyname; + struct registry_key_handle registry_key; + WERROR result = WERR_OK; + struct security_descriptor *sec_desc = NULL; + + if (!regfile) { + return WERR_GENERAL_FAILURE; + } + + if (!keypath) { + return WERR_OBJECT_PATH_INVALID; + } + + /* split up the registry key path */ + + key_tmp = talloc_strdup(regfile->mem_ctx, keypath); + if (!key_tmp) { + return WERR_NOMEM; + } + if (!reg_split_key(key_tmp, &parentpath, &keyname)) { + return WERR_OBJECT_PATH_INVALID; + } + + if (!keyname) { + keyname = parentpath; + } + + /* we need a registry_key_handle object here to enumerate subkeys and values */ + + ZERO_STRUCT(registry_key); + + registry_key.name = talloc_strdup(regfile->mem_ctx, keypath); + if (registry_key.name == NULL) { + return WERR_NOMEM; + } + + registry_key.ops = reghook_cache_find(registry_key.name); + if (registry_key.ops == NULL) { + return WERR_BADFILE; + } + + /* lookup the values and subkeys */ + + result = regsubkey_ctr_init(regfile->mem_ctx, &subkeys); + W_ERROR_NOT_OK_RETURN(result); + + result = regval_ctr_init(subkeys, &values); + W_ERROR_NOT_OK_RETURN(result); + + fetch_reg_keys(®istry_key, subkeys); + fetch_reg_values(®istry_key, values); + + result = regkey_get_secdesc(regfile->mem_ctx, ®istry_key, &sec_desc); + if (!W_ERROR_IS_OK(result)) { + goto done; + } + + /* write out this key */ + + key = regfio_write_key(regfile, keyname, values, subkeys, sec_desc, + parent); + if (key == NULL) { + result = WERR_CAN_NOT_COMPLETE; + goto done; + } + + /* write each one of the subkeys out */ + + num_subkeys = regsubkey_ctr_numkeys(subkeys); + for (i=0; i<num_subkeys; i++) { + subkeyname = regsubkey_ctr_specific_key(subkeys, i); + subkeypath = talloc_asprintf(regfile->mem_ctx, "%s\\%s", + keypath, subkeyname); + if (subkeypath == NULL) { + result = WERR_NOMEM; + goto done; + } + result = reg_write_tree(regfile, subkeypath, key); + if (!W_ERROR_IS_OK(result)) + goto done; + } + + DEBUG(6, ("reg_write_tree: wrote key [%s]\n", keypath)); + +done: + TALLOC_FREE(subkeys); + TALLOC_FREE(registry_key.name); + + return result; +} + +static WERROR backup_registry_key(struct registry_key_handle *krecord, + const char *fname) +{ + REGF_FILE *regfile; + WERROR result; + + /* open the registry file....fail if the file already exists */ + + regfile = regfio_open(fname, (O_RDWR|O_CREAT|O_EXCL), + (S_IREAD|S_IWRITE)); + if (regfile == NULL) { + DEBUG(0,("backup_registry_key: failed to open \"%s\" (%s)\n", + fname, strerror(errno) )); + return ntstatus_to_werror(map_nt_error_from_unix(errno)); + } + + /* write the registry tree to the file */ + + result = reg_write_tree(regfile, krecord->name, NULL); + + /* cleanup */ + + regfio_close(regfile); + + return result; +} + +WERROR reg_savekey(struct registry_key *key, const char *fname) +{ + return backup_registry_key(key->key, fname); +} diff --git a/source3/registry/reg_api_util.c b/source3/registry/reg_api_util.c new file mode 100644 index 0000000000..592b370d3b --- /dev/null +++ b/source3/registry/reg_api_util.c @@ -0,0 +1,181 @@ +/* + * Unix SMB/CIFS implementation. + * Virtual Windows Registry Layer + * Copyright (C) Volker Lendecke 2006 + * Copyright (C) Michael Adam 2007-2010 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see <http://www.gnu.org/licenses/>. + */ + +/* + * Higher level utility functions on top of reg_api.c + */ + +#include "includes.h" +#include "registry.h" +#include "reg_api_util.h" + +/** + * Utility function to open a complete registry path including the hive prefix. + */ +WERROR reg_open_path(TALLOC_CTX *mem_ctx, const char *orig_path, + uint32 desired_access, const struct security_token *token, + struct registry_key **pkey) +{ + struct registry_key *hive, *key; + char *path, *p; + WERROR err; + + if (!(path = SMB_STRDUP(orig_path))) { + return WERR_NOMEM; + } + + p = strchr(path, '\\'); + + if ((p == NULL) || (p[1] == '\0')) { + /* + * No key behind the hive, just return the hive + */ + + err = reg_openhive(mem_ctx, path, desired_access, token, + &hive); + if (!W_ERROR_IS_OK(err)) { + SAFE_FREE(path); + return err; + } + SAFE_FREE(path); + *pkey = hive; + return WERR_OK; + } + + *p = '\0'; + + err = reg_openhive(mem_ctx, path, KEY_ENUMERATE_SUB_KEYS, token, + &hive); + if (!W_ERROR_IS_OK(err)) { + SAFE_FREE(path); + return err; + } + + err = reg_openkey(mem_ctx, hive, p+1, desired_access, &key); + + TALLOC_FREE(hive); + SAFE_FREE(path); + + if (!W_ERROR_IS_OK(err)) { + return err; + } + + *pkey = key; + return WERR_OK; +} + +#if 0 +/* these two functions are unused. */ + +/** + * Utility function to create a registry key without opening the hive + * before. Assumes the hive already exists. + */ + +WERROR reg_create_path(TALLOC_CTX *mem_ctx, const char *orig_path, + uint32 desired_access, + const struct security_token *token, + enum winreg_CreateAction *paction, + struct registry_key **pkey) +{ + struct registry_key *hive; + char *path, *p; + WERROR err; + + if (!(path = SMB_STRDUP(orig_path))) { + return WERR_NOMEM; + } + + p = strchr(path, '\\'); + + if ((p == NULL) || (p[1] == '\0')) { + /* + * No key behind the hive, just return the hive + */ + + err = reg_openhive(mem_ctx, path, desired_access, token, + &hive); + if (!W_ERROR_IS_OK(err)) { + SAFE_FREE(path); + return err; + } + SAFE_FREE(path); + *pkey = hive; + *paction = REG_OPENED_EXISTING_KEY; + return WERR_OK; + } + + *p = '\0'; + + err = reg_openhive(mem_ctx, path, + (strchr(p+1, '\\') != NULL) ? + KEY_ENUMERATE_SUB_KEYS : KEY_CREATE_SUB_KEY, + token, &hive); + if (!W_ERROR_IS_OK(err)) { + SAFE_FREE(path); + return err; + } + + err = reg_createkey(mem_ctx, hive, p+1, desired_access, pkey, paction); + SAFE_FREE(path); + TALLOC_FREE(hive); + return err; +} + +/* + * Utility function to create a registry key without opening the hive + * before. Will not delete a hive. + */ + +WERROR reg_delete_path(const struct security_token *token, + const char *orig_path) +{ + struct registry_key *hive; + char *path, *p; + WERROR err; + + if (!(path = SMB_STRDUP(orig_path))) { + return WERR_NOMEM; + } + + p = strchr(path, '\\'); + + if ((p == NULL) || (p[1] == '\0')) { + SAFE_FREE(path); + return WERR_INVALID_PARAM; + } + + *p = '\0'; + + err = reg_openhive(NULL, path, + (strchr(p+1, '\\') != NULL) ? + KEY_ENUMERATE_SUB_KEYS : KEY_CREATE_SUB_KEY, + token, &hive); + if (!W_ERROR_IS_OK(err)) { + SAFE_FREE(path); + return err; + } + + err = reg_deletekey(hive, p+1); + SAFE_FREE(path); + TALLOC_FREE(hive); + return err; +} +#endif /* #if 0 */ diff --git a/source3/registry/reg_api_util.h b/source3/registry/reg_api_util.h new file mode 100644 index 0000000000..d2d7894d78 --- /dev/null +++ b/source3/registry/reg_api_util.h @@ -0,0 +1,46 @@ +/* + * Unix SMB/CIFS implementation. + * Virtual Windows Registry Layer + * Copyright (C) Volker Lendecke 2006 + * Copyright (C) Michael Adam 2007-2010 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see <http://www.gnu.org/licenses/>. + */ + +/* + * Higher level utility functions on top of reg_api.c + */ + +#ifndef _REG_API_UTIL_H +#define _REG_API_UTIL_H + +/** + * Utility function to open a complete registry path including the hive prefix. + */ +WERROR reg_open_path(TALLOC_CTX *mem_ctx, const char *orig_path, + uint32 desired_access, const struct security_token *token, + struct registry_key **pkey); + +#if 0 +/* currently unused */ +WERROR reg_create_path(TALLOC_CTX *mem_ctx, const char *orig_path, + uint32 desired_access, + const struct security_token *token, + enum winreg_CreateAction *paction, + struct registry_key **pkey); +WERROR reg_delete_path(const struct security_token *token, + const char *orig_path); +#endif + +#endif /* _REG_API_UTIL_H */ diff --git a/source3/registry/reg_util_legacy.c b/source3/registry/reg_util_legacy.c index 3a3f0207e2..29b0889402 100644 --- a/source3/registry/reg_util_legacy.c +++ b/source3/registry/reg_util_legacy.c @@ -22,6 +22,7 @@ #include "includes.h" #include "registry.h" #include "reg_util_legacy.h" +#include "reg_api_util.h" #undef DBGC_CLASS #define DBGC_CLASS DBGC_REGISTRY |