ReactOS 0.4.15-dev-7196-g0fe0b40
RegDeleteTree.c
Go to the documentation of this file.
1
2#include "advapi32_vista.h"
3
4/* heap allocation helpers */
5static void *heap_alloc( size_t len ) __WINE_ALLOC_SIZE(1);
6static inline void *heap_alloc( size_t len )
7{
8 return HeapAlloc( GetProcessHeap(), 0, len );
9}
10
11static inline BOOL heap_free( void *mem )
12{
13 return HeapFree( GetProcessHeap(), 0, mem );
14}
15
16/* Taken from Wine advapi32/registry.c */
17
18/******************************************************************************
19 * RegDeleteTreeW [ADVAPI32.@]
20 *
21 */
23{
24 LONG ret;
25 DWORD dwMaxSubkeyLen, dwMaxValueLen;
26 DWORD dwMaxLen, dwSize;
27 WCHAR szNameBuf[MAX_PATH], *lpszName = szNameBuf;
28 HKEY hSubKey = hKey;
29
30 if(lpszSubKey)
31 {
32 ret = RegOpenKeyExW(hKey, lpszSubKey, 0, KEY_READ, &hSubKey);
33 if (ret) return ret;
34 }
35
36 /* Get highest length for keys, values */
37 ret = RegQueryInfoKeyW(hSubKey, NULL, NULL, NULL, NULL,
38 &dwMaxSubkeyLen, NULL, NULL, &dwMaxValueLen, NULL, NULL, NULL);
39 if (ret) goto cleanup;
40
41 dwMaxSubkeyLen++;
42 dwMaxValueLen++;
43 dwMaxLen = max(dwMaxSubkeyLen, dwMaxValueLen);
44 if (dwMaxLen > sizeof(szNameBuf)/sizeof(WCHAR))
45 {
46 /* Name too big: alloc a buffer for it */
47 if (!(lpszName = heap_alloc( dwMaxLen*sizeof(WCHAR))))
48 {
50 goto cleanup;
51 }
52 }
53
54
55 /* Recursively delete all the subkeys */
56 while (TRUE)
57 {
58 dwSize = dwMaxLen;
59 if (RegEnumKeyExW(hSubKey, 0, lpszName, &dwSize, NULL,
60 NULL, NULL, NULL)) break;
61
62 ret = RegDeleteTreeW(hSubKey, lpszName);
63 if (ret) goto cleanup;
64 }
65
66 if (lpszSubKey)
67 ret = RegDeleteKeyW(hKey, lpszSubKey);
68 else
69 while (TRUE)
70 {
71 dwSize = dwMaxLen;
72 if (RegEnumValueW(hKey, 0, lpszName, &dwSize,
73 NULL, NULL, NULL, NULL)) break;
74
75 ret = RegDeleteValueW(hKey, lpszName);
76 if (ret) goto cleanup;
77 }
78
80 /* Free buffer if allocated */
81 if (lpszName != szNameBuf)
82 heap_free( lpszName);
83 if(lpszSubKey)
84 RegCloseKey(hSubKey);
85 return ret;
86}
87
88/******************************************************************************
89 * RegDeleteTreeA [ADVAPI32.@]
90 *
91 */
93{
94 LONG ret;
95 UNICODE_STRING lpszSubKeyW;
96
97 if (lpszSubKey) RtlCreateUnicodeStringFromAsciiz( &lpszSubKeyW, lpszSubKey);
98 else lpszSubKeyW.Buffer = NULL;
99 ret = RegDeleteTreeW( hKey, lpszSubKeyW.Buffer);
100 RtlFreeUnicodeString( &lpszSubKeyW );
101 return ret;
102}
static void * heap_alloc(size_t len) __WINE_ALLOC_SIZE(1)
Definition: RegDeleteTree.c:6
LSTATUS WINAPI RegDeleteTreeW(HKEY hKey, LPCWSTR lpszSubKey)
Definition: RegDeleteTree.c:22
static BOOL heap_free(void *mem)
Definition: RegDeleteTree.c:11
LSTATUS WINAPI RegDeleteTreeA(HKEY hKey, LPCSTR lpszSubKey)
Definition: RegDeleteTree.c:92
#define RegCloseKey(hKey)
Definition: registry.h:49
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
static LSTATUS(WINAPI *pRegDeleteTreeW)(HKEY
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3353
LONG WINAPI RegEnumKeyExW(_In_ HKEY hKey, _In_ DWORD dwIndex, _Out_ LPWSTR lpName, _Inout_ LPDWORD lpcbName, _Reserved_ LPDWORD lpReserved, _Out_opt_ LPWSTR lpClass, _Inout_opt_ LPDWORD lpcbClass, _Out_opt_ PFILETIME lpftLastWriteTime)
Definition: reg.c:2524
LONG WINAPI RegDeleteKeyW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey)
Definition: reg.c:1234
LONG WINAPI RegDeleteValueW(HKEY hKey, LPCWSTR lpValueName)
Definition: reg.c:2352
LONG WINAPI RegEnumValueW(_In_ HKEY hKey, _In_ DWORD index, _Out_ LPWSTR value, _Inout_ PDWORD val_count, _Reserved_ PDWORD reserved, _Out_opt_ PDWORD type, _Out_opt_ LPBYTE data, _Inout_opt_ PDWORD count)
Definition: reg.c:2850
LONG WINAPI RegQueryInfoKeyW(HKEY hKey, LPWSTR lpClass, LPDWORD lpcClass, LPDWORD lpReserved, LPDWORD lpcSubKeys, LPDWORD lpcMaxSubKeyLen, LPDWORD lpcMaxClassLen, LPDWORD lpcValues, LPDWORD lpcMaxValueNameLen, LPDWORD lpcMaxValueLen, LPDWORD lpcbSecurityDescriptor, PFILETIME lpftLastWriteTime)
Definition: reg.c:3682
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
#define MAX_PATH
Definition: compat.h:34
#define HeapFree(x, y, z)
Definition: compat.h:735
static void cleanup(void)
Definition: main.c:1335
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
FxAutoRegKey hKey
GLenum GLsizei len
Definition: glext.h:6722
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
NTSYSAPI BOOLEAN NTAPI RtlCreateUnicodeStringFromAsciiz(_Out_ PUNICODE_STRING Destination, _In_ PCSZ Source)
#define KEY_READ
Definition: nt_native.h:1023
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
long LONG
Definition: pedump.c:60
Definition: mem.c:156
#define max(a, b)
Definition: svc.c:63
int ret
#define WINAPI
Definition: msvc.h:6
#define __WINE_ALLOC_SIZE(x)
Definition: winnt_old.h:84
const char * LPCSTR
Definition: xmlstorage.h:183
__wchar_t WCHAR
Definition: xmlstorage.h:180
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185