From 9b7d1041fc198d62145ddedcda174c7fc515eb86 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Thu, 18 Feb 2010 13:12:31 +0100 Subject: [PATCH] advapi32: Implemented RegDeleteKeyExA/W. --- dlls/advapi32/advapi32.spec | 2 ++ dlls/advapi32/registry.c | 66 +++++++++++++++++++++++++++++---------------- include/winreg.h | 3 +++ 3 files changed, 48 insertions(+), 23 deletions(-) diff --git a/dlls/advapi32/advapi32.spec b/dlls/advapi32/advapi32.spec index 806cecf8cd2..892e84a327b 100644 --- a/dlls/advapi32/advapi32.spec +++ b/dlls/advapi32/advapi32.spec @@ -472,6 +472,8 @@ @ stdcall RegCreateKeyExW(long wstr long ptr long long ptr ptr ptr) @ stdcall RegCreateKeyW(long wstr ptr) @ stdcall RegDeleteKeyA(long str) +@ stdcall RegDeleteKeyExA(long str long long) +@ stdcall RegDeleteKeyExW(long wstr long long) @ stdcall RegDeleteKeyW(long wstr) @ stdcall RegDeleteTreeA(long str) @ stdcall RegDeleteTreeW(long wstr) diff --git a/dlls/advapi32/registry.c b/dlls/advapi32/registry.c index b9cb8c53228..faae2b14ba1 100644 --- a/dlls/advapi32/registry.c +++ b/dlls/advapi32/registry.c @@ -931,11 +931,9 @@ LSTATUS WINAPI RegCloseKey( HKEY hkey ) /****************************************************************************** - * RegDeleteKeyW [ADVAPI32.@] - * - * See RegDeleteKeyA. + * RegDeleteKeyExW [ADVAPI32.@] */ -LSTATUS WINAPI RegDeleteKeyW( HKEY hkey, LPCWSTR name ) +LSTATUS WINAPI RegDeleteKeyExW( HKEY hkey, LPCWSTR name, REGSAM access, DWORD reserved ) { DWORD ret; HKEY tmp; @@ -944,7 +942,8 @@ LSTATUS WINAPI RegDeleteKeyW( HKEY hkey, LPCWSTR name ) if (!(hkey = get_special_root_hkey( hkey ))) return ERROR_INVALID_HANDLE; - if (!(ret = RegOpenKeyExW( hkey, name, 0, DELETE, &tmp ))) + access &= KEY_WOW64_64KEY | KEY_WOW64_32KEY; + if (!(ret = RegOpenKeyExW( hkey, name, 0, access | DELETE, &tmp ))) { ret = RtlNtStatusToDosError( NtDeleteKey( tmp ) ); RegCloseKey( tmp ); @@ -955,24 +954,20 @@ LSTATUS WINAPI RegDeleteKeyW( HKEY hkey, LPCWSTR name ) /****************************************************************************** - * RegDeleteKeyA [ADVAPI32.@] - * - * Delete a registry key. - * - * PARAMS - * hkey [I] Handle to parent key containing the key to delete - * name [I] Name of the key user hkey to delete - * - * NOTES - * - * MSDN is wrong when it says that hkey must be opened with the DELETE access - * right. In reality, it opens a new handle with DELETE access. + * RegDeleteKeyW [ADVAPI32.@] * - * RETURNS - * Success: ERROR_SUCCESS - * Failure: Error code + * See RegDeleteKeyA. */ -LSTATUS WINAPI RegDeleteKeyA( HKEY hkey, LPCSTR name ) +LSTATUS WINAPI RegDeleteKeyW( HKEY hkey, LPCWSTR name ) +{ + return RegDeleteKeyExW( hkey, name, 0, 0 ); +} + + +/****************************************************************************** + * RegDeleteKeyExA [ADVAPI32.@] + */ +LSTATUS WINAPI RegDeleteKeyExA( HKEY hkey, LPCSTR name, REGSAM access, DWORD reserved ) { DWORD ret; HKEY tmp; @@ -981,7 +976,8 @@ LSTATUS WINAPI RegDeleteKeyA( HKEY hkey, LPCSTR name ) if (!(hkey = get_special_root_hkey( hkey ))) return ERROR_INVALID_HANDLE; - if (!(ret = RegOpenKeyExA( hkey, name, 0, DELETE, &tmp ))) + access &= KEY_WOW64_64KEY | KEY_WOW64_32KEY; + if (!(ret = RegOpenKeyExA( hkey, name, 0, access | DELETE, &tmp ))) { if (!is_version_nt()) /* win95 does recursive key deletes */ { @@ -989,7 +985,7 @@ LSTATUS WINAPI RegDeleteKeyA( HKEY hkey, LPCSTR name ) while(!RegEnumKeyA(tmp, 0, name, sizeof(name))) { - if(RegDeleteKeyA(tmp, name)) /* recurse */ + if(RegDeleteKeyExA(tmp, name, access, reserved)) /* recurse */ break; } } @@ -1001,6 +997,30 @@ LSTATUS WINAPI RegDeleteKeyA( HKEY hkey, LPCSTR name ) } +/****************************************************************************** + * RegDeleteKeyA [ADVAPI32.@] + * + * Delete a registry key. + * + * PARAMS + * hkey [I] Handle to parent key containing the key to delete + * name [I] Name of the key user hkey to delete + * + * NOTES + * + * MSDN is wrong when it says that hkey must be opened with the DELETE access + * right. In reality, it opens a new handle with DELETE access. + * + * RETURNS + * Success: ERROR_SUCCESS + * Failure: Error code + */ +LSTATUS WINAPI RegDeleteKeyA( HKEY hkey, LPCSTR name ) +{ + return RegDeleteKeyExA( hkey, name, 0, 0 ); +} + + /****************************************************************************** * RegSetValueExW [ADVAPI32.@] diff --git a/include/winreg.h b/include/winreg.h index e53245957ff..145a0265903 100644 --- a/include/winreg.h +++ b/include/winreg.h @@ -104,6 +104,9 @@ WINADVAPI LSTATUS WINAPI RegCreateKeyExW(HKEY,LPCWSTR,DWORD,LPWSTR,DWORD,REGSA WINADVAPI LSTATUS WINAPI RegDeleteKeyA(HKEY,LPCSTR); WINADVAPI LSTATUS WINAPI RegDeleteKeyW(HKEY,LPCWSTR); #define RegDeleteKey WINELIB_NAME_AW(RegDeleteKey) +WINADVAPI LSTATUS WINAPI RegDeleteKeyExA(HKEY,LPCSTR,REGSAM,DWORD); +WINADVAPI LSTATUS WINAPI RegDeleteKeyExW(HKEY,LPCWSTR,REGSAM,DWORD); +#define RegDeleteKeyEx WINELIB_NAME_AW(RegDeleteKeyEx) WINADVAPI LSTATUS WINAPI RegDeleteKeyValueA(HKEY,LPCSTR,LPCSTR); WINADVAPI LSTATUS WINAPI RegDeleteKeyValueW(HKEY,LPCWSTR,LPCWSTR); #define RegDeleteKeyValue WINELIB_NAME_AW(RegDeleteKeyValue) -- 2.11.4.GIT