ChangeLog Streamline the editing interfaces a bit. Open the registry with only the required permissions for the operation. Fix a few leaks. Index: programs/regedit/main.h =================================================================== RCS file: /var/cvs/wine/programs/regedit/main.h,v retrieving revision 1.12 diff -u -r1.12 main.h --- programs/regedit/main.h 13 Jan 2004 23:18:12 -0000 1.12 +++ programs/regedit/main.h 15 Jan 2004 07:15:52 -0000 @@ -94,10 +100,10 @@ extern LPCTSTR GetItemPath(HWND hwndTV, HTREEITEM hItem, HKEY* phRootKey); /* edit.c */ -extern BOOL CreateKey(HKEY hKey); -extern BOOL CreateValue(HWND hwnd, HKEY hKey, DWORD valueType); -extern BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName); -extern BOOL DeleteValue(HWND hwnd, HKEY hKey, LPCTSTR valueName); +extern BOOL CreateKey(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath); +extern BOOL CreateValue(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath, DWORD valueType); +extern BOOL ModifyValue(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath, LPCTSTR valueName); +extern BOOL DeleteValue(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath, LPCTSTR valueName); extern BOOL RenameValue(HWND hwnd, HKEY hRootKey, LPCTSTR keyPath, LPCTSTR oldName, LPCTSTR newName); #endif /* __MAIN_H__ */ Index: programs/regedit/framewnd.c =================================================================== RCS file: /var/cvs/wine/programs/regedit/framewnd.c,v retrieving revision 1.9 diff -u -r1.9 framewnd.c --- programs/regedit/framewnd.c 13 Jan 2004 23:18:12 -0000 1.9 +++ programs/regedit/framewnd.c 15 Jan 2004 07:18:39 -0000 @@ -435,17 +435,12 @@ */ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { - HKEY hKeyRoot = 0, hKey = 0; + HKEY hKeyRoot = 0; LPCTSTR keyPath; LPCTSTR valueName; - BOOL result = TRUE; - LONG lRet; DWORD valueType; - if ((keyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hKeyRoot))) { - lRet = RegOpenKeyEx(hKeyRoot, keyPath, 0, KEY_ALL_ACCESS, &hKey); - if (lRet != ERROR_SUCCESS) hKey = 0; - } + keyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hKeyRoot); valueName = GetValueName(g_pChildWnd->hListWnd); switch (LOWORD(wParam)) { @@ -463,18 +458,18 @@ PrintRegistryHive(hWnd, _T("")); break; case ID_EDIT_DELETE: - if (DeleteValue(hWnd, hKey, valueName)) + if (DeleteValue(hWnd, hKeyRoot, keyPath, valueName)) RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath); break; case ID_EDIT_MODIFY: - if (ModifyValue(hWnd, hKey, valueName)) + if (ModifyValue(hWnd, hKeyRoot, keyPath, valueName)) RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath); break; case ID_EDIT_COPYKEYNAME: CopyKeyName(hWnd, _T("")); break; case ID_EDIT_NEW_KEY: - CreateKey(hKey); + CreateKey(hWnd, hKeyRoot, keyPath); break; case ID_EDIT_NEW_STRINGVALUE: valueType = REG_SZ; @@ -486,7 +481,7 @@ valueType = REG_DWORD; /* fall through */ create_value: - if (CreateValue(hWnd, hKey, valueType)) + if (CreateValue(hWnd, hKeyRoot, keyPath, valueType)) RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath); case ID_EDIT_RENAME: StartValueRename(g_pChildWnd->hListWnd, hKeyRoot, keyPath); @@ -519,11 +514,10 @@ ShowAboutBox(hWnd); break; default: - result = FALSE; + return FALSE; } - RegCloseKey(hKey); - return result; + return TRUE; } /******************************************************************************** Index: programs/regedit/edit.c =================================================================== RCS file: /var/cvs/wine/programs/regedit/edit.c,v retrieving revision 1.7 diff -u -r1.7 edit.c --- programs/regedit/edit.c 13 Jan 2004 23:18:12 -0000 1.7 +++ programs/regedit/edit.c 15 Jan 2004 07:28:15 -0000 @@ -155,18 +155,20 @@ return NULL; } -BOOL CreateKey(HKEY hKey) +BOOL CreateKey(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath) { + BOOL result = FALSE; LONG lRet = ERROR_SUCCESS; HKEY retKey; TCHAR keyName[32]; TCHAR newKey[COUNT_OF(keyName) - 4]; int keyNum; + HKEY hKey; - /* If we have illegal parameter return with operation failure */ - if (!hKey) return FALSE; + lRet = RegOpenKeyEx(hKeyRoot, keyPath, 0, KEY_CREATE_SUB_KEY, &hKey); + if (lRet != ERROR_SUCCESS) return FALSE; - if (!LoadString(GetModuleHandle(0), IDS_NEWKEY, newKey, COUNT_OF(newKey))) return FALSE; + if (!LoadString(GetModuleHandle(0), IDS_NEWKEY, newKey, COUNT_OF(newKey))) goto done; /* try to find out a name for the newly create key (max 100 times) */ for (keyNum = 1; keyNum < 100; keyNum++) { @@ -175,22 +177,26 @@ if (lRet != ERROR_SUCCESS) break; RegCloseKey(retKey); } - if (lRet == ERROR_SUCCESS) return FALSE; + if (lRet == ERROR_SUCCESS) goto done; lRet = RegCreateKey(hKey, keyName, &retKey); - if (lRet != ERROR_SUCCESS) return FALSE; + if (lRet != ERROR_SUCCESS) goto done; + result = TRUE; +done: RegCloseKey(retKey); - return TRUE; + return result; } -BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName) +BOOL ModifyValue(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath, LPCTSTR valueName) { + BOOL result = FALSE; DWORD type; LONG lRet; - BOOL result = FALSE; + HKEY hKey; - if (!hKey || !valueName) return FALSE; + lRet = RegOpenKeyEx(hKeyRoot, keyPath, 0, KEY_READ | KEY_SET_VALUE, &hKey); + if (lRet != ERROR_SUCCESS) return FALSE; editValueName = valueName; if(!(stringValueData = read_value(hwnd, hKey, valueName, &type, 0))) goto done; @@ -216,38 +222,48 @@ done: HeapFree(GetProcessHeap(), 0, stringValueData); stringValueData = NULL; - + RegCloseKey(hKey); return result; } -BOOL DeleteValue(HWND hwnd, HKEY hKey, LPCTSTR valueName) +BOOL DeleteValue(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath, LPCTSTR valueName) { + BOOL result = FALSE; LONG lRet; + HKEY hKey; - if (!hKey || !valueName) return FALSE; + lRet = RegOpenKeyEx(hKeyRoot, keyPath, 0, KEY_SET_VALUE, &hKey); + if (lRet != ERROR_SUCCESS) return FALSE; if (messagebox(hwnd, MB_YESNO | MB_ICONEXCLAMATION, IDS_DELETE_BOX_TITLE, IDS_DELETE_BOX_TEXT, valueName) != IDYES) - return FALSE; + goto done; lRet = RegDeleteValue(hKey, valueName); if (lRet != ERROR_SUCCESS) { error(hwnd, IDS_BAD_VALUE, valueName); } - return lRet == ERROR_SUCCESS; + if (lRet != ERROR_SUCCESS) goto done; + result = TRUE; + +done: + RegCloseKey(hKey); + return result; } -BOOL CreateValue(HWND hwnd, HKEY hKey, DWORD valueType) +BOOL CreateValue(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath, DWORD valueType) { LONG lRet = ERROR_SUCCESS; TCHAR valueName[32]; TCHAR newValue[COUNT_OF(valueName) - 4]; DWORD valueDword = 0; + BOOL result = FALSE; int valueNum; + HKEY hKey; - /* If we have illegal parameter return with operation failure */ - if (!hKey) return FALSE; + lRet = RegOpenKeyEx(hKeyRoot, keyPath, 0, KEY_READ | KEY_SET_VALUE, &hKey); + if (lRet != ERROR_SUCCESS) return FALSE; - if (!LoadString(GetModuleHandle(0), IDS_NEWVALUE, newValue, COUNT_OF(newValue))) return FALSE; + if (!LoadString(GetModuleHandle(0), IDS_NEWVALUE, newValue, COUNT_OF(newValue))) goto done; /* try to find out a name for the newly create key (max 100 times) */ for (valueNum = 1; valueNum < 100; valueNum++) { @@ -255,15 +271,18 @@ lRet = RegQueryValueEx(hKey, valueName, 0, 0, 0, 0); if (lRet != ERROR_SUCCESS) break; } - if (lRet == ERROR_SUCCESS) return FALSE; + if (lRet == ERROR_SUCCESS) goto done; lRet = RegSetValueEx(hKey, valueName, 0, valueType, (BYTE*)&valueDword, sizeof(DWORD)); - if (lRet != ERROR_SUCCESS) return FALSE; + if (lRet != ERROR_SUCCESS) goto done; + result = TRUE; - return TRUE; +done: + RegCloseKey(hKey); + return result; } -BOOL RenameValue(HWND hwnd, HKEY hRootKey, LPCTSTR keyPath, LPCTSTR oldName, LPCTSTR newName) +BOOL RenameValue(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath, LPCTSTR oldName, LPCTSTR newName) { LPTSTR value = NULL; DWORD type; @@ -271,8 +290,8 @@ BOOL result = FALSE; HKEY hKey; - lRet = RegOpenKeyEx(hRootKey, keyPath, 0, KEY_ALL_ACCESS, &hKey); - if (lRet != ERROR_SUCCESS) goto done; + lRet = RegOpenKeyEx(hKeyRoot, keyPath, 0, KEY_READ | KEY_SET_VALUE, &hKey); + if (lRet != ERROR_SUCCESS) return FALSE; value = read_value(hwnd, hKey, oldName, &type, &len); if(!value) goto done; lRet = RegSetValueEx(hKey, newName, 0, type, (BYTE*)value, len); @@ -286,5 +305,6 @@ done: HeapFree(GetProcessHeap(), 0, value); + RegCloseKey(hKey); return result; } -- Dimi.