[PATCH] reg/tests: Test key and value creation in 32-bit and 64-bit registry views

Hugh McMaster hugh.mcmaster at outlook.com
Thu Jun 17 08:34:03 CDT 2021


Signed-off-by: Hugh McMaster <hugh.mcmaster at outlook.com>
---
 programs/reg/tests/add.c      | 133 ++++++++++++++++++++++++++++++++++
 programs/reg/tests/import.c   |  39 ++++++----
 programs/reg/tests/reg_test.h |   2 +
 3 files changed, 159 insertions(+), 15 deletions(-)

diff --git a/programs/reg/tests/add.c b/programs/reg/tests/add.c
index 384eb9012c7..264693ab349 100644
--- a/programs/reg/tests/add.c
+++ b/programs/reg/tests/add.c
@@ -274,6 +274,16 @@ static void test_command_syntax(void)
     /* Test empty type */
     run_reg_exe("reg add HKCU\\" KEY_BASE " /v emptyType /t \"\" /d WineTest /f", &r);
     ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
+
+    /* Test registry view */
+    run_reg_exe("reg add HKCU\\" KEY_BASE " /v abc /d 123 /f /reg:32 /reg:32", &r);
+    todo_wine ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
+
+    run_reg_exe("reg add HKCU\\" KEY_BASE " /v abc /d 123 /f /reg:32 /reg:64", &r);
+    todo_wine ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
+
+    run_reg_exe("reg add HKCU\\" KEY_BASE " /v abc /d 123 /f /reg:64 /reg:64", &r);
+    todo_wine ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
 }
 
 static void test_key_formats(void)
@@ -849,6 +859,117 @@ static void test_reg_multi_sz(void)
     delete_key(HKEY_CURRENT_USER, KEY_BASE, 0);
 }
 
+static void test_registry_view_win32(void)
+{
+    HKEY hkey;
+    DWORD r;
+    BOOL is_wow64, is_win32;
+
+    IsWow64Process(GetCurrentProcess(), &is_wow64);
+    is_win32 = !is_wow64 && (sizeof(void *) == sizeof(int));
+
+    if (!is_win32) return;
+
+    /* Try adding to the 32-bit registry view (32-bit Windows) */
+    run_reg_exe("reg add HKLM\\" KEY_BASE " /v Wine32 /d Test /f /reg:32", &r);
+    ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
+
+    open_key(HKEY_LOCAL_MACHINE, KEY_BASE, KEY_WOW64_32KEY, &hkey);
+    verify_reg(hkey, "Wine32", REG_SZ, "Test", 5, 0);
+    close_key(hkey);
+
+    open_key(HKEY_LOCAL_MACHINE, KEY_BASE, KEY_WOW64_64KEY, &hkey);
+    verify_reg(hkey, "Wine32", REG_SZ, "Test", 5, 0);
+    close_key(hkey);
+
+    delete_key(HKEY_LOCAL_MACHINE, KEY_BASE, 0);
+
+    /* Try adding to the 64-bit registry view, which doesn't exist on 32-bit Windows */
+    run_reg_exe("reg add HKLM\\" KEY_BASE " /v Wine64 /d Test /f /reg:64", &r);
+    ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
+
+    open_key(HKEY_LOCAL_MACHINE, KEY_BASE, KEY_WOW64_64KEY, &hkey);
+    verify_reg(hkey, "Wine64", REG_SZ, "Test", 5, 0);
+    close_key(hkey);
+
+    open_key(HKEY_LOCAL_MACHINE, KEY_BASE, KEY_WOW64_32KEY, &hkey);
+    verify_reg(hkey, "Wine64", REG_SZ, "Test", 5, 0);
+    close_key(hkey);
+
+    delete_key(HKEY_LOCAL_MACHINE, KEY_BASE, 0);
+}
+
+static void test_registry_view_win64(void)
+{
+    HKEY hkey;
+    DWORD r;
+    BOOL is_wow64, is_win64;
+
+    IsWow64Process(GetCurrentProcess(), &is_wow64);
+    is_win64 = !is_wow64 && (sizeof(void *) > sizeof(int));
+
+    if (!is_win64) return;
+
+    /* Try adding to the 32-bit registry view (64-bit Windows) */
+    run_reg_exe("reg add HKLM\\" KEY_BASE " /v Wine32 /d Test /f /reg:32", &r);
+    ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
+
+    todo_wine open_key(HKEY_LOCAL_MACHINE, KEY_BASE, KEY_WOW64_32KEY, &hkey);
+    todo_wine verify_reg(hkey, "Wine32", REG_SZ, "Test", 5, 0);
+    todo_wine close_key(hkey);
+    todo_wine delete_key(HKEY_LOCAL_MACHINE, KEY_BASE, KEY_WOW64_32KEY);
+
+    todo_wine verify_key_nonexist(HKEY_LOCAL_MACHINE, KEY_BASE, KEY_WOW64_64KEY);
+
+    /* Try adding to the 64-bit registry view (64-bit Windows) */
+    run_reg_exe("reg add HKLM\\" KEY_BASE " /v Wine64 /d Test /f /reg:64", &r);
+    ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
+
+    open_key(HKEY_LOCAL_MACHINE, KEY_BASE, KEY_WOW64_64KEY, &hkey);
+    verify_reg(hkey, "Wine64", REG_SZ, "Test", 5, 0);
+    close_key(hkey);
+    delete_key(HKEY_LOCAL_MACHINE, KEY_BASE, KEY_WOW64_64KEY);
+
+    verify_key_nonexist(HKEY_LOCAL_MACHINE, KEY_BASE, KEY_WOW64_32KEY);
+}
+
+static void test_registry_view_wow64(void)
+{
+    HKEY hkey;
+    DWORD r;
+    BOOL is_wow64;
+
+    IsWow64Process(GetCurrentProcess(), &is_wow64);
+
+    if (!is_wow64) return;
+
+    /* Try adding to the 32-bit registry view (WOW64) */
+    run_reg_exe("reg add HKLM\\" KEY_BASE " /v Wine32 /d Test /f /reg:32", &r);
+    ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
+
+    open_key(HKEY_LOCAL_MACHINE, KEY_BASE, KEY_WOW64_32KEY, &hkey);
+    verify_reg(hkey, "Wine32", REG_SZ, "Test", 5, 0);
+    close_key(hkey);
+    delete_key(HKEY_LOCAL_MACHINE, KEY_BASE, KEY_WOW64_32KEY);
+
+    verify_key_nonexist(HKEY_LOCAL_MACHINE, KEY_BASE, KEY_WOW64_64KEY);
+
+    /* Try adding to the 64-bit registry view (WOW64) */
+    run_reg_exe("reg add HKLM\\" KEY_BASE " /v Wine64 /d Test /f /reg:64", &r);
+    ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
+
+    todo_wine open_key(HKEY_LOCAL_MACHINE, KEY_BASE, KEY_WOW64_64KEY, &hkey);
+    todo_wine verify_reg(hkey, "Wine64", REG_SZ, "Test", 5, 0);
+    todo_wine close_key(hkey);
+
+    todo_wine open_key(HKEY_LOCAL_MACHINE, KEY_BASE, KEY_WOW64_64KEY, &hkey);
+    todo_wine verify_reg(hkey, "Wine64", REG_SZ, "Test", 5, 0);
+    todo_wine close_key(hkey);
+    todo_wine delete_key(HKEY_LOCAL_MACHINE, KEY_BASE, KEY_WOW64_64KEY);
+
+    todo_wine verify_key_nonexist(HKEY_LOCAL_MACHINE, KEY_BASE, KEY_WOW64_32KEY);
+}
+
 START_TEST(add)
 {
     DWORD r;
@@ -868,4 +989,16 @@ START_TEST(add)
     test_reg_dword();
     test_reg_dword_big_endian();
     test_reg_multi_sz();
+
+    /* Check if reg.exe is running with elevated privileges */
+    if (!is_elevated_process())
+    {
+        win_skip("reg.exe is not running with elevated privileges; "
+                 "skipping registry view tests\n");
+        return;
+    }
+
+    test_registry_view_win32();
+    test_registry_view_win64();
+    test_registry_view_wow64();
 }
