Author: hbelusca Date: Fri Jun 16 21:06:04 2017 New Revision: 75066
URL: http://svn.reactos.org/svn/reactos?rev=75066&view=rev Log: [NTOS]: Fix a bit the CmUnloadKey() function: - When a hive is unloaded, we *must* set the HIVE_IS_UNLOADING flag before doing anything else (as other code in Cm depends on this); - If we don't force a hive unload, we *must* check whether there are other opened handles to keys inside this hive, and if so, we must fail. If this is a force-unload however, we *must* invalidate/close all the opened handles to keys inside this hive, BUT this is left UNIMPLEMENTED at the moment (and therefore expect the already existing problems linked to this to still happen). - Move the HvFree(Hive); call at the very end, just before deleting the Cm hive, and as is done in CmpDestroyHive().
Modified: trunk/reactos/ntoskrnl/config/cmapi.c
Modified: trunk/reactos/ntoskrnl/config/cmapi.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/config/cmapi.c?rev... ============================================================================== --- trunk/reactos/ntoskrnl/config/cmapi.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/config/cmapi.c [iso-8859-1] Fri Jun 16 21:06:04 2017 @@ -2198,6 +2198,27 @@ return STATUS_INVALID_PARAMETER; }
+ /* Mark this hive as being unloaded */ + Hive->HiveFlags |= HIVE_IS_UNLOADING; + + /* Search for any opened keys in this hive, and take an appropriate action */ + if (Kcb->RefCount > 1) + { + if (Flags != REG_FORCE_UNLOAD) + { + if (CmCountOpenSubKeys(Kcb, FALSE) != 0) + { + /* There are open subkeys but we don't force hive unloading, fail */ + Hive->HiveFlags &= ~HIVE_IS_UNLOADING; + return STATUS_CANNOT_DELETE; + } + } + else + { + DPRINT1("CmUnloadKey: Force unloading is UNIMPLEMENTED, expect dangling KCBs problems!\n"); + } + } + /* Flush the hive */ CmFlushKey(Kcb, TRUE);
@@ -2206,9 +2227,8 @@ { DPRINT("CmpUnlinkHiveFromMaster() failed!\n");
- /* Remove the unloading flag */ + /* Remove the unloading flag and return failure */ Hive->HiveFlags &= ~HIVE_IS_UNLOADING; - return STATUS_INSUFFICIENT_RESOURCES; }
@@ -2243,15 +2263,15 @@ /* Destroy the view list */ CmpDestroyHiveViewList(CmHive);
- /* Free the hive storage */ - HvFree(Hive); - /* Delete the flusher lock */ ExDeleteResourceLite(CmHive->FlusherLock); ExFreePoolWithTag(CmHive->FlusherLock, TAG_CMHIVE);
/* Delete the view lock */ ExFreePoolWithTag(CmHive->ViewLock, TAG_CMHIVE); + + /* Free the hive storage */ + HvFree(Hive);
/* Free the hive */ CmpFree(CmHive, TAG_CM);