From: Hugh McMaster hugh.mcmaster@outlook.com
Signed-off-by: Hugh McMaster hugh.mcmaster@outlook.com --- programs/regedit/edit.c | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-)
diff --git a/programs/regedit/edit.c b/programs/regedit/edit.c index 4cb48799090..d668425b137 100644 --- a/programs/regedit/edit.c +++ b/programs/regedit/edit.c @@ -81,6 +81,35 @@ static void WINAPIV error_code_messagebox(HWND hwnd, unsigned int msg_id, ...) va_end(ap); }
+static INT_PTR CALLBACK modify_string_dlgproc(HWND hwndDlg, UINT msg, WPARAM wparam, LPARAM lparam) +{ + HWND hwndValue; + unsigned int len; + + switch (msg) + { + case WM_INITDIALOG: + SetDlgItemTextW(hwndDlg, IDC_VALUE_NAME, editValueName); + SetDlgItemTextW(hwndDlg, IDC_VALUE_DATA, stringValueData); + return TRUE; + case WM_COMMAND: + switch (LOWORD(wparam)) + { + case IDOK: + hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_DATA); + len = GetWindowTextLengthW(hwndValue); + stringValueData = realloc(stringValueData, (len + 1) * sizeof(WCHAR)); + if (!GetWindowTextW(hwndValue, stringValueData, len + 1)) + *stringValueData = 0; + /* fall through */ + case IDCANCEL: + EndDialog(hwndDlg, wparam); + return TRUE; + } + } + return FALSE; +} + static BOOL change_dword_base(HWND hwndDlg, BOOL toHex) { WCHAR buf[128]; @@ -268,7 +297,7 @@ BOOL ModifyValue(HWND hwnd, HKEY hKeyRoot, LPCWSTR keyPath, LPCWSTR valueName) if(!(stringValueData = read_value(hwnd, hKey, valueName, &type, &len))) goto done;
if ( (type == REG_SZ) || (type == REG_EXPAND_SZ) ) { - if (DialogBoxW(0, MAKEINTRESOURCEW(IDD_EDIT_STRING), hwnd, modify_dlgproc) == IDOK) { + if (DialogBoxW(0, MAKEINTRESOURCEW(IDD_EDIT_STRING), hwnd, modify_string_dlgproc) == IDOK) { lRet = RegSetValueExW(hKey, valueName, 0, type, (LPBYTE)stringValueData, (lstrlenW(stringValueData) + 1) * sizeof(WCHAR)); if (lRet == ERROR_SUCCESS) result = TRUE; else error_code_messagebox(hwnd, IDS_SET_VALUE_FAILED);
From: Hugh McMaster hugh.mcmaster@outlook.com
Signed-off-by: Hugh McMaster hugh.mcmaster@outlook.com --- programs/regedit/edit.c | 64 +++++++++++++++++++++++++++-------------- 1 file changed, 42 insertions(+), 22 deletions(-)
diff --git a/programs/regedit/edit.c b/programs/regedit/edit.c index d668425b137..e0d9d388bea 100644 --- a/programs/regedit/edit.c +++ b/programs/regedit/edit.c @@ -81,29 +81,53 @@ static void WINAPIV error_code_messagebox(HWND hwnd, unsigned int msg_id, ...) va_end(ap); }
-static INT_PTR CALLBACK modify_string_dlgproc(HWND hwndDlg, UINT msg, WPARAM wparam, LPARAM lparam) +static BOOL update_registry_value(HWND hwndDlg, struct edit_params *params) { HWND hwndValue; unsigned int len; + WCHAR *buf; + LONG ret; + + hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_DATA); + len = GetWindowTextLengthW(hwndValue); + buf = malloc((len + 1) * sizeof(WCHAR)); + len = GetWindowTextW(hwndValue, buf, len + 1); + + free(params->data); + params->data = buf; + params->size = (len + 1) * sizeof(WCHAR); + + ret = RegSetValueExW(params->hkey, params->value_name, 0, params->type, (BYTE *)params->data, params->size); + if (ret) error_code_messagebox(hwndDlg, IDS_SET_VALUE_FAILED); + + free(params->data); + params->data = NULL; + + return !ret; +} + +static INT_PTR CALLBACK modify_string_dlgproc(HWND hwndDlg, UINT msg, WPARAM wparam, LPARAM lparam) +{ + struct edit_params *params; + int ret = 0;
switch (msg) { case WM_INITDIALOG: + params = (struct edit_params *)lparam; + SetWindowLongPtrW(hwndDlg, DWLP_USER, (ULONG_PTR)params); SetDlgItemTextW(hwndDlg, IDC_VALUE_NAME, editValueName); - SetDlgItemTextW(hwndDlg, IDC_VALUE_DATA, stringValueData); + SetDlgItemTextW(hwndDlg, IDC_VALUE_DATA, params->data); return TRUE; case WM_COMMAND: switch (LOWORD(wparam)) { case IDOK: - hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_DATA); - len = GetWindowTextLengthW(hwndValue); - stringValueData = realloc(stringValueData, (len + 1) * sizeof(WCHAR)); - if (!GetWindowTextW(hwndValue, stringValueData, len + 1)) - *stringValueData = 0; + params = (struct edit_params *)GetWindowLongPtrW(hwndDlg, DWLP_USER); + ret = update_registry_value(hwndDlg, params); /* fall through */ case IDCANCEL: - EndDialog(hwndDlg, wparam); + EndDialog(hwndDlg, ret); return TRUE; } } @@ -281,11 +305,12 @@ done:
BOOL ModifyValue(HWND hwnd, HKEY hKeyRoot, LPCWSTR keyPath, LPCWSTR valueName) { - BOOL result = FALSE; + HKEY hKey; DWORD type; LONG lRet; - HKEY hKey; LONG len; + struct edit_params params; + BOOL result = FALSE;
lRet = RegOpenKeyExW(hKeyRoot, keyPath, 0, KEY_READ | KEY_SET_VALUE, &hKey); if (lRet) { @@ -296,12 +321,14 @@ BOOL ModifyValue(HWND hwnd, HKEY hKeyRoot, LPCWSTR keyPath, LPCWSTR valueName) editValueName = valueName ? valueName : g_pszDefaultValueName; if(!(stringValueData = read_value(hwnd, hKey, valueName, &type, &len))) goto done;
+ params.hkey = hKey; + params.value_name = valueName; + params.type = type; + params.data = stringValueData; + params.size = len; + if ( (type == REG_SZ) || (type == REG_EXPAND_SZ) ) { - if (DialogBoxW(0, MAKEINTRESOURCEW(IDD_EDIT_STRING), hwnd, modify_string_dlgproc) == IDOK) { - lRet = RegSetValueExW(hKey, valueName, 0, type, (LPBYTE)stringValueData, (lstrlenW(stringValueData) + 1) * sizeof(WCHAR)); - if (lRet == ERROR_SUCCESS) result = TRUE; - else error_code_messagebox(hwnd, IDS_SET_VALUE_FAILED); - } + result = DialogBoxParamW(0, MAKEINTRESOURCEW(IDD_EDIT_STRING), hwnd, modify_string_dlgproc, (LPARAM)¶ms); } else if ( type == REG_DWORD ) { DWORD value = *((DWORD*)stringValueData); stringValueData = realloc(stringValueData, 64); @@ -383,13 +410,6 @@ BOOL ModifyValue(HWND hwnd, HKEY hKeyRoot, LPCWSTR keyPath, LPCWSTR valueName) } else /* hex data types */ { - struct edit_params params; - - params.hkey = hKey; - params.value_name = valueName; - params.type = type; - params.data = stringValueData; - params.size = len; result = DialogBoxParamW(NULL, MAKEINTRESOURCEW(IDD_EDIT_BINARY), hwnd, bin_modify_dlgproc, (LPARAM)¶ms); }
From: Hugh McMaster hugh.mcmaster@outlook.com
Signed-off-by: Hugh McMaster hugh.mcmaster@outlook.com --- programs/regedit/edit.c | 224 +++++++++++++++++++++------------------- 1 file changed, 119 insertions(+), 105 deletions(-)
diff --git a/programs/regedit/edit.c b/programs/regedit/edit.c index e0d9d388bea..27251420dde 100644 --- a/programs/regedit/edit.c +++ b/programs/regedit/edit.c @@ -94,8 +94,46 @@ static BOOL update_registry_value(HWND hwndDlg, struct edit_params *params) len = GetWindowTextW(hwndValue, buf, len + 1);
free(params->data); - params->data = buf; - params->size = (len + 1) * sizeof(WCHAR); + + switch (params->type) + { + case REG_DWORD: + params->size = sizeof(DWORD); + params->data = malloc(params->size); + swscanf(buf, isDecimal ? L"%lu" : L"%lx", params->data); + break; + case REG_QWORD: + params->size = sizeof(UINT64); + params->data = malloc(params->size); + swscanf(buf, isDecimal ? L"%I64u" : L"%I64x", params->data); + break; + case REG_MULTI_SZ: + { + WCHAR *tmp = malloc((len + 2) * sizeof(WCHAR)); + unsigned int i, j; + + for (i = 0, j = 0; i < len; i++) + { + if (buf[i] == '\r' && buf[i + 1] == '\n') + { + if (tmp[j - 1]) tmp[j++] = 0; + i++; + } + else tmp[j++] = buf[i]; + } + + tmp[j++] = 0; + tmp[j++] = 0; + + free(buf); + params->data = tmp; + params->size = j * sizeof(WCHAR); + break; + } + default: /* REG_SZ, REG_EXPAND_SZ */ + params->data = buf; + params->size = (len + 1) * sizeof(WCHAR); + }
ret = RegSetValueExW(params->hkey, params->value_name, 0, params->type, (BYTE *)params->data, params->size); if (ret) error_code_messagebox(hwndDlg, IDS_SET_VALUE_FAILED); @@ -145,46 +183,46 @@ static BOOL change_dword_base(HWND hwndDlg, BOOL toHex) return SetDlgItemTextW(hwndDlg, IDC_VALUE_DATA, buf); }
-static INT_PTR CALLBACK modify_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +static INT_PTR CALLBACK modify_dword_dlgproc(HWND hwndDlg, UINT msg, WPARAM wparam, LPARAM lparam) { - HWND hwndValue; - WCHAR buff[64]; - int len; + struct edit_params *params; + WCHAR buf[64]; + int ret = 0;
- switch(uMsg) { + switch (msg) + { case WM_INITDIALOG: + params = (struct edit_params *)lparam; + SetWindowLongPtrW(hwndDlg, DWLP_USER, (ULONG_PTR)params); SetDlgItemTextW(hwndDlg, IDC_VALUE_NAME, editValueName); - SetDlgItemTextW(hwndDlg, IDC_VALUE_DATA, stringValueData); + SetDlgItemTextW(hwndDlg, IDC_VALUE_DATA, params->data); CheckRadioButton(hwndDlg, IDC_DWORD_HEX, IDC_DWORD_DEC, IDC_DWORD_HEX); isDecimal = FALSE; - if (lParam == REG_QWORD && LoadStringW(GetModuleHandleW(0), IDS_EDIT_QWORD, buff, ARRAY_SIZE(buff))) - SetWindowTextW(hwndDlg, buff); + if (params->type == REG_QWORD && LoadStringW(GetModuleHandleW(0), IDS_EDIT_QWORD, buf, ARRAY_SIZE(buf))) + SetWindowTextW(hwndDlg, buf); return TRUE; case WM_COMMAND: - switch (LOWORD(wParam)) { + switch (LOWORD(wparam)) + { case IDC_DWORD_HEX: if (isDecimal && change_dword_base(hwndDlg, TRUE)) isDecimal = FALSE; - break; + break; case IDC_DWORD_DEC: if (!isDecimal && change_dword_base(hwndDlg, FALSE)) isDecimal = TRUE; - break; + break; case IDOK: - if ((hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_DATA))) { - len = GetWindowTextLengthW(hwndValue); - stringValueData = realloc(stringValueData, (len + 1) * sizeof(WCHAR)); - if (!GetWindowTextW(hwndValue, stringValueData, len + 1)) - *stringValueData = 0; - } - /* Fall through */ + params = (struct edit_params *)GetWindowLongPtrW(hwndDlg, DWLP_USER); + ret = update_registry_value(hwndDlg, params); + /* fall through */ case IDCANCEL: - EndDialog(hwndDlg, wParam); + EndDialog(hwndDlg, ret); return TRUE; } } return FALSE; }
-static INT_PTR CALLBACK bin_modify_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +static INT_PTR CALLBACK modify_binary_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { struct edit_params *params; BYTE *data; @@ -303,6 +341,46 @@ done: return result; }
+static void format_dlgproc_string(struct edit_params *params) +{ + int i, j, count, len; + WCHAR *str, *buf; + + if (params->type == REG_DWORD || params->type == REG_QWORD) + { + UINT64 value = *((UINT64 *)params->data); + + params->data = realloc(params->data, 32 * sizeof(WCHAR)); + swprintf(params->data, 32, params->type == REG_DWORD ? L"%lx" : L"%I64x", value); + return; + } + + /* REG_MULTI_SZ */ + len = params->size / sizeof(WCHAR); + str = params->data; + + for (i = 0, count = 0; i < len; i++) + { + if (!str[i] && str[i + 1]) count++; + } + + buf = malloc(params->size + (count * sizeof(WCHAR))); + + for (i = 0, j = 0; i < len; i++) + { + if (!str[i] && str[i + 1]) + { + buf[j++] = '\r'; + buf[j++] = '\n'; + } + else buf[j++] = str[i]; + } + + free(params->data); + str = NULL; + params->data = buf; +} + BOOL ModifyValue(HWND hwnd, HKEY hKeyRoot, LPCWSTR keyPath, LPCWSTR valueName) { HKEY hKey; @@ -327,91 +405,27 @@ BOOL ModifyValue(HWND hwnd, HKEY hKeyRoot, LPCWSTR keyPath, LPCWSTR valueName) params.data = stringValueData; params.size = len;
- if ( (type == REG_SZ) || (type == REG_EXPAND_SZ) ) { - result = DialogBoxParamW(0, MAKEINTRESOURCEW(IDD_EDIT_STRING), hwnd, modify_string_dlgproc, (LPARAM)¶ms); - } else if ( type == REG_DWORD ) { - DWORD value = *((DWORD*)stringValueData); - stringValueData = realloc(stringValueData, 64); - wsprintfW(stringValueData, L"%x", value); - if (DialogBoxW(0, MAKEINTRESOURCEW(IDD_EDIT_DWORD), hwnd, modify_dlgproc) == IDOK) - { - DWORD val; - if (swscanf(stringValueData, isDecimal ? L"%lu" : L"%lx", &val)) - { - lRet = RegSetValueExW(hKey, valueName, 0, type, (BYTE*)&val, sizeof(val)); - if (lRet == ERROR_SUCCESS) result = TRUE; - else error_code_messagebox(hwnd, IDS_SET_VALUE_FAILED); - } - } - } else if ( type == REG_QWORD ) { - UINT64 value = *((UINT64 *)stringValueData); - stringValueData = realloc(stringValueData, 64); - swprintf(stringValueData, 64, L"%I64x", value); - if (DialogBoxParamW(0, MAKEINTRESOURCEW(IDD_EDIT_DWORD), hwnd, modify_dlgproc, type) == IDOK) - { - if (swscanf(stringValueData, isDecimal ? L"%I64u" : L"%I64x", &value)) - { - lRet = RegSetValueExW(hKey, valueName, 0, type, (BYTE *)&value, sizeof(value)); - if (lRet == ERROR_SUCCESS) result = TRUE; - else error_code_messagebox(hwnd, IDS_SET_VALUE_FAILED); - } - } - } else if ( type == REG_MULTI_SZ ) { - WCHAR char1 = '\r', char2 = '\n'; - WCHAR *tmpValueData = NULL; - INT i, j, count; - - for (i = 0, count = 0; i < len / sizeof(WCHAR); i++) - if ( !stringValueData[i] && stringValueData[i + 1] ) - count++; - tmpValueData = malloc(len + (count * sizeof(WCHAR))); - - for ( i = 0, j = 0; i < len / sizeof(WCHAR); i++) - { - if ( !stringValueData[i] && stringValueData[i + 1]) - { - tmpValueData[j++] = char1; - tmpValueData[j++] = char2; - } - else - tmpValueData[j++] = stringValueData[i]; - } - - free(stringValueData); - stringValueData = tmpValueData; - tmpValueData = NULL; - - if (DialogBoxW(0, MAKEINTRESOURCEW(IDD_EDIT_MULTI_STRING), hwnd, modify_dlgproc) == IDOK) - { - len = lstrlenW( stringValueData ); - tmpValueData = malloc((len + 2) * sizeof(WCHAR)); - - for (i = 0, j = 0; i < len; i++) - { - if ( stringValueData[i] == char1 && stringValueData[i + 1] == char2) - { - if ( tmpValueData[j - 1] != 0) - tmpValueData[j++] = 0; - i++; - } - else - tmpValueData[j++] = stringValueData[i]; - } - - tmpValueData[j++] = 0; - tmpValueData[j++] = 0; - free(stringValueData); - stringValueData = tmpValueData; - - lRet = RegSetValueExW(hKey, valueName, 0, type, (LPBYTE)stringValueData, j * sizeof(WCHAR)); - if (lRet == ERROR_SUCCESS) result = TRUE; - else error_code_messagebox(hwnd, IDS_SET_VALUE_FAILED); - } - } - else /* hex data types */ + switch (params.type) { + case REG_SZ: + case REG_EXPAND_SZ: + result = DialogBoxParamW(NULL, MAKEINTRESOURCEW(IDD_EDIT_STRING), hwnd, + modify_string_dlgproc, (LPARAM)¶ms); + break; + case REG_DWORD: + case REG_QWORD: + format_dlgproc_string(¶ms); + result = DialogBoxParamW(NULL, MAKEINTRESOURCEW(IDD_EDIT_DWORD), hwnd, + modify_dword_dlgproc, (LPARAM)¶ms); + break; + case REG_MULTI_SZ: + format_dlgproc_string(¶ms); + result = DialogBoxParamW(NULL, MAKEINTRESOURCEW(IDD_EDIT_MULTI_STRING), hwnd, + modify_string_dlgproc, (LPARAM)¶ms); + break; + default: /* hex data types */ result = DialogBoxParamW(NULL, MAKEINTRESOURCEW(IDD_EDIT_BINARY), hwnd, - bin_modify_dlgproc, (LPARAM)¶ms); + modify_binary_dlgproc, (LPARAM)¶ms); }
/* Update the listview item with the new data string */
From: Hugh McMaster hugh.mcmaster@outlook.com
Signed-off-by: Hugh McMaster hugh.mcmaster@outlook.com --- programs/regedit/edit.c | 136 ++++++++++++++++++++-------------------- 1 file changed, 67 insertions(+), 69 deletions(-)
diff --git a/programs/regedit/edit.c b/programs/regedit/edit.c index 27251420dde..44ef45993fd 100644 --- a/programs/regedit/edit.c +++ b/programs/regedit/edit.c @@ -30,7 +30,6 @@ #include "main.h"
static const WCHAR* editValueName; -static WCHAR* stringValueData; static BOOL isDecimal;
struct edit_params @@ -267,39 +266,42 @@ static INT_PTR CALLBACK modify_binary_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wP return FALSE; }
-static LPWSTR read_value(HWND hwnd, HKEY hKey, LPCWSTR valueName, DWORD *lpType, LONG *len) +static BOOL read_value(HWND hwnd, struct edit_params *params) { - DWORD valueDataLen; - LPWSTR buffer = NULL; - LONG lRet; + LONG ret; + WCHAR *buf = NULL;
- lRet = RegQueryValueExW(hKey, valueName, NULL, lpType, NULL, &valueDataLen); - if (lRet) { - if (lRet == ERROR_FILE_NOT_FOUND && !valueName) { /* no default value here, make it up */ - if (len) *len = 1; - if (lpType) *lpType = REG_SZ; - buffer = malloc(sizeof(WCHAR)); - *buffer = '\0'; - return buffer; + if ((ret = RegQueryValueExW(params->hkey, params->value_name, NULL, ¶ms->type, NULL, ¶ms->size))) + { + if (ret == ERROR_FILE_NOT_FOUND && !params->value_name) + { + params->type = REG_SZ; + params->size = sizeof(WCHAR); + params->data = malloc(params->size); + *(WCHAR *)params->data = 0; + return TRUE; } - error_code_messagebox(hwnd, IDS_BAD_VALUE, valueName); - goto done; - }
- buffer = malloc(valueDataLen + sizeof(WCHAR)); - lRet = RegQueryValueExW(hKey, valueName, 0, 0, (LPBYTE)buffer, &valueDataLen); - if (lRet) { - error_code_messagebox(hwnd, IDS_BAD_VALUE, valueName); - goto done; + goto error; } - if((valueDataLen % sizeof(WCHAR)) == 0) - buffer[valueDataLen / sizeof(WCHAR)] = 0; - if(len) *len = valueDataLen; - return buffer;
-done: - free(buffer); - return NULL; + buf = malloc(params->size + sizeof(WCHAR)); + + if (RegQueryValueExW(params->hkey, params->value_name, NULL, ¶ms->type, (BYTE *)buf, ¶ms->size)) + goto error; + + if (params->size % sizeof(WCHAR) == 0) + buf[params->size / sizeof(WCHAR)] = 0; + + params->data = buf; + + return TRUE; + +error: + error_code_messagebox(hwnd, IDS_BAD_VALUE, params->value_name); + free(buf); + params->data = NULL; + return FALSE; }
BOOL CreateKey(HWND hwnd, HKEY hKeyRoot, LPCWSTR keyPath, LPWSTR keyName) @@ -383,27 +385,24 @@ static void format_dlgproc_string(struct edit_params *params)
BOOL ModifyValue(HWND hwnd, HKEY hKeyRoot, LPCWSTR keyPath, LPCWSTR valueName) { - HKEY hKey; - DWORD type; - LONG lRet; - LONG len; struct edit_params params; BOOL result = FALSE;
- lRet = RegOpenKeyExW(hKeyRoot, keyPath, 0, KEY_READ | KEY_SET_VALUE, &hKey); - if (lRet) { + editValueName = valueName ? valueName : g_pszDefaultValueName; + + if (RegOpenKeyExW(hKeyRoot, keyPath, 0, KEY_READ | KEY_SET_VALUE, ¶ms.hkey)) + { error_code_messagebox(hwnd, IDS_SET_VALUE_FAILED); - return FALSE; + return FALSE; }
- editValueName = valueName ? valueName : g_pszDefaultValueName; - if(!(stringValueData = read_value(hwnd, hKey, valueName, &type, &len))) goto done; - - params.hkey = hKey; params.value_name = valueName; - params.type = type; - params.data = stringValueData; - params.size = len; + + if (!read_value(hwnd, ¶ms)) + { + RegCloseKey(params.hkey); + return FALSE; + }
switch (params.type) { @@ -433,15 +432,13 @@ BOOL ModifyValue(HWND hwnd, HKEY hKeyRoot, LPCWSTR keyPath, LPCWSTR valueName) { int index = SendMessageW(g_pChildWnd->hListWnd, LVM_GETNEXTITEM, -1, MAKELPARAM(LVNI_FOCUSED | LVNI_SELECTED, 0)); - free(stringValueData); - stringValueData = read_value(hwnd, hKey, valueName, &type, &len); - format_value_data(g_pChildWnd->hListWnd, index, type, stringValueData, len); + + read_value(hwnd, ¶ms); + format_value_data(g_pChildWnd->hListWnd, index, params.type, params.data, params.size); }
-done: - free(stringValueData); - stringValueData = NULL; - RegCloseKey(hKey); + free(params.data); + RegCloseKey(params.hkey); return result; }
@@ -564,47 +561,48 @@ done:
BOOL RenameValue(HWND hwnd, HKEY hKeyRoot, LPCWSTR keyPath, LPCWSTR oldName, LPCWSTR newName) { - LPWSTR value = NULL; - DWORD type; - LONG len, lRet; + struct edit_params params; BOOL result = FALSE; - HKEY hKey;
if (!oldName) return FALSE; if (!newName) return FALSE;
- lRet = RegOpenKeyExW(hKeyRoot, keyPath, 0, KEY_READ | KEY_SET_VALUE, &hKey); - if (lRet) { + if (RegOpenKeyExW(hKeyRoot, keyPath, 0, KEY_READ | KEY_SET_VALUE, ¶ms.hkey)) + { error_code_messagebox(hwnd, IDS_RENAME_VALUE_FAILED); - return FALSE; + return FALSE; }
- if (!RegQueryValueExW(hKey, newName, NULL, NULL, NULL, NULL)) { + if (!RegQueryValueExW(params.hkey, newName, NULL, NULL, NULL, NULL)) + { error_code_messagebox(hwnd, IDS_VALUE_EXISTS, oldName); goto done; } - value = read_value(hwnd, hKey, oldName, &type, &len); - if(!value) goto done; - lRet = RegSetValueExW(hKey, newName, 0, type, (BYTE*)value, len); - if (lRet) { + + params.value_name = oldName; + if (!read_value(hwnd, ¶ms)) goto done; + + if (RegSetValueExW(params.hkey, newName, 0, params.type, (BYTE *)params.data, params.size)) + { error_code_messagebox(hwnd, IDS_RENAME_VALUE_FAILED); - goto done; + goto done; } - lRet = RegDeleteValueW(hKey, oldName); - if (lRet) { - RegDeleteValueW(hKey, newName); + + if (RegDeleteValueW(params.hkey, oldName)) + { + RegDeleteValueW(params.hkey, newName); error_code_messagebox(hwnd, IDS_RENAME_VALUE_FAILED); - goto done; + goto done; } + result = TRUE;
done: - free(value); - RegCloseKey(hKey); + free(params.data); + RegCloseKey(params.hkey); return result; }
- BOOL RenameKey(HWND hwnd, HKEY hRootKey, LPCWSTR keyPath, LPCWSTR newName) { LPWSTR parentPath = 0;