From: Hugh McMaster Subject: [PATCH 6/6 v2] reg: Ask the user whether they want to overwrite an existing registry value Message-Id: Date: Tue, 9 Feb 2016 22:54:07 +1100 In-Reply-To: <1455018847-2574-1-git-send-email-hugh.mcmaster@outlook.com> References: <1455018847-2574-1-git-send-email-hugh.mcmaster@outlook.com> Signed-off-by: Hugh McMaster --- programs/reg/reg.c | 34 ++++++++++++++++++++++++++++++++-- programs/reg/reg.h | 5 +++++ programs/reg/reg.rc | 5 +++++ 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/programs/reg/reg.c b/programs/reg/reg.c index 06e2c86..04256bc 100644 --- a/programs/reg/reg.c +++ b/programs/reg/reg.c @@ -142,6 +142,32 @@ static void __cdecl output_string(const WCHAR *fmt, ...) __ms_va_end(va_args); } +/* ask_confirm() adapted from programs/cmd/builtins.c */ +static BOOL ask_confirm(unsigned int msgid, WCHAR *reg_info) +{ + HMODULE hmod; + WCHAR Ybuffer[4]; + WCHAR Nbuffer[4]; + WCHAR answer[MAX_PATH]; + DWORD count; + + hmod = GetModuleHandleW(NULL); + LoadStringW(hmod, STRING_YES, Ybuffer, ARRAY_SIZE(Ybuffer)); + LoadStringW(hmod, STRING_NO, Nbuffer, ARRAY_SIZE(Nbuffer)); + + while (1) + { + output_message(msgid, reg_info); + output_message(STRING_YESNO); + ReadConsoleW(GetStdHandle(STD_INPUT_HANDLE), answer, ARRAY_SIZE(answer), &count, NULL); + answer[0] = toupperW(answer[0]); + if (answer[0] == Ybuffer[0]) + return TRUE; + if (answer[0] == Nbuffer[0]) + return FALSE; + } +} + static inline BOOL path_rootname_cmp(const WCHAR *input_path, const WCHAR *rootkey_name) { DWORD length = strlenW(rootkey_name); @@ -314,9 +340,13 @@ static int reg_add(WCHAR *key_name, WCHAR *value_name, BOOL value_empty, if (!force) { - if (RegQueryValueW(subkey,value_name,NULL,NULL)==ERROR_SUCCESS) + if (RegQueryValueExW(subkey, value_name, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) { - /* FIXME: Prompt for overwrite */ + if (!ask_confirm(STRING_OVERWRITE_VALUE, value_name)) + { + output_message(STRING_CANCELLED); + return 0; + } } } diff --git a/programs/reg/reg.h b/programs/reg/reg.h index 717a3cf..0617979 100644 --- a/programs/reg/reg.h +++ b/programs/reg/reg.h @@ -34,3 +34,8 @@ #define STRING_MISSING_INTEGER 111 #define STRING_MISSING_HEXDATA 112 #define STRING_UNHANDLED_TYPE 113 +#define STRING_OVERWRITE_VALUE 114 +#define STRING_YESNO 115 +#define STRING_YES 116 +#define STRING_NO 117 +#define STRING_CANCELLED 118 diff --git a/programs/reg/reg.rc b/programs/reg/reg.rc index 44c5e8b..dfad9e2 100644 --- a/programs/reg/reg.rc +++ b/programs/reg/reg.rc @@ -39,4 +39,9 @@ STRINGTABLE STRING_MISSING_INTEGER, "reg: The option [/d] must be followed by a valid integer\n" STRING_MISSING_HEXDATA, "reg: The option [/d] must be followed by a valid hexadecimal value\n" STRING_UNHANDLED_TYPE, "reg: Unhandled registry data type [/t 0x%1!x!, /d %2]\n" + STRING_OVERWRITE_VALUE, "The registry value '%1' already exists. Do you want to overwrite it?" + STRING_YESNO, " (Yes|No)" + STRING_YES, "#msgctxt#Yes key#Y" + STRING_NO, "#msgctxt#No key#N" + STRING_CANCELLED, "The registry operation was cancelled\n" } -- 1.9.1