KiSwapProcess

VOID __fastcall KiSwapProcess(_EPROCESS *NewProcess, _EPROCESS *OldProcess){
  struct _KPRCB *CurrentPrcb; 
  unsigned __int64 v4; 
  __int64 v5; 
  unsigned __int64 v6; 
  unsigned __int64 v7; 
  unsigned __int64 v8; 
  unsigned __int64 v9; 
  CurrentPrcb = KeGetCurrentPrcb();
  v4 = *((unsigned __int8 *)CurrentPrcb + 209);
  v5 = 8i64 * *((unsigned __int8 *)CurrentPrcb + 208) + 376;
  _interlockedbittestandset64((volatile signed __int32 *)((char *)NewProcess + v5), v4);
  v6 = *((_QWORD *)NewProcess + 5);
  if( (_BYTE)KiKvaShadow )
  {
    v7 = *((_QWORD *)NewProcess + 5);
    if( (v6 & 2) != 0 )
      v7 = v6 | 0x8000000000000000ui64;
    __writegsqword(0x9000u, v7);
    KiSetAddressPolicy(*((_BYTE *)NewProcess + 912));
  }
  __writecr3(v6);
  if( !KiFlushPcid && (_BYTE)KiKvaShadow )
  {
    v8 = __readcr4();
    if( (v8 & 0x20080) != 0 )
    {
      __writecr4(v8 ^ 0x80);
      __writecr4(v8);
    }
    else
    {
      v9 = __readcr3();
      __writecr3(v9);
    }
  }
  _interlockedbittestandreset64((volatile signed __int32 *)((char *)OldProcess + v5), v4);
}

Referenced by:

KiUnstackDetachProcess