https://git.reactos.org/?p=reactos.git;a=commitdiff;h=83fdb9a6d96ac86b4b02afc716a421336a6f2903
commit 83fdb9a6d96ac86b4b02afc716a421336a6f2903 Author: Hermès Bélusca-Maïto <[email protected]> AuthorDate: Sun Feb 17 00:54:59 2019 +0100 Commit: Hermès Bélusca-Maïto <[email protected]> CommitDate: Sun Feb 17 01:21:35 2019 +0100 [NTOS:CM] Set and reset the CMHIVE HiveIsLoading flag adequately. Fix an assertion in CmFlushKey() and reset the CMHIVE ViewLockOwner when releasing the view lock. --- ntoskrnl/config/cmapi.c | 20 +++++++++++++++++--- ntoskrnl/config/cminit.c | 5 ++++- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/ntoskrnl/config/cmapi.c b/ntoskrnl/config/cmapi.c index 3b1455df1a..fe81bbc305 100644 --- a/ntoskrnl/config/cmapi.c +++ b/ntoskrnl/config/cmapi.c @@ -1959,6 +1959,7 @@ CmFlushKey(IN PCM_KEY_CONTROL_BLOCK Kcb, { /* Don't touch the hive */ CmpLockHiveFlusherExclusive(CmHive); + ASSERT(CmHive->ViewLock); KeAcquireGuardedMutex(CmHive->ViewLock); CmHive->ViewLockOwner = KeGetCurrentThread(); @@ -1968,13 +1969,18 @@ CmFlushKey(IN PCM_KEY_CONTROL_BLOCK Kcb, { /* I don't believe the current Hv does shrinking */ ASSERT(FALSE); + // CMP_ASSERT_EXCLUSIVE_REGISTRY_LOCK_OR_LOADING(CmHive); } else { /* Now we can release views */ ASSERT(CmHive->ViewLock); - CMP_ASSERT_EXCLUSIVE_REGISTRY_LOCK_OR_LOADING(CmHive); - ASSERT(KeGetCurrentThread() == CmHive->ViewLockOwner); + // CMP_ASSERT_VIEW_LOCK_OWNED(CmHive); + ASSERT((CmpSpecialBootCondition == TRUE) || + (CmHive->HiveIsLoading == TRUE) || + (CmHive->ViewLockOwner == KeGetCurrentThread()) || + (CmpTestRegistryLockExclusive() == TRUE)); + CmHive->ViewLockOwner = NULL; KeReleaseGuardedMutex(CmHive->ViewLock); } @@ -2240,6 +2246,9 @@ CmUnloadKey(IN PCM_KEY_CONTROL_BLOCK Kcb, } } + /* Set the loading flag */ + CmHive->HiveIsLoading = TRUE; + /* Flush the hive */ CmFlushKey(Kcb, TRUE); @@ -2248,8 +2257,13 @@ CmUnloadKey(IN PCM_KEY_CONTROL_BLOCK Kcb, { DPRINT("CmpUnlinkHiveFromMaster() failed!\n"); - /* Remove the unloading flag and return failure */ + /* Remove the unloading flag */ Hive->HiveFlags &= ~HIVE_IS_UNLOADING; + + /* Reset the loading flag */ + CmHive->HiveIsLoading = FALSE; + + /* Return failure */ return STATUS_INSUFFICIENT_RESOURCES; } diff --git a/ntoskrnl/config/cminit.c b/ntoskrnl/config/cminit.c index bf055fd914..5d8ea07276 100644 --- a/ntoskrnl/config/cminit.c +++ b/ntoskrnl/config/cminit.c @@ -102,7 +102,7 @@ CmpInitializeHive(OUT PCMHIVE *CmHive, Hive->NotifyList.Flink = NULL; Hive->NotifyList.Blink = NULL; - /* Set loading flag */ + /* Set the loading flag */ Hive->HiveIsLoading = TRUE; /* Set the current thread as creator */ @@ -213,6 +213,9 @@ CmpInitializeHive(OUT PCMHIVE *CmHive, } } + /* Reset the loading flag */ + Hive->HiveIsLoading = FALSE; + /* Lock the hive list */ ExAcquirePushLockExclusive(&CmpHiveListHeadLock);
