[PATCH 1/2] regedit: Add support for REG_QWORD type.
Nikolay Sivov
wine at gitlab.winehq.org
Thu Jun 23 17:55:28 CDT 2022
From: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
programs/regedit/edit.c | 29 ++++++++++++++++++++++-------
programs/regedit/framewnd.c | 5 ++++-
programs/regedit/listview.c | 12 ++++++++++++
programs/regedit/regedit.rc | 5 +++++
programs/regedit/resource.h | 2 ++
5 files changed, 45 insertions(+), 8 deletions(-)
diff --git a/programs/regedit/edit.c b/programs/regedit/edit.c
index b808c38c51c..e18b6ca5846 100644
--- a/programs/regedit/edit.c
+++ b/programs/regedit/edit.c
@@ -86,17 +86,18 @@ static void WINAPIV error_code_messagebox(HWND hwnd, unsigned int msg_id, ...)
static BOOL change_dword_base(HWND hwndDlg, BOOL toHex)
{
WCHAR buf[128];
- DWORD val;
+ UINT64 val;
if (!GetDlgItemTextW(hwndDlg, IDC_VALUE_DATA, buf, ARRAY_SIZE(buf))) return FALSE;
- if (!swscanf(buf, toHex ? L"%u" : L"%x", &val)) return FALSE;
- wsprintfW(buf, toHex ? L"%x" : L"%u", val);
+ if (!swscanf(buf, toHex ? L"%I64u" : L"%I64x", &val)) return FALSE;
+ wsprintfW(buf, toHex ? L"%I64x" : L"%I64u", val);
return SetDlgItemTextW(hwndDlg, IDC_VALUE_DATA, buf);
}
static INT_PTR CALLBACK modify_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HWND hwndValue;
+ WCHAR buff[64];
int len;
switch(uMsg) {
@@ -105,6 +106,8 @@ static INT_PTR CALLBACK modify_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, L
SetDlgItemTextW(hwndDlg, IDC_VALUE_DATA, stringValueData);
CheckRadioButton(hwndDlg, IDC_DWORD_HEX, IDC_DWORD_DEC, IDC_DWORD_HEX);
isDecimal = FALSE;
+ if (lParam == REG_QWORD && LoadStringW(GetModuleHandleW(0), IDS_EDIT_QWORD, buff, ARRAY_SIZE(buff)))
+ SetWindowTextW(hwndDlg, buff);
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam)) {
@@ -291,6 +294,19 @@ BOOL ModifyValue(HWND hwnd, HKEY hKeyRoot, LPCWSTR keyPath, LPCWSTR valueName)
}
heap_free(valueA);
}
+ } else if ( type == REG_QWORD ) {
+ UINT64 value = *((UINT64 *)stringValueData);
+ stringValueData = heap_xrealloc(stringValueData, 64);
+ swprintf(stringValueData, 64, L"%I64x", value);
+ if (DialogBoxParamW(0, MAKEINTRESOURCEW(IDD_EDIT_DWORD), hwnd, modify_dlgproc, type) == IDOK)
+ {
+ if (swscanf(stringValueData, isDecimal ? L"%I64u" : L"%I64x", &value))
+ {
+ lRet = RegSetValueExW(hKey, valueName, 0, type, (BYTE *)&value, sizeof(value));
+ if (lRet == ERROR_SUCCESS) result = TRUE;
+ else error_code_messagebox(hwnd, IDS_SET_VALUE_FAILED);
+ }
+ }
} else if ( type == REG_MULTI_SZ ) {
WCHAR char1 = '\r', char2 = '\n';
WCHAR *tmpValueData = NULL;
@@ -426,7 +442,7 @@ BOOL CreateValue(HWND hwnd, HKEY hKeyRoot, LPCWSTR keyPath, DWORD valueType, LPW
{
LONG lRet = ERROR_SUCCESS;
WCHAR newValue[256];
- DWORD valueDword = 0;
+ UINT64 value = 0;
BOOL result = FALSE;
int valueNum, index;
HKEY hKey;
@@ -451,15 +467,14 @@ BOOL CreateValue(HWND hwnd, HKEY hKeyRoot, LPCWSTR keyPath, DWORD valueType, LPW
goto done;
}
- lRet = RegSetValueExW(hKey, valueName, 0, valueType, (BYTE*)&valueDword, sizeof(DWORD));
+ lRet = RegSetValueExW(hKey, valueName, 0, valueType, (BYTE *)&value, sizeof(value));
if (lRet) {
error_code_messagebox(hwnd, IDS_CREATE_VALUE_FAILED);
goto done;
}
/* Add the new item to the listview */
- index = AddEntryToList(g_pChildWnd->hListWnd, valueName, valueType,
- (BYTE *)&valueDword, sizeof(DWORD), -1);
+ index = AddEntryToList(g_pChildWnd->hListWnd, valueName, valueType, (BYTE *)&value, sizeof(value), -1);
item.state = LVIS_FOCUSED | LVIS_SELECTED;
item.stateMask = LVIS_FOCUSED | LVIS_SELECTED;
SendMessageW(g_pChildWnd->hListWnd, LVM_SETITEMSTATE, index, (LPARAM)&item);
diff --git a/programs/regedit/framewnd.c b/programs/regedit/framewnd.c
index 88f05420675..83e4ec89ee0 100644
--- a/programs/regedit/framewnd.c
+++ b/programs/regedit/framewnd.c
@@ -158,7 +158,7 @@ static void update_new_items_and_copy_keyname(HMENU hMenu, WCHAR *keyName)
{
unsigned int state = MF_ENABLED, i;
unsigned int items[] = {ID_EDIT_NEW_KEY, ID_EDIT_NEW_STRINGVALUE, ID_EDIT_NEW_BINARYVALUE,
- ID_EDIT_NEW_DWORDVALUE, ID_EDIT_NEW_MULTI_STRINGVALUE,
+ ID_EDIT_NEW_DWORDVALUE, ID_EDIT_NEW_QWORDVALUE, ID_EDIT_NEW_MULTI_STRINGVALUE,
ID_EDIT_NEW_EXPANDVALUE, ID_EDIT_COPYKEYNAME};
if (!keyName)
@@ -930,6 +930,9 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
goto create_value;
case ID_EDIT_NEW_DWORDVALUE:
valueType = REG_DWORD;
+ goto create_value;
+ case ID_EDIT_NEW_QWORDVALUE:
+ valueType = REG_QWORD;
/* fall through */
create_value:
{
diff --git a/programs/regedit/listview.c b/programs/regedit/listview.c
index 50157eb12ef..e314862ee6f 100644
--- a/programs/regedit/listview.c
+++ b/programs/regedit/listview.c
@@ -118,6 +118,14 @@ void format_value_data(HWND hwndLV, int index, DWORD type, void *data, DWORD siz
ListView_SetItemTextW(hwndLV, index, 2, buf);
break;
}
+ case REG_QWORD:
+ {
+ UINT64 value = *(UINT64 *)data;
+ WCHAR buf[64];
+ swprintf(buf, ARRAY_SIZE(buf), L"0x%08Ix (%Iu)", value, value);
+ ListView_SetItemTextW(hwndLV, index, 2, buf);
+ break;
+ }
case REG_MULTI_SZ:
MakeMULTISZDisplayable(data);
ListView_SetItemTextW(hwndLV, index, 2, data);
@@ -245,6 +253,7 @@ void OnGetDispInfo(NMLVDISPINFOW *plvdi)
reg_binaryT[] = L"REG_BINARY",
reg_dwordT[] = L"REG_DWORD",
reg_dword_big_endianT[] = L"REG_DWORD_BIG_ENDIAN",
+ reg_qwordT[] = L"REG_QWORD",
reg_multi_szT[] = L"REG_MULTI_SZ",
reg_linkT[] = L"REG_LINK",
reg_resource_listT[] = L"REG_RESOURCE_LIST",
@@ -275,6 +284,9 @@ void OnGetDispInfo(NMLVDISPINFOW *plvdi)
case REG_DWORD:
plvdi->item.pszText = reg_dwordT;
break;
+ case REG_QWORD:
+ plvdi->item.pszText = reg_qwordT;
+ break;
case REG_DWORD_BIG_ENDIAN:
plvdi->item.pszText = reg_dword_big_endianT;
break;
diff --git a/programs/regedit/regedit.rc b/programs/regedit/regedit.rc
index d7dd7c4b49e..1b0c15ecc94 100644
--- a/programs/regedit/regedit.rc
+++ b/programs/regedit/regedit.rc
@@ -48,6 +48,7 @@ BEGIN
MENUITEM "&String Value", ID_EDIT_NEW_STRINGVALUE
MENUITEM "&Binary Value", ID_EDIT_NEW_BINARYVALUE
MENUITEM "&DWORD Value", ID_EDIT_NEW_DWORDVALUE
+ MENUITEM "&QWORD Value", ID_EDIT_NEW_QWORDVALUE
MENUITEM "&Multi-String Value", ID_EDIT_NEW_MULTI_STRINGVALUE
MENUITEM "&Expandable String Value", ID_EDIT_NEW_EXPANDVALUE
END
@@ -100,6 +101,7 @@ BEGIN
MENUITEM "&String Value", ID_EDIT_NEW_STRINGVALUE
MENUITEM "&Binary Value", ID_EDIT_NEW_BINARYVALUE
MENUITEM "&DWORD Value", ID_EDIT_NEW_DWORDVALUE
+ MENUITEM "&QWORD Value", ID_EDIT_NEW_QWORDVALUE
MENUITEM "&Multi-String Value", ID_EDIT_NEW_MULTI_STRINGVALUE
MENUITEM "&Expandable String Value", ID_EDIT_NEW_EXPANDVALUE
END
@@ -122,6 +124,7 @@ BEGIN
MENUITEM "&String Value", ID_EDIT_NEW_STRINGVALUE
MENUITEM "&Binary Value", ID_EDIT_NEW_BINARYVALUE
MENUITEM "&DWORD Value", ID_EDIT_NEW_DWORDVALUE
+ MENUITEM "&QWORD Value", ID_EDIT_NEW_QWORDVALUE
MENUITEM "&Multi-String Value", ID_EDIT_NEW_MULTI_STRINGVALUE
MENUITEM "&Expandable String Value", ID_EDIT_NEW_EXPANDVALUE
END
@@ -171,6 +174,7 @@ BEGIN
ID_EDIT_NEW_STRINGVALUE "Adds a new string value"
ID_EDIT_NEW_BINARYVALUE "Adds a new binary value"
ID_EDIT_NEW_DWORDVALUE "Adds a new 32-bit value"
+ ID_EDIT_NEW_QWORDVALUE "Adds a new 64-bit value"
ID_EDIT_NEW_MULTI_STRINGVALUE "Adds a new multi-string value"
ID_EDIT_NEW_EXPANDVALUE "Adds a new expandable string value"
ID_REGISTRY_IMPORTREGISTRYFILE "Imports a text file into the registry"
@@ -213,6 +217,7 @@ BEGIN
IDS_NEWKEY "New Key #%d"
IDS_NEWVALUE "New Value #%d"
IDS_NOTFOUND "Search complete. The string '%1' was not found."
+ IDS_EDIT_QWORD "Edit QWORD"
END
STRINGTABLE
diff --git a/programs/regedit/resource.h b/programs/regedit/resource.h
index 2bcdd39ad4f..c61b2fa048d 100644
--- a/programs/regedit/resource.h
+++ b/programs/regedit/resource.h
@@ -146,6 +146,8 @@
#define IDS_COLLAPSE 33107
#define IDS_EDIT_MODIFY 33108
#define IDS_EDIT_MODIFY_BIN 33109
+#define ID_EDIT_NEW_QWORDVALUE 33110
+#define IDS_EDIT_QWORD 33111
#define IDD_EDIT_STRING 2000
#define IDC_VALUE_NAME 2001
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/305
More information about the wine-devel
mailing list