[PATCH 2/2] reg: Always output the long key name when printing strings

Hugh McMaster hugh.mcmaster at outlook.com
Tue Jun 14 21:31:05 CDT 2016


Signed-off-by: Hugh McMaster <hugh.mcmaster at outlook.com>
---
 programs/reg/reg.c | 64 ++++++++++++++++++++++++++++++++++++++++++------------
 1 file changed, 50 insertions(+), 14 deletions(-)

diff --git a/programs/reg/reg.c b/programs/reg/reg.c
index 6f8a882..27d61bd 100644
--- a/programs/reg/reg.c
+++ b/programs/reg/reg.c
@@ -405,7 +405,7 @@ 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,
+static int reg_delete(HKEY root, WCHAR *path, WCHAR *long_key, WCHAR *value_name,
                       BOOL value_empty, BOOL value_all, BOOL force)
 {
     HKEY key;
@@ -417,9 +417,9 @@ static int reg_delete(HKEY root, WCHAR *path, WCHAR *key_name, WCHAR *value_name
         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);
+            ret = ask_confirm(STRING_DELETE_VALUEALL, long_key);
         else
-            ret = ask_confirm(STRING_DELETE_SUBKEY, key_name);
+            ret = ask_confirm(STRING_DELETE_SUBKEY, long_key);
 
         if (!ret)
         {
@@ -475,7 +475,7 @@ static int reg_delete(HKEY root, WCHAR *path, WCHAR *key_name, WCHAR *value_name
                 {
                     HeapFree(GetProcessHeap(), 0, szValue);
                     RegCloseKey(key);
-                    output_message(STRING_VALUEALL_FAILED, key_name);
+                    output_message(STRING_VALUEALL_FAILED, long_key);
                     return 1;
                 }
             }
@@ -789,7 +789,7 @@ static int query_all(HKEY key, WCHAR *path, BOOL recurse)
     return 0;
 }
 
-static int reg_query(HKEY root, WCHAR *path, WCHAR *key_name, WCHAR *value_name,
+static int reg_query(HKEY root, WCHAR *path, WCHAR *long_key, WCHAR *value_name,
                      BOOL value_empty, BOOL recurse)
 {
     HKEY key;
@@ -806,19 +806,46 @@ static int reg_query(HKEY root, WCHAR *path, WCHAR *key_name, WCHAR *value_name,
 
     if (value_name || value_empty)
     {
-        ret = query_value(key, value_name, key_name, recurse);
+        ret = query_value(key, value_name, long_key, recurse);
         if (recurse)
             output_message(STRING_MATCHES_FOUND, num_values_found);
     }
     else
-        ret = query_all(key, key_name, recurse);
+        ret = query_all(key, long_key, recurse);
 
     RegCloseKey(key);
 
     return ret;
 }
 
-static BOOL parse_registry_key(const WCHAR *key, HKEY *root, WCHAR **path)
+static WCHAR *get_long_key(HKEY root, WCHAR *path)
+{
+    DWORD i, array_size = ARRAY_SIZE(root_rels), len;
+    WCHAR *long_key;
+    WCHAR fmt[] = {'%','s','\\','%','s',0};
+
+    for (i = 0; i < array_size; i++)
+    {
+        if (root == root_rels[i].key)
+            break;
+    }
+
+    len = strlenW(root_rels[i].long_name);
+
+    if (!path)
+    {
+        long_key = HeapAlloc(GetProcessHeap(), 0, (len + 1) * sizeof(WCHAR));
+        strcpyW(long_key, root_rels[i].long_name);
+        return long_key;
+    }
+
+    len += strlenW(path) + 1; /* add one for the backslash */
+    long_key = HeapAlloc(GetProcessHeap(), 0, (len + 1) * sizeof(WCHAR));
+    sprintfW(long_key, fmt, root_rels[i].long_name, path);
+    return long_key;
+}
+
+static BOOL parse_registry_key(const WCHAR *key, HKEY *root, WCHAR **path, WCHAR **long_key)
 {
     if (!sane_path(key))
         return FALSE;
@@ -833,6 +860,8 @@ static BOOL parse_registry_key(const WCHAR *key, HKEY *root, WCHAR **path)
     *path = strchrW(key, '\\');
     if (*path) (*path)++;
 
+    *long_key = get_long_key(*root, *path);
+
     return TRUE;
 }
 
@@ -878,7 +907,7 @@ int wmain(int argc, WCHAR *argvW[])
     BOOL show_op_help = FALSE;
     static const WCHAR switchVAW[] = {'v','a',0};
     static const WCHAR switchVEW[] = {'v','e',0};
-    WCHAR *key_name, *path, *value_name = NULL, *type = NULL, *data = NULL, separator = '\0';
+    WCHAR *path, *long_key, *value_name = NULL, *type = NULL, *data = NULL, separator = '\0';
     BOOL value_empty = FALSE, value_all = FALSE, recurse = FALSE, force = FALSE;
     HKEY root;
 
@@ -924,11 +953,9 @@ int wmain(int argc, WCHAR *argvW[])
         return 0;
     }
 
-    if (!parse_registry_key(argvW[2], &root, &path))
+    if (!parse_registry_key(argvW[2], &root, &path, &long_key))
         return 1;
 
-    key_name = argvW[2];
-
     for (i = 3; i < argc; i++)
     {
         if (argvW[i][0] == '/' || argvW[i][0] == '-')
@@ -956,6 +983,7 @@ int wmain(int argc, WCHAR *argvW[])
             case 'v':
                 if (value_name || !(value_name = argvW[++i]))
                 {
+                    HeapFree(GetProcessHeap(), 0, long_key);
                     output_message(STRING_INVALID_CMDLINE);
                     return 1;
                 }
@@ -963,6 +991,7 @@ int wmain(int argc, WCHAR *argvW[])
             case 't':
                 if (type || !(type = argvW[++i]))
                 {
+                    HeapFree(GetProcessHeap(), 0, long_key);
                     output_message(STRING_INVALID_CMDLINE);
                     return 1;
                 }
@@ -970,6 +999,7 @@ int wmain(int argc, WCHAR *argvW[])
             case 'd':
                 if (data || !(data = argvW[++i]))
                 {
+                    HeapFree(GetProcessHeap(), 0, long_key);
                     output_message(STRING_INVALID_CMDLINE);
                     return 1;
                 }
@@ -984,6 +1014,7 @@ int wmain(int argc, WCHAR *argvW[])
                 ptr = argvW[++i];
                 if (!ptr || strlenW(ptr) != 1)
                 {
+                    HeapFree(GetProcessHeap(), 0, long_key);
                     output_message(STRING_INVALID_CMDLINE);
                     return 1;
                 }
@@ -993,6 +1024,7 @@ int wmain(int argc, WCHAR *argvW[])
                 force = TRUE;
                 break;
             default:
+                HeapFree(GetProcessHeap(), 0, long_key);
                 output_message(STRING_INVALID_CMDLINE);
                 return 1;
             }
@@ -1001,6 +1033,7 @@ int wmain(int argc, WCHAR *argvW[])
 
     if ((value_name && value_empty) || (value_name && value_all) || (value_empty && value_all))
     {
+        HeapFree(GetProcessHeap(), 0, long_key);
         output_message(STRING_INVALID_CMDLINE);
         return 1;
     }
@@ -1008,8 +1041,11 @@ int wmain(int argc, WCHAR *argvW[])
     if (op == REG_ADD)
         ret = reg_add(root, path, value_name, value_empty, type, separator, data, force);
     else if (op == REG_DELETE)
-        ret = reg_delete(root, path, key_name, value_name, value_empty, value_all, force);
+        ret = reg_delete(root, path, long_key, value_name, value_empty, value_all, force);
     else if (op == REG_QUERY)
-        ret = reg_query(root, path, key_name, value_name, value_empty, recurse);
+        ret = reg_query(root, path, long_key, value_name, value_empty, recurse);
+
+    HeapFree(GetProcessHeap(), 0, long_key);
+
     return ret;
 }
-- 
2.7.4




More information about the wine-patches mailing list