[PATCH v2 1/1] reg: Add REG_QWORD support to 'add'.

Nikolay Sivov wine at gitlab.winehq.org
Fri Jun 24 09:23:04 CDT 2022


From: Nikolay Sivov <nsivov at codeweavers.com>

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 programs/reg/add.c       | 16 +++++++
 programs/reg/reg.c       |  1 +
 programs/reg/reg.h       |  2 +-
 programs/reg/reg.rc      |  2 +-
 programs/reg/tests/add.c | 95 ++++++++++++++++++++++++++++++++++++++++
 5 files changed, 114 insertions(+), 2 deletions(-)

diff --git a/programs/reg/add.c b/programs/reg/add.c
index 269fa30e5e1..e0cd0373339 100644
--- a/programs/reg/add.c
+++ b/programs/reg/add.c
@@ -84,6 +84,22 @@ static BOOL get_regdata(const WCHAR *data, DWORD reg_type, WCHAR separator,
             *(DWORD *)*data_bytes = val;
             break;
         }
+        case REG_QWORD:
+        {
+            WCHAR *rest;
+            UINT64 val;
+
+            val = _wcstoui64(data, &rest, (towlower(data[1]) == 'x') ? 16 : 10);
+            if (*rest || (val == ~0ull && errno == ERANGE))
+            {
+                output_message(STRING_MISSING_NUMBER);
+                return FALSE;
+            }
+            *size_bytes = sizeof(val);
+            *data_bytes = malloc(*size_bytes);
+            *(UINT64 *)*data_bytes = val;
+            break;
+        }
         case REG_BINARY:
         {
             BYTE hex0, hex1, *ptr;
diff --git a/programs/reg/reg.c b/programs/reg/reg.c
index 4fd374579e9..5753b99bdf4 100644
--- a/programs/reg/reg.c
+++ b/programs/reg/reg.c
@@ -46,6 +46,7 @@ const struct reg_type_rels type_rels[] =
     {REG_DWORD,               L"REG_DWORD"},
     {REG_DWORD_LITTLE_ENDIAN, L"REG_DWORD_LITTLE_ENDIAN"},
     {REG_DWORD_BIG_ENDIAN,    L"REG_DWORD_BIG_ENDIAN"},
+    {REG_QWORD,               L"REG_QWORD"},
     {REG_MULTI_SZ,            L"REG_MULTI_SZ"},
 };
 
diff --git a/programs/reg/reg.h b/programs/reg/reg.h
index 67b49b7797f..4ac54dcecaf 100644
--- a/programs/reg/reg.h
+++ b/programs/reg/reg.h
@@ -31,7 +31,7 @@ struct reg_type_rels {
     const WCHAR *name;
 };
 
-extern const struct reg_type_rels type_rels[8];
+extern const struct reg_type_rels type_rels[9];
 
 void output_writeconsole(const WCHAR *str, DWORD wlen);
 void WINAPIV output_message(unsigned int id, ...);
diff --git a/programs/reg/reg.rc b/programs/reg/reg.rc
index a3c53cf41b4..45acb993add 100644
--- a/programs/reg/reg.rc
+++ b/programs/reg/reg.rc
@@ -55,7 +55,7 @@ STRINGTABLE
 \     The type of data to add to the registry. If [/t] is specified,\n\
 \     <type> must be one of the following:\n\n\
 \         REG_SZ    | REG_MULTI_SZ | REG_EXPAND_SZ\n\
-\         REG_DWORD | REG_BINARY   | REG_NONE\n\n\
+\         REG_DWORD | REG_QWORD    | REG_BINARY   | REG_NONE\n\n\
 \     If [/t] is not specified, the default data type is REG_SZ.\n\n\
 \  /s <separator>\n\
 \     The character used to separate strings in REG_MULTI_SZ data.\n\
diff --git a/programs/reg/tests/add.c b/programs/reg/tests/add.c
index 0d213414443..ae9c79b07ec 100644
--- a/programs/reg/tests/add.c
+++ b/programs/reg/tests/add.c
@@ -764,6 +764,100 @@ static void test_reg_dword_big_endian(void)
     delete_key(HKEY_CURRENT_USER, KEY_BASE, 0);
 }
 
