[NTOSKRNL]
[reactos.git] / reactos / ntoskrnl / config / cminit.c
index bb3e9d5..8689e8e 100644 (file)
@@ -197,7 +197,7 @@ CmpInitializeHive(OUT PCMHIVE *RegistryHive,
                           CmpFileRead,
                           CmpFileFlush,
                           Cluster,
-                          (PUNICODE_STRING)FileName);
+                          FileName);
     if (!NT_SUCCESS(Status))
     {
         /* Cleanup allocations and fail */
@@ -238,6 +238,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 +381,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 +419,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 +483,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 +493,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 +618,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;