[PATCH 6/6 v2] reg: Ask the user whether they want to overwrite an existing registry value

Hugh McMaster hugh.mcmaster at outlook.com
Tue Feb 9 05:54:07 CST 2016


Signed-off-by: Hugh McMaster <hugh.mcmaster at outlook.com>
---
 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




More information about the wine-patches mailing list