Rebase against 846155f1531207a763c099defa90fc2c41135164.

[advapi32-RegCopyTree]
Removed patches to implement RegCopyTreeA/W (accepted upstream).
This commit is contained in:
Sebastian Lackner
2016-03-02 04:27:31 +01:00
parent caaedcff2b
commit ab74d819f0
15 changed files with 348 additions and 818 deletions

View File

@@ -1,12 +1,12 @@
From a46f711251567a2846eb5b0f40a0d8c0b66661ac Mon Sep 17 00:00:00 2001
From 95113550630cf847fdc52c5ded8ad1d6c84c6149 Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Sun, 28 Feb 2016 03:33:09 +0100
Date: Tue, 1 Mar 2016 13:20:07 +0100
Subject: advapi32: Fix RegDeleteTreeW when empty string is passed.
---
dlls/advapi32/registry.c | 6 +++---
dlls/advapi32/tests/registry.c | 4 ++--
2 files changed, 5 insertions(+), 5 deletions(-)
dlls/advapi32/registry.c | 6 +++---
dlls/advapi32/tests/registry.c | 14 ++++++++++++++
2 files changed, 17 insertions(+), 3 deletions(-)
diff --git a/dlls/advapi32/registry.c b/dlls/advapi32/registry.c
index 172423b..aa451b1 100644
@@ -40,17 +40,26 @@ index 172423b..aa451b1 100644
return ret;
}
diff --git a/dlls/advapi32/tests/registry.c b/dlls/advapi32/tests/registry.c
index 483df47..6010123 100644
index 4b3b4e9..ddda755 100644
--- a/dlls/advapi32/tests/registry.c
+++ b/dlls/advapi32/tests/registry.c
@@ -2257,9 +2257,9 @@ static void test_reg_delete_tree(void)
ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
ret = RegOpenKeyA(hkey_main, "subkey", &subkey);
- todo_wine ok(ret == ERROR_SUCCESS, "subkey was deleted\n");
@@ -2246,6 +2246,20 @@ static void test_reg_delete_tree(void)
dwsize = MAX_PATH;
ok(RegQueryValueExA(subkey, "value", NULL, &type, (BYTE *)buffer, &dwsize),
"Value is still present\n");
+ ret = RegCloseKey(subkey);
+ ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+
+ ret = RegOpenKeyA(hkey_main, "subkey", &subkey);
+ ok(ret == ERROR_SUCCESS, "subkey was deleted\n");
ret = RegCloseKey(subkey);
- todo_wine ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+ ret = pRegDeleteTreeA(subkey, "");
+ ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+ ret = RegCloseKey(subkey);
+ ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+
+ ret = RegOpenKeyA(hkey_main, "subkey", &subkey);
+ ok(ret == ERROR_SUCCESS, "subkey was deleted\n");
+ ret = RegCloseKey(subkey);
+ ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
ret = pRegDeleteTreeA(hkey_main, "not-here");

View File

