[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