VmpPauseResumeNotify

__int64 __fastcall VmpPauseResumeNotify(__int64 a1, int a2){
  _ETHREAD *CurrentThread; 
  int v5; 
  _EX_PUSH_LOCK *v6; 
  unsigned int v7; 
  NTSTATUS v8; 
  int v9; 
  _EPROCESS *v10; 
  int i; 
  int v12; 
  bool v13; 
  int v14; 
  int v15; 
  unsigned int v16; 
  int ProcessInformation; 
  __int64 v19; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v5 = 4;
  --CurrentThread->Tcb.KernelApcDisable;
  v6 = (_EX_PUSH_LOCK *)(a1 + 96);
  ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)(a1 + 96), 0i64);
  v7 = *(_DWORD *)(a1 + 104);
  if( (v7 & 1) != 0 )
  {
    v8 = -1073740682;
    goto LABEL_31;
  }
  v9 = (v7 >> 1) & 3;
  if( a2 )
  {
    if( v9 >= a2 )
    {
      v8 = -1073741811;
      goto LABEL_31;
    }
  }
  else if( !v9 )
  {
    v8 = 1075380276;
    goto LABEL_31;
  }
  *(_DWORD *)(a1 + 104) = v7 | 1;
  if( (_InterlockedExchangeAdd64(&v6->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock(v6);
  KeAbPostRelease(v6);
  v19 = 0i64;
  ProcessInformation = 3;
  if( a2 )
  {
    for( i = v9 + 1; ; ++i )
    {
      if( i > a2 )
      {
        v5 = a2;
        goto LABEL_28;
      }
      if( i == 1 )
      {
        v10 = (_EPROCESS *)(KeGetCurrentThread()->ApcState.Process->Vm.Instance.WorkingSetLeafPrivateSize << 12 >> 20);
        if( (unsigned __int64)v10 > (unsigned int)VmPauseOutswapSizeCapMB )
          continue;
        v19 = 0i64;
      }
      else
      {
        if( (unsigned int)(i - 2) > 1
          || !MiGetProcessPartition(KeGetCurrentThread()->ApcState.Process, v10)->Store.Registered && i != 3 )
        {
          continue;
        }
        v12 = 3;
        v13 = (*(_DWORD *)(a1 + 88) & 1) == 0;
        v14 = *(_DWORD *)(a1 + 88) & 1;
        LODWORD(v19) = 1;
        if( !v13 )
          v12 = 35;
        HIDWORD(v19) = v12;
        v15 = 32 * v14 + 3;
        if( (unsigned int)SmStoreExistsForProcess(KeGetCurrentThread()->ApcState.Process) )
        {
          HIDWORD(v19) = v15 | 8;
          if( i == 3 )
            HIDWORD(v19) = v15 | 0x18;
        }
      }
      v8 = MmProcessWorkingSetControl((VOID *)0xFFFFFFFFFFFFFFFFi64, &ProcessInformation, 0xCui64, 0);
      if( v8 < 0 )
        goto LABEL_29;
    }
  }
  v19 = 0x100000000i64;
  MmProcessWorkingSetControl((VOID *)0xFFFFFFFFFFFFFFFFi64, &ProcessInformation, 0xCui64, 0);
  v5 = 0;
LABEL_28:
  v8 = 0;
LABEL_29:
  ExAcquirePushLockExclusiveEx(v6, 0i64);
  v16 = *(_DWORD *)(a1 + 104) & 0xFFFFFFFE;
  *(_DWORD *)(a1 + 104) = v16;
  if( v5 != 4 )
    *(_DWORD *)(a1 + 104) = v16 ^ ((unsigned __int8)v16 ^ (unsigned __int8)(2 * v5)) & 6;
LABEL_31:
  if( (_InterlockedExchangeAdd64(&v6->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock(v6);
  KeAbPostRelease(v6);
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  return(unsigned int)v8;
}

Referenced by:

VmPauseResumeNotify