[ADVAPI32]
authorJérôme Gardou <jerome.gardou@reactos.org>
Tue, 30 Sep 2014 20:01:00 +0000 (20:01 +0000)
committerJérôme Gardou <jerome.gardou@reactos.org>
Tue, 30 Sep 2014 20:01:00 +0000 (20:01 +0000)
 - Implement DeleteKey for HKCR subkeys
CORE-8582

svn path=/trunk/; revision=64421

reactos/dll/win32/advapi32/reg/hkcr.c
reactos/dll/win32/advapi32/reg/reg.c
reactos/dll/win32/advapi32/reg/reg.h

index b7a13e8..081423b 100644 (file)
@@ -238,7 +238,6 @@ OpenHKCRKey(
     /* Close it if we must */
     if (QueriedKey != hKey)
     {
-        /* The original key is on the machine view */
         RegCloseKey(QueriedKey);
     }
 
@@ -258,6 +257,45 @@ OpenHKCRKey(
     if (ErrorCode == ERROR_SUCCESS)
         MakeHKCRKey(phkResult);
 
+    /* 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)
     {
@@ -265,5 +303,25 @@ OpenHKCRKey(
         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;
 }
index 1f910ee..b68337d 100644 (file)
@@ -1227,6 +1227,9 @@ RegDeleteKeyW(HKEY hKey,
         return RtlNtStatusToDosError(Status);
     }
 
+    if (IsHKCRKey(ParentKey))
+        return DeleteHKCRKey(ParentKey, lpSubKey);
+
     RtlInitUnicodeString(&SubKeyName,
                          (LPWSTR)lpSubKey);
     InitializeObjectAttributes(&ObjectAttributes,
index 45e8113..5d0bc25 100644 (file)
@@ -30,3 +30,10 @@ OpenHKCRKey(
     _In_ DWORD ulOptions,
     _In_ REGSAM samDesired,
     _In_ PHKEY phkResult);
+
+LONG
+WINAPI
+DeleteHKCRKey(
+    _In_ HKEY hKey,
+    _In_ LPCWSTR lpSubKey);
+