@@ -1,71 +0,0 @@
From a467ec1afb9e82ac62292f86b9dd53cf7eff2a83 Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Fri, 26 Feb 2016 16:58:23 +0100
Subject: advapi32/tests: Improve RegDeleteTree tests.
Signed-off-by: Sebastian Lackner <sebastian@fds-team.de>
---
dlls/advapi32/tests/registry.c | 25 +++++++++++++++++++++----
1 file changed, 21 insertions(+), 4 deletions(-)
diff --git a/dlls/advapi32/tests/registry.c b/dlls/advapi32/tests/registry.c
index ef5d989..76a2928 100644
--- a/dlls/advapi32/tests/registry.c
+++ b/dlls/advapi32/tests/registry.c
@@ -41,7 +41,7 @@ static const char * sTestpath2 = "%FOO%\\subdir1";
static const DWORD ptr_size = 8 * sizeof(void*);
static DWORD (WINAPI *pRegGetValueA)(HKEY,LPCSTR,LPCSTR,DWORD,LPDWORD,PVOID,LPDWORD);
-static DWORD (WINAPI *pRegDeleteTreeA)(HKEY,LPCSTR);
+static LONG (WINAPI *pRegDeleteTreeA)(HKEY,const char *);
static DWORD (WINAPI *pRegDeleteKeyExA)(HKEY,LPCSTR,REGSAM,DWORD);
static BOOL (WINAPI *pIsWow64Process)(HANDLE,PBOOL);
static NTSTATUS (WINAPI * pNtDeleteKey)(HANDLE);
@@ -2083,6 +2083,7 @@ static void test_reg_delete_tree(void)
{
CHAR buffer[MAX_PATH];
HKEY subkey, subkey2;
+ DWORD dwsize, type;
LONG size, ret;
if(!pRegDeleteTreeA) {
@@ -2128,7 +2129,9 @@ static void test_reg_delete_tree(void)
ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
ret = RegCloseKey(subkey2);
ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
- ret = RegSetValueA(subkey, "value", REG_SZ, "data2", 5);
+ ret = RegSetValueA(subkey, NULL, REG_SZ, "data", 4);
+ ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+ ret = RegSetValueExA(subkey, "value", 0, REG_SZ, (const BYTE *)"data2", 5);
ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
ret = pRegDeleteTreeA(subkey, NULL);
ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
@@ -2143,9 +2146,23 @@ static void test_reg_delete_tree(void)
ok(ret == ERROR_SUCCESS,
"Default value of subkey is not present\n");
ok(!buffer[0], "Expected length 0 got length %u(%s)\n", lstrlenA(buffer), buffer);
- size = MAX_PATH;
- ok(RegQueryValueA(subkey, "value", buffer, &size),
+ dwsize = MAX_PATH;
+ ok(RegQueryValueExA(subkey, "value", NULL, &type, (BYTE *)buffer, &dwsize),
"Value is still present\n");
+ ret = RegCloseKey(subkey);
+ ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+
+ ret = RegOpenKeyA(hkey_main, "subkey", &subkey);
+ ok(ret == ERROR_SUCCESS, "subkey was deleted\n");
+ ret = pRegDeleteTreeA(subkey, "");
+ ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+ ret = RegCloseKey(subkey);
+ ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+
+ ret = RegOpenKeyA(hkey_main, "subkey", &subkey);
+ todo_wine ok(ret == ERROR_SUCCESS, "subkey was deleted\n");
+ ret = RegCloseKey(subkey);
+ todo_wine ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
ret = pRegDeleteTreeA(hkey_main, "not-here");
ok(ret == ERROR_FILE_NOT_FOUND,
--
2.7.1

View File

@@ -1,143 +0,0 @@
From 662fc2e86a67494a394b6f9e98d2aac3e8705042 Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Fri, 26 Feb 2016 16:59:06 +0100
Subject: advapi32/tests: Add tests for RegCopyTree.
Signed-off-by: Sebastian Lackner <sebastian@fds-team.de>
---
dlls/advapi32/tests/registry.c | 98 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 98 insertions(+)
diff --git a/dlls/advapi32/tests/registry.c b/dlls/advapi32/tests/registry.c
index 76a2928..7664362 100644
--- a/dlls/advapi32/tests/registry.c
+++ b/dlls/advapi32/tests/registry.c
@@ -41,6 +41,7 @@ static const char * sTestpath2 = "%FOO%\\subdir1";
static const DWORD ptr_size = 8 * sizeof(void*);
static DWORD (WINAPI *pRegGetValueA)(HKEY,LPCSTR,LPCSTR,DWORD,LPDWORD,PVOID,LPDWORD);
+static LONG (WINAPI *pRegCopyTreeA)(HKEY,const char *,HKEY);
static LONG (WINAPI *pRegDeleteTreeA)(HKEY,const char *);
static DWORD (WINAPI *pRegDeleteKeyExA)(HKEY,LPCSTR,REGSAM,DWORD);
static BOOL (WINAPI *pIsWow64Process)(HANDLE,PBOOL);
@@ -135,6 +136,7 @@ static void InitFunctionPtrs(void)
/* This function was introduced with Windows 2003 SP1 */
ADVAPI32_GET_PROC(RegGetValueA);
+ ADVAPI32_GET_PROC(RegCopyTreeA);
ADVAPI32_GET_PROC(RegDeleteTreeA);
ADVAPI32_GET_PROC(RegDeleteKeyExA);
ADVAPI32_GET_PROC(RegDeleteKeyValueA);
@@ -2079,6 +2081,101 @@ static void test_string_termination(void)
RegCloseKey(subkey);
}
+static void test_reg_copy_tree(void)
+{
+ HKEY src, dst, subkey;
+ CHAR buffer[MAX_PATH];
+ DWORD dwsize, type;
+ LONG size, ret;
+
+ if (!pRegCopyTreeA)
+ {
+ skip("Skipping RegCopyTreeA tests, function not present\n");
+ return;
+ }
+
+ ret = RegCreateKeyA(hkey_main, "src", &src);
+ ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+ ret = RegCreateKeyA(hkey_main, "dst", &dst);
+ ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+
+ /* Copy nonexistent subkey */
+ ret = pRegCopyTreeA(src, "nonexistent_subkey", dst);
+ ok(ret == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", ret);
+
+ /* Create test keys and values */
+ ret = RegSetValueA(src, NULL, REG_SZ, "data", 4);
+ ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+ ret = RegSetValueExA(src, "value", 0, REG_SZ, (const BYTE *)"data2", 5);
+ ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+
+ ret = RegCreateKeyA(src, "subkey2", &subkey);
+ ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+ ret = RegSetValueA(subkey, NULL, REG_SZ, "data3", 5);
+ ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+ ret = RegSetValueExA(subkey, "value", 0, REG_SZ, (const BYTE *)"data4", 5);
+ ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+ ret = RegCloseKey(subkey);
+ ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+
+ ret = RegCreateKeyA(src, "subkey3", &subkey);
+ ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+ ret = RegCloseKey(subkey);
+ ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+
+ /* Copy subkey */
+ ret = pRegCopyTreeA(src, "subkey2", dst);
+ ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+
+ size = MAX_PATH;
+ ret = RegQueryValueA(dst, NULL, buffer, &size);
+ ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+ ok(!strcmp(buffer, "data3"), "Expected 'data3', got '%s'\n", buffer);
+
+ dwsize = MAX_PATH;
+ ret = RegQueryValueExA(dst, "value", NULL, &type, (BYTE *)buffer, &dwsize);
+ ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+ ok(type == REG_SZ, "Expected REG_SZ, got %u\n", type);
+ ok(!strcmp(buffer, "data4"), "Expected 'data4', got '%s'\n", buffer);
+
+ /* Copy full tree */
+ ret = pRegCopyTreeA(src, NULL, dst);
+ ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+
+ size = MAX_PATH;
+ ret = RegQueryValueA(dst, NULL, buffer, &size);
+ ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+ ok(!strcmp(buffer, "data"), "Expected 'data', got '%s'\n", buffer);
+
+ dwsize = MAX_PATH;
+ ret = RegQueryValueExA(dst, "value", NULL, &type, (BYTE *)buffer, &dwsize);
+ ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+ ok(type == REG_SZ, "Expected REG_SZ, got %u\n", type);
+ ok(!strcmp(buffer, "data2"), "Expected 'data2', got '%s'\n", buffer);
+
+ ret = RegOpenKeyA(dst, "subkey2", &subkey);
+ ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+ size = MAX_PATH;
+ ret = RegQueryValueA(subkey, NULL, buffer, &size);
+ ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+ ok(!strcmp(buffer, "data3"), "Expected 'data3', got '%s'\n", buffer);
+ dwsize = MAX_PATH;
+ ret = RegQueryValueExA(subkey, "value", NULL, &type, (BYTE *)buffer, &dwsize);
+ ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+ ok(type == REG_SZ, "Expected REG_SZ, got %u\n", type);
+ ok(!strcmp(buffer, "data4"), "Expected 'data4', got '%s'\n", buffer);
+ ret = RegCloseKey(subkey);
+ ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+
+ ret = RegOpenKeyA(dst, "subkey3", &subkey);
+ ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+ ret = RegCloseKey(subkey);
+ ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+
+ delete_key(src);
+ delete_key(dst);
+}
+
static void test_reg_delete_tree(void)
{
CHAR buffer[MAX_PATH];
@@ -3334,6 +3431,7 @@ START_TEST(registry)
test_reg_save_key();
test_reg_load_key();
test_reg_unload_key();
+ test_reg_copy_tree();
test_reg_delete_tree();
test_rw_order();
test_deleted_key();
--
2.7.1

View File

@@ -1,179 +0,0 @@
From d58022657d2eda1e50cabde52e96a6c8864b2123 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Fri, 26 Feb 2016 17:00:05 +0100
Subject: advapi32: Implement RegCopyTreeA/W.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Michael Müller <michael@fds-team.de>
Signed-off-by: Sebastian Lackner <sebastian@fds-team.de>
---
dlls/advapi32/advapi32.spec | 4 +-
dlls/advapi32/registry.c | 95 ++++++++++++++++++++++
dlls/advapi32/tests/registry.c | 2 +-
.../api-ms-win-core-registry-l1-1-0.spec | 2 +-
.../api-ms-win-downlevel-advapi32-l1-1-0.spec | 2 +-
5 files changed, 100 insertions(+), 5 deletions(-)
diff --git a/dlls/advapi32/advapi32.spec b/dlls/advapi32/advapi32.spec
index 88f7fee..08f799d 100644
--- a/dlls/advapi32/advapi32.spec
+++ b/dlls/advapi32/advapi32.spec
@@ -575,8 +575,8 @@
@ stdcall RegConnectRegistryW(wstr long ptr)
# @ stub RegConnectRegistryExA
# @ stub RegConnectRegistryExW
-# @ stub RegCopyTreeA
-# @ stub RegCopyTreeW
+@ stdcall RegCopyTreeA(long str long)
+@ stdcall RegCopyTreeW(long wstr long)
@ stdcall RegCreateKeyA(long str ptr)
@ stdcall RegCreateKeyExA(long str long ptr long long ptr ptr ptr)
@ stdcall RegCreateKeyExW(long wstr long ptr long long ptr ptr ptr)
diff --git a/dlls/advapi32/registry.c b/dlls/advapi32/registry.c
index 3508407..1e7639c 100644
--- a/dlls/advapi32/registry.c
+++ b/dlls/advapi32/registry.c
@@ -3104,6 +3104,101 @@ LSTATUS WINAPI RegDeleteTreeA(HKEY hKey, LPCSTR lpszSubKey)
return ret;
}
+
+/******************************************************************************
+ * RegCopyTreeW [ADVAPI32.@]
+ *
+ */
+LONG WINAPI RegCopyTreeW( HKEY hsrc, const WCHAR *subkey, HKEY hdst )
+{
+ DWORD name_size, max_name;
+ DWORD value_size, max_value;
+ DWORD max_subkey, i, type;
+ WCHAR *name_buf = NULL;
+ BYTE *value_buf = NULL;
+ HKEY hkey;
+ LONG ret;
+
+ TRACE( "(%p, %s, %p)\n", hsrc, debugstr_w(subkey), hdst );
+
+ if (subkey)
+ {
+ ret = RegOpenKeyExW( hsrc, subkey, 0, KEY_READ, &hsrc );
+ if (ret) return ret;
+ }
+
+ ret = RegQueryInfoKeyW( hsrc, NULL, NULL, NULL, NULL, &max_subkey,
+ NULL, NULL, &max_name, &max_value, NULL, NULL );
+ if (ret)
+ goto cleanup;
+
+ max_name = max( max_subkey, max_name ) + 1;
+ if (!(name_buf = heap_alloc( max_name * sizeof(WCHAR) )))
+ {
+ ret = ERROR_NOT_ENOUGH_MEMORY;
+ goto cleanup;
+ }
+
+ if (!(value_buf = heap_alloc( max_value )))
+ {
+ ret = ERROR_NOT_ENOUGH_MEMORY;
+ goto cleanup;
+ }
+
+ /* Copy values */
+ for (i = 0;; i++)
+ {
+ name_size = max_name;
+ value_size = max_value;
+ ret = RegEnumValueW( hsrc, i, name_buf, &name_size, NULL, &type, value_buf, &value_size );
+ if (ret == ERROR_NO_MORE_ITEMS) break;
+ if (ret) goto cleanup;
+ ret = RegSetValueExW( hdst, name_buf, 0, type, value_buf, value_size );
+ if (ret) goto cleanup;
+ }
+
+ /* Recursively copy subkeys */
+ for (i = 0;; i++)
+ {
+ name_size = max_name;
+ ret = RegEnumKeyExW( hsrc, i, name_buf, &name_size, NULL, NULL, NULL, NULL );
+ if (ret == ERROR_NO_MORE_ITEMS) break;
+ if (ret) goto cleanup;
+ ret = RegCreateKeyExW( hdst, name_buf, 0, NULL, 0, KEY_WRITE, NULL, &hkey, NULL );
+ if (ret) goto cleanup;
+ ret = RegCopyTreeW( hsrc, name_buf, hkey );
+ RegCloseKey( hkey );
+ if (ret) goto cleanup;
+ }
+
+ ret = ERROR_SUCCESS;
+
+cleanup:
+ heap_free( name_buf );
+ heap_free( value_buf );
+ if (subkey)
+ RegCloseKey( hsrc );
+ return ret;
+}
+
+
+/******************************************************************************
+ * RegCopyTreeA [ADVAPI32.@]
+ *
+ */
+LONG WINAPI RegCopyTreeA( HKEY hsrc, const char *subkey, HKEY hdst )
+{
+ UNICODE_STRING subkeyW;
+ LONG ret;
+
+ if (subkey) RtlCreateUnicodeStringFromAsciiz( &subkeyW, subkey );
+ else subkeyW.Buffer = NULL;
+ ret = RegCopyTreeW( hsrc, subkeyW.Buffer, hdst );
+ RtlFreeUnicodeString( &subkeyW );
+ return ret;
+}
+
+
/******************************************************************************
* RegDisableReflectionKey [ADVAPI32.@]
*
diff --git a/dlls/advapi32/tests/registry.c b/dlls/advapi32/tests/registry.c
index 7664362..483df47 100644
--- a/dlls/advapi32/tests/registry.c
+++ b/dlls/advapi32/tests/registry.c
@@ -2090,7 +2090,7 @@ static void test_reg_copy_tree(void)
if (!pRegCopyTreeA)
{
- skip("Skipping RegCopyTreeA tests, function not present\n");
+ win_skip("Skipping RegCopyTreeA tests, function not present\n");
return;
}
diff --git a/dlls/api-ms-win-core-registry-l1-1-0/api-ms-win-core-registry-l1-1-0.spec b/dlls/api-ms-win-core-registry-l1-1-0/api-ms-win-core-registry-l1-1-0.spec
index d83fbdd..91b1a94 100644
--- a/dlls/api-ms-win-core-registry-l1-1-0/api-ms-win-core-registry-l1-1-0.spec
+++ b/dlls/api-ms-win-core-registry-l1-1-0/api-ms-win-core-registry-l1-1-0.spec
@@ -1,5 +1,5 @@
@ stdcall RegCloseKey(long) advapi32.RegCloseKey
-@ stub RegCopyTreeW
+@ stdcall RegCopyTreeW(long wstr long) advapi32.RegCopyTreeW
@ stdcall RegCreateKeyExA(long str long ptr long long ptr ptr ptr) advapi32.RegCreateKeyExA
@ stdcall RegCreateKeyExW(long wstr long ptr long long ptr ptr ptr) advapi32.RegCreateKeyExW
@ stdcall RegDeleteKeyExA(long str long long) advapi32.RegDeleteKeyExA
diff --git a/dlls/api-ms-win-downlevel-advapi32-l1-1-0/api-ms-win-downlevel-advapi32-l1-1-0.spec b/dlls/api-ms-win-downlevel-advapi32-l1-1-0/api-ms-win-downlevel-advapi32-l1-1-0.spec
index 4105e59..e1b4663 100644
--- a/dlls/api-ms-win-downlevel-advapi32-l1-1-0/api-ms-win-downlevel-advapi32-l1-1-0.spec
+++ b/dlls/api-ms-win-downlevel-advapi32-l1-1-0/api-ms-win-downlevel-advapi32-l1-1-0.spec
@@ -84,7 +84,7 @@
@ stdcall PrivilegedServiceAuditAlarmW(wstr wstr long ptr long) advapi32.PrivilegedServiceAuditAlarmW
@ stub QuerySecurityAccessMask
@ stdcall RegCloseKey(long) advapi32.RegCloseKey
-@ stub RegCopyTreeW
+@ stdcall RegCopyTreeW(long wstr long) advapi32.RegCopyTreeW
@ stdcall RegCreateKeyExA(long str long ptr long long ptr ptr ptr) advapi32.RegCreateKeyExA
@ stdcall RegCreateKeyExW(long wstr long ptr long long ptr ptr ptr) advapi32.RegCreateKeyExW
@ stdcall RegDeleteKeyExA(long str long long) advapi32.RegDeleteKeyExA
--
2.7.1

View File

@@ -1,159 +0,0 @@
From 7f360564594bf9bdc33e1c2d675a62045a1f41db Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Fri, 26 Feb 2016 17:02:25 +0100
Subject: advapi32: Simplify and clean up RegDeleteTree implementation.
Signed-off-by: Sebastian Lackner <sebastian@fds-team.de>
---
dlls/advapi32/registry.c | 101 +++++++++++++++++++++++------------------------
1 file changed, 50 insertions(+), 51 deletions(-)
diff --git a/dlls/advapi32/registry.c b/dlls/advapi32/registry.c
index 1e7639c..172423b 100644
--- a/dlls/advapi32/registry.c
+++ b/dlls/advapi32/registry.c
@@ -3016,91 +3016,90 @@ LSTATUS WINAPI RegDisablePredefinedCache(void)
return ERROR_SUCCESS;
}
+
/******************************************************************************
* RegDeleteTreeW [ADVAPI32.@]
*
*/
-LSTATUS WINAPI RegDeleteTreeW(HKEY hKey, LPCWSTR lpszSubKey)
+LSTATUS WINAPI RegDeleteTreeW( HKEY hkey, const WCHAR *subkey )
{
+ static const WCHAR emptyW[] = {0};
+ DWORD name_size, max_name, max_subkey;
+ WCHAR *name_buf = NULL;
LONG ret;
- DWORD dwMaxSubkeyLen, dwMaxValueLen;
- DWORD dwMaxLen, dwSize;
- WCHAR szNameBuf[MAX_PATH], *lpszName = szNameBuf;
- HKEY hSubKey = hKey;
- TRACE("(hkey=%p,%p %s)\n", hKey, lpszSubKey, debugstr_w(lpszSubKey));
+ TRACE( "(%p, %s)\n", hkey, debugstr_w(subkey) );
- if(lpszSubKey)
+ if (subkey)
{
- ret = RegOpenKeyExW(hKey, lpszSubKey, 0, KEY_READ, &hSubKey);
+ ret = RegOpenKeyExW( hkey, subkey, 0, KEY_READ, &hkey );
if (ret) return ret;
}
- /* Get highest length for keys, values */
- ret = RegQueryInfoKeyW(hSubKey, NULL, NULL, NULL, NULL,
- &dwMaxSubkeyLen, NULL, NULL, &dwMaxValueLen, NULL, NULL, NULL);
- if (ret) goto cleanup;
+ ret = RegQueryInfoKeyW( hkey, NULL, NULL, NULL, NULL, &max_subkey,
+ NULL, NULL, &max_name, NULL, NULL, NULL );
+ if (ret)
+ goto cleanup;
- dwMaxSubkeyLen++;
- dwMaxValueLen++;
- dwMaxLen = max(dwMaxSubkeyLen, dwMaxValueLen);
- if (dwMaxLen > sizeof(szNameBuf)/sizeof(WCHAR))
+ max_name = max( max_subkey, max_name ) + 1;
+ if (!(name_buf = heap_alloc( max_name * sizeof(WCHAR) )))
{
- /* Name too big: alloc a buffer for it */
- if (!(lpszName = heap_alloc( dwMaxLen*sizeof(WCHAR))))
- {
- ret = ERROR_NOT_ENOUGH_MEMORY;
- goto cleanup;
- }
+ ret = ERROR_NOT_ENOUGH_MEMORY;
+ goto cleanup;
}
+ /* Recursively delete subkeys */
+ for (;;)
+ {
+ name_size = max_name;
+ ret = RegEnumKeyExW( hkey, 0, name_buf, &name_size, NULL, NULL, NULL, NULL );
+ if (ret == ERROR_NO_MORE_ITEMS) break;
+ if (ret) goto cleanup;
+ ret = RegDeleteTreeW( hkey, name_buf );
+ if (ret) goto cleanup;
+ }
- /* Recursively delete all the subkeys */
- while (TRUE)
+ /* Delete the key itself */
+ if (subkey)
{
- dwSize = dwMaxLen;
- if (RegEnumKeyExW(hSubKey, 0, lpszName, &dwSize, NULL,
- NULL, NULL, NULL)) break;
+ ret = RegDeleteKeyW( hkey, emptyW );
+ goto cleanup;
+ }
- ret = RegDeleteTreeW(hSubKey, lpszName);
+ /* Delete values */
+ for (;;)
+ {
+ name_size = max_name;
+ ret = RegEnumValueW( hkey, 0, name_buf, &name_size, NULL, NULL, NULL, NULL );
+ if (ret == ERROR_NO_MORE_ITEMS) break;
+ if (ret) goto cleanup;
+ ret = RegDeleteValueW( hkey, name_buf );
if (ret) goto cleanup;
}
- if (lpszSubKey)
- ret = RegDeleteKeyW(hKey, lpszSubKey);
- else
- while (TRUE)
- {
- dwSize = dwMaxLen;
- if (RegEnumValueW(hKey, 0, lpszName, &dwSize,
- NULL, NULL, NULL, NULL)) break;
-
- ret = RegDeleteValueW(hKey, lpszName);
- if (ret) goto cleanup;
- }
+ ret = ERROR_SUCCESS;
cleanup:
- /* Free buffer if allocated */
- if (lpszName != szNameBuf)
- heap_free( lpszName);
- if(lpszSubKey)
- RegCloseKey(hSubKey);
+ heap_free( name_buf );
+ if (subkey)
+ RegCloseKey( hkey );
return ret;
}
+
/******************************************************************************
* RegDeleteTreeA [ADVAPI32.@]
*
*/
-LSTATUS WINAPI RegDeleteTreeA(HKEY hKey, LPCSTR lpszSubKey)
+LSTATUS WINAPI RegDeleteTreeA( HKEY hkey, const char *subkey )
{
+ UNICODE_STRING subkeyW;
LONG ret;
- UNICODE_STRING lpszSubKeyW;
- if (lpszSubKey) RtlCreateUnicodeStringFromAsciiz( &lpszSubKeyW, lpszSubKey);
- else lpszSubKeyW.Buffer = NULL;
- ret = RegDeleteTreeW( hKey, lpszSubKeyW.Buffer);
- RtlFreeUnicodeString( &lpszSubKeyW );
+ if (subkey) RtlCreateUnicodeStringFromAsciiz( &subkeyW, subkey );
+ else subkeyW.Buffer = NULL;
+ ret = RegDeleteTreeW( hkey, subkeyW.Buffer );
+ RtlFreeUnicodeString( &subkeyW );
return ret;
}
--
2.7.1

View File

@@ -1 +0,0 @@
Fixes: [39690] Implement advapi32.RegCopyTree{A,W}