diff --git a/ntoskrnl/config/cmapi.c b/ntoskrnl/config/cmapi.c index 3b1455df1ad..fe81bbc3051 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 bf055fd914d..5d8ea072761 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);