- Get autochk, calc, cmd, devmgr, expand, format, gettype, hostname, lsass, msconfig...
[reactos.git] / reactos / subsys / system / regedit / edit.c
index 84f186f..cc30cf5 100644 (file)
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
-#define WIN32_LEAN_AND_MEAN     /* Exclude rarely-used stuff from Windows headers */
-
-#include <windows.h>
-#include <tchar.h>
-#include <commctrl.h>
-#include <commdlg.h>
-#include <cderr.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <shellapi.h>
-#include <ctype.h>
-
-#include "main.h"
-#include "regproc.h"
-#include "resource.h"
-#include "hexedit.h"
-
+#include <regedit.h>
 
 typedef enum _EDIT_MODE
 {
@@ -50,7 +34,6 @@ static DWORD dwordValueData;
 static DWORD valueDataLen;
 static EDIT_MODE dwordEditMode = EDIT_MODE_HEX;
 
-
 void error(HWND hwnd, INT resId, ...)
 {
     va_list ap;
@@ -74,6 +57,23 @@ void error(HWND hwnd, INT resId, ...)
     MessageBox(hwnd, errstr, title, MB_OK | MB_ICONERROR);
 }
 
+static void error_code_messagebox(HWND hwnd, DWORD error_code)
+{
+    LPTSTR lpMsgBuf;
+    DWORD status;
+    TCHAR title[256];
+    static const TCHAR fallback[] = TEXT("Error displaying error message.\n");
+    if (!LoadString(hInst, IDS_ERROR, title, COUNT_OF(title)))
+        lstrcpy(title, TEXT("Error"));
+    status = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
+                           NULL, error_code, 0, (LPTSTR)&lpMsgBuf, 0, NULL);
+    if (!status)
+        lpMsgBuf = (LPTSTR)fallback;
+    MessageBox(hwnd, lpMsgBuf, title, MB_OK | MB_ICONERROR);
+    if (lpMsgBuf != fallback)
+        LocalFree(lpMsgBuf);
+}
+
 void warning(HWND hwnd, INT resId, ...)
 {
     va_list ap;
@@ -231,7 +231,7 @@ LRESULT CALLBACK DwordEditSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPAR
 {
     WNDPROC oldwndproc;
 
-    oldwndproc = (WNDPROC)GetWindowLongPtr(hwnd, GWL_USERDATA);
+    oldwndproc = (WNDPROC)(LONG_PTR)GetWindowLongPtr(hwnd, GWL_USERDATA);
 
     switch (uMsg)
     {
@@ -276,7 +276,7 @@ INT_PTR CALLBACK modify_dword_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LP
     TCHAR ValueString[32];
     LPTSTR Remainder;
     DWORD Base;
-    DWORD Value;
+    DWORD Value = 0;
 
     switch(uMsg) {
     case WM_INITDIALOG:
@@ -284,7 +284,7 @@ INT_PTR CALLBACK modify_dword_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LP
 
         /* subclass the edit control */
         hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_DATA);
-        oldproc = (WNDPROC)GetWindowLongPtr(hwndValue, GWL_WNDPROC);
+        oldproc = (WNDPROC)(LONG_PTR)GetWindowLongPtr(hwndValue, GWL_WNDPROC);
         SetWindowLongPtr(hwndValue, GWL_USERDATA, (DWORD_PTR)oldproc);
         SetWindowLongPtr(hwndValue, GWL_WNDPROC, (DWORD_PTR)DwordEditSubclassProc);
 
@@ -315,19 +315,11 @@ INT_PTR CALLBACK modify_dword_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LP
                 {
                     if ((len = GetWindowTextLength(hwndValue)))
                     {
-                        if (!GetWindowText(hwndValue, ValueString, 32))
-                        {
-                            Value = 0;
-                        }
-                        else
+                        if (GetWindowText(hwndValue, ValueString, 32))
                         {
                             Value = _tcstoul (ValueString, &Remainder, 10);
                         }
                     }
-                    else
-                    {
-                        Value = 0;
-                    }
                 }
                 _stprintf (ValueString, _T("%lx"), Value);
                 SetDlgItemText(hwndDlg, IDC_VALUE_DATA, ValueString);
@@ -343,19 +335,11 @@ INT_PTR CALLBACK modify_dword_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LP
                 {
                     if ((len = GetWindowTextLength(hwndValue)))
                     {
-                        if (!GetWindowText(hwndValue, ValueString, 32))
-                        {
-                            Value = 0;
-                        }
-                        else
+                        if (GetWindowText(hwndValue, ValueString, 32))
                         {
                             Value = _tcstoul (ValueString, &Remainder, 16);
                         }
                     }
-                    else
-                    {
-                        Value = 0;
-                    }
                 }
                 _stprintf (ValueString, _T("%lu"), Value);
                 SetDlgItemText(hwndDlg, IDC_VALUE_DATA, ValueString);
@@ -398,7 +382,7 @@ INT_PTR CALLBACK modify_dword_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LP
 INT_PTR CALLBACK modify_binary_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
     HWND hwndValue;
-    int len;
+    UINT len;
 
     switch(uMsg) {
     case WM_INITDIALOG:
@@ -514,7 +498,7 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName, BOOL EditBin)
         {
             DWORD llen, listlen, nl_len;
             LPTSTR src, lines = NULL;
-            
+
            if (!(stringValueData = HeapAlloc(GetProcessHeap(), 0, valueDataLen)))
             {
                 error(hwnd, IDS_TOO_BIG_VALUE, valueDataLen);
@@ -526,7 +510,7 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName, BOOL EditBin)
                 error(hwnd, IDS_BAD_VALUE, valueName);
                 goto done;
             }
-            
+
            /* convert \0 to \r\n */
             src = stringValueData;
             nl_len = _tcslen(_T("\r\n")) * sizeof(TCHAR);
@@ -559,7 +543,7 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName, BOOL EditBin)
                 BOOL EmptyLines = FALSE;
                 LPTSTR src, lines, nl;
                 DWORD linechars, buflen, c_nl, dest;
-                
+
                 src = stringValueData;
                 buflen = sizeof(TCHAR);
                 lines = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, buflen + sizeof(TCHAR));
@@ -596,12 +580,12 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName, BOOL EditBin)
                     src += linechars + (nl != NULL ? c_nl : 0);
                 }
                 lines[++dest] = _T('\0');
