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);
(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);
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,
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);
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);
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;
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;
}
/* 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;