CmpUpdateHiveRootCellFlags

INT64 __stdcall CmpUpdateHiveRootCellFlags(CMHIVE *Hive, UINT64 RootCellIndex){
  _EX_PUSH_LOCK *p_FlusherLock; 
  unsigned int v3; 
  _CELL_DATA *v5; 
  _CELL_DATA *v6; 
  unsigned int v7; 
  __int64 v9; 

  p_FlusherLock = (_EX_PUSH_LOCK *)&Hive->Hive.FlusherLock;
  v3 = RootCellIndex;
  v9 = 0xFFFFFFFFi64;
  ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)&Hive->Hive.FlusherLock, 0i64);
  v5 = Hive->Hive.GetCellRoutine(Hive, v3, &v9);
  v6 = v5;
  if( v5 )
  {
    if( (v5->u.KeyValue.NameLength & 0xC) != 12 )
    {
      if( !HvpMarkCellDirty(Hive, (PVOID)v3, 0, CmHiveDirtyNormal) )
      {
        v7 = -1073741670;
        goto LABEL_6;
      }
      v6->u.KeyNode.Flags |= 0xCu;
    }
    v7 = 0;
LABEL_6:
    Hive->Hive.ReleaseCellRoutine((_HHIVE *)Hive, (_HV_GET_CELL_CONTEXT *)&v9);
    goto LABEL_7;
  }
  v7 = -1073741670;
LABEL_7:
  if( _InterlockedCompareExchange64(&p_FlusherLock->_bf_0, 0i64, 17i64) != 17 )
    ExfReleasePushLockShared(p_FlusherLock);
  KeAbPostRelease(p_FlusherLock);
  return v7;
}

Referenced by:

CmpDoParseKey