KiRequestProcessInSwap
VOID __stdcall KiRequestProcessInSwap(_ETHREAD *Thread, _EPROCESS *Process){
struct _KPRCB *CurrentPrcb;
char v4;
_LIST_ENTRY *v6;
_LIST_ENTRY *Blink;
_SINGLE_LIST_ENTRY *p_SwapListEntry;
signed __int64 v9;
signed __int64 v10;
_DWORD *SchedulerAssist;
UINT64 SpinCount;
Thread->Tcb.WaitBlock[2].SpareLong = KUSER_SHARED_DATA.TickCount.LowPart;
CurrentPrcb = KeGetCurrentPrcb();
v4 = 0;
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&Thread->Tcb.ThreadLock, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( Thread->Tcb.ThreadLock );
SchedulerAssist = CurrentPrcb->SchedulerAssist;
if( SchedulerAssist && CurrentPrcb->NestingLevel <= 1u )
++SchedulerAssist[6];
}
Thread->Tcb.WaitBlockFill6[68] = 9;
if( (*(&Thread->Tcb.MiscFlags + 1) & 0x1000) != 0 )
_interlockedbittestandreset((volatile signed __int32 *)&Thread->Tcb.116 + 1, 0xCu);
Thread->Tcb.ThreadLock = 0i64;
v6 = (_LIST_ENTRY *)Thread->Tcb.gapD8;
Blink = Process->Pcb.ReadyListHead.Blink;
if( Blink->Flink != &Process->Pcb.ReadyListHead )
__fastfail(3u);
v6->Flink = &Process->Pcb.ReadyListHead;
v6->Blink = Blink;
Blink->Flink = v6;
Process->Pcb.ReadyListHead.Blink = v6;
if( (Process->Pcb.StackCount.Value & 7) == 1 )
{
_InterlockedXor(&Process->Pcb.StackCount.Value, 3u);
v4 = 1;
}
_InterlockedAnd((volatile signed __int32 *)Process, 0xFFFFFF7F);
if( v4 )
{
MmNotifyProcessInSwapTrigger(&Process->Pcb);
p_SwapListEntry = &Process->Pcb.SwapListEntry;
_m_prefetchw((char *)&KiSwapEvent + 24);
v9 = *(&KiSwapEvent + 3);
do
{
p_SwapListEntry->Next = (_SINGLE_LIST_ENTRY *)v9;
v10 = v9;
v9 = _InterlockedCompareExchange64((_QWORD *)&KiSwapEvent + 3, (signed __int64)p_SwapListEntry, v9);
}
while( v9 != v10 );
if( !v9 )
KeSetEvent((PRKEVENT)&KiSwapEvent, 10, 0);
}
}Referenced by:
KiExitDispatcher
KiInSwapSingleProcess
KiReadyThread