-                
+
                 if(EmptyLines)
                 {
                     warning(hwnd, IDS_MULTI_SZ_EMPTY_STRING);
                 }
-                
+
                lRet = RegSetValueEx(hKey, valueName, 0, type, (LPBYTE)lines, buflen);
                HeapFree(GetProcessHeap(), 0, lines);
             }
@@ -634,7 +618,7 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName, BOOL EditBin)
         #ifndef UNICODE
         LPWSTR u_valuename;
         int len_vname = lstrlen(valueName);
-        
+
        if(len_vname > 0)
         {
           if(!(u_valuename = HeapAlloc(GetProcessHeap(), 0, (len_vname + 1) * sizeof(WCHAR))))
@@ -656,7 +640,7 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName, BOOL EditBin)
               error(hwnd, IDS_TOO_BIG_VALUE, valueDataLen);
               goto done;
             }
-           
+
            /* force to use the unicode version, so editing strings in binary mode is correct */
            lRet = RegQueryValueExW(hKey,
                                    #ifndef UNICODE
@@ -713,3 +697,34 @@ done:
 
     return result;
 }
+
+BOOL DeleteKey(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath)
+{
+    TCHAR msg[128], caption[128];
+    BOOL result = FALSE;
+    LONG lRet;
+    HKEY hKey;
+    
+    lRet = RegOpenKeyEx(hKeyRoot, keyPath, 0, KEY_READ|KEY_SET_VALUE, &hKey);
+    if (lRet != ERROR_SUCCESS) {
+       error_code_messagebox(hwnd, lRet);
+       return FALSE;
+    }
+    
+    LoadString(hInst, IDS_QUERY_DELETE_KEY_CONFIRM, caption, sizeof(caption)/sizeof(TCHAR));
+    LoadString(hInst, IDS_QUERY_DELETE_KEY_ONE, msg, sizeof(msg)/sizeof(TCHAR));
+
+    if (MessageBox(g_pChildWnd->hWnd, msg, caption, MB_ICONQUESTION | MB_YESNO) != IDYES)
+        goto done;
+       
+    lRet = SHDeleteKey(hKeyRoot, keyPath);
+    if (lRet != ERROR_SUCCESS) {
+       error(hwnd, IDS_BAD_KEY, keyPath);
+       goto done;
+    }
+    result = TRUE;
+    
+done:
+    RegCloseKey(hKey);
+    return result;
+}