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