KiRequestProcessInSwap

VOID __stdcall KiRequestProcessInSwap(_ETHREAD *Thread, _EPROCESS *Process){
  struct _KPRCB *CurrentPrcb; 
  char v4; 
  _EPROCESS *v6; 
  _EPROCESS **v7; 
  signed __int64 *v8; 
  signed __int64 v9; 
  signed __int64 v10; 
  __int64 v11; 
  UINT64 SpinCount; 
  *((_DWORD *)Thread + 109) = KUSER_SHARED_DATA.TickCount.LowPart;
  CurrentPrcb = KeGetCurrentPrcb();
  v4 = 0;
  LODWORD(SpinCount) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)Thread + 16, 0i64) )
  {
    do
      KeYieldProcessorEx(&SpinCount);
    while( *((_QWORD *)Thread + 8) );
    v11 = *((_QWORD *)CurrentPrcb + 4247);
    if( v11 && *((_BYTE *)CurrentPrcb + 32) <= 1u )
      ++*(_DWORD *)(v11 + 24);
  }
  *((_BYTE *)Thread + 388) = 9;
  if( (*((_DWORD *)Thread + 30) & 0x1000) != 0 )
    _interlockedbittestandreset((volatile signed __int32 *)Thread + 30, 0xCu);
  *((_QWORD *)Thread + 8) = 0i64;
  v6 = (_EPROCESS *)((char *)Thread + 216);
  v7 = (_EPROCESS **)*((_QWORD *)Process + 44);
  if( *v7 != (_EPROCESS *)((char *)Process + 344) )
    __fastfail(3u);
  *(_QWORD *)v6 = (char *)Process + 344;
  *((_QWORD *)v6 + 1) = v7;
  *v7 = v6;
  *((_QWORD *)Process + 44) = v6;
  if( (*((_DWORD *)Process + 210) & 7) == 1 )
  {
    _InterlockedXor((volatile signed __int32 *)Process + 210, 3u);
    v4 = 1;
  }
  _InterlockedAnd((volatile signed __int32 *)Process, 0xFFFFFF7F);
  if( v4 )
  {
    MmNotifyProcessInSwapTrigger((__int64)Process);
    v8 = (signed __int64 *)((char *)Process + 360);
    _m_prefetchw(&KiProcessInSwapListHead);
    v9 = KiProcessInSwapListHead;
    do
    {
      *v8 = v9;
      v10 = v9;
      v9 = _InterlockedCompareExchange64(&KiProcessInSwapListHead, (signed __int64)v8, v9);
    }
    while( v9 != v10 );
    if( !v9 )
      KeSetEvent(&KiSwapEvent, 10);
  }
}

Referenced by:

KiExitDispatcher
KiInSwapSingleProcess
KiReadyThread