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_CMHIVE); /* Delete the view lock */ ExFreePoolWithTag(CmHive->ViewLock, TAG_CMHIVE); /* Destroy the security descriptor cache */ CmpDestroySecurityCache(CmHive); /* Destroy the view list */ CmpDestroyHiveViewList(CmHive); /* Free the hive storage */ HvFree(&CmHive->Hive); /* Free the hive */ CmpFree(CmHive, TAG_CM); return STATUS_SUCCESS; }
NTSTATUS CmiInitializeTempHive( IN OUT PCMHIVE Hive) { NTSTATUS Status; RtlZeroMemory ( Hive, sizeof(CMHIVE)); DPRINT("Hive 0x%p\n", Hive); Status = HvInitialize(&Hive->Hive, HINIT_CREATE, 0, 0, 0, CmpAllocate, CmpFree, CmpFileSetSize, CmpFileWrite, CmpFileRead, CmpFileFlush, 1, NULL); if (!NT_SUCCESS(Status)) { return Status; } if (!CmCreateRootNode (&Hive->Hive, L"")) { HvFree (&Hive->Hive); return STATUS_INSUFFICIENT_RESOURCES; } Hive->Flags = HIVE_NO_FILE; /* Add the new hive to the hive list */ InsertTailList ( &CmiHiveListHead, &Hive->HiveList); VERIFY_REGISTRY_HIVE (Hive); return STATUS_SUCCESS; }