CmFreezeRegistry

__int64 __fastcall CmFreezeRegistry(int a1){
  _ETHREAD *CurrentThread; 
  NTSTATUS v2; 
  _CMHIVE *i; 
  _CMHIVE *NextActiveHive; 
  _CMHIVE *v6; 
  int v7; 
  _ETHREAD *v8; 
  _CMHIVE *j; 
  _CMHIVE *v10; 
  _EX_RUNDOWN_REF *v11; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v2 = 0;
  --CurrentThread->Tcb.KernelApcDisable;
  if( ExAcquireRundownProtection((_EX_RUNDOWN_REF *)&CmpDummyThreadEvent + 132) )
  {
    CmpLockRegistryExclusive();
    if( *(&stru_140CF2E80 + 1623) )
    {
      v2 = -1073741431;
      CmpUnlockRegistry();
    }
    else
    {
      for( i = 0i64; ; i = v6 )
      {
        NextActiveHive = CmpGetNextActiveHive(i);
        v6 = NextActiveHive;
        if( !NextActiveHive )
          break;
        if( (NextActiveHive->Hive.HiveFlags & 3) == 0 )
        {
          NextActiveHive->Hive.BaseBlock->ThawRmId = NextActiveHive->Hive.BaseBlock->RmId;
          NextActiveHive->Hive.BaseBlock->ThawTmId = NextActiveHive->Hive.BaseBlock->TmId;
          NextActiveHive->Hive.BaseBlock->ThawLogId = NextActiveHive->Hive.BaseBlock->LogId;
          NextActiveHive->Hive.BaseBlock->RmId = 0i64;
          NextActiveHive->Hive.BaseBlock->TmId = 0i64;
          NextActiveHive->Hive.BaseBlock->LogId = 0i64;
          NextActiveHive->Hive.BaseBlock->GuidSignature = 0;
          if( (NextActiveHive->Flags & 0x300) != 256 && !NextActiveHive->Hive.DirtyCount )
          {
            ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&NextActiveHive->Hive.WriterLock, 0i64);
            HvMarkBaseBlockDirty(&v6->Hive);
            if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&v6->Hive.WriterLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
              ExfTryToWakePushLock((_EX_PUSH_LOCK *)&v6->Hive.WriterLock);
            KeAbPostRelease(&v6->Hive.WriterLock);
          }
        }
      }
      v7 = CmFreezeThawTimeoutInSeconds;
      *(&stru_140CF2E80 + 1623) = 1;
      if( a1 )
        v7 = a1;
      KiSetTimerEx(
        (_KTIMER *)((char *)&CmpDummyThreadEvent + 416),
        (_LARGE_INTEGER)(-10000000i64 * v7),
        0i64,
        0,
        (_KDPC *)((char *)&CmpDummyThreadEvent + 544));
      CmpDisableLazyFlush(2ui64);
      CmpUnlockRegistry();
      v8 = (_ETHREAD *)KeGetCurrentThread();
      --v8->Tcb.KernelApcDisable;
      for( j = 0i64; ; j = (_CMHIVE *)v11 )
      {
        v10 = CmpGetNextActiveHive(j);
        v11 = (_EX_RUNDOWN_REF *)v10;
        if( !v10 )
          break;
        if( (v10->Hive.HiveFlags & 3) == 0 )
        {
          v2 = CmpFlushHive(v10, 0xDui64);
          if( v2 < 0 )
          {
            ExReleaseRundownProtection(v11 + 204);
            CmThawRegistry();
            v2 = -1073741491;
            break;
          }
        }
      }
      KeLeaveCriticalRegionThread(KeGetCurrentThread());
    }
    ExReleaseRundownProtection((_EX_RUNDOWN_REF *)&CmpDummyThreadEvent + 132);
    KeLeaveCriticalRegionThread(KeGetCurrentThread());
  }
  else
  {
    KeLeaveCriticalRegionThread(KeGetCurrentThread());
    return(unsigned int)-1073741431;
  }
  return(unsigned int)v2;
}

Referenced by:

NtFreezeRegistry