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