CmpLockRegistryFreezeAware

NTSTATUS __stdcall CmpLockRegistryFreezeAware(UINT8 LockExclusive){
  __int128 v3; 
  __int128 Object; 
  __int64 v5; 

  v5 = 0i64;
  v3 = 0i64;
  Object = 0i64;
  KeInitializeEvent((INT64)&Object, 1, 0);
  if( LockExclusive )
    CmpLockRegistryExclusive();
  else
    CmpLockRegistry();
  while( *(&stru_140CF2E80 + 1623) == 1 )
  {
    KeResetEvent((_KEVENT *)&Object);
    ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&CmpDummyThreadEvent + 60, 0i64);
    if( (_UNKNOWN *)**(&CmpDummyThreadEvent + 49) != (_UNKNOWN *)((char *)&CmpDummyThreadEvent + 384) )
      __fastfail(3u);
    *((_QWORD *)&v3 + 1) = *(&CmpDummyThreadEvent + 49);
    *(_QWORD *)&v3 = (char *)&CmpDummyThreadEvent + 384;
    **(&CmpDummyThreadEvent + 49) = &v3;
    *(&CmpDummyThreadEvent + 49) = &v3;
    ExReleasePushLockEx((ULONG_PTR)&CmpDummyThreadEvent + 480, 0);
    CmpUnlockRegistry();
    KeWaitForSingleObject((UINT64)&Object, 0, 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