--- ../wine-git/dlls/advapi32/tests/registry.c	2007-03-17 08:36:33.000000000 +0100
+++ dlls/advapi32/tests/registry.c	2007-04-02 00:00:11.000000000 +0200
@@ -35,6 +35,7 @@
 
 static HMODULE hadvapi32;
 static DWORD (WINAPI *pRegGetValueA)(HKEY,LPCSTR,LPCSTR,DWORD,LPDWORD,PVOID,LPDWORD);
+static DWORD (WINAPI *pRegDeleteTreeA)(HKEY,LPCSTR);
 
 #define ADVAPI32_GET_PROC(func) \
     p ## func = (void*)GetProcAddress(hadvapi32, #func); \
@@ -47,6 +48,7 @@
 
     /* This function was introduced with Windows 2003 SP1 */
     ADVAPI32_GET_PROC(RegGetValueA)
+    ADVAPI32_GET_PROC(RegDeleteTreeA)
 }
 
 /* delete key and all its subkeys */
@@ -872,6 +874,59 @@
     RegDeleteKeyA(subkey, "");
 }
 
+static void test_reg_delete_tree(void)
+{
+    CHAR buffer[MAX_PATH];
+    HKEY subkey, subkey2;
+    LONG size, ret;
+
+    if(!pRegDeleteTreeA) {
+        skip("Skipping RegDeleteTreeA tests, function not present\n");
+        return;
+    }
+
+    ret = RegCreateKeyA(hkey_main, "subkey", &subkey);
+    ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+    ret = RegCreateKeyA(subkey, "subkey2", &subkey2);
+    ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+    ret = RegSetValueA(subkey, NULL, REG_SZ, "data", 4);
+    ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+    ret = RegSetValueA(subkey2, NULL, REG_SZ, "data2", 5);
+    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 = pRegDeleteTreeA(subkey, "subkey2");
+    ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+    ok(RegOpenKeyA(subkey, "subkey2", &subkey2),
+        "subkey2 was not deleted\n");
+    size = MAX_PATH;
+    ok(!RegQueryValueA(subkey, NULL, buffer, &size),
+        "Default value of subkey not longer present\n");
+
+    ret = RegCreateKeyA(subkey, "subkey2", &subkey2);
+    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 = pRegDeleteTreeA(hkey_main, "subkey\\subkey2");
+    ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+    ok(RegOpenKeyA(subkey, "subkey2", &subkey2),
+        "subkey2 was not deleted\n");
+    ok(!RegQueryValueA(subkey, NULL, buffer, &size),
+        "Default value of subkey not longer present\n");
+    
+    ret = pRegDeleteTreeA(subkey, NULL);
+    ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
+    ok(!RegOpenKeyA(hkey_main, "subkey", &subkey),
+        "subkey was deleted\n");
+    ok(RegQueryValueA(subkey, NULL, buffer, &size),
+        "Default value of subkey is still present\n");
+
+    ret = pRegDeleteTreeA(hkey_main, "not-here");
+    ok(ret == ERROR_FILE_NOT_FOUND,
+        "Expected ERROR_FILE_NOT_FOUND, got %d\n", ret);
+}
+
 START_TEST(registry)
 {
     /* Load pointers for functions that are not available in all Windows versions */
@@ -901,6 +956,8 @@
         set_privileges(SE_RESTORE_NAME, FALSE);
     }
 
+    test_reg_delete_tree();
+
     /* cleanup */
     delete_key( hkey_main );
     
