* Sync up to trunk head (r65074).
[reactos.git] / ntoskrnl / config / cminit.c
index 897e584..84749d3 100644 (file)
@@ -201,6 +201,7 @@ CmpInitializeHive(OUT PCMHIVE *RegistryHive,
     if (!NT_SUCCESS(Status))
     {
         /* Cleanup allocations and fail */
+        ExDeleteResourceLite(Hive->FlusherLock);
         ExFreePoolWithTag(Hive->FlusherLock, TAG_CM);
         ExFreePoolWithTag(Hive->ViewLock, TAG_CM);
         ExFreePoolWithTag(Hive, TAG_CM);
@@ -214,9 +215,11 @@ CmpInitializeHive(OUT PCMHIVE *RegistryHive,
         (OperationType == HINIT_MAPFILE))
     {
         /* Verify integrity */
-        if (CmCheckRegistry((PCMHIVE)Hive, TRUE))
+        ULONG CheckStatus = CmCheckRegistry(Hive, CheckFlags);
+        if (CheckStatus != 0)
         {
             /* Cleanup allocations and fail */
+            ExDeleteResourceLite(Hive->FlusherLock);
             ExFreePoolWithTag(Hive->FlusherLock, TAG_CM);
             ExFreePoolWithTag(Hive->ViewLock, TAG_CM);
             ExFreePoolWithTag(Hive, TAG_CM);
@@ -238,6 +241,28 @@ CmpInitializeHive(OUT PCMHIVE *RegistryHive,
     return STATUS_SUCCESS;
 }
 
+NTSTATUS
+NTAPI
+CmpDestroyHive(IN PCMHIVE CmHive)
+{
+    /* Remove the hive from the list */
+    ExAcquirePushLockExclusive(&CmpHiveListHeadLock);
+    RemoveEntryList(&CmHive->HiveList);
+    ExReleasePushLock(&CmpHiveListHeadLock);
+
+    /* Delete the flusher lock */
+    ExDeleteResourceLite(CmHive->FlusherLock);
+    ExFreePoolWithTag(CmHive->FlusherLock, TAG_CM);
+
+    /* Delete the view lock */
+    ExFreePoolWithTag(CmHive->ViewLock, TAG_CM);
+
+    /* Free the hive */
+    HvFree(&CmHive->Hive);
+
+    return STATUS_SUCCESS;
+}
+
 NTSTATUS
 NTAPI
 CmpOpenHiveFiles(IN PCUNICODE_STRING BaseName,