* Sync up to trunk head (r65074).
[reactos.git] / ntoskrnl / config / cminit.c
index bb3e9d5..84749d3 100644 (file)
@@ -197,10 +197,11 @@ CmpInitializeHive(OUT PCMHIVE *RegistryHive,
                           CmpFileRead,
                           CmpFileFlush,
                           Cluster,
-                          (PUNICODE_STRING)FileName);
+                          FileName);
     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,
@@ -359,7 +384,7 @@ CmpOpenHiveFiles(IN PCUNICODE_STRING BaseName,
     if (!NT_SUCCESS(Status))
     {
         /* Close handles and free buffers */
-        if (NameBuffer) ExFreePool(NameBuffer);
+        if (NameBuffer) ExFreePoolWithTag(NameBuffer, TAG_CM);
         ObDereferenceObject(Event);
         ZwClose(EventHandle);
         DPRINT1("ZwCreateFile failed : %lx.\n", Status);
@@ -397,7 +422,7 @@ CmpOpenHiveFiles(IN PCUNICODE_STRING BaseName,
         if (!NT_SUCCESS(Status))
         {
             /* Close handles and free buffers */
-            if (NameBuffer) ExFreePool(NameBuffer);
+            if (NameBuffer) ExFreePoolWithTag(NameBuffer, TAG_CM);
             ObDereferenceObject(Event);
             ZwClose(EventHandle);
             ZwClose(*Primary);
@@ -461,7 +486,7 @@ CmpOpenHiveFiles(IN PCUNICODE_STRING BaseName,
         if (!NT_SUCCESS(Status))
         {
             /* Close handles and free buffers */
-            if (NameBuffer) ExFreePool(NameBuffer);
+            if (NameBuffer) ExFreePoolWithTag(NameBuffer, TAG_CM);
             ObDereferenceObject(Event);
             ZwClose(EventHandle);
             return Status;
@@ -471,7 +496,7 @@ CmpOpenHiveFiles(IN PCUNICODE_STRING BaseName,
         if (FsSizeInformation.BytesPerSector > HBLOCK_SIZE)
         {
             /* Close handles and free buffers */
-            if (NameBuffer) ExFreePool(NameBuffer);
+            if (NameBuffer) ExFreePoolWithTag(NameBuffer, TAG_CM);
             ObDereferenceObject(Event);
             ZwClose(EventHandle);
             return STATUS_CANNOT_LOAD_REGISTRY_FILE;
@@ -596,7 +621,7 @@ CmpOpenHiveFiles(IN PCUNICODE_STRING BaseName,
     }
 
     /* We're done, close handles and free buffers */
-    if (NameBuffer) ExFreePool(NameBuffer);
+    if (NameBuffer) ExFreePoolWithTag(NameBuffer, TAG_CM);
     ObDereferenceObject(Event);
     ZwClose(EventHandle);
     return STATUS_SUCCESS;