From: Sven Baars sbaars@codeweavers.com
--- dlls/advapi32/tests/registry.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)
diff --git a/dlls/advapi32/tests/registry.c b/dlls/advapi32/tests/registry.c index 524c3e0ef76..97ee32f255b 100644 --- a/dlls/advapi32/tests/registry.c +++ b/dlls/advapi32/tests/registry.c @@ -1500,6 +1500,22 @@ static void test_reg_delete_key(void) ret = RegOpenKeyA(hkey_main, "deleteme", &key); ok(ret == ERROR_FILE_NOT_FOUND, "Key was not deleted, got %ld\n", ret); RegCloseKey(key); + + /* Test deleting 32-bit keys */ + ret = RegCreateKeyExA(hkey_main, "deleteme", 0, NULL, 0, KEY_ALL_ACCESS | KEY_WOW64_32KEY, NULL, &key, NULL); + ok(ret == ERROR_SUCCESS, "Could not create key, got %ld\n", ret); + RegCloseKey(key); + + ret = RegOpenKeyExA(hkey_main, "deleteme", 0, KEY_READ | KEY_WOW64_32KEY, &key); + ok(ret == ERROR_SUCCESS, "Could not open key, got %ld\n", ret); + + ret = RegDeleteKeyExA(key, "", KEY_WOW64_32KEY, 0); + todo_wine_if(ptr_size == 64) ok(ret == ERROR_SUCCESS, "RegDeleteKeyExA failed, got %ld\n", ret); + RegCloseKey(key); + + ret = RegOpenKeyA(hkey_main, "deleteme", &key); + todo_wine_if(ptr_size == 64) ok(ret == ERROR_FILE_NOT_FOUND, "Key was not deleted, got %ld\n", ret); + RegCloseKey(key); }
static BOOL set_privileges(LPCSTR privilege, BOOL set)
From: Sven Baars sbaars@codeweavers.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=54691 --- dlls/advapi32/tests/registry.c | 4 ++-- dlls/kernelbase/registry.c | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/dlls/advapi32/tests/registry.c b/dlls/advapi32/tests/registry.c index 97ee32f255b..81a6e67d828 100644 --- a/dlls/advapi32/tests/registry.c +++ b/dlls/advapi32/tests/registry.c @@ -1510,11 +1510,11 @@ static void test_reg_delete_key(void) ok(ret == ERROR_SUCCESS, "Could not open key, got %ld\n", ret);
ret = RegDeleteKeyExA(key, "", KEY_WOW64_32KEY, 0); - todo_wine_if(ptr_size == 64) ok(ret == ERROR_SUCCESS, "RegDeleteKeyExA failed, got %ld\n", ret); + ok(ret == ERROR_SUCCESS, "RegDeleteKeyExA failed, got %ld\n", ret); RegCloseKey(key);
ret = RegOpenKeyA(hkey_main, "deleteme", &key); - todo_wine_if(ptr_size == 64) ok(ret == ERROR_FILE_NOT_FOUND, "Key was not deleted, got %ld\n", ret); + ok(ret == ERROR_FILE_NOT_FOUND, "Key was not deleted, got %ld\n", ret); RegCloseKey(key); }
diff --git a/dlls/kernelbase/registry.c b/dlls/kernelbase/registry.c index d414b210026..daf1afa2cd6 100644 --- a/dlls/kernelbase/registry.c +++ b/dlls/kernelbase/registry.c @@ -155,7 +155,7 @@ static NTSTATUS open_subkey( HKEY *subkey, HKEY root, UNICODE_STRING *name, DWOR attr.SecurityDescriptor = NULL; attr.SecurityQualityOfService = NULL;
- if (buffer[0] == '\') return STATUS_OBJECT_PATH_INVALID; + if (len > 0 && buffer[0] == '\') return STATUS_OBJECT_PATH_INVALID; while (i < len && buffer[i] != '\') i++;
str.Buffer = name->Buffer; @@ -202,7 +202,7 @@ static NTSTATUS open_subkey( HKEY *subkey, HKEY root, UNICODE_STRING *name, DWOR /* wrapper for NtOpenKeyEx to handle Wow6432 nodes */ static NTSTATUS open_key( HKEY *retkey, HKEY root, UNICODE_STRING name, DWORD options, ACCESS_MASK access ) { - HKEY subkey, subkey_root = root; + HKEY subkey = 0, subkey_root = root; NTSTATUS status = 0;
*retkey = NULL; @@ -228,7 +228,7 @@ static NTSTATUS open_key( HKEY *retkey, HKEY root, UNICODE_STRING name, DWORD op return status; }
- while (!status && name.Length) + while (!status && (name.Length || !subkey)) { status = open_subkey( &subkey, subkey_root, &name, options, access ); if (subkey_root && subkey_root != root) NtClose( subkey_root );