[NTOSKRNL]
authorEric Kohl <eric.kohl@reactos.org>
Mon, 29 Jun 2015 18:26:56 +0000 (18:26 +0000)
committerEric Kohl <eric.kohl@reactos.org>
Mon, 29 Jun 2015 18:26:56 +0000 (18:26 +0000)
Add CmpDestroySecurityCache() and CmpDestroyHiveViewList() stubs and call them in CmpDestroyHive and CmUnloadKey().

CORE-6492 #resolve #comment Thank you Hermes! This is exactly what I needed!

svn path=/trunk/; revision=68313

reactos/ntoskrnl/config/cmapi.c
reactos/ntoskrnl/config/cminit.c
reactos/ntoskrnl/config/cmmapvw.c
reactos/ntoskrnl/config/cmsecach.c
reactos/ntoskrnl/include/internal/cm.h

index 869a676..e2e1f6a 100644 (file)
@@ -2241,7 +2241,11 @@ CmUnloadKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
     /* 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);
index 7b542c1..dea2311 100644 (file)
@@ -257,6 +257,12 @@ CmpDestroyHive(IN PCMHIVE CmHive)
     /* 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);
 
index 7314eae..d223d2f 100644 (file)
@@ -29,3 +29,54 @@ CmpInitHiveViewList(IN PCMHIVE 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 */
index 872ede5..69236c0 100644 (file)
@@ -35,3 +35,18 @@ CmpInitSecurityCache(IN PCMHIVE Hive)
         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 */
index d991869..0647c59 100644 (file)
@@ -552,6 +552,12 @@ CmpInitHiveViewList(
     IN PCMHIVE Hive
 );
 
+VOID
+NTAPI
+CmpDestroyHiveViewList(
+    IN PCMHIVE Hive
+);
+
 //
 // Security Cache Functions
 //
@@ -561,6 +567,12 @@ CmpInitSecurityCache(
     IN PCMHIVE Hive
 );
 
+VOID
+NTAPI
+CmpDestroySecurityCache(
+    IN PCMHIVE Hive
+);
+
 //
 // Value Cache Functions
 //