Stefan Leichter : advapi32: Added implementation of RegDeleteTreeA/W.

Alexandre Julliard julliard at wine.codeweavers.com
Wed May 30 08:56:58 CDT 2007


Module: wine
Branch: master
Commit: 88b6bc4f7c20113f3b94a6ed8b80016a625d9bf6
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=88b6bc4f7c20113f3b94a6ed8b80016a625d9bf6

Author: Stefan Leichter <Stefan.Leichter at camline.com>
Date:   Fri May 25 18:15:54 2007 +0200

advapi32: Added implementation of RegDeleteTreeA/W.

---

 dlls/advapi32/advapi32.spec |    2 +
 dlls/advapi32/registry.c    |   88 +++++++++++++++++++++++++++++++++++++++++++
 include/winreg.h            |    3 +
 3 files changed, 93 insertions(+), 0 deletions(-)

diff --git a/dlls/advapi32/advapi32.spec b/dlls/advapi32/advapi32.spec
index 0d27297..20f333d 100644
--- a/dlls/advapi32/advapi32.spec
+++ b/dlls/advapi32/advapi32.spec
@@ -473,6 +473,8 @@
 @ stdcall RegCreateKeyW(long wstr ptr)
 @ stdcall RegDeleteKeyA(long str)
 @ stdcall RegDeleteKeyW(long wstr)
+@ stdcall RegDeleteTreeA(long str)
+@ stdcall RegDeleteTreeW(long wstr)
 @ stdcall RegDeleteValueA(long str)
 @ stdcall RegDeleteValueW(long wstr)
 @ stdcall RegDisablePredefinedCache()
diff --git a/dlls/advapi32/registry.c b/dlls/advapi32/registry.c
index 4406004..cb905ed 100644
--- a/dlls/advapi32/registry.c
+++ b/dlls/advapi32/registry.c
@@ -2615,3 +2615,91 @@ LONG WINAPI RegDisablePredefinedCache(void)
 
     return ERROR_SUCCESS;
 }
+
+/******************************************************************************
+ * RegDeleteTreeW [ADVAPI32.@]
+ *
+ */
+LONG WINAPI RegDeleteTreeW(HKEY hKey, LPCWSTR lpszSubKey)
+{
+    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));
+
+    if(lpszSubKey)
+    {
+        ret = RegOpenKeyExW(hKey, lpszSubKey, 0, KEY_READ, &hSubKey);
+        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;
+
+    dwMaxSubkeyLen++;
+    dwMaxValueLen++;
+    dwMaxLen = max(dwMaxSubkeyLen, dwMaxValueLen);
+    if (dwMaxLen > sizeof(szNameBuf)/sizeof(WCHAR))
+    {
+        /* Name too big: alloc a buffer for it */
+        if (!(lpszName = HeapAlloc( GetProcessHeap(), 0, dwMaxLen*sizeof(WCHAR))))
+        {
+            ret = ERROR_NOT_ENOUGH_MEMORY;
+            goto cleanup;
+        }
+    }
+
+
+    /* Recursively delete all the subkeys */
+    while (TRUE)
+    {
+        dwSize = dwMaxLen;
+        if (RegEnumKeyExW(hSubKey, 0, lpszName, &dwSize, NULL,
+                          NULL, NULL, NULL)) break;
+
+        ret = RegDeleteTreeW(hSubKey, lpszName);
+        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;
+        }
+
+cleanup:
+    /* Free buffer if allocated */
+    if (lpszName != szNameBuf)
+        HeapFree( GetProcessHeap(), 0, lpszName);
+    if(lpszSubKey)
+        RegCloseKey(hSubKey);
+    return ret;
+}
+
+/******************************************************************************
+ * RegDeleteTreeA [ADVAPI32.@]
+ *
+ */
+LONG WINAPI RegDeleteTreeA(HKEY hKey, LPCSTR lpszSubKey)
+{
+    LONG ret;
+    UNICODE_STRING lpszSubKeyW;
+
+    if (lpszSubKey) RtlCreateUnicodeStringFromAsciiz( &lpszSubKeyW, lpszSubKey);
+    else lpszSubKeyW.Buffer = NULL;
+    ret = RegDeleteTreeW( hKey, lpszSubKeyW.Buffer);
+    RtlFreeUnicodeString( &lpszSubKeyW );
+    return ret;
+}
diff --git a/include/winreg.h b/include/winreg.h
index c694052..4e04956 100644
--- a/include/winreg.h
+++ b/include/winreg.h
@@ -154,6 +154,9 @@ LONG        WINAPI RegCreateKeyW(HKEY,LPCWSTR,PHKEY);
 LONG        WINAPI RegDeleteKeyA(HKEY,LPCSTR);
 LONG        WINAPI RegDeleteKeyW(HKEY,LPCWSTR);
 #define     RegDeleteKey WINELIB_NAME_AW(RegDeleteKey)
+LONG        WINAPI RegDeleteTreeA(HKEY,LPCSTR);
+LONG        WINAPI RegDeleteTreeW(HKEY,LPCWSTR);
+#define     RegDeleteTree WINELIB_NAME_AW(RegDeleteTree)
 LONG        WINAPI RegDeleteValueA(HKEY,LPCSTR);
 LONG        WINAPI RegDeleteValueW(HKEY,LPCWSTR);
 #define     RegDeleteValue WINELIB_NAME_AW(RegDeleteValue)




More information about the wine-cvs mailing list