+static void test_reg_qword(void)
+{
+    UINT64 qword;
+    HKEY hkey;
+    DWORD r;
+
+    add_key(HKEY_CURRENT_USER, KEY_BASE, 0, &hkey);
+
+    run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_QWORD /f /d 0x123456789abcdef", &r);
+    ok(r == REG_EXIT_SUCCESS, "Unexpected exit code %ld.\n", r);
+    qword = 0x123456789abcdef;
+    verify_reg(hkey, "", REG_QWORD, &qword, sizeof(qword), 0);
+
+    run_reg_exe("reg add HKCU\\" KEY_BASE " /ve /t REG_QWORD /f", &r);
+    ok(r == REG_EXIT_SUCCESS, "Unexpected exit code %ld.\n", r);
+    qword = 0;
+    verify_reg(hkey, "", REG_QWORD, &qword, sizeof(qword), 0);
+
+    run_reg_exe("reg add HKCU\\" KEY_BASE " /v qword0 /t REG_QWORD /f /d", &r);
+    ok(r == REG_EXIT_FAILURE, "Unexpected exit code %lu.\n", r);
+
+    run_reg_exe("reg add HKCU\\" KEY_BASE " /v qword1 /t REG_QWORD /f", &r);
+    ok(r == REG_EXIT_SUCCESS, "Unexpected exit code %ld.\n", r);
+    qword = 0;
+    verify_reg(hkey, "qword1", REG_QWORD, &qword, sizeof(qword), 0);
+
+    run_reg_exe("reg add HKCU\\" KEY_BASE " /v qword2 /t REG_QWORD /d zzz /f", &r);
+    ok(r == REG_EXIT_FAILURE, "Unexpected exit code %lu.\n", r);
+
+    run_reg_exe("reg add HKCU\\" KEY_BASE " /v qword3 /t REG_QWORD /d deadbeef /f", &r);
+    ok(r == REG_EXIT_FAILURE, "Unexpected exit code %lu.\n", r);
+
+    run_reg_exe("reg add HKCU\\" KEY_BASE " /v qword4 /t REG_QWORD /d 123xyz /f", &r);
+    ok(r == REG_EXIT_FAILURE, "Unexpected exit code %lu.\n", r);
+
+    run_reg_exe("reg add HKCU\\" KEY_BASE " /v qword5 /t reg_qword /d 12345678 /f", &r);
+    ok(r == REG_EXIT_SUCCESS, "Unexpected exit code %ld.\n", r);
+    qword = 12345678;
+    verify_reg(hkey, "qword5", REG_QWORD, &qword, sizeof(qword), 0);
+
+    run_reg_exe("reg add HKCU\\" KEY_BASE " /v qword6 /t REG_QWORD /D 0123 /f", &r);
+    ok(r == REG_EXIT_SUCCESS, "Unexpected exit code %ld.\n", r);
+    qword = 123;
+    verify_reg(hkey, "qword6", REG_QWORD, &qword, sizeof(qword), 0);
+
+    run_reg_exe("reg add HKCU\\" KEY_BASE " /v qword7 /t reg_qword /d 0xabcdefg /f", &r);
+    ok(r == REG_EXIT_FAILURE, "got exit code %ld, expected 1\n", r);
+
+    run_reg_exe("reg add HKCU\\" KEY_BASE " /v qword8 /t REG_qword /d 0xdeadbeef /f", &r);
+    ok(r == REG_EXIT_SUCCESS, "got exit code %ld, expected 0\n", r);
+    qword = 0xdeadbeef;
+    verify_reg(hkey, "qword8", REG_QWORD, &qword, sizeof(qword), 0);
+
+    run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_QWORD /v qword9 /f /d -1", &r);
+    ok(r == REG_EXIT_SUCCESS, "got exit code %ld, expected 0\n", r);
+    qword = ~0ull;
+    verify_reg(hkey, "qword9", REG_QWORD, &qword, sizeof(qword), 0);
+
+    run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_QWORD /v qword10 /f /d -0x1", &r);
+    ok(r == REG_EXIT_FAILURE, "got exit code %lu, expected 1\n", r);
+
+    run_reg_exe("reg add HKCU\\" KEY_BASE " /v qword11 /t REG_qword /d 0x01ffffffffffffffff /f", &r);
+    ok(r == REG_EXIT_FAILURE, "got exit code %ld, expected 1\n", r);
+
+    run_reg_exe("reg add HKCU\\" KEY_BASE " /v qword12 /t REG_QWORD /d 0xffffffffffffffff /f", &r);
+    ok(r == REG_EXIT_SUCCESS, "got exit code %ld, expected 0\n", r);
+    qword = ~0ull;
+    verify_reg(hkey, "qword12", REG_QWORD, &qword, sizeof(qword), 0);
+
+    run_reg_exe("reg add HKCU\\" KEY_BASE " /v qword13 /t REG_QWORD /d 00x123 /f", &r);
+    ok(r == REG_EXIT_FAILURE, "got exit code %ld, expected 1\n", r);
+
+    run_reg_exe("reg add HKCU\\" KEY_BASE " /v qword14 /t REG_QWORD /d 0X123 /f", &r);
+    ok(r == REG_EXIT_SUCCESS, "got exit code %ld, expected 0\n", r);
+    qword = 0x123;
+    verify_reg(hkey, "qword14", REG_QWORD, &qword, sizeof(qword), 0);
+
+    run_reg_exe("reg add HKCU\\" KEY_BASE " /v qword15 /t REG_QWORD /d 18446744073709551616 /f", &r);
+    ok(r == REG_EXIT_FAILURE, "got exit code %lu, expected 1\n", r);
+
+    run_reg_exe("reg add HKCU\\" KEY_BASE " /v qword16 /t REG_QWORD /d 456 /f", &r);
+    ok(r == REG_EXIT_SUCCESS, "got exit code %ld, expected 0\n", r);
+    qword = 456;
+    verify_reg(hkey, "qword16", REG_QWORD, &qword, sizeof(qword), 0);
+
+    run_reg_exe("reg add HKCU\\" KEY_BASE " /v qword17 /t REG_QWORD /d 0x456 /f", &r);
+    ok(r == REG_EXIT_SUCCESS, "got exit code %ld, expected 0\n", r);
+    qword = 0x456;
+    verify_reg(hkey, "qword17", REG_QWORD, &qword, sizeof(qword), 0);
+
+    close_key(hkey);
+    delete_key(HKEY_CURRENT_USER, KEY_BASE, 0);
+}
+
 static void test_reg_multi_sz(void)
 {
     HKEY hkey;
@@ -988,6 +1082,7 @@ START_TEST(add)
     test_reg_binary();
     test_reg_dword();
     test_reg_dword_big_endian();
+    test_reg_qword();
     test_reg_multi_sz();
 
     /* Check if reg.exe is running with elevated privileges */
-- 
GitLab

https://gitlab.winehq.org/wine/wine/-/merge_requests/306



More information about the wine-devel mailing list