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.@]