KiInSwapSingleProcess
VOID __fastcall KiInSwapSingleProcess(_ETHREAD *Thread, _EPROCESS *Process, UINT8 OldIrql){
unsigned __int64 v4;
struct _KPRCB *CurrentPrcb;
UINT64 SpinCount;
LODWORD(SpinCount) = 0;
v4 = OldIrql;
while( _interlockedbittestandset((volatile signed __int32 *)Process, 7u) )
{
do
KeYieldProcessorEx(&SpinCount);
while( (*(_DWORD *)Process->Pcb.gap0 & 0x80u) != 0 );
}
if( (Process->Pcb.StackCount.Value & 7) != 0 )
{
KiRequestProcessInSwap(&Thread->Tcb, &Process->Pcb);
CurrentPrcb = KeGetCurrentPrcb();
if( Thread == CurrentPrcb->CurrentThread )
{
Thread->Tcb.WaitReason = 23;
Thread->Tcb.WaitIrql = v4;
KiSwapThread(Thread, CurrentPrcb);
return;
}
}
else
{
_InterlockedAnd((volatile signed __int32 *)Process, 0xFFFFFF7F);
}
__writecr8(v4);
}Referenced by:
KeReadyThread
KiAttachProcess
KiStackAttachProcess