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?re…
==============================================================================
--- 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);