Bletch npwoods@mess.org: - Implements key and value renaming - Implements key deleting - Implements New Key/String/Binary/DWORD option Modified: trunk/reactos/subsys/system/regedit/En.rc Modified: trunk/reactos/subsys/system/regedit/childwnd.c Modified: trunk/reactos/subsys/system/regedit/framewnd.c Modified: trunk/reactos/subsys/system/regedit/listview.c Modified: trunk/reactos/subsys/system/regedit/main.c Modified: trunk/reactos/subsys/system/regedit/main.h Modified: trunk/reactos/subsys/system/regedit/regproc.c Modified: trunk/reactos/subsys/system/regedit/regproc.h Modified: trunk/reactos/subsys/system/regedit/resource.h Modified: trunk/reactos/subsys/system/regedit/security.c Modified: trunk/reactos/subsys/system/regedit/treeview.c _____
Modified: trunk/reactos/subsys/system/regedit/En.rc --- trunk/reactos/subsys/system/regedit/En.rc 2005-09-22 20:44:10 UTC (rev 17987) +++ trunk/reactos/subsys/system/regedit/En.rc 2005-09-22 20:54:20 UTC (rev 17988) @@ -277,6 +277,9 @@
IDS_UNSUPPORTED_TYPE "Can't edit keys of this type (%ld)" IDS_TOO_BIG_VALUE "Value is too big (%ld)" IDS_MULTI_SZ_EMPTY_STRING "Data of type REG_MULTI_SZ cannot contain empty strings.\nThe empty strings have been removed from the list." + IDS_QUERY_DELETE_KEY_ONE "Are you sure you want to delete this key?" + IDS_QUERY_DELETE_KEY_MORE "Are you sure you want to delete these keys?" + IDS_QUERY_DELETE_KEY_CONFIRM "Confirm Key Delete" IDS_QUERY_DELETE_ONE "Are you sure you want to delete this value?" IDS_QUERY_DELETE_MORE "Are you sure you want to delete these values?" IDS_QUERY_DELETE_CONFIRM "Confirm Value Delete" @@ -284,6 +287,8 @@ IDS_ERR_DELETEVALUE "Unable to delete all specified values!" IDS_ERR_RENVAL_CAPTION "Error Renaming Value" IDS_ERR_RENVAL_TOEMPTY "Cannot rename %s. The specified value name is empty. Try another name and try again." + IDS_NEW_KEY "New Key #%d" + IDS_NEW_VALUE "New Value #%d" END
STRINGTABLE DISCARDABLE _____
Modified: trunk/reactos/subsys/system/regedit/childwnd.c --- trunk/reactos/subsys/system/regedit/childwnd.c 2005-09-22 20:44:10 UTC (rev 17987) +++ trunk/reactos/subsys/system/regedit/childwnd.c 2005-09-22 20:54:20 UTC (rev 17988) @@ -25,6 +25,7 @@
#include <stdio.h>
#include "main.h" +#include "regproc.h"
ChildWnd* g_pChildWnd; HBITMAP SizingPattern = 0; @@ -102,6 +103,12 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { ChildWnd* pChildWnd = g_pChildWnd; + HTREEITEM hSelection; + HKEY hRootKey; + LPCTSTR keyPath; + TCHAR szConfirmTitle[256]; + TCHAR szConfirmText[256]; + switch (LOWORD(wParam)) { /* Parse the menu selections: */ case ID_REGISTRY_EXIT: @@ -120,6 +127,27 @@ SetFocus(pChildWnd->hTreeWnd); TreeView_EditLabel(pChildWnd->hTreeWnd, TreeView_GetSelection(pChildWnd->hTreeWnd)); break; + case ID_TREE_DELETE: + hSelection = TreeView_GetSelection(pChildWnd->hTreeWnd); + keyPath = GetItemPath(pChildWnd->hTreeWnd, hSelection, &hRootKey); + + LoadString(hInst, IDS_QUERY_DELETE_KEY_CONFIRM, szConfirmTitle, sizeof(szConfirmTitle) / sizeof(szConfirmTitle[0])); + LoadString(hInst, IDS_QUERY_DELETE_KEY_ONE, szConfirmText, sizeof(szConfirmText) / sizeof(szConfirmText[0])); + + if (MessageBox(pChildWnd->hWnd, szConfirmText, szConfirmTitle, MB_YESNO) == IDYES) + { + if (RegDeleteKeyRecursive(hRootKey, keyPath) == ERROR_SUCCESS) + TreeView_DeleteItem(pChildWnd->hTreeWnd, hSelection); + } + break; + case ID_EDIT_NEW_KEY: + CreateNewKey(pChildWnd->hTreeWnd, TreeView_GetSelection(pChildWnd->hTreeWnd)); + break; + case ID_EDIT_NEW_STRINGVALUE: + case ID_EDIT_NEW_BINARYVALUE: + case ID_EDIT_NEW_DWORDVALUE: + SendMessage(hFrameWnd, WM_COMMAND, wParam, lParam); + break; case ID_SWITCH_PANELS: pChildWnd->nFocusPanel = !pChildWnd->nFocusPanel; SetFocus(pChildWnd->nFocusPanel? pChildWnd->hListWnd: pChildWnd->hTreeWnd); @@ -208,7 +236,7 @@ POINTS pt; pt = MAKEPOINTS(lParam); GetClientRect(hWnd, &rt); - pt.x = min(max(pt.x, SPLIT_MIN), rt.right - SPLIT_MIN); + pt.x = (SHORT) min(max(pt.x, SPLIT_MIN), rt.right - SPLIT_MIN); draw_splitbar(hWnd, last_split); last_split = -1; pChildWnd->nSplitPos = pt.x; @@ -253,7 +281,7 @@
pt = MAKEPOINTS(lParam); GetClientRect(hWnd, &rt); - pt.x = min(max(pt.x, SPLIT_MIN), rt.right - SPLIT_MIN); + pt.x = (SHORT) min(max(pt.x, SPLIT_MIN), rt.right - SPLIT_MIN); if(last_split != pt.x) { rt.left = last_split-SPLIT_WIDTH/2; @@ -308,11 +336,19 @@ break; case TVN_ENDLABELEDIT: { - TCHAR msg[32]; - _stprintf(msg, _T("rename to %s"), ((NMTVDISPINFO *) lParam)->item.pszText); - MessageBox(pChildWnd->hTreeWnd, msg, NULL, MB_OK); + LPCTSTR keyPath; + HKEY hRootKey; + LPNMTVDISPINFO ptvdi; + LONG lResult; + + ptvdi = (LPNMTVDISPINFO) lParam; + if (ptvdi->item.pszText) + { + keyPath = GetItemPath(pChildWnd->hTreeWnd, ptvdi->item.hItem, &hRootKey); + lResult = RegRenameKey(hRootKey, keyPath, ptvdi->item.pszText); + return lResult == ERROR_SUCCESS; + } } - break; default: return 0; } @@ -329,6 +365,7 @@ { goto def; } + return Result; break; } } _____
Modified: trunk/reactos/subsys/system/regedit/framewnd.c --- trunk/reactos/subsys/system/regedit/framewnd.c 2005-09-22 20:44:10 UTC (rev 17987) +++ trunk/reactos/subsys/system/regedit/framewnd.c 2005-09-22 20:54:20 UTC (rev 17988) @@ -466,6 +466,69 @@
return TRUE; }
+static BOOL CreateNewValue(HKEY hRootKey, LPCTSTR pszKeyPath, DWORD dwType) +{ + TCHAR szNewValueFormat[128]; + TCHAR szNewValue[128]; + int iIndex = 1; + BYTE data[128]; + DWORD dwExistingType, cbData; + LONG lResult; + HKEY hKey; + LVFINDINFO lvfi; + + if (RegOpenKey(hRootKey, pszKeyPath, &hKey) != ERROR_SUCCESS) + return FALSE; + + LoadString(hInst, IDS_NEW_VALUE, szNewValueFormat, sizeof(szNewValueFormat) + / sizeof(szNewValueFormat[0])); + + do + { + _sntprintf(szNewValue, sizeof(szNewValue) / sizeof(szNewValue[0]), + szNewValueFormat, iIndex++); + + cbData = sizeof(data); + lResult = RegQueryValueEx(hKey, szNewValue, NULL, &dwExistingType, data, &cbData); + } + while(lResult == ERROR_SUCCESS); + + switch(dwType) { + case REG_DWORD: + cbData = sizeof(DWORD); + break; + case REG_SZ: + case REG_EXPAND_SZ: + cbData = sizeof(TCHAR); + break; + case REG_MULTI_SZ: + cbData = sizeof(TCHAR) * 2; + break; + case REG_QWORD: + cbData = sizeof(DWORD) * 2; + break; + default: + cbData = 0; + break; + } + memset(data, 0, cbData); + lResult = RegSetValueEx(hKey, szNewValue, 0, dwType, data, cbData); + if (lResult != ERROR_SUCCESS) + return FALSE; + + RefreshListView(g_pChildWnd->hListWnd, hRootKey, pszKeyPath); + + /* locate the newly added value, and get ready to rename it */ + memset(&lvfi, 0, sizeof(lvfi)); + lvfi.flags = LVFI_STRING; + lvfi.psz = szNewValue; + iIndex = ListView_FindItem(g_pChildWnd->hListWnd, -1, &lvfi); + if (iIndex >= 0) + ListView_EditLabel(g_pChildWnd->hListWnd, iIndex); + + return TRUE; +} +
/*********************************************************************** ******** * * FUNCTION: _CmdWndProc(HWND, unsigned, WORD, LONG) @@ -593,6 +656,15 @@ } } break; + case ID_EDIT_NEW_STRINGVALUE: + CreateNewValue(hKeyRoot, keyPath, REG_SZ); + break; + case ID_EDIT_NEW_BINARYVALUE: + CreateNewValue(hKeyRoot, keyPath, REG_BINARY); + break; + case ID_EDIT_NEW_DWORDVALUE: + CreateNewValue(hKeyRoot, keyPath, REG_DWORD); + break; } case ID_EDIT_COPYKEYNAME: CopyKeyName(hWnd, _T("")); @@ -622,6 +694,9 @@ /*case ID_OPTIONS_TOOLBAR:*/ /* toggle_child(hWnd, LOWORD(wParam), hToolBar);*/ /* break;*/ + case ID_EDIT_NEW_KEY: + CreateNewKey(g_pChildWnd->hTreeWnd, TreeView_GetSelection(g_pChildWnd->hTreeWnd)); + break; default: result = FALSE; } _____
Modified: trunk/reactos/subsys/system/regedit/listview.c --- trunk/reactos/subsys/system/regedit/listview.c 2005-09-22 20:44:10 UTC (rev 17987) +++ trunk/reactos/subsys/system/regedit/listview.c 2005-09-22 20:54:20 UTC (rev 17988) @@ -27,6 +27,7 @@
#include <stdio.h>
#include "main.h" +#include "regproc.h"
#define CX_ICON 16 #define CY_ICON 16 @@ -442,11 +443,19 @@ if(_tcslen(Info->item.pszText) == 0) { LoadString(hInst, IDS_ERR_RENVAL_TOEMPTY, msg, sizeof(msg)/sizeof(TCHAR)); + MessageBox(0, msg, NULL, 0); + *Result = TRUE; } else - _stprintf(msg, _T("rename from %s to %s"), lineinfo->name, Info->item.pszText); - MessageBox(0, msg, NULL, 0); - *Result = TRUE; + { + HKEY hKeyRoot; + LPCTSTR keyPath; + LONG lResult; + keyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hKeyRoot); + lResult = RegRenameValue(hKeyRoot, keyPath, Info->item.pszText, lineinfo->name); + *Result = TRUE; + return (lResult == ERROR_SUCCESS); + } } } } _____
Modified: trunk/reactos/subsys/system/regedit/main.c --- trunk/reactos/subsys/system/regedit/main.c 2005-09-22 20:44:10 UTC (rev 17987) +++ trunk/reactos/subsys/system/regedit/main.c 2005-09-22 20:54:20 UTC (rev 17988) @@ -28,6 +28,8 @@
#include <process.h> #include <stdio.h> #include <fcntl.h> +#include <aclui.h> +#include <cguid.h>
#include "main.h" #include "hexedit.h" _____
Modified: trunk/reactos/subsys/system/regedit/main.h --- trunk/reactos/subsys/system/regedit/main.h 2005-09-22 20:44:10 UTC (rev 17987) +++ trunk/reactos/subsys/system/regedit/main.h 2005-09-22 20:54:20 UTC (rev 17988) @@ -99,6 +99,7 @@
extern HWND CreateTreeView(HWND hwndParent, LPTSTR pHostName, int id); extern BOOL OnTreeExpanding(HWND hWnd, NMTREEVIEW* pnmtv); extern LPCTSTR GetItemPath(HWND hwndTV, HTREEITEM hItem, HKEY* phRootKey); +extern BOOL CreateNewKey(HWND hwndTV, HTREEITEM hItem);
/* edit.c */ extern BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName, BOOL EditBin); _____
Modified: trunk/reactos/subsys/system/regedit/regproc.c --- trunk/reactos/subsys/system/regedit/regproc.c 2005-09-22 20:44:10 UTC (rev 17987) +++ trunk/reactos/subsys/system/regedit/regproc.c 2005-09-22 20:54:20 UTC (rev 17988) @@ -27,6 +27,8 @@
#include <winnt.h> #include <winreg.h> #include <assert.h> +#include <tchar.h> +#include <malloc.h> #include "regproc.h"
#define REG_VAL_BUF_SIZE 4096 @@ -1501,3 +1503,166 @@ { return app_name; } + +LONG RegDeleteKeyRecursive(HKEY hKey, LPCTSTR lpSubKey) +{ + LONG lResult; + HKEY hSubKey = NULL; + DWORD dwIndex, cbName; + TCHAR szSubKey[256]; + FILETIME ft; + + lResult = RegOpenKeyEx(hKey, lpSubKey, 0, KEY_ALL_ACCESS, &hSubKey); + if (lResult == ERROR_SUCCESS) + { + dwIndex = 0; + do + { + cbName = sizeof(szSubKey) / sizeof(szSubKey[0]); + lResult = RegEnumKeyEx(hSubKey, dwIndex++, szSubKey, &cbName, NULL, NULL, NULL, &ft); + if (lResult == ERROR_SUCCESS) + RegDeleteKeyRecursive(hSubKey, szSubKey); + } + while(lResult == ERROR_SUCCESS); + + RegCloseKey(hSubKey); + } + + return RegDeleteKey(hKey, lpSubKey); +} + +LONG RegCopyKey(HKEY hDestKey, LPCTSTR lpDestSubKey, HKEY hSrcKey, LPCTSTR lpSrcSubKey) +{ + LONG lResult; + DWORD dwDisposition; + HKEY hDestSubKey = NULL; + HKEY hSrcSubKey = NULL; + DWORD dwIndex, dwType, cbName, cbData; + TCHAR szSubKey[256]; + TCHAR szValueName[256]; + BYTE szValueData[512]; + + FILETIME ft; + + /* open the source subkey, if specified */ + if (lpSrcSubKey) + { + lResult = RegOpenKeyEx(hSrcKey, lpSrcSubKey, 0, KEY_ALL_ACCESS, &hSrcSubKey); + if (lResult) + goto done; + hSrcKey = hSrcSubKey; + } + + /* create the destination subkey */ + lResult = RegCreateKeyEx(hDestKey, lpDestSubKey, 0, NULL, 0, KEY_WRITE, NULL, + &hDestSubKey, &dwDisposition); + if (lResult) + goto done; + + /* copy all subkeys */ + dwIndex = 0; + do + { + cbName = sizeof(szSubKey) / sizeof(szSubKey[0]); + lResult = RegEnumKeyEx(hSrcKey, dwIndex++, szSubKey, &cbName, NULL, NULL, NULL, &ft); + if (lResult == ERROR_SUCCESS) + { + lResult = RegCopyKey(hDestSubKey, szSubKey, hSrcKey, szSubKey); + if (lResult) + goto done; + } + } + while(lResult == ERROR_SUCCESS); + + /* copy all subvalues */ + dwIndex = 0; + do + { + cbName = sizeof(szValueName) / sizeof(szValueName[0]); + cbData = sizeof(szValueData) / sizeof(szValueData[0]); + lResult = RegEnumValue(hSrcKey, dwIndex++, szValueName, &cbName, NULL, &dwType, szValueData, &cbData); + if (lResult == ERROR_SUCCESS) + { + lResult = RegSetValueEx(hDestSubKey, szValueName, 0, dwType, szValueData, cbData); + if (lResult) + goto done; + } + } + while(lResult == ERROR_SUCCESS); + + lResult = ERROR_SUCCESS; + +done: + if (hSrcSubKey) + RegCloseKey(hSrcSubKey); + if (hDestSubKey) + RegCloseKey(hDestSubKey); + if (lResult != ERROR_SUCCESS) + RegDeleteKeyRecursive(hDestKey, lpDestSubKey); + return lResult; + +} + +LONG RegMoveKey(HKEY hDestKey, LPCTSTR lpDestSubKey, HKEY hSrcKey, LPCTSTR lpSrcSubKey) +{ + LONG lResult; + + if (!lpSrcSubKey) + return ERROR_INVALID_FUNCTION; + + lResult = RegCopyKey(hDestKey, lpDestSubKey, hSrcKey, lpSrcSubKey); + if (lResult == ERROR_SUCCESS) + RegDeleteKeyRecursive(hSrcKey, lpSrcSubKey); + + return lResult; +} + +LONG RegRenameKey(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpNewName) +{ + LPCTSTR s; + LPTSTR lpNewSubKey; + + s = _tcsrchr(lpSubKey, '\'); + if (s) + { + s++; + lpNewSubKey = (LPTSTR) alloca((s - lpSubKey + _tcslen(lpNewName) + 1) * sizeof(TCHAR)); + memcpy(lpNewSubKey, lpSubKey, (s - lpSubKey) * sizeof(TCHAR)); + _tcscpy(lpNewSubKey + (s - lpSubKey), lpNewName); + lpNewName = lpNewSubKey; + } + return RegMoveKey(hKey, lpNewName, hKey, lpSubKey); +} + +LONG RegRenameValue(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpDestValue, LPCTSTR lpSrcValue) +{ + LONG lResult; + HKEY hSubKey = NULL; + DWORD dwType, cbData; + BYTE data[512]; + + if (lpSubKey) + { + lResult = RegOpenKey(hKey, lpSubKey, &hSubKey); + if (lResult != ERROR_SUCCESS) + goto done; + hKey = hSubKey; + } + + cbData = sizeof(data); + lResult = RegQueryValueEx(hKey, lpSrcValue, NULL, &dwType, data, &cbData); + if (lResult != ERROR_SUCCESS) + goto done; + + lResult = RegSetValueEx(hKey, lpDestValue, 0, dwType, data, cbData); + if (lResult != ERROR_SUCCESS) + goto done; + + RegDeleteValue(hKey, lpSrcValue); + +done: + if (hKey) + RegCloseKey(hKey); + return lResult; +} + _____
Modified: trunk/reactos/subsys/system/regedit/regproc.h --- trunk/reactos/subsys/system/regedit/regproc.h 2005-09-22 20:44:10 UTC (rev 17987) +++ trunk/reactos/subsys/system/regedit/regproc.h 2005-09-22 20:54:20 UTC (rev 17988) @@ -82,4 +82,13 @@
VOID UnloadAclUiDll(VOID); BOOL RegKeyEditPermissions(HWND hWndOwner, HKEY hKey, LPCTSTR lpMachine, LPCTSTR lpKeyName);
+/* + * Processing + */ +LONG RegDeleteKeyRecursive(HKEY hKey, LPCTSTR lpSubKey); +LONG RegCopyKey(HKEY hDestKey, LPCTSTR lpDestSubKey, HKEY hSrcKey, LPCTSTR lpSrcSubKey); +LONG RegMoveKey(HKEY hDestKey, LPCTSTR lpDestSubKey, HKEY hSrcKey, LPCTSTR lpSrcSubKey); +LONG RegRenameKey(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpNewName); +LONG RegRenameValue(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpDestValue, LPCTSTR lpSrcValue); + /* EOF */ _____
Modified: trunk/reactos/subsys/system/regedit/resource.h --- trunk/reactos/subsys/system/regedit/resource.h 2005-09-22 20:44:10 UTC (rev 17987) +++ trunk/reactos/subsys/system/regedit/resource.h 2005-09-22 20:54:20 UTC (rev 17988) @@ -130,6 +130,9 @@
#define ID_EDIT_PERMISSIONS 32872 #define ID_TREE_DELETE 32873 #define ID_TREE_RENAME 32874 +#define IDS_QUERY_DELETE_KEY_ONE 32875 +#define IDS_QUERY_DELETE_KEY_MORE 32876 +#define IDS_QUERY_DELETE_KEY_CONFIRM 32877
#define IDS_FLT_REGFILES 31001 #define IDS_FLT_REGFILES_FLT 31002 @@ -156,6 +159,8 @@ #define IDS_INHERIT_SUBKEYSONLY 31123 #define IDS_EXPAND 31124 #define IDS_COLLAPSE 31125 +#define IDS_NEW_KEY 31126 +#define IDS_NEW_VALUE 31127
#define IDD_EDIT_STRING 2000 _____
Modified: trunk/reactos/subsys/system/regedit/security.c --- trunk/reactos/subsys/system/regedit/security.c 2005-09-22 20:44:10 UTC (rev 17987) +++ trunk/reactos/subsys/system/regedit/security.c 2005-09-22 20:54:20 UTC (rev 17988) @@ -28,6 +28,8 @@
#include <objbase.h> #include <basetyps.h> #include <unknwn.h> +#include <aclui.h> +#include <cguid.h> #include "security.h" #include "regproc.h" #include "resource.h" _____
Modified: trunk/reactos/subsys/system/regedit/treeview.c --- trunk/reactos/subsys/system/regedit/treeview.c 2005-09-22 20:44:10 UTC (rev 17987) +++ trunk/reactos/subsys/system/regedit/treeview.c 2005-09-22 20:54:20 UTC (rev 17988) @@ -260,6 +260,55 @@
}
+BOOL CreateNewKey(HWND hwndTV, HTREEITEM hItem) +{ + TCHAR szNewKeyFormat[128]; + TCHAR szNewKey[128]; + LPCTSTR pszKeyPath; + int iIndex = 1; + HKEY hRootKey; + HKEY hKey = NULL; + HKEY hNewKey = NULL; + BOOL bSuccess = FALSE; + LONG lResult; + DWORD dwDisposition; + HTREEITEM hNewItem; + + pszKeyPath = GetItemPath(g_pChildWnd->hTreeWnd, hItem, &hRootKey); + if (RegOpenKey(hRootKey, pszKeyPath, &hKey) != ERROR_SUCCESS) + goto done; + + if (LoadString(hInst, IDS_NEW_KEY, szNewKeyFormat, sizeof(szNewKeyFormat) / sizeof(szNewKeyFormat[0])) <= 0) + goto done; + + do + { + _sntprintf(szNewKey, sizeof(szNewKey) / sizeof(szNewKey[0]), szNewKeyFormat, iIndex++); + lResult = RegCreateKeyEx(hKey, szNewKey, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hNewKey, &dwDisposition); + if (hNewKey && (dwDisposition == REG_OPENED_EXISTING_KEY)) + { + RegCloseKey(hNewKey); + hNewKey = NULL; + } + } + while(!hNewKey); + + hNewItem = AddEntryToTree(hwndTV, hItem, szNewKey, NULL, 0, NULL); + if (!hNewItem) + goto done; + TreeView_EditLabel(hwndTV, hNewItem); + + bSuccess = TRUE; + +done: + if (hKey) + RegCloseKey(hKey); + if (hNewKey) + RegCloseKey(hNewKey); + return bSuccess; +} + + /* * CreateTreeView - creates a tree view control. * Returns the handle to the new control if successful, or NULL otherwise.