CmFreezeRegistry

INT64 __stdcall CmFreezeRegistry(UINT64 TimeOutInSeconds){
  _ETHREAD *CurrentThread; 
  int v2; 
  int v3; 
  _CMHIVE *i; 
  _CMHIVE *NextActiveHive; 
  _CMHIVE *v6; 
  int v7; 
  _ETHREAD *v8; 
  _CMHIVE *j; 
  _CMHIVE *v10; 
  EVENT_DESCRIPTOR *v11; 
  struct _EX_RUNDOWN_REF *v12; 
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v2 = 0;
  v3 = TimeOutInSeconds;
  --*((_WORD *)CurrentThread + 242);
  if( ExAcquireRundownProtection((PEX_RUNDOWN_REF)&CmpShutdownRundown) )
  {
    CmpLockRegistryExclusive();
    if( CmpFreezeThawState )
    {
      v2 = -1073741431;
      CmpUnlockRegistry();
    }
    else
    {
      for( i = 0i64; ; i = v6 )
      {
        NextActiveHive = CmpGetNextActiveHive(i);
        v6 = NextActiveHive;
        if( !NextActiveHive )
          break;
        if( (*((_DWORD *)NextActiveHive + 40) & 3) == 0 )
        {
          *(_OWORD *)(*((_QWORD *)NextActiveHive + 8) + 4056i64) = *(_OWORD *)(*((_QWORD *)NextActiveHive + 8) + 112i64);
          *(_OWORD *)(*((_QWORD *)NextActiveHive + 8) + 4040i64) = *(_OWORD *)(*((_QWORD *)NextActiveHive + 8) + 148i64);
          *(_OWORD *)(*((_QWORD *)NextActiveHive + 8) + 4072i64) = *(_OWORD *)(*((_QWORD *)NextActiveHive + 8) + 128i64);
          *(_OWORD *)(*((_QWORD *)NextActiveHive + 8) + 112i64) = 0i64;
          *(_OWORD *)(*((_QWORD *)NextActiveHive + 8) + 148i64) = 0i64;
          *(_OWORD *)(*((_QWORD *)NextActiveHive + 8) + 128i64) = 0i64;
          *(_DWORD *)(*((_QWORD *)NextActiveHive + 8) + 164i64) = 0;
          if( (*((_DWORD *)NextActiveHive + 1038) & 0x300) != 256 && !*((_DWORD *)NextActiveHive + 26) )
          {
            ExAcquirePushLockExclusiveEx((UINT64)NextActiveHive + 80, 0i64);
            HvMarkBaseBlockDirty((_HHIVE *)v6);
            if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v6 + 10, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
              ExfTryToWakePushLock((volatile INT64 *)v6 + 10);
            KeAbPostRelease((char *)v6 + 80);
          }
        }
      }
      v7 = CmFreezeThawTimeoutInSeconds;
      CmpFreezeThawState = 1;
      if( v3 )
        v7 = v3;
      KiSetTimerEx((_KTIMER *)CmpFreezeThawTimer, (_LARGE_INTEGER)(-10000000i64 * v7), 0i64, 0, &CmpFreezeThawDpc);
      CmpDisableLazyFlush(2ui64);
      CmpUnlockRegistry();
      v8 = (_ETHREAD *)KeGetCurrentThread();
      --*((_WORD *)v8 + 242);
      for( j = 0i64; ; j = (_CMHIVE *)v12 )
      {
        v10 = CmpGetNextActiveHive(j);
        v12 = (struct _EX_RUNDOWN_REF *)v10;
        if( !v10 )
          break;
        if( (*((_DWORD *)v10 + 40) & 3) == 0 )
        {
          v2 = CmpFlushHive((ULONG_PTR)v10, 13, v11);
          if( v2 < 0 )
          {
            ExReleaseRundownProtection(v12 + 204);
            CmThawRegistry();
            v2 = -1073741491;
            break;
          }
        }
      }
      KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
    }
    ExReleaseRundownProtection((PEX_RUNDOWN_REF)&CmpShutdownRundown);
    KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  }
  else
  {
    KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
    return(unsigned int)-1073741431;
  }
  return(unsigned int)v2;
}

Referenced by:

NtFreezeRegistry