Author: jgardou Date: Tue Sep 30 20:01:00 2014 New Revision: 64421
URL: http://svn.reactos.org/svn/reactos?rev=64421&view=rev Log: [ADVAPI32] - Implement DeleteKey for HKCR subkeys CORE-8582
Modified: trunk/reactos/dll/win32/advapi32/reg/hkcr.c trunk/reactos/dll/win32/advapi32/reg/reg.c trunk/reactos/dll/win32/advapi32/reg/reg.h
Modified: trunk/reactos/dll/win32/advapi32/reg/hkcr.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/advapi32/reg/hkcr... ============================================================================== --- trunk/reactos/dll/win32/advapi32/reg/hkcr.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/advapi32/reg/hkcr.c [iso-8859-1] Tue Sep 30 20:01:00 2014 @@ -238,7 +238,6 @@ /* Close it if we must */ if (QueriedKey != hKey) { - /* The original key is on the machine view */ RegCloseKey(QueriedKey); }
@@ -261,9 +260,68 @@ /* Close it if we must */ if (QueriedKey != hKey) { + RegCloseKey(QueriedKey); + } + + return ErrorCode; +} + +LONG +WINAPI +DeleteHKCRKey( + _In_ HKEY hKey, + _In_ LPCWSTR lpSubKey) +{ + HKEY QueriedKey; + LONG ErrorCode; + + ASSERT(IsHKCRKey(hKey)); + + /* Remove the HKCR flag while we're working */ + hKey = (HKEY)(((ULONG_PTR)hKey) & ~0x2); + + ErrorCode = GetPreferredHKCRKey(hKey, &QueriedKey); + + if (ErrorCode == ERROR_FILE_NOT_FOUND) + { + /* The key doesn't exist on HKCU side, no chance for a subkey */ + return RegDeleteKeyW(hKey, lpSubKey); + } + + if (ErrorCode != ERROR_SUCCESS) + { + /* Somehow we failed for another reason (maybe deleted key or whatever) */ + return ErrorCode; + } + + ErrorCode = RegDeleteKeyW(QueriedKey, lpSubKey); + + /* Close it if we must */ + if (QueriedKey != hKey) + { /* The original key is on the machine view */ RegCloseKey(QueriedKey); }
+ /* Anything else than ERROR_FILE_NOT_FOUND means that we found it, even if it is with failures. */ + if (ErrorCode != ERROR_FILE_NOT_FOUND) + return ErrorCode; + + /* If we're here, we must open from HKLM key. */ + ErrorCode = GetFallbackHKCRKey(hKey, &QueriedKey); + if (ErrorCode != ERROR_SUCCESS) + { + /* Maybe the key doesn't exist in the HKLM view */ + return ErrorCode; + } + + ErrorCode = RegDeleteKeyW(QueriedKey, lpSubKey); + + /* Close it if we must */ + if (QueriedKey != hKey) + { + RegCloseKey(QueriedKey); + } + return ErrorCode; }
Modified: trunk/reactos/dll/win32/advapi32/reg/reg.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/advapi32/reg/reg.... ============================================================================== --- trunk/reactos/dll/win32/advapi32/reg/reg.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/advapi32/reg/reg.c [iso-8859-1] Tue Sep 30 20:01:00 2014 @@ -1227,6 +1227,9 @@ return RtlNtStatusToDosError(Status); }
+ if (IsHKCRKey(ParentKey)) + return DeleteHKCRKey(ParentKey, lpSubKey); + RtlInitUnicodeString(&SubKeyName, (LPWSTR)lpSubKey); InitializeObjectAttributes(&ObjectAttributes,
Modified: trunk/reactos/dll/win32/advapi32/reg/reg.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/advapi32/reg/reg.... ============================================================================== --- trunk/reactos/dll/win32/advapi32/reg/reg.h [iso-8859-1] (original) +++ trunk/reactos/dll/win32/advapi32/reg/reg.h [iso-8859-1] Tue Sep 30 20:01:00 2014 @@ -30,3 +30,10 @@ _In_ DWORD ulOptions, _In_ REGSAM samDesired, _In_ PHKEY phkResult); + +LONG +WINAPI +DeleteHKCRKey( + _In_ HKEY hKey, + _In_ LPCWSTR lpSubKey); +