Streamline the editing interfaces a bit.
authorDimitrie O. Paun <dpaun@rogers.com>
Fri, 16 Jan 2004 02:21:23 +0000 (02:21 +0000)
committerAlexandre Julliard <julliard@winehq.org>
Fri, 16 Jan 2004 02:21:23 +0000 (02:21 +0000)
Open the registry with only the required permissions for the
operation. Fix a few leaks.

programs/regedit/edit.c
programs/regedit/framewnd.c
programs/regedit/main.h

index 93c56e0fb3aa8d5870b6e94faa3496f9ac561eac..0b881a1783d1d691f70673c0e37ac6d9b671f5ae 100644 (file)
@@ -155,18 +155,20 @@ done:
     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 @@ BOOL CreateKey(HKEY hKey)
        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 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName)
 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 @@ BOOL CreateValue(HWND hwnd, HKEY hKey, DWORD valueType)
        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 RenameValue(HWND hwnd, HKEY hRootKey, LPCTSTR keyPath, LPCTSTR oldName, LPC
     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 @@ BOOL RenameValue(HWND hwnd, HKEY hRootKey, LPCTSTR keyPath, LPCTSTR oldName, LPC
 
 done:
     HeapFree(GetProcessHeap(), 0, value);
+    RegCloseKey(hKey);
     return result;
 }
index 0c75acc98ea4d1deacd9741f6177790830d1f54a..d7ca688e069f6bf15dfd5a586ab4bc1adb660c5b 100644 (file)
@@ -435,17 +435,12 @@ BOOL RefreshView(HWND hWnd)
  */
 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 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
         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 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
        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);
@@ -533,11 +528,10 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
         return TRUE;
     }
     default:
-        result = FALSE;
+        return FALSE;
     }
 
-    RegCloseKey(hKey);
-    return result;
+    return TRUE;
 }
 
 /********************************************************************************
index eed6f85733b5c13df84cccb6e9914a0f6b30252b..228f3c8f340ed4460f6055aa5d9a1a8a6f400892 100644 (file)
@@ -98,10 +98,10 @@ extern BOOL OnTreeExpanding(HWND hWnd, NMTREEVIEW* pnmtv);
 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__ */