* 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 <regedit.h>
typedef enum _EDIT_MODE
{
static const TCHAR* editValueName;
static TCHAR* stringValueData;
+static PVOID binValueData;
static DWORD dwordValueData;
+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;
}
else
{
- SetDlgItemText(hwndDlg, IDC_VALUE_NAME, _T("(Default)"));
+ TCHAR buffer[255];
+ LoadString(hInst, IDS_DEFAULT_VALUE_NAME, buffer, sizeof(buffer)/sizeof(TCHAR));
+ SetDlgItemText(hwndDlg, IDC_VALUE_NAME, buffer);
}
SetDlgItemText(hwndDlg, IDC_VALUE_DATA, stringValueData);
SetFocus(GetDlgItem(hwndDlg, IDC_VALUE_DATA));
}
else
{
- SetDlgItemText(hwndDlg, IDC_VALUE_NAME, _T("(Default)"));
+ TCHAR buffer[255];
+ LoadString(hInst, IDS_DEFAULT_VALUE_NAME, buffer, sizeof(buffer)/sizeof(TCHAR));
+ SetDlgItemText(hwndDlg, IDC_VALUE_NAME, buffer);
}
SetDlgItemText(hwndDlg, IDC_VALUE_DATA, stringValueData);
SetFocus(GetDlgItem(hwndDlg, IDC_VALUE_DATA));
{
WNDPROC oldwndproc;
- oldwndproc = (WNDPROC)GetWindowLong(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)GetWindowLong(hwndValue, GWL_WNDPROC);
- SetWindowLong(hwndValue, GWL_USERDATA, (LONG)oldproc);
- SetWindowLong(hwndValue, GWL_WNDPROC, (LONG)DwordEditSubclassProc);
+ oldproc = (WNDPROC)(LONG_PTR)GetWindowLongPtr(hwndValue, GWL_WNDPROC);
+ SetWindowLongPtr(hwndValue, GWL_USERDATA, (DWORD_PTR)oldproc);
+ SetWindowLongPtr(hwndValue, GWL_WNDPROC, (DWORD_PTR)DwordEditSubclassProc);
if(editValueName && _tcscmp(editValueName, _T("")))
{
}
else
{
- SetDlgItemText(hwndDlg, IDC_VALUE_NAME, _T("(Default)"));
+ TCHAR buffer[255];
+ LoadString(hInst, IDS_DEFAULT_VALUE_NAME, buffer, sizeof(buffer)/sizeof(TCHAR));
+ SetDlgItemText(hwndDlg, IDC_VALUE_NAME, buffer);
}
CheckRadioButton (hwndDlg, IDC_FORMAT_HEX, IDC_FORMAT_DEC, IDC_FORMAT_HEX);
_stprintf (ValueString, _T("%lx"), dwordValueData);
{
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);
return FALSE;
}
-BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName)
+
+INT_PTR CALLBACK modify_binary_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ HWND hwndValue;
+ UINT len;
+
+ switch(uMsg) {
+ case WM_INITDIALOG:
+ if(editValueName && _tcscmp(editValueName, _T("")))
+ {
+ SetDlgItemText(hwndDlg, IDC_VALUE_NAME, editValueName);
+ }
+ else
+ {
+ TCHAR buffer[255];
+ LoadString(hInst, IDS_DEFAULT_VALUE_NAME, buffer, sizeof(buffer)/sizeof(TCHAR));
+ SetDlgItemText(hwndDlg, IDC_VALUE_NAME, buffer);
+ }
+ hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_DATA);
+ HexEdit_LoadBuffer(hwndValue, binValueData, valueDataLen);
+ /* reset the hex edit control's font */
+ SendMessage(hwndValue, WM_SETFONT, 0, 0);
+ SetFocus(hwndValue);
+ return FALSE;
+ case WM_COMMAND:
+ switch (LOWORD(wParam))
+ {
+ case IDOK:
+ if ((hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_DATA)))
+ {
+ len = HexEdit_GetBufferSize(hwndValue);
+ if (len != valueDataLen && len > 0)
+ {
+ binValueData = HeapReAlloc(GetProcessHeap(), 0, binValueData, len);
+ }
+ if (len > 0)
+ {
+ HexEdit_CopyBuffer(hwndValue, binValueData, len);
+ }
+ valueDataLen = len;
+ }
+ EndDialog(hwndDlg, IDOK);
+ break;
+ case IDCANCEL:
+ EndDialog(hwndDlg, IDCANCEL);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+
+BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName, BOOL EditBin)
{
- DWORD valueDataLen;
DWORD type;
LONG lRet;
BOOL result = FALSE;
type = REG_SZ;
valueDataLen = 0;
stringValueData = NULL;
+ binValueData = NULL;
}
if (lRet != ERROR_SUCCESS)
goto done;
}
- if ((type == REG_SZ) || (type == REG_EXPAND_SZ))
+ if (EditBin == FALSE && ((type == REG_SZ) || (type == REG_EXPAND_SZ)))
{
if (valueDataLen > 0)
{
result = TRUE;
}
}
- else if (type == REG_MULTI_SZ)
+ else if (EditBin == FALSE && type == REG_MULTI_SZ)
{
if (valueDataLen > 0)
{
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);
}
result = TRUE;
}
}
- else if (type == REG_DWORD)
+ else if (EditBin == FALSE && type == REG_DWORD)
{
lRet = RegQueryValueEx(hKey, valueName, 0, 0, (LPBYTE)&dwordValueData, &valueDataLen);
if (lRet != ERROR_SUCCESS)
result = TRUE;
}
}
+ else if (EditBin == TRUE || type == REG_NONE || type == REG_BINARY)
+ {
+ #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, len_vname);
+ goto done;
+ }
+ /* convert the ansi value name to an unicode string */
+ MultiByteToWideChar(CP_ACP, 0, valueName, -1, u_valuename, len_vname + 1);
+ valueDataLen *= sizeof(WCHAR);
+ }
+ else
+ u_valuename = L"";
+ #endif
+ if(valueDataLen > 0)
+ {
+ if(!(binValueData = HeapAlloc(GetProcessHeap(), 0, valueDataLen)))
+ {
+ 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
+ u_valuename,
+ #else
+ valueName,
+ #endif
+ 0, 0, (LPBYTE)binValueData, &valueDataLen);
+ if (lRet != ERROR_SUCCESS)
+ {
+ HeapFree(GetProcessHeap(), 0, binValueData);
+ #ifndef UNICODE
+ if(len_vname > 0)
+ HeapFree(GetProcessHeap(), 0, u_valuename);
+ #endif
+ error(hwnd, IDS_BAD_VALUE, valueName);
+ goto done;
+ }
+ }
+ else
+ {
+ binValueData = NULL;
+ }
+
+ if (DialogBox(0, MAKEINTRESOURCE(IDD_EDIT_BIN_DATA), hwnd, modify_binary_dlgproc) == IDOK)
+ {
+ /* force to use the unicode version, so editing strings in binary mode is correct */
+ lRet = RegSetValueExW(hKey,
+ #ifndef UNICODE
+ u_valuename,
+ #else
+ valueName,
+ #endif
+ 0, type, (LPBYTE)binValueData, valueDataLen);
+ if (lRet == ERROR_SUCCESS)
+ result = TRUE;
+ }
+ if(binValueData != NULL)
+ HeapFree(GetProcessHeap(), 0, binValueData);
+ #ifndef UNICODE
+ if(len_vname > 0)
+ HeapFree(GetProcessHeap(), 0, u_valuename);
+ #endif
+ }
else
{
error(hwnd, IDS_UNSUPPORTED_TYPE, type);
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;
+}