CmpLockRegistryFreezeAware

NTSTATUS __stdcall CmpLockRegistryFreezeAware(UINT8 LockExclusive){
  UINT64 v2; 
  UINT8 v3; 
  UINT8 v4; 
  IRP *v6; 
  __int128 v7; 
  struct _KEVENT Event; 
  v7 = 0i64;
  memset(&Event, 0, sizeof(Event));
  KeInitializeEvent(&Event, SynchronizationEvent, 0);
  if( LockExclusive )
    CmpLockRegistryExclusive();
  else
    CmpLockRegistry();
  while( CmpFreezeThawState == 1 )
  {
    KeResetEvent(&Event, v2, v3, v4, v6);
    ExAcquirePushLockExclusiveEx((UINT64)&CmpFreezeListLock, 0i64);
    if( *(__int64 **)qword_140C47BC8 != &CmpFreezeThawWaitListHead )
      __fastfail(3u);
    *((_QWORD *)&v7 + 1) = qword_140C47BC8;
    *(_QWORD *)&v7 = &CmpFreezeThawWaitListHead;
    *(_QWORD *)qword_140C47BC8 = &v7;
    qword_140C47BC8 = (__int64)&v7;
    ExReleasePushLockEx((UINT64)&CmpFreezeListLock, 0i64);
    CmpUnlockRegistry();
    KeWaitForSingleObject(&Event, Executive, 0, 0, 0i64);
    if( LockExclusive )
      CmpLockRegistryExclusive();
    else
      CmpLockRegistry();
  }
  return 0;
}

Referenced by:

CmLoadAppKey
CmRestoreKey
CmpBecomeActiveFlusherAndReconciler
CmpDoFlushNextHive
CmpFlushHive
CmpLateUnloadHiveWorker
CmpLoadKeyCommon
CmpPerformUnloadKey
CmpResolveHiveLoadConflict
CmpStartRMLogs
CmpTryToRundownHive
ExpWatchProductTypeWork
NtFlushKey