regedit: cleanup

Dimitrie O. Paun dpaun at rogers.com
Thu Jan 15 01:33:47 CST 2004


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.




More information about the wine-patches mailing list