From 81a3eecc3c2e7ddced2f25cabc6de47101fd4fb1 Mon Sep 17 00:00:00 2001 From: Hugh McMaster Date: Wed, 17 Mar 2021 23:38:05 +1100 Subject: [PATCH] reg: Split 'delete' functions from reg.c. Signed-off-by: Hugh McMaster Signed-off-by: Alexandre Julliard --- programs/reg/Makefile.in | 1 + programs/reg/delete.c | 109 +++++++++++++++++++++++++++++++++++++++ programs/reg/reg.c | 88 ------------------------------- programs/reg/reg.h | 4 ++ 4 files changed, 114 insertions(+), 88 deletions(-) create mode 100644 programs/reg/delete.c diff --git a/programs/reg/Makefile.in b/programs/reg/Makefile.in index 3203126db66..161be0062f1 100644 --- a/programs/reg/Makefile.in +++ b/programs/reg/Makefile.in @@ -5,6 +5,7 @@ DELAYIMPORTS = user32 EXTRADLLFLAGS = -mconsole -municode -mno-cygwin C_SRCS = \ + delete.c \ export.c \ import.c \ query.c \ diff --git a/programs/reg/delete.c b/programs/reg/delete.c new file mode 100644 index 00000000000..530d4513ece --- /dev/null +++ b/programs/reg/delete.c @@ -0,0 +1,109 @@ +/* + * Copyright 2016-2017, 2021 Hugh McMaster + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include +#include "reg.h" + +int reg_delete(HKEY root, WCHAR *path, WCHAR *key_name, WCHAR *value_name, + BOOL value_empty, BOOL value_all, BOOL force) +{ + HKEY key; + + if (!force) + { + BOOL ret; + + if (value_name || value_empty) + ret = ask_confirm(STRING_DELETE_VALUE, value_name); + else if (value_all) + ret = ask_confirm(STRING_DELETE_VALUEALL, key_name); + else + ret = ask_confirm(STRING_DELETE_SUBKEY, key_name); + + if (!ret) + { + output_message(STRING_CANCELLED); + return 0; + } + } + + /* Delete subtree only if no /v* option is given */ + if (!value_name && !value_empty && !value_all) + { + if (RegDeleteTreeW(root, path) != ERROR_SUCCESS) + { + output_message(STRING_CANNOT_FIND); + return 1; + } + output_message(STRING_SUCCESS); + return 0; + } + + if (RegOpenKeyW(root, path, &key) != ERROR_SUCCESS) + { + output_message(STRING_CANNOT_FIND); + return 1; + } + + if (value_all) + { + DWORD max_value_len = 256, value_len; + WCHAR *value_name; + LONG rc; + + value_name = heap_xalloc(max_value_len * sizeof(WCHAR)); + + while (1) + { + value_len = max_value_len; + rc = RegEnumValueW(key, 0, value_name, &value_len, NULL, NULL, NULL, NULL); + if (rc == ERROR_SUCCESS) + { + rc = RegDeleteValueW(key, value_name); + if (rc != ERROR_SUCCESS) + { + heap_free(value_name); + RegCloseKey(key); + output_message(STRING_VALUEALL_FAILED, key_name); + return 1; + } + } + else if (rc == ERROR_MORE_DATA) + { + max_value_len *= 2; + value_name = heap_xrealloc(value_name, max_value_len * sizeof(WCHAR)); + } + else break; + } + heap_free(value_name); + } + else if (value_name || value_empty) + { + if (RegDeleteValueW(key, value_empty ? NULL : value_name) != ERROR_SUCCESS) + { + RegCloseKey(key); + output_message(STRING_CANNOT_FIND); + return 1; + } + } + + RegCloseKey(key); + output_message(STRING_SUCCESS); + return 0; +} diff --git a/programs/reg/reg.c b/programs/reg/reg.c index 8b97c560118..079ed9b1a1e 100644 --- a/programs/reg/reg.c +++ b/programs/reg/reg.c @@ -422,94 +422,6 @@ static int reg_add(HKEY root, WCHAR *path, WCHAR *value_name, BOOL value_empty, return 0; } -static int reg_delete(HKEY root, WCHAR *path, WCHAR *key_name, WCHAR *value_name, - BOOL value_empty, BOOL value_all, BOOL force) -{ - HKEY key; - - if (!force) - { - BOOL ret; - - if (value_name || value_empty) - ret = ask_confirm(STRING_DELETE_VALUE, value_name); - else if (value_all) - ret = ask_confirm(STRING_DELETE_VALUEALL, key_name); - else - ret = ask_confirm(STRING_DELETE_SUBKEY, key_name); - - if (!ret) - { - output_message(STRING_CANCELLED); - return 0; - } - } - - /* Delete subtree only if no /v* option is given */ - if (!value_name && !value_empty && !value_all) - { - if (RegDeleteTreeW(root, path) != ERROR_SUCCESS) - { - output_message(STRING_CANNOT_FIND); - return 1; - } - output_message(STRING_SUCCESS); - return 0; - } - - if (RegOpenKeyW(root, path, &key) != ERROR_SUCCESS) - { - output_message(STRING_CANNOT_FIND); - return 1; - } - - if (value_all) - { - DWORD max_value_len = 256, value_len; - WCHAR *value_name; - LONG rc; - - value_name = heap_xalloc(max_value_len * sizeof(WCHAR)); - - while (1) - { - value_len = max_value_len; - rc = RegEnumValueW(key, 0, value_name, &value_len, NULL, NULL, NULL, NULL); - if (rc == ERROR_SUCCESS) - { - rc = RegDeleteValueW(key, value_name); - if (rc != ERROR_SUCCESS) - { - heap_free(value_name); - RegCloseKey(key); - output_message(STRING_VALUEALL_FAILED, key_name); - return 1; - } - } - else if (rc == ERROR_MORE_DATA) - { - max_value_len *= 2; - value_name = heap_xrealloc(value_name, max_value_len * sizeof(WCHAR)); - } - else break; - } - heap_free(value_name); - } - else if (value_name || value_empty) - { - if (RegDeleteValueW(key, value_empty ? NULL : value_name) != ERROR_SUCCESS) - { - RegCloseKey(key); - output_message(STRING_CANNOT_FIND); - return 1; - } - } - - RegCloseKey(key); - output_message(STRING_SUCCESS); - return 0; -} - WCHAR *build_subkey_path(WCHAR *path, DWORD path_len, WCHAR *subkey_name, DWORD subkey_len) { WCHAR *subkey_path; diff --git a/programs/reg/reg.h b/programs/reg/reg.h index 471ed9c4d55..c8baaa0f9a9 100644 --- a/programs/reg/reg.h +++ b/programs/reg/reg.h @@ -41,6 +41,10 @@ HKEY path_get_rootkey(const WCHAR *path); WCHAR *build_subkey_path(WCHAR *path, DWORD path_len, WCHAR *subkey_name, DWORD subkey_len); BOOL parse_registry_key(const WCHAR *key, HKEY *root, WCHAR **path, WCHAR **long_key); +/* delete.c */ +int reg_delete(HKEY root, WCHAR *path, WCHAR *key_name, WCHAR *value_name, + BOOL value_empty, BOOL value_all, BOOL force); + /* export.c */ int reg_export(int argc, WCHAR *argv[]);