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