PspChangeProcessExecutionState

__int64 __fastcall PspChangeProcessExecutionState(ULONG_PTR BugCheckParameter1){
  unsigned int v1; 
  char v2; 
  unsigned __int32 v4; 
  struct _DMA_ADAPTER *v5; 
  int v6; 
  unsigned int v7; 
  unsigned __int32 v9; 
  char v10; 
  char v11; 
  unsigned int SessionId; 
  struct _DMA_ADAPTER *v13; 
  char v14; 
  unsigned __int32 v15; 
  int v16; 
  bool v17; 
  signed __int32 v18; 
  void(__fastcall **ExtensionTable)(ULONG_PTR); 
  int v20; 
  char v21; 
  KAPC_STATE v22; 
  _KAPC_STATE ApcState; 
  v21 = 0;
  v1 = 0;
  memset(&ApcState, 0, sizeof(ApcState));
  v2 = 0;
  memset(&v22, 0, sizeof(v22));
  _m_prefetchw((const void *)(BugCheckParameter1 + 1120));
  v4 = *(_DWORD *)(BugCheckParameter1 + 1120);
  v5 = 0i64;
  while( (v4 & 0x40000000) == 0 )
  {
    v6 = (v4 >> 28) & 3;
    v7 = (v4 >> 22) & 3;
    if( v6 == v7 )
      break;
    v9 = v4;
    v4 = _InterlockedCompareExchange((volatile signed __int32 *)(BugCheckParameter1 + 1120), v4 | 0x40000000, v4);
    if( v9 == v4 )
    {
LABEL_6:
      v10 = 0;
      v11 = v7 ^ v6;
      if( !v2 )
      {
        KiStackAttachProcess((_KPROCESS *)BugCheckParameter1, 0i64, &ApcState);
        SessionId = MmGetSessionIdEx(BugCheckParameter1);
        if( SessionId != -1 )
        {
          LODWORD(v13) = MmGetSessionById(SessionId);
          v5 = v13;
          if( v13 )
          {
            if( MmAttachSession(v13, &v22) < 0 )
            {
              HalPutDmaAdapter(v5);
              v5 = 0i64;
            }
          }
        }
        v2 = 1;
      }
      if( (v11 & 2) != 0 )
      {
        if( (v6 & 2) != 0 )
          v10 = 1;
        else
          MmInSwapWorkingSet((_EPROCESS *)BugCheckParameter1);
      }
      if( (v11 & 1) != 0 )
      {
        v14 = 1;
        v21 = 1;
        if( (v6 & 1) != 0 )
          PsFreezeProcess(BugCheckParameter1, 1);
        else
          PsThawProcess(BugCheckParameter1, 1);
      }
      else
      {
        v14 = v21;
      }
      v7 = v6;
      if( v10 )
      {
        v20 = MmOutSwapWorkingSet((_EPROCESS *)BugCheckParameter1, PspOutSwapSharedPages != 0);
        if( v20 < 0 )
        {
          if( v20 == -1073741671 )
            v1 = -1073741671;
          v7 = v6 & 0xFFFFFFFD;
        }
      }
      _m_prefetchw((const void *)(BugCheckParameter1 + 1120));
      v15 = *(_DWORD *)(BugCheckParameter1 + 1120);
      v16 = v6;
      do
      {
        v6 = (v15 >> 28) & 3;
        if( v6 != v16 && v6 != v7 )
          goto LABEL_6;
        v18 = _InterlockedCompareExchange(
                (volatile signed __int32 *)(BugCheckParameter1 + 1120),
                v15 & 0x8F3FFFFF | ((v7 | (v7 << 6)) << 22),
                v15);
        v17 = v15 == v18;
        v15 = v18;
      }
      while( !v17 );
      if( v5 )
      {
        MmDetachSession(v5, &v22);
        HalPutDmaAdapter(v5);
      }
      KiUnstackDetachProcess(&ApcState, 0i64);
      if( v14 )
      {
        ExtensionTable = (void(__fastcall **)(ULONG_PTR))ExGetExtensionTable(PspMmcssExtensionHost);
        if( ExtensionTable )
        {
          (*ExtensionTable)(BugCheckParameter1);
          ExReleaseExtensionTable(PspMmcssExtensionHost);
        }
      }
      return v1;
    }
  }
  return v1;
}

Referenced by:

PsSwapProcessWorkingSet
PspAssignProcessToJob
PspExecuteJobFreezeThawCallback
PspInsertThread
PspRemoveProcessFromJobChain