From: Santino Mazza smazza@codeweavers.com
Signed-off-by: Santino Mazza smazza@codeweavers.com --- dlls/advapi32/tests/registry.c | 74 +++++++++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 2 deletions(-)
diff --git a/dlls/advapi32/tests/registry.c b/dlls/advapi32/tests/registry.c index df56b0968ee..21ab5386587 100644 --- a/dlls/advapi32/tests/registry.c +++ b/dlls/advapi32/tests/registry.c @@ -1600,7 +1600,77 @@ static void test_reg_unload_key(void) DeleteFileA("saved_key.LOG"); }
-/* tests that show that RegConnectRegistry and +/* Helper function to wait for a file blocked by the registry to be available */ +static void wait_file_available(char *path) +{ + int attempts = 0; + HANDLE file = NULL; + + while (((file = CreateFileA(path, GENERIC_READ, 0, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE) + && attempts++ <= 10) + { + Sleep(200); + } + ok(attempts <= 10, "couldn't open file %s after 10 attempts error %ld.\n", path, GetLastError()); + CloseHandle(file); +} + +static void test_reg_load_app_key(void) +{ + DWORD ret; + DWORD size1, size2; + char temppath[MAX_PATH], hivefilepath[MAX_PATH]; + const BYTE large_buffer[9216]; /* this buffer should be larger than the default reg file */ + HANDLE hivefile; + HKEY appkey = NULL; + + GetTempPathA(sizeof(temppath), temppath); + GetTempFileNameA(temppath, "key", 0, hivefilepath); + DeleteFileA(hivefilepath); + + 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, hivefilepath, NULL); + if (ret != ERROR_SUCCESS) + { + win_skip("Failed to save test key 0x%lx\n", ret); + return; + } + + set_privileges(SE_BACKUP_NAME, FALSE); + set_privileges(SE_RESTORE_NAME, FALSE); + + /* Test simple key load */ + /* Check if the changes are saved to the file */ + hivefile = CreateFileA(hivefilepath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, NULL); + size1 = GetFileSize(hivefile, NULL); + CloseHandle(hivefile); + + ret = RegLoadAppKeyA(hivefilepath, &appkey, KEY_READ | KEY_WRITE, 0, 0); + ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %ld\n", ret); + ok(appkey != NULL, "got a null key\n"); + + ret = RegSetValueExA(appkey, "testkey", 0, REG_BINARY, large_buffer, sizeof(large_buffer)); + todo_wine ok(ret == ERROR_SUCCESS, "couldn't set key value %lx\n", ret); + RegCloseKey(appkey); + + wait_file_available(hivefilepath); + hivefile = CreateFileA(hivefilepath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, NULL); + size2 = GetFileSize(hivefile, NULL); + todo_wine ok(size2 > size1, "Expected file to increase size. %ld <= %ld\n", size2, size1); + CloseHandle(hivefile); + DeleteFileA(hivefilepath); +} + +/* tests that show that RegConnectRegistry and OpenSCManager accept computer names without the \ prefix (what MSDN says). */ static void test_regconnectregistry( void) @@ -4486,6 +4556,7 @@ START_TEST(registry) test_reg_save_key(); test_reg_load_key(); test_reg_unload_key(); + test_reg_load_app_key(); test_reg_copy_tree(); test_reg_delete_tree(); test_rw_order(); @@ -4502,6 +4573,5 @@ START_TEST(registry)
/* cleanup */ delete_key( hkey_main ); - test_regconnectregistry(); }