From: Santino Mazza mazzasantino1206@gmail.com
Signed-off-by: Santino Mazza smazza@codeweavers.com --- dlls/advapi32/tests/registry.c | 89 ++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+)
diff --git a/dlls/advapi32/tests/registry.c b/dlls/advapi32/tests/registry.c index df56b0968ee..7bafc1ed42e 100644 --- a/dlls/advapi32/tests/registry.c +++ b/dlls/advapi32/tests/registry.c @@ -1600,6 +1600,94 @@ static void test_reg_unload_key(void) DeleteFileA("saved_key.LOG"); }
+static void test_reg_load_app_key(void) +{ + DWORD ret; + HKEY key1; + HKEY key2; + HKEY childkey; + DWORD size1; + DWORD size2; + HANDLE hivefile; + + set_privileges(SE_BACKUP_NAME, FALSE); + set_privileges(SE_RESTORE_NAME, FALSE); + + /* Test with non existant file */ + ret = RegLoadAppKeyA("saved_app_key", &key1, KEY_READ, 0, 0); + ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %ld\n", ret); + ok(key1 != NULL, "got a null key\n"); + + ret = GetFileAttributesA("saved_app_key"); + todo_wine ok(ret != -1, "hive file didn't got created.\n"); + + RegCloseKey(key1); + DeleteFileA("saved_app_key"); + + if (!set_privileges(SE_BACKUP_NAME, TRUE) || + !set_privileges(SE_RESTORE_NAME, FALSE)) + { + win_skip("Failed to set SE_BACKUP_NAME privileges, skipping tests\n"); + return; + } + + ret = RegSaveKeyA(hkey_main, "saved_app_key", NULL); + ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %ld\n", ret); + + /* Test without process app key ownership */ + ret = RegLoadAppKeyA("saved_app_key", &key1, KEY_READ, 0, 0); + ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %ld\n", ret); + ok(key1 != NULL, "got a null key\n"); + + ret = RegLoadAppKeyA("saved_app_key", &key2, KEY_READ, 0, 0); + ok(ret == ERROR_SUCCESS || broken(ret == ERROR_ALREADY_EXISTS) /* win7 */, "expected ERROR_SUCCESS, got %ld\n", ret); + ok(key2 != NULL || broken(key2 == NULL) /* win7 */, "got a null key\n"); + + RegCloseKey(key1); + RegCloseKey(key2); + + /* Test with process app key ownership */ + ret = RegLoadAppKeyA("saved_app_key", &key1, KEY_READ, REG_PROCESS_APPKEY, 0); + ok(ret == ERROR_SUCCESS || broken(ret == ERROR_ALREADY_EXISTS) /* win7 */, "expected ERROR_SUCCESS, got %ld\n", ret); + ok(key1 != NULL, "got a null key\n"); + + ret = RegLoadAppKeyA("saved_app_key", &key2, KEY_READ, 0, 0); + todo_wine ok(ret == ERROR_SHARING_VIOLATION || broken(ret == ERROR_ALREADY_EXISTS) /* win7 */, "expected ERROR_SHARING_VIOLATION, got %ld\n", ret); + todo_wine ok(key2 == NULL || broken(key2 != NULL), "expected null handle\n"); + + RegCloseKey(key1); + + ret = RegLoadAppKeyA("saved_app_key", &key2, KEY_READ, 0, 0); + ok(ret == ERROR_SUCCESS || broken(ret == ERROR_ALREADY_EXISTS) /* win7 */, "expected ERROR_SUCCESS, got %ld\n", ret); + ok(key2 != NULL || broken(key2 == NULL) /* win7 */, "got a null key\n"); + RegCloseKey(key2); + + + /* Check if the changes are saved to the file */ + hivefile = CreateFileA("saved_app_key", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, NULL); + size1 = GetFileSize(hivefile, NULL); + CloseHandle(hivefile); + + ret = RegLoadAppKeyA("saved_app_key", &key1, KEY_READ | KEY_WRITE, 0, 0); + ok(ret == ERROR_SUCCESS || broken(ret == ERROR_ALREADY_EXISTS) /* win7 */, "expected ERROR_SUCCESS, got %ld\n", ret); + ok(key1 != NULL, "got a null key\n"); + + ret = RegCreateKeyA(key1, "testkey", &childkey); + todo_wine ok(ret == ERROR_SUCCESS || broken(ret == ERROR_INVALID_HANDLE) /* win7 */, "error when creating testkey. %ld\n", ret); + RegCloseKey(key1); + + hivefile = CreateFileA("saved_app_key", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, NULL); + size2 = GetFileSize(hivefile, NULL); + todo_wine ok(size2 > size1 || broken(size1 == size2) /* win7 */, "Expected file to increase size. %ld >= %ld\n", size1, size2); + CloseHandle(hivefile); + + DeleteFileA("saved_app_key"); + DeleteFileA("saved_app_key.LOG"); + +} + /* tests that show that RegConnectRegistry and OpenSCManager accept computer names without the \ prefix (what MSDN says). */ @@ -4485,6 +4573,7 @@ START_TEST(registry) test_classesroot_mask(); test_reg_save_key(); test_reg_load_key(); + test_reg_load_app_key(); test_reg_unload_key(); test_reg_copy_tree(); test_reg_delete_tree();