CmpBecomeActiveFlusherAndReconciler

void __fastcall CmpBecomeActiveFlusherAndReconciler(__int64 a1){
  volatile signed __int64 *v2; 
  _HIVE_WRITE_WAIT_QUEUE *v3; 
  UINT64 v4; 
  char v5; 
  _HIVE_WRITE_WAIT_QUEUE *v6; 
  v2 = (volatile signed __int64 *)(a1 + 72);
  v3 = (_HIVE_WRITE_WAIT_QUEUE *)(a1 + 4248);
  while( 1 )
  {
    CmpLockRegistryFreezeAware(0);
    ExAcquirePushLockExclusiveEx((UINT64)v2, 0i64);
    if( PoIsInitializedStopWatch(v3) )
    {
      v6 = v3;
      goto LABEL_8;
    }
    if( !PoIsInitializedStopWatch((_QWORD *)(a1 + 4232)) )
      break;
    v6 = (_HIVE_WRITE_WAIT_QUEUE *)(a1 + 4232);
LABEL_8:
    CmpWaitOnHiveWriteQueue((_CMHIVE *)a1, v6, v4);
  }
  CmpAcquireWriteQueue(v3);
  CmpAcquireWriteQueue((_QWORD *)(a1 + 4232));
  v5 = _InterlockedExchangeAdd64(v2, 0xFFFFFFFFFFFFFFFFui64);
  if( (v5 & 2) != 0 && (v5 & 4) == 0 )
    ExfTryToWakePushLock(v2);
  KeAbPostRelease((PVOID)v2);
  CmpUnlockRegistry();
}

Referenced by:

CmReplaceKey
CmpLoadHiveThread
CmpRefreshHive
CmpSaveKeyByFileCopy