From f225297a5f496ec01e6884d90b83951f55c501d9 Mon Sep 17 00:00:00 2001 From: Byeong-Sik Jeon Date: Sat, 31 Mar 2007 00:14:03 +0900 Subject: [PATCH] regedit: Support REG_MULTI_SZ creation and editing. --- programs/regedit/En.rc | 17 ++++++++++++ programs/regedit/edit.c | 53 +++++++++++++++++++++++++++++++++++++ programs/regedit/framewnd.c | 3 +++ programs/regedit/resource.h | 2 ++ 4 files changed, 75 insertions(+) diff --git a/programs/regedit/En.rc b/programs/regedit/En.rc index 078af0045d0..fad29132d44 100644 --- a/programs/regedit/En.rc +++ b/programs/regedit/En.rc @@ -53,6 +53,7 @@ BEGIN MENUITEM "&String Value", ID_EDIT_NEW_STRINGVALUE MENUITEM "&Binary Value", ID_EDIT_NEW_BINARYVALUE MENUITEM "&DWORD Value", ID_EDIT_NEW_DWORDVALUE + MENUITEM "&Multi String Value", ID_EDIT_NEW_MULTI_STRINGVALUE END MENUITEM SEPARATOR MENUITEM "&Delete\tDel", ID_EDIT_DELETE @@ -129,6 +130,7 @@ BEGIN MENUITEM "&String Value", ID_EDIT_NEW_STRINGVALUE MENUITEM "&Binary Value", ID_EDIT_NEW_BINARYVALUE MENUITEM "&DWORD Value", ID_EDIT_NEW_DWORDVALUE + MENUITEM "&Multi String Value", ID_EDIT_NEW_MULTI_STRINGVALUE END MENUITEM SEPARATOR MENUITEM "&Delete\tDel", ID_EDIT_DELETE @@ -179,6 +181,7 @@ BEGIN MENUITEM "&String Value", ID_EDIT_NEW_STRINGVALUE MENUITEM "&Binary Value", ID_EDIT_NEW_BINARYVALUE MENUITEM "&DWORD Value", ID_EDIT_NEW_DWORDVALUE + MENUITEM "&Multi String Value", ID_EDIT_NEW_MULTI_STRINGVALUE END MENUITEM SEPARATOR MENUITEM "&Delete\tDel", ID_EDIT_DELETE @@ -286,6 +289,19 @@ BEGIN PUSHBUTTON "Cancel",IDCANCEL,175,80,30,11,WS_GROUP END +IDD_EDIT_MULTI_STRING DIALOG DISCARDABLE 22, 17, 210, 175 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "Edit Multi String" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Value name:",IDC_STATIC,5,5,119,8 + EDITTEXT IDC_VALUE_NAME,5,15,200,12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL| WS_DISABLED + LTEXT "Value data:",IDC_STATIC,5,30,119,8 + EDITTEXT IDC_VALUE_DATA,5,40,200,112, WS_BORDER | WS_TABSTOP | WS_HSCROLL | WS_VSCROLL | ES_MULTILINE | ES_WANTRETURN + DEFPUSHBUTTON "OK",IDOK,140,160,30,11,WS_GROUP + PUSHBUTTON "Cancel",IDCANCEL,175,160,30,11,WS_GROUP +END + /* * String Table */ @@ -321,6 +337,7 @@ BEGIN ID_EDIT_NEW_STRINGVALUE "Adds a new string value" ID_EDIT_NEW_BINARYVALUE "Adds a new binary value" ID_EDIT_NEW_DWORDVALUE "Adds a new double word value" + ID_EDIT_NEW_MULTI_STRINGVALUE "Adds a new multi string value" ID_REGISTRY_IMPORTREGISTRYFILE "Imports a text file into the registry" ID_REGISTRY_EXPORTREGISTRYFILE "Exports all or part of the registry to a text file" diff --git a/programs/regedit/edit.c b/programs/regedit/edit.c index a8349665499..31645a7b68c 100644 --- a/programs/regedit/edit.c +++ b/programs/regedit/edit.c @@ -322,6 +322,59 @@ BOOL ModifyValue(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath, LPCTSTR valueName) params.cbData = len; result = DialogBoxParam(NULL, MAKEINTRESOURCE(IDD_EDIT_BINARY), hwnd, bin_modify_dlgproc, (LPARAM)¶ms); + } else if ( type == REG_MULTI_SZ ) { + TCHAR char1 = (TCHAR)'\r', char2 = (TCHAR)'\n'; + TCHAR *tmpValueData = NULL; + INT i, j, count; + + for ( i = 0, count = 0; i < len - 1; i++) + if ( !stringValueData[i] && stringValueData[i + 1] ) + count++; + tmpValueData = HeapAlloc( GetProcessHeap(), 0, ( len + count ) * sizeof(TCHAR)); + if ( !tmpValueData ) goto done; + + for ( i = 0, j = 0; i < len - 1; i++) + { + if ( !stringValueData[i] && stringValueData[i + 1]) + { + tmpValueData[j++] = char1; + tmpValueData[j++] = char2; + } + else + tmpValueData[j++] = stringValueData[i]; + } + tmpValueData[j] = stringValueData[i]; + HeapFree( GetProcessHeap(), 0, stringValueData); + stringValueData = tmpValueData; + tmpValueData = NULL; + + if (DialogBox(0, MAKEINTRESOURCE(IDD_EDIT_MULTI_STRING), hwnd, modify_dlgproc) == IDOK) + { + len = lstrlen( stringValueData ); + tmpValueData = HeapAlloc( GetProcessHeap(), 0, (len + 2) * sizeof(TCHAR)); + if ( !tmpValueData ) goto done; + + for ( i = 0, j = 0; i < len - 1; 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++] = stringValueData[i]; + tmpValueData[j++] = 0; + tmpValueData[j++] = 0; + HeapFree( GetProcessHeap(), 0, stringValueData); + stringValueData = tmpValueData; + + lRet = RegSetValueEx(hKey, valueName, 0, type, (LPBYTE)stringValueData, j * sizeof(TCHAR)); + if (lRet == ERROR_SUCCESS) result = TRUE; + else error_code_messagebox(hwnd, lRet); + } } else { error(hwnd, IDS_UNSUPPORTED_TYPE, type); } diff --git a/programs/regedit/framewnd.c b/programs/regedit/framewnd.c index 006e8029526..1c9dbc7bcaa 100644 --- a/programs/regedit/framewnd.c +++ b/programs/regedit/framewnd.c @@ -710,6 +710,9 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) case ID_EDIT_NEW_STRINGVALUE: valueType = REG_SZ; goto create_value; + case ID_EDIT_NEW_MULTI_STRINGVALUE: + valueType = REG_MULTI_SZ; + goto create_value; case ID_EDIT_NEW_BINARYVALUE: valueType = REG_BINARY; goto create_value; diff --git a/programs/regedit/resource.h b/programs/regedit/resource.h index 8d98d5af411..8e703fb40ec 100644 --- a/programs/regedit/resource.h +++ b/programs/regedit/resource.h @@ -132,6 +132,7 @@ #define ID_SWITCH_PANELS 32871 #define ID_FAVORITE_FIRST 33000 #define ID_FAVORITE_LAST 33099 +#define ID_EDIT_NEW_MULTI_STRINGVALUE 33100 #define IDD_EDIT_STRING 2000 #define IDC_VALUE_NAME 2001 @@ -142,6 +143,7 @@ #define IDC_FIND_VALUES 2006 #define IDC_FIND_CONTENT 2007 #define IDC_FIND_WHOLE 2008 +#define IDD_EDIT_MULTI_STRING 2009 #define IDC_EXPORT_BASE 100 #define IDC_EXPORT_ALL 101