[PATCH] reg: Handle a special case for Default values and 'reg query'

Hugh McMaster hugh.mcmaster at outlook.com
Thu Jul 21 02:36:44 CDT 2016


Signed-off-by: Hugh McMaster <hugh.mcmaster at outlook.com>
---
 programs/reg/reg.c       | 26 ++++++++++++++++++++------
 programs/reg/reg.h       |  1 +
 programs/reg/reg.rc      |  1 +
 programs/reg/tests/reg.c |  2 +-
 4 files changed, 23 insertions(+), 7 deletions(-)

diff --git a/programs/reg/reg.c b/programs/reg/reg.c
index 0d6bec4..6fcf129 100644
--- a/programs/reg/reg.c
+++ b/programs/reg/reg.c
@@ -583,6 +583,7 @@ static const WCHAR *reg_type_to_wchar(DWORD type)
 static void output_value(const WCHAR *value_name, DWORD type, BYTE *data, DWORD data_size)
 {
     WCHAR fmt[] = {' ',' ',' ',' ','%','1',0};
+    WCHAR defval[32];
     WCHAR *reg_data;
     WCHAR newlineW[] = {'\n',0};
 
@@ -590,14 +591,22 @@ static void output_value(const WCHAR *value_name, DWORD type, BYTE *data, DWORD
         output_string(fmt, value_name);
     else
     {
-        WCHAR defval[32];
         LoadStringW(GetModuleHandleW(NULL), STRING_DEFAULT_VALUE, defval, ARRAY_SIZE(defval));
         output_string(fmt, defval);
     }
     output_string(fmt, reg_type_to_wchar(type));
-    reg_data = reg_data_to_wchar(type, data, data_size);
-    output_string(fmt, reg_data);
-    HeapFree(GetProcessHeap(), 0, reg_data);
+
+    if (data)
+    {
+        reg_data = reg_data_to_wchar(type, data, data_size);
+        output_string(fmt, reg_data);
+        HeapFree(GetProcessHeap(), 0, reg_data);
+    }
+    else
+    {
+        LoadStringW(GetModuleHandleW(NULL), STRING_VALUE_NOT_SET, defval, ARRAY_SIZE(defval));
+        output_string(fmt, defval);
+    }
     output_string(newlineW);
 }
 
@@ -661,8 +670,13 @@ static int query_value(HKEY key, WCHAR *value_name, WCHAR *path, BOOL recurse)
     {
         if (rc == ERROR_FILE_NOT_FOUND)
         {
-            output_message(STRING_CANNOT_FIND);
-            return 1;
+            if (value_name && *value_name)
+            {
+                output_message(STRING_CANNOT_FIND);
+                return 1;
+            }
+            output_string(fmt, path);
+            output_value(NULL, REG_SZ, NULL, 0);
         }
         return 0;
     }
diff --git a/programs/reg/reg.h b/programs/reg/reg.h
index e7bb590..1142278 100644
--- a/programs/reg/reg.h
+++ b/programs/reg/reg.h
@@ -51,3 +51,4 @@
 #define STRING_INVALID_OPTION   128
 #define STRING_REG_HELP         129
 #define STRING_FUNC_HELP        130
+#define STRING_VALUE_NOT_SET    131
diff --git a/programs/reg/reg.rc b/programs/reg/reg.rc
index 8714dae..ae69cb7 100644
--- a/programs/reg/reg.rc
+++ b/programs/reg/reg.rc
@@ -61,4 +61,5 @@ STRINGTABLE
     STRING_INVALID_OPTION, "reg: Invalid option [%1]. "
     STRING_REG_HELP, "Type \"REG /?\" for help.\n"
     STRING_FUNC_HELP, "Type \"REG %1 /?\" for help.\n"
+    STRING_VALUE_NOT_SET, "(value not set)"
 }
diff --git a/programs/reg/tests/reg.c b/programs/reg/tests/reg.c
index 7556870..0339e6e 100644
--- a/programs/reg/tests/reg.c
+++ b/programs/reg/tests/reg.c
@@ -547,7 +547,7 @@ static void test_query(void)
     ok(err == ERROR_SUCCESS, "got %d, expected 0\n", err);
 
     run_reg_exe("reg query HKCU\\" KEY_BASE " /ve", &r);
-    todo_wine ok(r == REG_EXIT_SUCCESS || broken(r == REG_EXIT_FAILURE /* WinXP */),
+    ok(r == REG_EXIT_SUCCESS || broken(r == REG_EXIT_FAILURE /* WinXP */),
        "got exit code %d, expected 0\n", r);
 
     err = RegSetValueExA(key, "Test", 0, REG_SZ, (BYTE *)hello, sizeof(hello));
-- 
2.7.4




More information about the wine-patches mailing list