Signed-off-by: Hugh McMaster hugh.mcmaster@outlook.com --- programs/reg/delete.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/programs/reg/delete.c b/programs/reg/delete.c index 6ead3fc6919..0f263e91902 100644 --- a/programs/reg/delete.c +++ b/programs/reg/delete.c @@ -53,7 +53,7 @@ int reg_delete(HKEY root, WCHAR *path, WCHAR *key_name, WCHAR *value_name, return 0; }
- if (RegOpenKeyW(root, path, &key) != ERROR_SUCCESS) + if (RegOpenKeyExW(root, path, 0, KEY_READ|KEY_SET_VALUE, &key)) { output_message(STRING_CANNOT_FIND); return 1;
Signed-off-by: Hugh McMaster hugh.mcmaster@outlook.com --- programs/reg/delete.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/programs/reg/delete.c b/programs/reg/delete.c index 0f263e91902..c102fb4ad53 100644 --- a/programs/reg/delete.c +++ b/programs/reg/delete.c @@ -41,7 +41,7 @@ int reg_delete(HKEY root, WCHAR *path, WCHAR *key_name, WCHAR *value_name, } }
- /* Delete subtree only if no /v* option is given */ + /* Delete registry key if no /v* option is given */ if (!value_name && !value_empty && !value_all) { if (RegDeleteTreeW(root, path) != ERROR_SUCCESS)
Signed-off-by: Hugh McMaster hugh.mcmaster@outlook.com --- programs/reg/query.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/programs/reg/query.c b/programs/reg/query.c index c8277cd7114..fb9305dea35 100644 --- a/programs/reg/query.c +++ b/programs/reg/query.c @@ -331,7 +331,7 @@ int reg_query(int argc, WCHAR *argvW[]) HKEY root; WCHAR *path, *key_name, *value_name = NULL; BOOL value_empty = FALSE, recurse = FALSE; - int i; + int i, ret;
if (!parse_registry_key(argvW[2], &root, &path, &key_name)) return 1; @@ -370,9 +370,12 @@ int reg_query(int argc, WCHAR *argvW[]) if (value_name && value_empty) goto invalid;
- return run_query(root, path, key_name, value_name, value_empty, recurse); + ret = run_query(root, path, key_name, value_name, value_empty, recurse); + free(key_name); + return ret;
invalid: + free(key_name); output_message(STRING_INVALID_CMDLINE); return 1; }
Hugh McMaster hugh.mcmaster@outlook.com writes:
@@ -370,9 +370,12 @@ int reg_query(int argc, WCHAR *argvW[]) if (value_name && value_empty) goto invalid;
- return run_query(root, path, key_name, value_name, value_empty, recurse);
- ret = run_query(root, path, key_name, value_name, value_empty, recurse);
- free(key_name);
- return ret;
invalid:
- free(key_name); output_message(STRING_INVALID_CMDLINE); return 1;
}
Freeing memory before process exit is not useful, so it's not worth making the code more complicated for this.
Signed-off-by: Hugh McMaster hugh.mcmaster@outlook.com --- programs/reg/delete.c | 64 +++++++++++++++++++++++++++++++++++++++++-- programs/reg/reg.c | 22 +++++---------- programs/reg/reg.h | 3 +- 3 files changed, 70 insertions(+), 19 deletions(-)
diff --git a/programs/reg/delete.c b/programs/reg/delete.c index c102fb4ad53..c80205ab5a9 100644 --- a/programs/reg/delete.c +++ b/programs/reg/delete.c @@ -18,8 +18,8 @@
#include "reg.h"
-int reg_delete(HKEY root, WCHAR *path, WCHAR *key_name, WCHAR *value_name, - BOOL value_empty, BOOL value_all, BOOL force) +static int run_delete(HKEY root, WCHAR *path, WCHAR *key_name, WCHAR *value_name, + BOOL value_empty, BOOL value_all, BOOL force) { HKEY key;
@@ -105,3 +105,63 @@ int reg_delete(HKEY root, WCHAR *path, WCHAR *key_name, WCHAR *value_name, output_message(STRING_SUCCESS); return 0; } + +int reg_delete(int argc, WCHAR *argvW[]) +{ + HKEY root; + WCHAR *path, *key_name, *value_name = NULL; + BOOL value_all = FALSE, value_empty = FALSE, force = FALSE; + int i, ret; + + if (!parse_registry_key(argvW[2], &root, &path, &key_name)) + return 1; + + for (i = 3; i < argc; i++) + { + if (argvW[i][0] == '/' || argvW[i][0] == '-') + { + WCHAR *str = &argvW[i][1]; + + if (!lstrcmpiW(str, L"va")) + { + if (value_all) goto invalid; + value_all = TRUE; + continue; + } + else if (!lstrcmpiW(str, L"ve")) + { + if (value_empty) goto invalid; + value_empty = TRUE; + continue; + } + else if (!str[0] || str[1]) + goto invalid; + + switch (towlower(*str)) + { + case 'v': + if (value_name || !(value_name = argvW[++i])) + goto invalid; + break; + case 'f': + if (force) goto invalid; + force = TRUE; + break; + default: + goto invalid; + } + } + } + + if ((value_name && value_empty) || (value_name && value_all) || (value_empty && value_all)) + goto invalid; + + ret = run_delete(root, path, key_name, value_name, value_empty, value_all, force); + free(key_name); + return ret; + +invalid: + free(key_name); + output_message(STRING_INVALID_CMDLINE); + return 1; +} diff --git a/programs/reg/reg.c b/programs/reg/reg.c index 88889205ca7..9f2b4b53a04 100644 --- a/programs/reg/reg.c +++ b/programs/reg/reg.c @@ -333,11 +333,10 @@ static enum operations get_operation(const WCHAR *str, int *op_help)
int __cdecl wmain(int argc, WCHAR *argvW[]) { - int i, op, op_help, ret; - static const WCHAR switchVAW[] = {'v','a',0}; + int i, op, op_help; static const WCHAR switchVEW[] = {'v','e',0}; WCHAR *key_name, *path, *value_name = NULL, *type = NULL, *data = NULL, separator = '\0'; - BOOL value_empty = FALSE, value_all = FALSE, force = FALSE; + BOOL value_empty = FALSE, force = FALSE; HKEY root;
if (argc == 1) @@ -374,6 +373,9 @@ int __cdecl wmain(int argc, WCHAR *argvW[]) return 0; }
+ if (op == REG_DELETE) + return reg_delete(argc, argvW); + if (op == REG_EXPORT) return reg_export(argc, argvW);
@@ -397,11 +399,6 @@ int __cdecl wmain(int argc, WCHAR *argvW[]) value_empty = TRUE; continue; } - else if (!lstrcmpiW(ptr, switchVAW)) - { - value_all = TRUE; - continue; - } else if (!ptr[0] || ptr[1]) { output_message(STRING_INVALID_CMDLINE); @@ -450,16 +447,11 @@ int __cdecl wmain(int argc, WCHAR *argvW[]) } }
- if ((value_name && value_empty) || (value_name && value_all) || (value_empty && value_all)) + if (value_name && value_empty) { output_message(STRING_INVALID_CMDLINE); return 1; }
- if (op == REG_ADD) - ret = reg_add(root, path, value_name, value_empty, type, separator, data, force); - else - ret = reg_delete(root, path, key_name, value_name, value_empty, value_all, force); - - return ret; + return reg_add(root, path, value_name, value_empty, type, separator, data, force); } diff --git a/programs/reg/reg.h b/programs/reg/reg.h index e1e4804d19d..e4ee13eca6e 100644 --- a/programs/reg/reg.h +++ b/programs/reg/reg.h @@ -47,8 +47,7 @@ int reg_add(HKEY root, WCHAR *path, WCHAR *value_name, BOOL value_empty, WCHAR *type, WCHAR separator, WCHAR *data, BOOL force);
/* delete.c */ -int reg_delete(HKEY root, WCHAR *path, WCHAR *key_name, WCHAR *value_name, - BOOL value_empty, BOOL value_all, BOOL force); +int reg_delete(int argc, WCHAR *argvW[]);
/* export.c */ int reg_export(int argc, WCHAR *argvW[]);
Signed-off-by: Hugh McMaster hugh.mcmaster@outlook.com --- programs/reg/add.c | 70 +++++++++++++++++++++++++++++++++++++-- programs/reg/reg.c | 82 +++------------------------------------------- programs/reg/reg.h | 3 +- 3 files changed, 74 insertions(+), 81 deletions(-)
diff --git a/programs/reg/add.c b/programs/reg/add.c index 3d0a509b4f0..9938173bb45 100644 --- a/programs/reg/add.c +++ b/programs/reg/add.c @@ -149,8 +149,8 @@ static LPBYTE get_regdata(const WCHAR *data, DWORD reg_type, WCHAR separator, DW return out_data; }
-int reg_add(HKEY root, WCHAR *path, WCHAR *value_name, BOOL value_empty, - WCHAR *type, WCHAR separator, WCHAR *data, BOOL force) +static int run_add(HKEY root, WCHAR *path, WCHAR *value_name, BOOL value_empty, + WCHAR *type, WCHAR separator, WCHAR *data, BOOL force) { HKEY key;
@@ -208,3 +208,69 @@ int reg_add(HKEY root, WCHAR *path, WCHAR *value_name, BOOL value_empty,
return 0; } + +int reg_add(int argc, WCHAR *argvW[]) +{ + HKEY root; + WCHAR *path, *key_name, *value_name = NULL, *type = NULL, *data = NULL, separator = '\0'; + BOOL value_empty = FALSE, force = FALSE; + int i, ret; + + if (!parse_registry_key(argvW[2], &root, &path, &key_name)) + return 1; + + for (i = 3; i < argc; i++) + { + if (argvW[i][0] == '/' || argvW[i][0] == '-') + { + WCHAR *str = &argvW[i][1]; + + if (!lstrcmpiW(str, L"ve")) + { + value_empty = TRUE; + continue; + } + else if (!str[0] || str[1]) + goto invalid; + + switch (towlower(*str)) + { + case 'v': + if (value_name || !(value_name = argvW[++i])) + goto invalid; + break; + case 't': + if (type || !(type = argvW[++i])) + goto invalid; + break; + case 'd': + if (data || !(data = argvW[++i])) + goto invalid; + break; + case 's': + str = argvW[++i]; + if (!str || lstrlenW(str) != 1) + goto invalid; + separator = str[0]; + break; + case 'f': + force = TRUE; + break; + default: + goto invalid; + } + } + } + + if (value_name && value_empty) + goto invalid; + + ret = run_add(root, path, value_name, value_empty, type, separator, data, force); + free(key_name); + return ret; + +invalid: + free(key_name); + output_message(STRING_INVALID_CMDLINE); + return 1; +} diff --git a/programs/reg/reg.c b/programs/reg/reg.c index 9f2b4b53a04..e419799676f 100644 --- a/programs/reg/reg.c +++ b/programs/reg/reg.c @@ -333,11 +333,7 @@ static enum operations get_operation(const WCHAR *str, int *op_help)
int __cdecl wmain(int argc, WCHAR *argvW[]) { - int i, op, op_help; - static const WCHAR switchVEW[] = {'v','e',0}; - WCHAR *key_name, *path, *value_name = NULL, *type = NULL, *data = NULL, separator = '\0'; - BOOL value_empty = FALSE, force = FALSE; - HKEY root; + int op, op_help;
if (argc == 1) { @@ -373,6 +369,9 @@ int __cdecl wmain(int argc, WCHAR *argvW[]) return 0; }
+ if (op == REG_ADD) + return reg_add(argc, argvW); + if (op == REG_DELETE) return reg_delete(argc, argvW);
@@ -382,76 +381,5 @@ int __cdecl wmain(int argc, WCHAR *argvW[]) if (op == REG_IMPORT) return reg_import(argc, argvW);
- if (op == REG_QUERY) - return reg_query(argc, argvW); - - if (!parse_registry_key(argvW[2], &root, &path, &key_name)) - return 1; - - for (i = 3; i < argc; i++) - { - if (argvW[i][0] == '/' || argvW[i][0] == '-') - { - WCHAR *ptr = &argvW[i][1]; - - if (!lstrcmpiW(ptr, switchVEW)) - { - value_empty = TRUE; - continue; - } - else if (!ptr[0] || ptr[1]) - { - output_message(STRING_INVALID_CMDLINE); - return 1; - } - - switch(towlower(argvW[i][1])) - { - case 'v': - if (value_name || !(value_name = argvW[++i])) - { - output_message(STRING_INVALID_CMDLINE); - return 1; - } - break; - case 't': - if (type || !(type = argvW[++i])) - { - output_message(STRING_INVALID_CMDLINE); - return 1; - } - break; - case 'd': - if (data || !(data = argvW[++i])) - { - output_message(STRING_INVALID_CMDLINE); - return 1; - } - break; - case 's': - ptr = argvW[++i]; - if (!ptr || lstrlenW(ptr) != 1) - { - output_message(STRING_INVALID_CMDLINE); - return 1; - } - separator = ptr[0]; - break; - case 'f': - force = TRUE; - break; - default: - output_message(STRING_INVALID_CMDLINE); - return 1; - } - } - } - - if (value_name && value_empty) - { - output_message(STRING_INVALID_CMDLINE); - return 1; - } - - return reg_add(root, path, value_name, value_empty, type, separator, data, force); + return reg_query(argc, argvW); } diff --git a/programs/reg/reg.h b/programs/reg/reg.h index e4ee13eca6e..3525bed75b8 100644 --- a/programs/reg/reg.h +++ b/programs/reg/reg.h @@ -43,8 +43,7 @@ BOOL parse_registry_key(const WCHAR *key, HKEY *root, WCHAR **path, WCHAR **long BOOL is_switch(const WCHAR *s, const WCHAR c);
/* add.c */ -int reg_add(HKEY root, WCHAR *path, WCHAR *value_name, BOOL value_empty, - WCHAR *type, WCHAR separator, WCHAR *data, BOOL force); +int reg_add(int arc, WCHAR *argvW[]);
/* delete.c */ int reg_delete(int argc, WCHAR *argvW[]);
Signed-off-by: Hugh McMaster hugh.mcmaster@outlook.com --- programs/reg/add.c | 4 +++- programs/reg/tests/add.c | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/programs/reg/add.c b/programs/reg/add.c index 9938173bb45..170f2a40a46 100644 --- a/programs/reg/add.c +++ b/programs/reg/add.c @@ -227,6 +227,7 @@ int reg_add(int argc, WCHAR *argvW[])
if (!lstrcmpiW(str, L"ve")) { + if (value_empty) goto invalid; value_empty = TRUE; continue; } @@ -249,11 +250,12 @@ int reg_add(int argc, WCHAR *argvW[]) break; case 's': str = argvW[++i]; - if (!str || lstrlenW(str) != 1) + if (separator || !str || lstrlenW(str) != 1) goto invalid; separator = str[0]; break; case 'f': + if (force) goto invalid; force = TRUE; break; default: diff --git a/programs/reg/tests/add.c b/programs/reg/tests/add.c index f5d473e8887..e1e7a478502 100644 --- a/programs/reg/tests/add.c +++ b/programs/reg/tests/add.c @@ -234,7 +234,7 @@ static void test_add(void) ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
run_reg_exe("reg add HKCU\" KEY_BASE " /f /f", &r); - todo_wine ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r); + ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
open_key(HKEY_CURRENT_USER, KEY_BASE, 0, &hkey);
@@ -295,7 +295,7 @@ static void test_add(void) verify_reg(hkey, NULL, REG_SZ, "", 1, 0);
run_reg_exe("reg add HKCU\" KEY_BASE " /ve /f /ve", &r); - todo_wine ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r); + ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
run_reg_exe("reg add HKEY_CURRENT_USER\" KEY_BASE " /ve /d WineTEST /f", &r); ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
Signed-off-by: Hugh McMaster hugh.mcmaster@outlook.com --- programs/reg/add.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/programs/reg/add.c b/programs/reg/add.c index 170f2a40a46..0b1e733257c 100644 --- a/programs/reg/add.c +++ b/programs/reg/add.c @@ -154,7 +154,8 @@ static int run_add(HKEY root, WCHAR *path, WCHAR *value_name, BOOL value_empty, { HKEY key;
- if (RegCreateKeyW(root, path, &key) != ERROR_SUCCESS) + if (RegCreateKeyExW(root, path, 0, NULL, REG_OPTION_NON_VOLATILE, + KEY_READ|KEY_WRITE, NULL, &key, NULL)) { output_message(STRING_INVALID_KEY); return 1;