* 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
{
static DWORD valueDataLen;
static EDIT_MODE dwordEditMode = EDIT_MODE_HEX;
-
void error(HWND hwnd, INT resId, ...)
{
va_list ap;
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;
{
WNDPROC oldwndproc;
- oldwndproc = (WNDPROC)GetWindowLongPtr(hwnd, GWL_USERDATA);
+ oldwndproc = (WNDPROC)(LONG_PTR)GetWindowLongPtr(hwnd, GWL_USERDATA);
switch (uMsg)
{
INT_PTR CALLBACK modify_dword_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
WNDPROC oldproc;
- TCHAR* valueData;
HWND hwndValue;
int len;
TCHAR ValueString[32];
LPTSTR Remainder;
DWORD Base;
- DWORD Value;
+ DWORD Value = 0;
switch(uMsg) {
case WM_INITDIALOG:
/* 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);
{
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);
{
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);
INT_PTR CALLBACK modify_binary_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
- PVOID valueData;
HWND hwndValue;
- int len;
+ UINT len;
switch(uMsg) {
case WM_INITDIALOG:
{
DWORD llen, listlen, nl_len;
LPTSTR src, lines = NULL;
-
+
if (!(stringValueData = HeapAlloc(GetProcessHeap(), 0, valueDataLen)))
{
error(hwnd, IDS_TOO_BIG_VALUE, valueDataLen);
error(hwnd, IDS_BAD_VALUE, valueName);
goto done;
}
-
+
/* convert \0 to \r\n */
src = stringValueData;
nl_len = _tcslen(_T("\r\n")) * sizeof(TCHAR);
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));
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);
}
#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))))
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
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;
+}