This merge request is related to !820
-- v3: server: Allow a loaded key to be loaded multiple times. advapi32/tests: Test if a loaded key can be loaded multiple times.
From: Santino Mazza smazza@codeweavers.com
--- dlls/advapi32/tests/registry.c | 41 +++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-)
diff --git a/dlls/advapi32/tests/registry.c b/dlls/advapi32/tests/registry.c index 480e96ef6ee..04bfd41338b 100644 --- a/dlls/advapi32/tests/registry.c +++ b/dlls/advapi32/tests/registry.c @@ -1545,7 +1545,7 @@ static void test_reg_save_key(void) static void test_reg_load_key(void) { DWORD ret; - HKEY hkHandle; + HKEY hkHandle, child_key;
if (!set_privileges(SE_RESTORE_NAME, TRUE) || !set_privileges(SE_BACKUP_NAME, FALSE)) @@ -1557,6 +1557,45 @@ static void test_reg_load_key(void) ret = RegLoadKeyA(HKEY_LOCAL_MACHINE, "Test", "saved_key"); ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %ld\n", ret);
+ ret = RegDeleteKeyA(HKEY_LOCAL_MACHINE, "Test"); + ok(ret == ERROR_ACCESS_DENIED, "expected ERROR_ACCESS_DENIED, got %ld\n", ret); + + /* Test behaviour when loading a loaded key again */ + ret = RegOpenKeyA(HKEY_LOCAL_MACHINE, "Test", &hkHandle); + ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %ld\n", ret); + + ret = RegCreateKeyA(hkHandle, "child_key", &child_key); + ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %ld\n", ret); + + RegCloseKey(child_key); + RegCloseKey(hkHandle); + + ret = RegLoadKeyA(HKEY_LOCAL_MACHINE, "Test", "saved_key"); + todo_wine ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %ld\n", ret); + + ret = RegOpenKeyA(HKEY_LOCAL_MACHINE, "Test", &hkHandle); + ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %ld\n", ret); + + ret = RegOpenKeyA(hkHandle, "child_key", &child_key); + ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %ld\n", ret); + + RegCloseKey(child_key); + + ret = RegDeleteKeyA(hkHandle, "child_key"); + ok(ret == S_OK, "expected ERROR_SUCCESS, got %ld\n", ret); + RegCloseKey(hkHandle); + + ret = RegLoadKeyA(HKEY_LOCAL_MACHINE, "Test", "saved_key"); + todo_wine ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %ld\n", ret); + + ret = RegOpenKeyA(HKEY_LOCAL_MACHINE, "Test", &hkHandle); + ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %ld\n", ret); + + ret = RegOpenKeyA(hkHandle, "child_key", &child_key); + ok(ret == ERROR_FILE_NOT_FOUND, "expected ERROR_SUCCESS, got %ld\n", ret); + + RegCloseKey(hkHandle); + set_privileges(SE_RESTORE_NAME, FALSE);
ret = RegOpenKeyA(HKEY_LOCAL_MACHINE, "Test", &hkHandle);
From: Santino Mazza smazza@codeweavers.com
--- dlls/advapi32/tests/registry.c | 4 ++-- server/registry.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/dlls/advapi32/tests/registry.c b/dlls/advapi32/tests/registry.c index 04bfd41338b..3dd87517d03 100644 --- a/dlls/advapi32/tests/registry.c +++ b/dlls/advapi32/tests/registry.c @@ -1571,7 +1571,7 @@ static void test_reg_load_key(void) RegCloseKey(hkHandle);
ret = RegLoadKeyA(HKEY_LOCAL_MACHINE, "Test", "saved_key"); - todo_wine ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %ld\n", ret); + ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %ld\n", ret);
ret = RegOpenKeyA(HKEY_LOCAL_MACHINE, "Test", &hkHandle); ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %ld\n", ret); @@ -1586,7 +1586,7 @@ static void test_reg_load_key(void) RegCloseKey(hkHandle);
ret = RegLoadKeyA(HKEY_LOCAL_MACHINE, "Test", "saved_key"); - todo_wine ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %ld\n", ret); + ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %ld\n", ret);
ret = RegOpenKeyA(HKEY_LOCAL_MACHINE, "Test", &hkHandle); ok(ret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %ld\n", ret); diff --git a/server/registry.c b/server/registry.c index 03e5f20cae5..69a317d5315 100644 --- a/server/registry.c +++ b/server/registry.c @@ -2333,7 +2333,7 @@ DECL_HANDLER(load_registry) if (!(parent = get_hkey_obj( objattr->rootdir, 0 ))) return; }
- if ((key = create_key( parent, &name, 0, KEY_WOW64_64KEY, 0, sd ))) + if ((key = create_key( parent, &name, 0, KEY_WOW64_64KEY, OBJ_OPENIF, sd ))) { load_registry( key, req->file ); release_object( key );
I added more tests for checking what should happen if I delete and create a child key inside a loaded key, and then load it again.