{
/* Don't touch the hive */
CmpLockHiveFlusherExclusive(CmHive);
+
ASSERT(CmHive->ViewLock);
KeAcquireGuardedMutex(CmHive->ViewLock);
CmHive->ViewLockOwner = KeGetCurrentThread();
{
/* 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);
}
}
}
+ /* Set the loading flag */
+ CmHive->HiveIsLoading = TRUE;
+
/* Flush the hive */
CmFlushKey(Kcb, TRUE);
{
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;
}
Hive->NotifyList.Flink = NULL;
Hive->NotifyList.Blink = NULL;
- /* Set loading flag */
+ /* Set the loading flag */
Hive->HiveIsLoading = TRUE;
/* Set the current thread as creator */
}
}
+ /* Reset the loading flag */
+ Hive->HiveIsLoading = FALSE;
+
/* Lock the hive list */
ExAcquirePushLockExclusive(&CmpHiveListHeadLock);