SwapContext

UINT8 __stdcall SwapContext(_ETHREAD *OldThread, _ETHREAD *NewThread, UINT8 SwapIrql){
  INT64 v3; 
  ULONG_PTR v4; 
  ULONG_PTR v5; 
  INT64 v6; 
  unsigned __int64 v7; 
  unsigned __int64 v8; 
  UINT64 v9; 
  ULONG_PTR v10; 
  _DWORD *v11; 
  unsigned __int64 v12; 
  unsigned __int64 v13; 
  ULONG64 v14; 
  unsigned __int64 v15; 
  unsigned __int64 v18; 
  unsigned __int8 v19; 
  __int64 v20; 
  unsigned __int64 v21; 
  unsigned __int64 v22; 
  __int64 v23; 
  unsigned __int64 v24; 
  unsigned int *v25; 
  unsigned __int64 v26; 
  unsigned int v27; 
  __int64 v28; 
  unsigned int v29; 
  __int64 v30; 
  unsigned int v31; 
  __int64 v32; 
  bool v33; 
  __int64 v34; 
  int v36; 
  _BYTE v37[32]; 
  INT64 v38; 
  _m_prefetchw((const void *)(v5 + 113));
  LOBYTE(v38) = (_BYTE)OldThread;
  if( *(_BYTE *)(v5 + 113) )
  {
    v36 = 0;
    do
    {
      ++v36;
      _mm_pause();
    }
    while( *(_BYTE *)(v5 + 113) );
  }
  *(_BYTE *)(v5 + 113) = 1;
  _disable();
  v7 = __rdtsc();
  v8 = (((unsigned __int64)HIDWORD(v7) << 32) | (unsigned int)v7) - *(_QWORD *)(v3 + 32448);
  *(_QWORD *)(v3 + 32568) += v8;
  *(_QWORD *)(v3 + 32448) += v8;
  v9 = v8;
  if( *(_BYTE *)(v3 + 6) )
  {
    *(_BYTE *)(v3 + 6) = 0;
    if( *(_QWORD *)(v3 + 24) != v5 )
      HalRequestSoftwareInterrupt(2i64);
  }
  if( (*(_BYTE *)(v5 + 2) & 0x36) != 0 )
  {
    KiBeginThreadAccountingPeriod((_KPRCB *)v3, (_KTHREAD *)v5, v9);
  }
  else
  {
    --*(_BYTE *)(v3 + 32);
    _enable();
  }
  ++*(_DWORD *)(v3 + 11580);
  v10 = KeFeatureBits;
  if( KiCacheIsoBitmap && (KeFeatureBits & 0x100000000000i64) != 0 )
    KiCheckAndApplyCacheIsolation(v3, v5);
  if( *(_QWORD *)(v3 + 24) != v5 && (unsigned __int8)*(_DWORD *)(v5 + 512) != *(_BYTE *)(v3 + 236) )
    KeCheckAndApplyBamQos(v3, v5, SwapIrql, v6);
  v11 = *(_DWORD **)(v4 + 96);
  v12 = *(_QWORD *)(v4 + 592) & 0xFFFFFFFFFFFFFFFDui64;
  v13 = *(_DWORD *)(v4 + 592) & 0xFFFFFFFD;
  if( v12 )
  {
    v12 >>= 32;
    if( (v10 & 0x4000000000i64) != 0 )
    {
      _xsaves(v11);
    }
    else if( (v10 & 0x8000) != 0 )
    {
      _xsaveopt(v11, v13);
    }
    else if( (v10 & 0x800000) != 0 )
    {
      _xsave(v11, v13);
    }
    else
    {
      _fxsave(v11);
    }
  }
  v11[6] = _mm_getcsr();
  if( (v13 & 0x100) != 0 && (_DWORD)KiIptMsrMask )
    KiSaveThreadIptState(v4);
  *(_QWORD *)(v4 + 88) = v37;
  if( *(char *)(v4 + 3) < 0 )
  {
    v14 = __readmsr(0xC0000102);
    v12 = (unsigned __int64)HIDWORD(v14) << 32;
    if( v14 >= MmUserProbeAddress )
      v14 = MmUserProbeAddress;
    *(_QWORD *)(*(_QWORD *)(v4 + 496) + 128i64) = v14;
  }
  if( *(_QWORD *)(*(_QWORD *)(v4 + 544) + 1408i64) )
  {
    v15 = __readmsr(0xC0000100);
    v12 = HIDWORD(v15);
    *(_QWORD *)(v4 + 1512) = v15;
  }
  if( _bittestandreset(MK_FP(__GS__, 2131i64), 0) )
    *(_BYTE *)(v4 + 127) |= 2u;
  if( _bittestandreset((signed __int32 *)(v5 + 127), 1u) )
    __writegsbyte(0x853u, *((_BYTE *)KeGetPcr() + 2131) | 1);
  v18 = *(_QWORD *)(v5 + 544);
  LOBYTE(v18) = (*(_BYTE *)(v3 + 254) | v18) & 0xC2;
  if( v18 == *(_QWORD *)(v4 + 544) )
  {
    LODWORD(v18) = *((unsigned __int8 *)KeGetPcr() + 2131);
    LOWORD(v18) = v18 & 3;
    if( (_WORD)v18 == 1 )
    {
      _disable();
      v19 = *((_BYTE *)KeGetPcr() + 2129);
      if( *((_BYTE *)KeGetPcr() + 634) != v19 )
      {
        __writegsbyte(0x27Au, v19);
        v18 = 72i64;
        HIDWORD(v12) = 0;
        __writemsr(0x48u, v19);
      }
      LODWORD(v12) = *((unsigned __int8 *)KeGetPcr() + 2130);
      if( (v12 & 0x10) != 0 )
      {
        v18 = 73i64;
        __writemsr(0x49u, 1ui64);
        v12 = *((unsigned __int8 *)KeGetPcr() + 2130);
        LODWORD(v12) = (unsigned __int8)v12;
      }
      if( (v12 & 0x40) != 0 )
        __flush_rsb();
      _mm_lfence();
      __writegsbyte(0x853u, *((_BYTE *)KeGetPcr() + 2131) | 2);
      _enable();
    }
  }
  else
  {
    LOBYTE(v18) = v18 & 0xC0;
    KiUpdateSpeculationControl(v18);
  }
  v20 = *(_QWORD *)(v5 + 184);
  if( v20 != *(_QWORD *)(v4 + 184) )
  {
    _interlockedbittestandset64(
      (volatile signed __int32 *)(v20 + 8i64 * *(unsigned __int8 *)(v3 + 208) + 376),
      *(unsigned __int8 *)(v3 + 209));
    v21 = *(_QWORD *)(v20 + 40);
    if( (KiKvaShadow & 1) != 0 )
    {
      _disable();
      if( (v21 & 2) != 0 )
      {
        v21 |= 0x8000000000000000ui64;
        *(_DWORD *)(v3 + 36504) |= 1u;
      }
      *(_QWORD *)(v3 + 36480) = v21;
      v21 &= ~0x8000000000000000ui64;
      *(_DWORD *)(v3 + 36504) &= ~2u;
      if( _bittest((const signed __int32 *)(v20 + 912), 0) )
        *(_DWORD *)(v3 + 36504) ^= 3u;
      _enable();
    }
    __writecr3(v21);
    if( (KiKvaShadow & 1) != 0 && (v21 & 2) == 0 )
    {
      v22 = __readcr4();
      v22 ^= 0x80ui64;
      __writecr4(v22);
      __writecr4(v22 ^ 0x80);
    }
    v18 = *(unsigned __int8 *)(v3 + 209);
    v12 = *(_QWORD *)(v4 + 184);
    _interlockedbittestandreset64((volatile signed __int32 *)(v12 + 8i64 * *(unsigned __int8 *)(v3 + 208) + 376), v18);
  }
  v23 = *(_QWORD *)(v5 + 40);
  if( (KiKvaShadow & 1) != 0 )
    *(_QWORD *)(v3 + 36488) = v23;
  else
    *(_QWORD *)(*(_QWORD *)(v3 - 376) + 4i64) = v23;
  *(_QWORD *)(v3 + 40) = v23;
  if( v23 >= 0 )
    KeBugCheckEx(0x1CEu, v4, v5, 0i64, 0i64);
  if( KiCpuTracingFlags )
  {
    if( (KiCpuTracingFlags & 2) != 0 )
      KiClearLastBranchRecordStack();
    if( (KiCpuTracingFlags & 4) != 0 )
      KiResetProcessorTraceBuffer((_EPROCESS *)v18, (UINT8 *)v12);
  }
  v24 = *(_QWORD *)(v5 + 592) | KUSER_SHARED_DATA.XState.EnabledSupervisorFeatures & *(_QWORD *)(v4 + 592);
  *(_BYTE *)(v4 + 113) = 0;
  v25 = *(unsigned int **)(v5 + 96);
  v26 = v24 & 0xFFFFFFFFFFFFFFFDui64;
  if( v26 )
  {
    if( (v10 & 0x20000000000i64) != 0 && (v26 & 1) != 0 )
      __asm { fninit }
    if( (v10 & 0x4000000000i64) != 0 )
    {
      _xrstors(v25);
    }
    else if( (v10 & 0x800000) != 0 )
    {
      _xrstor(v25, (unsigned int)v26);
    }
    else
    {
      _fxrstor(v25);
    }
  }
  _mm_setcsr(v25[6]);
  if( (v26 & 0x100) != 0 && (_DWORD)KiIptMsrMask )
    KiRestoreThreadIptState(v5);
  if( !_bittest((const signed __int32 *)(v5 + 116), 0xAu) )
  {
    v27 = *(_DWORD *)(v5 + 1512);
    if( *(_QWORD *)(*(_QWORD *)(v5 + 544) + 1408i64) )
      v27 = *(_DWORD *)(v5 + 240) + 0x2000;
    v28 = *(_QWORD *)(v3 - 384);
    *(_WORD *)(v28 + 82) = v27;
    v29 = HIWORD(v27);
    *(_BYTE *)(v28 + 84) = v29;
    *(_BYTE *)(v28 + 87) = BYTE1(v29);
    __writemsr(0xC0000100, *(_QWORD *)(v5 + 1512));
    if( (__GS__ & (unsigned __int16)(__ES__ & __DS__)) != 43 )
    {
      __DS__ = 43;
      _disable();
      __swapgs();
      __swapgs();
      _enable();
    }
    v30 = *(_QWORD *)(v5 + 240);
    v31 = *(_DWORD *)(v5 + 244);
    *(_QWORD *)(v3 - 336) = v30;
    if( (*(_BYTE *)(v5 + 3) & 0x84) != 0 )
    {
      if( *(char *)(v5 + 3) >= 0 )
      {
        LODWORD(v30) = *(_DWORD *)(v5 + 1520);
        v31 = *(_DWORD *)(v5 + 1524);
      }
      else
      {
        v32 = *(_QWORD *)(v5 + 496);
        LODWORD(v30) = *(_DWORD *)(v32 + 128);
        v31 = *(_DWORD *)(v32 + 132);
      }
    }
    __writemsr(0xC0000102, __PAIR64__(v31, v30));
  }
  if( (*(_DWORD *)(v3 + 12588) & 0x10001) != 0 )
    KeBugCheckEx(0xB8u, v4, v5, 0i64, 0i64);
  ++*(_DWORD *)(v5 + 340);
  v33 = *(_BYTE *)(v5 + 193) == 1;
  if( *(_BYTE *)(v5 + 193) == 1 )
  {
    v33 = (*(_WORD *)(v5 + 486) | (unsigned __int8)v38) == 0;
    if( *(_WORD *)(v5 + 486) | (unsigned __int8)v38 )
    {
      HalRequestSoftwareInterrupt(1i64);
      return((unsigned __int64)v37 | v34) == 0;
    }
  }
  return v33;
}

Referenced by:

KiIdleLoop
KiSwapContext
KxDispatchInterrupt