PspChangeProcessExecutionState

NTSTATUS __stdcall PspChangeProcessExecutionState(_EPROCESS *Process){
  NTSTATUS v1; 
  char v2; 
  unsigned __int32 Flags2; 
  _ADAPTER_OBJECT *v5; 
  int v6; 
  unsigned int v7; 
  unsigned __int32 v9; 
  char v10; 
  char v11; 
  unsigned int SessionId; 
  _ADAPTER_OBJECT *SessionById; 
  char v14; 
  unsigned __int32 v15; 
  int v16; 
  bool v17; 
  signed __int32 v18; 
  void(__fastcall **ExtensionTable)(_EPROCESS *); 
  NTSTATUS 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(&Process->1120);
  Flags2 = Process->Flags2;
  v5 = 0i64;
  while( (Flags2 & 0x40000000) == 0 )
  {
    v6 = (Flags2 >> 28) & 3;
    v7 = (Flags2 >> 22) & 3;
    if( v6 == v7 )
      break;
    v9 = Flags2;
    Flags2 = _InterlockedCompareExchange((volatile signed __int32 *)&Process->1120, Flags2 | 0x40000000, Flags2);
    if( v9 == Flags2 )
    {
LABEL_6:
      v10 = 0;
      v11 = v7 ^ v6;
      if( !v2 )
      {
        KiStackAttachProcess(Process, 0i64, &ApcState);
        SessionId = MmGetSessionIdEx(Process);
        if( SessionId != -1 )
        {
          SessionById = (_ADAPTER_OBJECT *)MmGetSessionById(SessionId);
          v5 = SessionById;
          if( SessionById )
          {
            if( MmAttachSession(SessionById, &v22) < 0 )
            {
              HalPutDmaAdapter(v5);
              v5 = 0i64;
            }
          }
        }
        v2 = 1;
      }
      if( (v11 & 2) != 0 )
      {
        if( (v6 & 2) != 0 )
          v10 = 1;
        else
          MmInSwapWorkingSet(Process);
      }
      if( (v11 & 1) != 0 )
      {
        v14 = 1;
        v21 = 1;
        if( (v6 & 1) != 0 )
          PsFreezeProcess(Process, 1u);
        else
          PsThawProcess(Process, 1u);
      }
      else
      {
        v14 = v21;
      }
      v7 = v6;
      if( v10 )
      {
        v20 = MmOutSwapWorkingSet(Process, *(&stru_140CF2E80 + 1817) != 0);
        if( v20 < 0 )
        {
          if( v20 == -1073741671 )
            v1 = -1073741671;
          v7 = v6 & 0xFFFFFFFD;
        }
      }
      _m_prefetchw(&Process->1120);
      v15 = Process->Flags2;
      v16 = v6;
      do
      {
        v6 = (v15 >> 28) & 3;
        if( v6 != v16 && v6 != v7 )
          goto LABEL_6;
        v18 = _InterlockedCompareExchange(
                (volatile signed __int32 *)&Process->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 **)(_EPROCESS *))ExGetExtensionTable((_EX_HOST *)PspMmcssExtensionHost);
        if( ExtensionTable )
        {
          (*ExtensionTable)(Process);
          ExReleaseExtensionTable(PspMmcssExtensionHost);
        }
      }
      return v1;
    }
  }
  return v1;
}

Referenced by:

PsSwapProcessWorkingSet
PspAssignProcessToJob
PspExecuteJobFreezeThawCallback
PspInsertThread
PspRemoveProcessFromJobChain