Commit 7a6d6aab authored by Dimitrie O. Paun's avatar Dimitrie O. Paun Committed by Alexandre Julliard

Streamline the editing interfaces a bit.

Open the registry with only the required permissions for the operation. Fix a few leaks.
parent 14263ab0
...@@ -155,18 +155,20 @@ done: ...@@ -155,18 +155,20 @@ done:
return NULL; return NULL;
} }
BOOL CreateKey(HKEY hKey) BOOL CreateKey(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath)
{ {
BOOL result = FALSE;
LONG lRet = ERROR_SUCCESS; LONG lRet = ERROR_SUCCESS;
HKEY retKey; HKEY retKey;
TCHAR keyName[32]; TCHAR keyName[32];
TCHAR newKey[COUNT_OF(keyName) - 4]; TCHAR newKey[COUNT_OF(keyName) - 4];
int keyNum; int keyNum;
HKEY hKey;
/* If we have illegal parameter return with operation failure */ lRet = RegOpenKeyEx(hKeyRoot, keyPath, 0, KEY_CREATE_SUB_KEY, &hKey);
if (!hKey) return FALSE; 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) */ /* try to find out a name for the newly create key (max 100 times) */
for (keyNum = 1; keyNum < 100; keyNum++) { for (keyNum = 1; keyNum < 100; keyNum++) {
...@@ -175,22 +177,26 @@ BOOL CreateKey(HKEY hKey) ...@@ -175,22 +177,26 @@ BOOL CreateKey(HKEY hKey)
if (lRet != ERROR_SUCCESS) break; if (lRet != ERROR_SUCCESS) break;
RegCloseKey(retKey); RegCloseKey(retKey);
} }
if (lRet == ERROR_SUCCESS) return FALSE; if (lRet == ERROR_SUCCESS) goto done;
lRet = RegCreateKey(hKey, keyName, &retKey); lRet = RegCreateKey(hKey, keyName, &retKey);
if (lRet != ERROR_SUCCESS) return FALSE; if (lRet != ERROR_SUCCESS) goto done;
result = TRUE;
done:
RegCloseKey(retKey); 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; DWORD type;
LONG lRet; 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; editValueName = valueName;
if(!(stringValueData = read_value(hwnd, hKey, valueName, &type, 0))) goto done; if(!(stringValueData = read_value(hwnd, hKey, valueName, &type, 0))) goto done;
...@@ -216,38 +222,48 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName) ...@@ -216,38 +222,48 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName)
done: done:
HeapFree(GetProcessHeap(), 0, stringValueData); HeapFree(GetProcessHeap(), 0, stringValueData);
stringValueData = NULL; stringValueData = NULL;
RegCloseKey(hKey);
return result; 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; 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) 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); lRet = RegDeleteValue(hKey, valueName);
if (lRet != ERROR_SUCCESS) { if (lRet != ERROR_SUCCESS) {
error(hwnd, IDS_BAD_VALUE, valueName); 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; LONG lRet = ERROR_SUCCESS;
TCHAR valueName[32]; TCHAR valueName[32];
TCHAR newValue[COUNT_OF(valueName) - 4]; TCHAR newValue[COUNT_OF(valueName) - 4];
DWORD valueDword = 0; DWORD valueDword = 0;
BOOL result = FALSE;
int valueNum; int valueNum;
HKEY hKey;
/* If we have illegal parameter return with operation failure */ lRet = RegOpenKeyEx(hKeyRoot, keyPath, 0, KEY_READ | KEY_SET_VALUE, &hKey);
if (!hKey) return FALSE; 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) */ /* try to find out a name for the newly create key (max 100 times) */
for (valueNum = 1; valueNum < 100; valueNum++) { for (valueNum = 1; valueNum < 100; valueNum++) {
...@@ -255,15 +271,18 @@ BOOL CreateValue(HWND hwnd, HKEY hKey, DWORD valueType) ...@@ -255,15 +271,18 @@ BOOL CreateValue(HWND hwnd, HKEY hKey, DWORD valueType)
lRet = RegQueryValueEx(hKey, valueName, 0, 0, 0, 0); lRet = RegQueryValueEx(hKey, valueName, 0, 0, 0, 0);
if (lRet != ERROR_SUCCESS) break; 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)); 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; LPTSTR value = NULL;
DWORD type; DWORD type;
...@@ -271,8 +290,8 @@ BOOL RenameValue(HWND hwnd, HKEY hRootKey, LPCTSTR keyPath, LPCTSTR oldName, LPC ...@@ -271,8 +290,8 @@ BOOL RenameValue(HWND hwnd, HKEY hRootKey, LPCTSTR keyPath, LPCTSTR oldName, LPC
BOOL result = FALSE; BOOL result = FALSE;
HKEY hKey; HKEY hKey;
lRet = RegOpenKeyEx(hRootKey, keyPath, 0, KEY_ALL_ACCESS, &hKey); lRet = RegOpenKeyEx(hKeyRoot, keyPath, 0, KEY_READ | KEY_SET_VALUE, &hKey);
if (lRet != ERROR_SUCCESS) goto done; if (lRet != ERROR_SUCCESS) return FALSE;
value = read_value(hwnd, hKey, oldName, &type, &len); value = read_value(hwnd, hKey, oldName, &type, &len);
if(!value) goto done; if(!value) goto done;
lRet = RegSetValueEx(hKey, newName, 0, type, (BYTE*)value, len); lRet = RegSetValueEx(hKey, newName, 0, type, (BYTE*)value, len);
...@@ -286,5 +305,6 @@ BOOL RenameValue(HWND hwnd, HKEY hRootKey, LPCTSTR keyPath, LPCTSTR oldName, LPC ...@@ -286,5 +305,6 @@ BOOL RenameValue(HWND hwnd, HKEY hRootKey, LPCTSTR keyPath, LPCTSTR oldName, LPC
done: done:
HeapFree(GetProcessHeap(), 0, value); HeapFree(GetProcessHeap(), 0, value);
RegCloseKey(hKey);
return result; return result;
} }
...@@ -435,17 +435,12 @@ BOOL RefreshView(HWND hWnd) ...@@ -435,17 +435,12 @@ BOOL RefreshView(HWND hWnd)
*/ */
static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{ {
HKEY hKeyRoot = 0, hKey = 0; HKEY hKeyRoot = 0;
LPCTSTR keyPath; LPCTSTR keyPath;
LPCTSTR valueName; LPCTSTR valueName;
BOOL result = TRUE;
LONG lRet;
DWORD valueType; DWORD valueType;
if ((keyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hKeyRoot))) { keyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hKeyRoot);
lRet = RegOpenKeyEx(hKeyRoot, keyPath, 0, KEY_ALL_ACCESS, &hKey);
if (lRet != ERROR_SUCCESS) hKey = 0;
}
valueName = GetValueName(g_pChildWnd->hListWnd); valueName = GetValueName(g_pChildWnd->hListWnd);
switch (LOWORD(wParam)) { switch (LOWORD(wParam)) {
...@@ -463,18 +458,18 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) ...@@ -463,18 +458,18 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
PrintRegistryHive(hWnd, _T("")); PrintRegistryHive(hWnd, _T(""));
break; break;
case ID_EDIT_DELETE: case ID_EDIT_DELETE:
if (DeleteValue(hWnd, hKey, valueName)) if (DeleteValue(hWnd, hKeyRoot, keyPath, valueName))
RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath); RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath);
break; break;
case ID_EDIT_MODIFY: case ID_EDIT_MODIFY:
if (ModifyValue(hWnd, hKey, valueName)) if (ModifyValue(hWnd, hKeyRoot, keyPath, valueName))
RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath); RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath);
break; break;
case ID_EDIT_COPYKEYNAME: case ID_EDIT_COPYKEYNAME:
CopyKeyName(hWnd, _T("")); CopyKeyName(hWnd, _T(""));
break; break;
case ID_EDIT_NEW_KEY: case ID_EDIT_NEW_KEY:
CreateKey(hKey); CreateKey(hWnd, hKeyRoot, keyPath);
break; break;
case ID_EDIT_NEW_STRINGVALUE: case ID_EDIT_NEW_STRINGVALUE:
valueType = REG_SZ; valueType = REG_SZ;
...@@ -486,7 +481,7 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) ...@@ -486,7 +481,7 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
valueType = REG_DWORD; valueType = REG_DWORD;
/* fall through */ /* fall through */
create_value: create_value:
if (CreateValue(hWnd, hKey, valueType)) if (CreateValue(hWnd, hKeyRoot, keyPath, valueType))
RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath); RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath);
case ID_EDIT_RENAME: case ID_EDIT_RENAME:
StartValueRename(g_pChildWnd->hListWnd, hKeyRoot, keyPath); StartValueRename(g_pChildWnd->hListWnd, hKeyRoot, keyPath);
...@@ -533,11 +528,10 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) ...@@ -533,11 +528,10 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
return TRUE; return TRUE;
} }
default: default:
result = FALSE; return FALSE;
} }
RegCloseKey(hKey); return TRUE;
return result;
} }
/******************************************************************************** /********************************************************************************
......
...@@ -98,10 +98,10 @@ extern BOOL OnTreeExpanding(HWND hWnd, NMTREEVIEW* pnmtv); ...@@ -98,10 +98,10 @@ extern BOOL OnTreeExpanding(HWND hWnd, NMTREEVIEW* pnmtv);
extern LPCTSTR GetItemPath(HWND hwndTV, HTREEITEM hItem, HKEY* phRootKey); extern LPCTSTR GetItemPath(HWND hwndTV, HTREEITEM hItem, HKEY* phRootKey);
/* edit.c */ /* edit.c */
extern BOOL CreateKey(HKEY hKey); extern BOOL CreateKey(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath);
extern BOOL CreateValue(HWND hwnd, HKEY hKey, DWORD valueType); extern BOOL CreateValue(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath, DWORD valueType);
extern BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName); extern BOOL ModifyValue(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath, LPCTSTR valueName);
extern BOOL DeleteValue(HWND hwnd, HKEY hKey, 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); extern BOOL RenameValue(HWND hwnd, HKEY hRootKey, LPCTSTR keyPath, LPCTSTR oldName, LPCTSTR newName);
#endif /* __MAIN_H__ */ #endif /* __MAIN_H__ */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment