CVS: winex/dlls/advapi32 advapi32.spec, 1.22, 1.23 registry.c, 1.6, 1.7

[email protected] 14 Dec 2007 20:27:08 -0000
Newsgroups gmane.comp.emulators.winex.cvs
Message-ID <[email protected]>
Subject: winex/dlls/advapi32 advapi32.spec,1.22,1.23 registry.c,1.6,1.7Update of /var/lib/cvsd/cvsroot/winex/dlls/advapi32
In directory agravaine:/tmp/cvs-serv16382/dlls/advapi32

Modified Files:
	advapi32.spec registry.c 
Log Message:
Added implementation of RegDeleteTree.


Index: advapi32.spec
===================================================================
RCS file: /var/lib/cvsd/cvsroot/winex/dlls/advapi32/advapi32.spec,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -d -r1.22 -r1.23
--- advapi32.spec	14 Dec 2007 20:26:49 -0000	1.22
+++ advapi32.spec	14 Dec 2007 20:27:06 -0000	1.23
@@ -207,6 +207,8 @@
 @ stdcall RegCreateKeyW(long wstr ptr) RegCreateKeyW
 @ stdcall RegDeleteKeyA(long str) RegDeleteKeyA
 @ stdcall RegDeleteKeyW(long wstr) RegDeleteKeyW
+@ stdcall RegDeleteTreeA(long str) RegDeleteKeyA
+@ stdcall RegDeleteTreeW(long wstr) RegDeleteKeyW
 @ stdcall RegDeleteValueA(long str) RegDeleteValueA
 @ stdcall RegDeleteValueW(long wstr) RegDeleteValueW
 @ stdcall RegEnumKeyA(long long ptr long) RegEnumKeyA

Index: registry.c
===================================================================
RCS file: /var/lib/cvsd/cvsroot/winex/dlls/advapi32/registry.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- registry.c	31 Jul 2007 19:57:38 -0000	1.6
+++ registry.c	14 Dec 2007 20:27:06 -0000	1.7
@@ -597,7 +597,7 @@
     DWORD ret;
     HKEY tmp;
 
-    if (!name || !*name) return NtDeleteKey( hkey );
+    if (!name || !*name) return RtlNtStatusToDosError( NtDeleteKey( hkey ) );
     if (!(ret = RegOpenKeyExW( hkey, name, 0, 0, &tmp )))
     {
         ret = RtlNtStatusToDosError( NtDeleteKey( tmp ) );
@@ -615,7 +615,7 @@
     DWORD ret;
     HKEY tmp;
 
-    if (!name || !*name) return NtDeleteKey( hkey );
+    if (!name || !*name) return RtlNtStatusToDosError( NtDeleteKey( hkey ) );
     if (!(ret = RegOpenKeyExA( hkey, name, 0, 0, &tmp )))
     {
         ret = RtlNtStatusToDosError( NtDeleteKey( tmp ) );
@@ -625,6 +625,101 @@
 }
 
 
+/******************************************************************************
+ *           RegDeleteTreeW   [ADVAPI32.@]
+ *
+ * PARAMS
+ *    hkey   [I] Handle to open key
+ *    name   [I] Name of subkey to delete
+ *
+ * RETURNS
+ *    Success: ERROR_SUCCESS
+ *    Failure: Error code
+ */
+DWORD WINAPI RegDeleteTreeW( HKEY hkey, LPCWSTR name )
+{
+    WCHAR kname[256];
+    DWORD ret, i;
+    HKEY tmp;
+
+    if ((ret = RegOpenKeyExW( hkey, name, 0, 0, &tmp )) != ERROR_SUCCESS)
+        return ret;
+
+    for (i = 0; ; i++) {
+        DWORD len = sizeof(kname)/sizeof(WCHAR);
+        ret = RegEnumKeyExW( tmp, i, kname, &len, NULL, NULL, NULL, NULL );
+        if (ret == ERROR_MORE_DATA) {
+            /* the max size of a key is 255 chars, so this shouldn't happen,
+             * but maybe we'll want to handle it someday anyway. */
+            FIXME("key name too long\n");
+            break;
+        }
+        if (ret != ERROR_SUCCESS)
+            break;
+
+        if ((ret = RegDeleteTreeW( tmp, kname )) != ERROR_SUCCESS)
+            break;
+    }
+
+    if (name) {
+        if (ret == ERROR_SUCCESS)
+            ret = RegDeleteKeyW( hkey, name );
+    } else {
+        DWORD maxlen = 0;
+        WCHAR *pvname = NULL;
+        ret = RegQueryInfoKeyW( tmp, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &maxlen, NULL, NULL, NULL );
+        if (ret == ERROR_SUCCESS) {
+            pvname = HeapAlloc( GetProcessHeap(), 0, (maxlen+1) * sizeof(WCHAR) );
+            if (!pvname) ret = ERROR_NOT_ENOUGH_MEMORY;
+        }
+        if (ret == ERROR_SUCCESS) {
+            for (i = 0; ; i++) {
+                DWORD len = maxlen+1;
+                ret = RegEnumValueW( tmp, i, pvname, &len, NULL, NULL, NULL, NULL );
+                if (ret == ERROR_MORE_DATA) {
+                    /* shouldn't happen (unless someone else is modifying the key at the same time,
+                     * but that would be a bad idea anyway), not sure whether to handle */
+                    FIXME("value name too long\n");
+                    break;
+                }
+                if (ret != ERROR_SUCCESS)
+                    break;
+                if ((ret = RegDeleteValueW( tmp, pvname )) != ERROR_SUCCESS)
+                    break;
+            }
+            HeapFree( GetProcessHeap(), 0, pvname );
+        }
+    }
+
+    RegCloseKey( tmp );
+    return ret;
+}
+
+
+/******************************************************************************
+ *           RegDeleteTreeA   [ADVAPI32.@]
+ */
+DWORD WINAPI RegDeleteTreeA( HKEY hkey, LPCSTR name )
+{
+    ANSI_STRING nameA;
+    UNICODE_STRING nameW;
+    NTSTATUS status;
+    DWORD ret = ERROR_SUCCESS;
+
+    RtlInitAnsiString( &nameA, name );
+    RtlInitUnicodeString( &nameW, NULL );
+
+    if (name && (status = RtlAnsiStringToUnicodeString( &nameW, &nameA, TRUE )) != STATUS_SUCCESS)
+        ret = RtlNtStatusToDosError( status );
+
+    if (ret == ERROR_SUCCESS)
+        ret = RegDeleteTreeW( hkey, nameW.Buffer );
+
+    RtlFreeUnicodeString( &nameW );
+    return ret;
+}
+
+
 
 /******************************************************************************
  *           RegSetValueExW   [ADVAPI32.@]