Signed-off-by: Hugh McMaster hugh.mcmaster@outlook.com --- programs/reg/Makefile.in | 1 + programs/reg/copy.c | 24 ++++++++++++++++++++++++ programs/reg/reg.c | 6 ++++++ programs/reg/reg.h | 3 +++ programs/reg/reg.rc | 24 +++++++++++++++++++++++- programs/reg/resource.h | 1 + programs/reg/tests/copy.c | 14 +++++++------- 7 files changed, 65 insertions(+), 8 deletions(-) create mode 100644 programs/reg/copy.c
diff --git a/programs/reg/Makefile.in b/programs/reg/Makefile.in index 5ef0d0854aa..7f7a5bc8032 100644 --- a/programs/reg/Makefile.in +++ b/programs/reg/Makefile.in @@ -6,6 +6,7 @@ EXTRADLLFLAGS = -mconsole -municode -mno-cygwin
C_SRCS = \ add.c \ + copy.c \ delete.c \ export.c \ import.c \ diff --git a/programs/reg/copy.c b/programs/reg/copy.c new file mode 100644 index 00000000000..ba0916e9956 --- /dev/null +++ b/programs/reg/copy.c @@ -0,0 +1,24 @@ +/* + * Copyright 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 "reg.h" + +int reg_copy(int argc, WCHAR *argvW[]) +{ + return 1; +} diff --git a/programs/reg/reg.c b/programs/reg/reg.c index 8ffbc5054d9..652fb19d931 100644 --- a/programs/reg/reg.c +++ b/programs/reg/reg.c @@ -1,5 +1,6 @@ /* * Copyright 2008 Andrew Riedi + * 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 @@ -285,6 +286,7 @@ static BOOL is_help_switch(const WCHAR *s)
enum operations { REG_ADD, + REG_COPY, REG_DELETE, REG_EXPORT, REG_IMPORT, @@ -299,6 +301,7 @@ static enum operations get_operation(const WCHAR *str, int *op_help) static const struct op_info op_array[] = { { L"add", REG_ADD, STRING_ADD_USAGE }, + { L"copy", REG_COPY, STRING_COPY_USAGE }, { L"delete", REG_DELETE, STRING_DELETE_USAGE }, { L"export", REG_EXPORT, STRING_EXPORT_USAGE }, { L"import", REG_IMPORT, STRING_IMPORT_USAGE }, @@ -362,6 +365,9 @@ int __cdecl wmain(int argc, WCHAR *argvW[]) if (op == REG_ADD) return reg_add(argc, argvW);
+ if (op == REG_COPY) + return reg_copy(argc, argvW); + if (op == REG_DELETE) return reg_delete(argc, argvW);
diff --git a/programs/reg/reg.h b/programs/reg/reg.h index b12d936d672..67b49b7797f 100644 --- a/programs/reg/reg.h +++ b/programs/reg/reg.h @@ -47,6 +47,9 @@ BOOL is_switch(const WCHAR *s, const WCHAR c); /* add.c */ int reg_add(int argc, WCHAR *argvW[]);
+/* copy.c */ +int reg_copy(int argc, WCHAR *argvW[]); + /* delete.c */ int reg_delete(int argc, WCHAR *argvW[]);
diff --git a/programs/reg/reg.rc b/programs/reg/reg.rc index 117365547ca..c091023384c 100644 --- a/programs/reg/reg.rc +++ b/programs/reg/reg.rc @@ -29,7 +29,7 @@ STRINGTABLE STRING_USAGE, "Usage:\n\ \ REG [operation] [parameters]\n\n\ \Supported operations:\n\ -\ ADD | DELETE | EXPORT | IMPORT | QUERY\n\n\ +\ ADD | COPY | DELETE | EXPORT | IMPORT | QUERY\n\n\ \For help on a specific operation, type:\n\ \ REG [operation] /?\n\n"
@@ -172,9 +172,31 @@ STRINGTABLE STRING_OVERWRITE_FILE, "The file '%1' already exists. Do you want to overwrite it?" STRING_KEY_NONEXIST, "reg: Unable to find the specified registry key\n" STRING_KEY_IMPORT_FAILED, "reg: Unable to import the registry key '%1'\n" + STRING_REG_VIEW_USAGE, " /reg:32\n\ \ Access the registry using the 32-bit view.\n\n\ \ /reg:64\n\ \ Access the registry using the 64-bit view.\n\n" STRING_ACCESS_DENIED, "reg: Unable to access or create the specified registry key\n" + + STRING_COPY_USAGE, "REG COPY <key1> <key2> [/s] [/f]\n\n\ +\ Copies the contents of a specified registry key to another location.\n\ +\ By default, this operation only copies registry values. Use [/s] to\n\ +\ recursively copy all subkeys and values.\n\n\ +\ <key1>, <key2>\n\ +\ Registry keys specifying the source (<key1>) and destination (<key2>)\n\ +\ of the data. If <key2> does not exist, it is created.\n\n\ +\ Format: ROOT\Subkey\n\n\ +\ ROOT: A predefined registry key. This must be one of the following:\n\n\ +\ HKEY_LOCAL_MACHINE | HKLM\n\ +\ HKEY_CURRENT_USER | HKCU\n\ +\ HKEY_CLASSES_ROOT | HKCR\n\ +\ HKEY_USERS | HKU\n\ +\ HKEY_CURRENT_CONFIG | HKCC\n\n\ +\ Subkey: The full path to a registry key under a given ROOT key.\n\n\ +\ /s\n\ +\ Copy all subkeys and values from <key1> to <key2>.\n\n\ +\ /f\n\ +\ Overwrite all registry data in <key2> without prompting for confirmation.\n\ +\ This option does not modify subkeys and values that only exist in <key2>.\n\n" } diff --git a/programs/reg/resource.h b/programs/reg/resource.h index ecc4c09337c..670d297389a 100644 --- a/programs/reg/resource.h +++ b/programs/reg/resource.h @@ -63,3 +63,4 @@ #define STRING_KEY_IMPORT_FAILED 140 #define STRING_REG_VIEW_USAGE 141 #define STRING_ACCESS_DENIED 142 +#define STRING_COPY_USAGE 143 diff --git a/programs/reg/tests/copy.c b/programs/reg/tests/copy.c index 53d990811ac..ecd3cc5b29d 100644 --- a/programs/reg/tests/copy.c +++ b/programs/reg/tests/copy.c @@ -28,25 +28,25 @@ static void test_command_syntax(void) ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
run_reg_exe("reg copy /?", &r); - todo_wine ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r); + ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
run_reg_exe("reg copy /h", &r); - todo_wine ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r); + ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
run_reg_exe("reg copy -H", &r); - todo_wine ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r); + ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
run_reg_exe("reg copy /? /f", &r); - ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r); + todo_wine ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
run_reg_exe("reg copy /h /f", &r); - ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r); + todo_wine ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
run_reg_exe("reg copy /? /s", &r); - ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r); + todo_wine ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
run_reg_exe("reg copy /h /s", &r); - ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r); + todo_wine ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
run_reg_exe("reg copy /f", &r); ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);