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/hkc…
==============================================================================
--- 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);
+