[PATCH 2/5] kernelbase: Do not map HKEY_PERFORMANCE_DATA to \Registry\PerfData.

Zebediah Figura zfigura at codeweavers.com
Tue Aug 10 23:38:23 CDT 2021


Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
 dlls/advapi32/tests/registry.c | 23 +++++++++--------------
 dlls/kernelbase/registry.c     | 31 +++++++++++++++++++------------
 2 files changed, 28 insertions(+), 26 deletions(-)

diff --git a/dlls/advapi32/tests/registry.c b/dlls/advapi32/tests/registry.c
index 85fb757792a..e1ad31f70fd 100644
--- a/dlls/advapi32/tests/registry.c
+++ b/dlls/advapi32/tests/registry.c
@@ -3902,26 +3902,21 @@ static void test_performance_keys(void)
         todo_wine ok(ret == ERROR_INVALID_HANDLE, "got %u\n", ret);
 
         ret = RegOpenKeyA(keys[i], "Global", &key);
-        todo_wine_if (keys[i] == HKEY_PERFORMANCE_DATA)
-            ok(ret == ERROR_INVALID_HANDLE, "got %u\n", ret);
+        ok(ret == ERROR_INVALID_HANDLE, "got %u\n", ret);
 
         ret = RegOpenKeyExA(keys[i], "Global", 0, KEY_READ, &key);
-        todo_wine_if (keys[i] == HKEY_PERFORMANCE_DATA)
-            ok(ret == ERROR_INVALID_HANDLE, "got %u\n", ret);
+        ok(ret == ERROR_INVALID_HANDLE, "got %u\n", ret);
 
         size = 0;
         ret = RegQueryValueA(keys[i], "Global", NULL, (LONG *)&size);
-        todo_wine_if (keys[i] == HKEY_PERFORMANCE_DATA)
-            ok(ret == ERROR_INVALID_HANDLE, "got %u\n", ret);
+        ok(ret == ERROR_INVALID_HANDLE, "got %u\n", ret);
 
         ret = RegSetValueA(keys[i], "Global", REG_SZ, "dummy", 5);
-        todo_wine_if (keys[i] == HKEY_PERFORMANCE_DATA)
-            ok(ret == ERROR_INVALID_HANDLE, "got %u\n", ret);
+        ok(ret == ERROR_INVALID_HANDLE, "got %u\n", ret);
 
         ret = RegQueryInfoKeyA(keys[i], NULL, NULL, NULL, &key_count, NULL,
                 NULL, &value_count, NULL, NULL, NULL, NULL);
-        todo_wine_if (keys[i] != HKEY_PERFORMANCE_DATA)
-            ok(!ret, "got %u\n", ret);
+        todo_wine ok(!ret, "got %u\n", ret);
         todo_wine ok(!key_count, "got %u subkeys\n", key_count);
         todo_wine ok(value_count == 2, "got %u values\n", value_count);
 
@@ -3940,7 +3935,7 @@ static void test_performance_keys(void)
     }
 
     ret = RegSetValueExA(HKEY_PERFORMANCE_DATA, "Global", 0, REG_SZ, (const BYTE *)"dummy", 5);
-    todo_wine ok(ret == ERROR_INVALID_HANDLE, "got %u\n", ret);
+    ok(ret == ERROR_INVALID_HANDLE, "got %u\n", ret);
 
     ret = RegSetValueExA(HKEY_PERFORMANCE_TEXT, "Global", 0, REG_SZ, (const BYTE *)"dummy", 5);
     todo_wine ok(ret == ERROR_BADKEY, "got %u\n", ret);
@@ -3951,7 +3946,7 @@ static void test_performance_keys(void)
     if (pRegSetKeyValueW)
     {
         ret = pRegSetKeyValueW(HKEY_PERFORMANCE_DATA, NULL, L"Global", REG_SZ, L"dummy", 10);
-        todo_wine ok(ret == ERROR_INVALID_HANDLE, "got %u\n", ret);
+        ok(ret == ERROR_INVALID_HANDLE, "got %u\n", ret);
 
         ret = pRegSetKeyValueW(HKEY_PERFORMANCE_TEXT, NULL, L"Global", REG_SZ, L"dummy", 10);
         todo_wine ok(ret == ERROR_BADKEY, "got %u\n", ret);
@@ -3961,7 +3956,7 @@ static void test_performance_keys(void)
     }
 
     ret = RegEnumKeyA(HKEY_PERFORMANCE_DATA, 0, buffer, buffer_size);
