From c78dfb87e1d45626e47ccc5cd4d2c8566c2f308e Mon Sep 17 00:00:00 2001 From: Hugh McMaster Date: Mon, 29 Jul 2013 22:03:08 +1000 Subject: reg --- programs/reg/reg.c | 41 +++++++++++++++++++++++++++++++++++++---- programs/reg/reg.h | 7 +++++++ programs/reg/reg.rc | 7 +++++++ 3 files changed, 51 insertions(+), 4 deletions(-) diff --git a/programs/reg/reg.c b/programs/reg/reg.c index 1b46661..29643f6 100644 --- a/programs/reg/reg.c +++ b/programs/reg/reg.c @@ -67,6 +67,28 @@ static int reg_message(int msg) return reg_printfW(formatW, msg_buffer); } +static BOOL ask_yes_no(UINT msg_id) +{ + WCHAR Ybuffer[16]; + WCHAR Nbuffer[16]; + HANDLE hStdIn = GetStdHandle(STD_INPUT_HANDLE); + WCHAR answer[16] = {'\0'}; + LPDWORD nCharsRead = 0; + + LoadStringW(GetModuleHandleW(NULL), STRING_YES, Ybuffer, sizeof(Ybuffer)/sizeof(WCHAR)); + LoadStringW(GetModuleHandleW(NULL), STRING_NO, Nbuffer, sizeof(Nbuffer)/sizeof(WCHAR)); + + while (TRUE) + { + reg_message(msg_id); + reg_message(STRING_YESNO); + ReadConsoleW(hStdIn, answer, 15, nCharsRead, NULL); + answer[0] = toupperW(answer[0]); + if (answer[0] == Ybuffer[0]) return TRUE; + if (answer[0] == Nbuffer[0]) return FALSE; + } +} + static HKEY get_rootkey(LPWSTR key) { static const WCHAR szHKLM[] = {'H','K','L','M',0}; @@ -210,7 +232,12 @@ static int reg_add(WCHAR *key_name, WCHAR *value_name, BOOL value_empty, { if (RegQueryValueW(subkey,value_name,NULL,NULL)==ERROR_SUCCESS) { - /* FIXME: Prompt for overwrite */ + if (!ask_yes_no(STRING_OVERWRITE_PROMPT)) + { + RegCloseKey(subkey); + reg_message(STRING_NO_REG_CHANGE); + return 1; + } } } @@ -281,7 +308,11 @@ static int reg_delete(WCHAR *key_name, WCHAR *value_name, BOOL value_empty, if (!force) { - /* FIXME: Prompt for delete */ + if (!ask_yes_no(STRING_DELETE_PROMPT)) + { + reg_message(STRING_NO_REG_CHANGE); + return 1; + } } /* Delete subtree only if no /v* option is given */ @@ -313,7 +344,7 @@ static int reg_delete(WCHAR *key_name, WCHAR *value_name, BOOL value_empty, &maxValue, NULL, NULL, NULL); if (rc != ERROR_SUCCESS) { - /* FIXME: failure */ + reg_message(STRING_CANNOT_FIND); RegCloseKey(subkey); return 1; } @@ -334,7 +365,9 @@ static int reg_delete(WCHAR *key_name, WCHAR *value_name, BOOL value_empty, } if (rc != ERROR_SUCCESS) { - /* FIXME delete failed */ + RegCloseKey(subkey); + reg_message(STRING_DELETE_FAILED); + return 1; } } else if (value_name) diff --git a/programs/reg/reg.h b/programs/reg/reg.h index 2221647..3b88127 100644 --- a/programs/reg/reg.h +++ b/programs/reg/reg.h @@ -30,3 +30,10 @@ #define STRING_INVALID_CMDLINE 107 #define STRING_NO_REMOTE 108 #define STRING_CANNOT_FIND 109 +#define STRING_YESNO 110 +#define STRING_YES 111 +#define STRING_NO 112 +#define STRING_OVERWRITE_PROMPT 113 +#define STRING_DELETE_PROMPT 114 +#define STRING_DELETE_FAILED 115 +#define STRING_NO_REG_CHANGE 116 diff --git a/programs/reg/reg.rc b/programs/reg/reg.rc index 5897b3b..8c6f66a 100644 --- a/programs/reg/reg.rc +++ b/programs/reg/reg.rc @@ -33,4 +33,11 @@ STRINGTABLE STRING_INVALID_CMDLINE, "Error: Invalid command line parameters\n" STRING_NO_REMOTE, "Error: Unable to add keys to remote machine\n" STRING_CANNOT_FIND, "Error: The system was unable to find the specified registry key or value\n" + STRING_YESNO, " (Yes|No) " + STRING_YES, "#msgctxt#Yes key#Y" + STRING_NO, "#msgctxt#No key#N" + STRING_OVERWRITE_PROMPT, "Do you want to overwrite the specified registry key?" + STRING_DELETE_PROMPT, "Do you want to delete the specified registry key?" + STRING_DELETE_FAILED, "Error: Unable to delete the specified registry key.\n" + STRING_NO_REG_CHANGE, "The registry has not been modified.\n" } -- 1.7.10.4