/* Remove the hive from the hive file list */
CmpRemoveFromHiveFileList(CmHive);
- /* FIXME: More cleanup */
+ /* Destroy the security descriptor cache */
+ CmpDestroySecurityCache(CmHive);
+
+ /* Destroy the view list */
+ CmpDestroyHiveViewList(CmHive);
/* Free the hive storage */
HvFree(Hive);
/* Delete the view lock */
ExFreePoolWithTag(CmHive->ViewLock, TAG_CM);
+ /* Destroy the security descriptor cache */
+ CmpDestroySecurityCache(CmHive);
+
+ /* Destroy the view list */
+ CmpDestroyHiveViewList(CmHive);
+
/* Free the hive storage */
HvFree(&CmHive->Hive);
Hive->PinnedViews = 0;
Hive->UseCount = 0;
}
+
+VOID
+NTAPI
+CmpDestroyHiveViewList(IN PCMHIVE Hive)
+{
+ PCM_VIEW_OF_FILE CmView;
+ PLIST_ENTRY EntryList;
+
+ /* Do NOT destroy the views of read-only hives */
+ ASSERT(Hive->Hive.ReadOnly == FALSE);
+
+ /* Free all the views inside the Pinned View List */
+ EntryList = RemoveHeadList(&Hive->PinViewListHead);
+ while (EntryList != &Hive->PinViewListHead)
+ {
+ CmView = CONTAINING_RECORD(EntryList, CM_VIEW_OF_FILE, PinViewList);
+
+ /* FIXME: Unmap the view if it is mapped */
+
+ ExFreePool(CmView);
+
+ Hive->PinnedViews--;
+
+ EntryList = RemoveHeadList(&Hive->PinViewListHead);
+ }
+
+ /* The Pinned View List should be empty */
+ ASSERT(IsListEmpty(&Hive->PinViewListHead) == TRUE);
+ ASSERT(Hive->PinnedViews == 0);
+
+ /* Now, free all the views inside the LRU View List */
+ EntryList = RemoveHeadList(&Hive->LRUViewListHead);
+ while (EntryList != &Hive->LRUViewListHead)
+ {
+ CmView = CONTAINING_RECORD(EntryList, CM_VIEW_OF_FILE, LRUViewList);
+
+ /* FIXME: Unmap the view if it is mapped */
+
+ ExFreePool(CmView);
+
+ Hive->MappedViews--;
+
+ EntryList = RemoveHeadList(&Hive->LRUViewListHead);
+ }
+
+ /* The LRU View List should be empty */
+ ASSERT(IsListEmpty(&Hive->LRUViewListHead) == TRUE);
+ ASSERT(Hive->MappedViews == 0);
+}
+
+/* EOF */
InitializeListHead(&Hive->SecurityHash[i]);
}
}
+
+VOID
+NTAPI
+CmpDestroySecurityCache(IN PCMHIVE Hive)
+{
+ /* FIXME: clean Hive->SecurityHash and/or Hive->SecurityCache */
+
+ /* Reset data */
+ Hive->SecurityCount = 0;
+ Hive->SecurityCacheSize = 0;
+ Hive->SecurityHitHint = -1;
+ Hive->SecurityCache = NULL;
+}
+
+/* EOF */