CmpDoFlushNextHive

UINT8 __stdcall CmpDoFlushNextHive(UINT8 *WriteError, UINT64 *NextDueDelay){
  unsigned __int64 v2; 
  UINT8 v3; 
  _CMHIVE *NextActiveHive; 
  UINT64 v7; 
  UINT64 UnbiasedInterruptTime; 
  unsigned __int64 v10; 

  v2 = -1i64;
  v3 = 0;
  if( BYTE1(NlsMbCodePageTag) )
    return 0;
  NextActiveHive = CmpGetNextActiveHive(0i64);
  if( NextActiveHive )
  {
    do
    {
      v7 = -1i64;
      if( (NextActiveHive->Hive.HiveFlags & 3) == 0 )
      {
        if( NextActiveHive->Hive.DirtyCount || NextActiveHive->Hive.BaseBlockDirty )
        {
          UnbiasedInterruptTime = KiQueryUnbiasedInterruptTime(1u);
          v10 = NextActiveHive->DirtyTime + 10000000i64 * (unsigned int)dword_140C00400;
          if( UnbiasedInterruptTime >= v10 )
          {
            if( CmpFlushHive(NextActiveHive, 0x12ui64) < 0 )
            {
              v3 = 1;
              *WriteError = 1;
              v7 = 10000000i64 * (unsigned int)dword_140C0040C;
            }
          }
          else
          {
            v3 = 1;
            v7 = v10 - UnbiasedInterruptTime;
          }
        }
        else if( (NextActiveHive->FlushFlags & 1) == 0 )
        {
          CmpFlushHive(NextActiveHive, 0x22ui64);
        }
      }
      if( NextActiveHive->Frozen == 1 )
      {
        LOCK_HIVE_LOAD();
        CmpLockRegistryFreezeAware(0);
        if( NextActiveHive->Frozen == 1 )
          CmpDoQueueLateUnloadWorker(NextActiveHive);
        CmpUnlockRegistry();
        UNLOCK_HIVE_LOAD();
      }
      if( v7 >= v2 )
        v7 = v2;
      v2 = v7;
      NextActiveHive = CmpGetNextActiveHive(NextActiveHive);
    }
    while( NextActiveHive );
    if( v3 )
      *NextDueDelay = v7;
  }
  return v3;
}

Referenced by:

No references.