From: Hugh McMaster Subject: [PATCH] reg: Handle a special case for Default values and 'reg query' Message-Id: Date: Thu, 21 Jul 2016 07:36:44 +0000 Signed-off-by: Hugh McMaster --- 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