diff --git a/dlls/advapi32/tests/registry.c b/dlls/advapi32/tests/registry.c index 505d5ad30e..d4beb17158 100644 --- a/dlls/advapi32/tests/registry.c +++ b/dlls/advapi32/tests/registry.c @@ -1914,7 +1914,7 @@ static void test_redirection(void) static void test_classesroot(void) { - HKEY hkey, hkcr; + HKEY hkey, hklm, hkcr; DWORD size = 8; DWORD type = REG_SZ; static CHAR buffer[8]; @@ -1963,8 +1963,91 @@ static void test_classesroot(void) /* cleanup */ delete_key( hkey ); + delete_key( hkcr ); RegCloseKey( hkey ); RegCloseKey( hkcr ); + + /* create a key in the hklm classes */ + if (!RegOpenKeyA( HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls", &hklm )) + { + delete_key( hklm ); + RegCloseKey( hklm ); + } + res = RegCreateKeyExA( HKEY_LOCAL_MACHINE, "Software\\Classes\\WineTestCls", 0, NULL, REG_OPTION_NON_VOLATILE, + KEY_ALL_ACCESS, NULL, &hklm, NULL ); + if (res == ERROR_ACCESS_DENIED) + { + skip("not enough privileges to add a system class\n"); + return; + } + + /* try to open that key in hkcr */ + res = RegOpenKeyExA( HKEY_CLASSES_ROOT, "WineTestCls", 0, + KEY_QUERY_VALUE|KEY_SET_VALUE, &hkcr ); + ok(res == ERROR_SUCCESS, + "test key not found in hkcr: %d\n", res); + if (res) + { + delete_key( hklm ); + RegCloseKey( hklm ); + return; + } + + /* set a value in hklm classes */ + res = RegSetValueExA(hklm, "val2", 0, REG_SZ, (const BYTE *)"hklm", sizeof("user")); + ok(res == ERROR_SUCCESS, "RegSetValueExA failed: %d, GLE=%x\n", res, GetLastError()); + + /* try to find the value in hkcr */ + res = RegQueryValueExA(hkcr, "val2", NULL, &type, (LPBYTE)buffer, &size); + ok(res == ERROR_SUCCESS, "RegQueryValueExA failed: %d\n", res); + ok(!strcmp( buffer, "hklm" ), "value set to '%s'\n", buffer ); + + /* modify the value in hkcr */ + res = RegSetValueExA(hkcr, "val2", 0, REG_SZ, (const BYTE *)"hkcr", sizeof("hkcr")); + ok(res == ERROR_SUCCESS, "RegSetValueExA failed: %d\n", res); + + /* check that the value is not modified in hklm classes */ + res = RegQueryValueExA(hklm, "val2", NULL, &type, (LPBYTE)buffer, &size); + ok(res == ERROR_SUCCESS, "RegQueryValueExA failed: %d, GLE=%x\n", res, GetLastError()); + ok(!strcmp( buffer, "hklm" ), "value set to '%s'\n", buffer ); + + if (RegCreateKeyExA( HKEY_CURRENT_USER, "Software\\Classes\\WineTestCls", 0, NULL, 0, + KEY_QUERY_VALUE|KEY_SET_VALUE, NULL, &hkey, NULL )) return; + + /* try to open that key in hkcr */ + res = RegOpenKeyExA( HKEY_CLASSES_ROOT, "WineTestCls", 0, + KEY_QUERY_VALUE|KEY_SET_VALUE, &hkcr ); + ok(res == ERROR_SUCCESS, + "test key not found in hkcr: %d\n", res); + + /* set a value in user's classes */ + res = RegSetValueExA(hkey, "val2", 0, REG_SZ, (const BYTE *)"user", sizeof("user")); + ok(res == ERROR_SUCCESS, "RegSetValueExA failed: %d, GLE=%x\n", res, GetLastError()); + + /* try to find the value in hkcr */ + res = RegQueryValueExA(hkcr, "val2", NULL, &type, (LPBYTE)buffer, &size); + ok(res == ERROR_SUCCESS, "RegQueryValueExA failed: %d\n", res); + ok(!strcmp( buffer, "user" ), "value set to '%s'\n", buffer ); + + /* modify the value in hklm */ + res = RegSetValueExA(hklm, "val2", 0, REG_SZ, (const BYTE *)"hklm", sizeof("user")); + ok(res == ERROR_SUCCESS, "RegSetValueExA failed: %d, GLE=%x\n", res, GetLastError()); + + /* check that the value is not overwritten in hkcr or user's classes */ + res = RegQueryValueExA(hkcr, "val2", NULL, &type, (LPBYTE)buffer, &size); + ok(res == ERROR_SUCCESS, "RegQueryValueExA failed: %d\n", res); + ok(!strcmp( buffer, "user" ), "value set to '%s'\n", buffer ); + res = RegQueryValueExA(hkey, "val2", NULL, &type, (LPBYTE)buffer, &size); + ok(res == ERROR_SUCCESS, "RegQueryValueExA failed: %d, GLE=%x\n", res, GetLastError()); + ok(!strcmp( buffer, "user" ), "value set to '%s'\n", buffer ); + + /* cleanup */ + delete_key( hkey ); + delete_key( hklm ); + delete_key( hkcr ); + RegCloseKey( hkey ); + RegCloseKey( hklm ); + RegCloseKey( hkcr ); } static void test_deleted_key(void)