CmpBlockHiveWrites

NTSTATUS __stdcall CmpBlockHiveWrites(_CMHIVE *Hive, UINT64 Flags, _CMHIVE **TerminalHive){
  volatile signed __int32 *v5; 
  int v6; 
  __int64 *NextHive; 
  __int64 *v8; 
  v5 = 0i64;
  v6 = Flags;
  while( 1 )
  {
    NextHive = CmpGetNextHive(v5);
    v8 = NextHive;
    if( !NextHive )
      break;
    if( Hive == (_CMHIVE *)NextHive || !Hive )
    {
      if( !v6 || (v6 & (_DWORD)NextHive[519]) == v6 || NextHive == (__int64 *)CmpMasterHive )
      {
        CmpReferenceHive((_CMHIVE *)NextHive);
        if( TerminalHive )
          *TerminalHive = (_CMHIVE *)v8;
        ExAcquirePushLockExclusiveEx((UINT64)(v8 + 9), 0i64);
      }
      if( Hive == (_CMHIVE *)v8 )
      {
        if( _InterlockedExchangeAdd((volatile signed __int32 *)v8 + 1068, 0xFFFFFFFF) == 1 )
          CmpDeleteHive(v8);
        return 0;
      }
    }
    v5 = (volatile signed __int32 *)v8;
  }
  if( !Hive )
    return 0;
  return -1073741772;
}

Referenced by:

CmpVEExecuteOpenLogic
CmpVEExecuteRealStoreParseLogic
CmpVEExecuteVirtualStoreParseLogic