[NTOSKRNL]

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
This commit is contained in:
Eric Kohl 2015-06-29 18:26:56 +00:00
parent 223bd478e0
commit 3a7d34ee38
5 changed files with 89 additions and 1 deletions

View 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);

View 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);

View 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 */

View 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 */

View 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
//