VmpPauseResumeNotify

INT64 __fastcall VmpPauseResumeNotify(INT64 a1, INT64 a2){
  _ETHREAD *CurrentThread; 
  int v3; 
  int v5; 
  volatile INT64 *v6; 
  unsigned int v7; 
  NTSTATUS v8; 
  int v9; 
  int i; 
  __int64 v11; 
  int v12; 
  bool v13; 
  int v14; 
  int v15; 
  unsigned int v16; 
  int ProcessInformation; 
  __int64 v19; 
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v3 = a2;
  v5 = 4;
  --*((_WORD *)CurrentThread + 242);
  v6 = (volatile INT64 *)(a1 + 96);
  ExAcquirePushLockExclusiveEx(a1 + 96, 0i64);
  v7 = *(_DWORD *)(a1 + 104);
  if( (v7 & 1) != 0 )
  {
    v8 = -1073740682;
    goto LABEL_31;
  }
  v9 = (v7 >> 1) & 3;
  if( v3 )
  {
    if( v9 >= v3 )
    {
      v8 = -1073741811;
      goto LABEL_31;
    }
  }
  else if( !v9 )
  {
    v8 = 1075380276;
    goto LABEL_31;
  }
  *(_DWORD *)(a1 + 104) = v7 | 1;
  if( (_InterlockedExchangeAdd64(v6, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock(v6);
  KeAbPostRelease((PVOID)v6);
  v19 = 0i64;
  ProcessInformation = 3;
  if( v3 )
  {
    for( i = v9 + 1; ; ++i )
    {
      if( i > v3 )
      {
        v5 = v3;
        goto LABEL_28;
      }
      if( i == 1 )
      {
        if( *(_QWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 1792i64) << 12 >> 20 > (unsigned __int64)(unsigned int)VmPauseOutswapSizeCapMB )
          continue;
        v19 = 0i64;
      }
      else
      {
        if( (unsigned int)(i - 2) > 1 )
          continue;
        MiGetProcessPartition(*((_EPROCESS **)KeGetCurrentThread() + 23));
        if( !*(_DWORD *)(v11 + 1160) && 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( SmStoreExistsForProcess(*((_QWORD *)KeGetCurrentThread() + 23)) )
        {
          HIDWORD(v19) = v15 | 8;
          if( i == 3 )
            HIDWORD(v19) = v15 | 0x18;
        }
      }
      v8 = MmProcessWorkingSetControl((PVOID)0xFFFFFFFFFFFFFFFFi64, &ProcessInformation, 0xCui64, 0);
      if( v8 < 0 )
        goto LABEL_29;
    }
  }
  v19 = 0x100000000i64;
  MmProcessWorkingSetControl((PVOID)0xFFFFFFFFFFFFFFFFi64, &ProcessInformation, 0xCui64, 0);
  v5 = 0;
LABEL_28:
  v8 = 0;
LABEL_29:
  ExAcquirePushLockExclusiveEx((UINT64)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, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock(v6);
  KeAbPostRelease((PVOID)v6);
  KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  return(unsigned int)v8;
}

Referenced by:

VmPauseResumeNotify