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 | 78 +++++++++++++++++++++++-------------- include/winreg.h | 3 ++ 3 files changed, 54 insertions(+), 29 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 ); @@ -954,6 +953,50 @@ LSTATUS WINAPI RegDeleteKeyW( HKEY hkey, LPCWSTR name ) } +/****************************************************************************** + * RegDeleteKeyW [ADVAPI32.@] + * + * See RegDeleteKeyA. + */ +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; + + if (!name) return ERROR_INVALID_PARAMETER; + + if (!(hkey = get_special_root_hkey( hkey ))) return ERROR_INVALID_HANDLE; + + 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 */ + { + CHAR name[MAX_PATH]; + + while(!RegEnumKeyA(tmp, 0, name, sizeof(name))) + { + if(RegDeleteKeyExA(tmp, name, access, reserved)) /* recurse */ + break; + } + } + ret = RtlNtStatusToDosError( NtDeleteKey( tmp ) ); + RegCloseKey( tmp ); + } + TRACE("%s ret=%08x\n", debugstr_a(name), ret); + return ret; +} + + /****************************************************************************** * RegDeleteKeyA [ADVAPI32.@] * @@ -974,30 +1017,7 @@ LSTATUS WINAPI RegDeleteKeyW( HKEY hkey, LPCWSTR name ) */ LSTATUS WINAPI RegDeleteKeyA( HKEY hkey, LPCSTR name ) { - DWORD ret; - HKEY tmp; - - if (!name) return ERROR_INVALID_PARAMETER; - - if (!(hkey = get_special_root_hkey( hkey ))) return ERROR_INVALID_HANDLE; - - if (!(ret = RegOpenKeyExA( hkey, name, 0, DELETE, &tmp ))) - { - if (!is_version_nt()) /* win95 does recursive key deletes */ - { - CHAR name[MAX_PATH]; - - while(!RegEnumKeyA(tmp, 0, name, sizeof(name))) - { - if(RegDeleteKeyA(tmp, name)) /* recurse */ - break; - } - } - ret = RtlNtStatusToDosError( NtDeleteKey( tmp ) ); - RegCloseKey( tmp ); - } - TRACE("%s ret=%08x\n", debugstr_a(name), ret); - return ret; + return RegDeleteKeyExA( hkey, name, 0, 0 ); } 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)