-    todo_wine ok(ret == ERROR_INVALID_HANDLE, "got %u\n", ret);
+    ok(ret == ERROR_INVALID_HANDLE, "got %u\n", ret);
 
     ret = RegEnumKeyA(HKEY_PERFORMANCE_TEXT, 0, buffer, buffer_size);
     todo_wine ok(ret == ERROR_NO_MORE_ITEMS, "got %u\n", ret);
@@ -4100,7 +4095,7 @@ static void test_perflib_key(void)
     RtlInitUnicodeString(&string, L"\\Registry\\PerfData");
     InitializeObjectAttributes(&attr, &string, OBJ_CASE_INSENSITIVE, NULL, NULL);
     ret = NtOpenKey((HANDLE *)&key, KEY_READ, &attr);
-    todo_wine ok(ret == STATUS_OBJECT_NAME_NOT_FOUND, "got %#x\n", ret);
+    ok(ret == STATUS_OBJECT_NAME_NOT_FOUND, "got %#x\n", ret);
 
     free(buffer);
 }
diff --git a/dlls/kernelbase/registry.c b/dlls/kernelbase/registry.c
index d9d62e81b31..3a551ecbec5 100644
--- a/dlls/kernelbase/registry.c
+++ b/dlls/kernelbase/registry.c
@@ -56,7 +56,7 @@ static const WCHAR * const root_key_names[] =
     NULL,         /* HKEY_CURRENT_USER is determined dynamically */
     L"\\Registry\\Machine",
     L"\\Registry\\User",
-    L"\\Registry\\PerfData",
+    NULL,         /* HKEY_PERFORMANCE_DATA is not a real key */
     L"\\Registry\\Machine\\System\\CurrentControlSet\\Hardware Profiles\\Current",
     L"\\Registry\\DynData"
 };
@@ -330,21 +330,28 @@ static HKEY create_special_root_hkey( HKEY hkey, DWORD access )
 /* map the hkey from special root to normal key if necessary */
 static inline HKEY get_special_root_hkey( HKEY hkey, REGSAM access )
 {
-    HKEY ret = hkey;
+    unsigned int index = HandleToUlong(hkey) - HandleToUlong(HKEY_SPECIAL_ROOT_FIRST);
+    DWORD wow64_flags = access & (KEY_WOW64_32KEY | KEY_WOW64_64KEY);
 
-    if ((HandleToUlong(hkey) >= HandleToUlong(HKEY_SPECIAL_ROOT_FIRST))
-            && (HandleToUlong(hkey) <= HandleToUlong(HKEY_SPECIAL_ROOT_LAST)))
+    switch (HandleToUlong(hkey))
     {
-        REGSAM mask = 0;
+        case (LONG)(LONG_PTR)HKEY_CLASSES_ROOT:
+            if (wow64_flags)
+                return create_special_root_hkey( hkey, MAXIMUM_ALLOWED | wow64_flags );
+            /* fall through */
 
-        if (HandleToUlong(hkey) == HandleToUlong(HKEY_CLASSES_ROOT))
-            mask = KEY_WOW64_32KEY | KEY_WOW64_64KEY;
+        case (LONG)(LONG_PTR)HKEY_CURRENT_USER:
+        case (LONG)(LONG_PTR)HKEY_LOCAL_MACHINE:
+        case (LONG)(LONG_PTR)HKEY_USERS:
+        case (LONG)(LONG_PTR)HKEY_CURRENT_CONFIG:
+        case (LONG)(LONG_PTR)HKEY_DYN_DATA:
+            if (special_root_keys[index])
+                return special_root_keys[index];
+            return create_special_root_hkey( hkey, MAXIMUM_ALLOWED );
 
-        if ((access & mask) ||
-                !(ret = special_root_keys[HandleToUlong(hkey) - HandleToUlong(HKEY_SPECIAL_ROOT_FIRST)]))
-            ret = create_special_root_hkey( hkey, MAXIMUM_ALLOWED | (access & mask) );
+        default:
+            return hkey;
     }
-    return ret;
 }
 
 
@@ -1565,7 +1572,7 @@ LSTATUS WINAPI DECLSPEC_HOTPATCH RegQueryValueExA( HKEY hkey, LPCSTR name, LPDWO
           hkey, debugstr_a(name), reserved, type, data, count, count ? *count : 0 );
 
     if ((data && !count) || reserved) return ERROR_INVALID_PARAMETER;
-    if (hkey != HKEY_PERFORMANCE_DATA && !(hkey = get_special_root_hkey( hkey, 0 )))
+    if (!(hkey = get_special_root_hkey( hkey, 0 )))
         return ERROR_INVALID_HANDLE;
 
     if (count) datalen = *count;
-- 
2.30.2




More information about the wine-devel mailing list