KiOutSwapKernelStacks
VOID __stdcall KiOutSwapKernelStacks(){
__int64 v0;
__int64 v1;
unsigned int v2;
unsigned __int8 CurrentIrql;
_QWORD *v4;
__int64 v5;
__int64 v6;
__int64 v7;
_QWORD *v8;
_QWORD *v9;
_ETHREAD *v10;
__int64 v11;
UINT64 SpinCount;
__int128 v13[2];
__int64 v14;
v0 = 0i64;
memset(v13, 0, sizeof(v13));
v14 = 0i64;
v1 = (__int64)*(&KiProcessorBlock + (unsigned int)KiLastProcessor);
v2 = KUSER_SHARED_DATA.TickCount.LowPart - KiStackProtectTime;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)(v1 + 31760), 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *(_QWORD *)(v1 + 31760) );
}
v4 = *(_QWORD **)(v1 + 31744);
while( v4 != (_QWORD *)(v1 + 31744) )
{
if( (unsigned int)v0 >= 5 )
break;
v5 = (__int64)(v4 - 27);
v4 = (_QWORD *)*v4;
if( v2 < *(_DWORD *)(v5 + 436) )
break;
if( *(char *)(v5 + 195) < 25 )
{
_interlockedbittestandreset((volatile signed __int32 *)(v5 + 120), 0x11u);
v6 = v5;
if( _interlockedbittestandset((volatile signed __int32 *)(v5 + 120), 0x14u) )
v6 = v5 | 1;
*((_QWORD *)v13 + v0) = v6;
v0 = (unsigned int)(v0 + 1);
}
v7 = *(_QWORD *)(v5 + 216);
v8 = *(_QWORD **)(v5 + 224);
if( *(_QWORD *)(v7 + 8) != v5 + 216 || *v8 != v5 + 216 )
__fastfail(3u);
*v8 = v7;
*(_QWORD *)(v7 + 8) = v8;
*(_QWORD *)(v5 + 712) = 0i64;
}
_InterlockedAnd64((volatile signed __int64 *)(v1 + 31760), 0i64);
__writecr8(CurrentIrql);
++KiLastProcessor;
if( KiLastProcessor == (unsigned int)KeQueryActiveProcessorCountEx(0xFFFFu) )
KiLastProcessor = 0;
if( (_DWORD)v0 )
{
v9 = (_QWORD *)v13 + v0;
do
{
--v9;
LODWORD(v0) = v0 - 1;
v10 = (_ETHREAD *)(*v9 & 0xFFFFFFFFFFFFFFFEui64);
v11 = *v9 & 1i64;
if( !v11 )
v10 = (_ETHREAD *)*v9;
KiWaitForContextSwap(&v10->Tcb);
if( (unsigned int)v11 != 1 )
KiDecrementProcessStackCount(&v10->Tcb.ApcState.Process->Pcb);
MmOutPageKernelStack(&v10->Tcb);
}
while( (_DWORD)v0 );
}
}Referenced by:
KeSwapProcessOrStack