wine-staging/patches/advapi32-RegCopyTree/0004-advapi32-Simplify-and-clean-up-RegDeleteTree-impleme.patch
2016-02-28 08:07:37 +01:00

160 lines
4.9 KiB
Diff

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