diff --git a/programs/reg/tests/import.c b/programs/reg/tests/import.c
index c8a6b079a6a..2d8ece8990b 100644
--- a/programs/reg/tests/import.c
+++ b/programs/reg/tests/import.c
@@ -18,6 +18,29 @@
 
 #include "reg_test.h"
 
+BOOL is_elevated_process(void)
+{
+    LONG err;
+    HKEY hkey;
+
+    err = RegDeleteKeyA(HKEY_CLASSES_ROOT, KEY_BASE);
+
+    if (err == ERROR_ACCESS_DENIED)
+        return FALSE;
+
+    if (err == ERROR_FILE_NOT_FOUND)
+    {
+        if (RegCreateKeyExA(HKEY_CLASSES_ROOT, KEY_BASE, 0, NULL, REG_OPTION_NON_VOLATILE,
+                            KEY_READ, NULL, &hkey, NULL))
+            return FALSE;
+
+        RegCloseKey(hkey);
+        RegDeleteKeyA(HKEY_CLASSES_ROOT, KEY_BASE);
+    }
+
+    return TRUE;
+}
+
 static BOOL write_file(const void *str, DWORD size)
 {
     HANDLE file;
@@ -3466,30 +3489,16 @@ static void test_unicode_import_with_whitespace(void)
 
 static void test_import_win31(void)
 {
-    LONG err;
     HKEY hkey;
     DWORD r;
 
     /* Check if reg.exe is running with elevated privileges */
-    err = RegDeleteKeyA(HKEY_CLASSES_ROOT, KEY_BASE);
-    if (err == ERROR_ACCESS_DENIED)
+    if (!is_elevated_process())
     {
         win_skip("reg.exe is not running with elevated privileges; "
                  "skipping Windows 3.1 import tests\n");
         return;
     }
-    if (err == ERROR_FILE_NOT_FOUND)
-    {
-        if (RegCreateKeyExA(HKEY_CLASSES_ROOT, KEY_BASE, 0, NULL, REG_OPTION_NON_VOLATILE,
-                          KEY_READ, NULL, &hkey, NULL))
-        {
-            win_skip("reg.exe is not running with elevated privileges; "
-                     "skipping Windows 3.1 import tests\n");
-            return;
-        }
-        RegCloseKey(hkey);
-        RegDeleteKeyA(HKEY_CLASSES_ROOT, KEY_BASE);
-    }
 
     /* Test simple value */
     test_import_str("REGEDIT\r\n"
diff --git a/programs/reg/tests/reg_test.h b/programs/reg/tests/reg_test.h
index db525619978..fdc747af1e9 100644
--- a/programs/reg/tests/reg_test.h
+++ b/programs/reg/tests/reg_test.h
@@ -90,6 +90,8 @@ extern const char *embedded_null_test;
 extern const char *escaped_null_test;
 
 /* import.c */
+BOOL is_elevated_process(void);
+
 #define test_import_str(c,r) import_reg(__FILE__,__LINE__,c,FALSE,r)
 #define test_import_wstr(c,r) import_reg(__FILE__,__LINE__,c,TRUE,r)
 BOOL import_reg(const char *file, unsigned line, const char *contents, BOOL unicode, DWORD *rc);
-- 
2.32.0




More information about the wine-devel mailing list