KiReadyOutSwappedThreads
VOID __stdcall KiReadyOutSwappedThreads(_LIST_ENTRY *ListHead, UINT8 OldIrql){
struct _KPRCB *CurrentPrcb;
unsigned __int64 v4;
_LIST_ENTRY *v5;
struct _KPRCB *v6;
INT64 p_Blink;
_ETHREAD *CurrentThread;
_DWORD *SchedulerAssist;
INT64 v10;
struct _KPRCB *v11;
_ETHREAD *NextThread;
char v13;
_DWORD *v14;
INT64 v15;
INT64 v16;
INT64 v17;
UINT64 v18;
UINT64 SpinCount;
CurrentPrcb = KeGetCurrentPrcb();
v4 = OldIrql;
v5 = ListHead;
do
{
v6 = KeGetCurrentPrcb();
p_Blink = (INT64)&v5[-14].Blink;
v5 = v5->Flink;
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)(p_Blink + 64), 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *(_QWORD *)(p_Blink + 64) );
SchedulerAssist = v6->SchedulerAssist;
if( SchedulerAssist && v6->NestingLevel <= 1u )
++SchedulerAssist[6];
}
KiEnterDeferredReadyState(p_Blink);
*(_QWORD *)(p_Blink + 64) = 0i64;
KiReadyThread(CurrentPrcb, (_KTHREAD *)p_Blink);
}
while( v5 != ListHead );
if( (unsigned __int8)v4 < 2u )
{
CurrentThread = CurrentPrcb->CurrentThread;
if( CurrentPrcb->NextThread )
{
KiAbProcessContextSwitch(&CurrentPrcb->CurrentThread->Tcb, 0i64);
v11 = KeGetCurrentPrcb();
LODWORD(v18) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&CurrentPrcb->PrcbLock, 0i64) )
{
do
KeYieldProcessorEx(&v18);
while( CurrentPrcb->PrcbLock );
v14 = v11->SchedulerAssist;
if( v14 && v11->NestingLevel <= 1u )
++v14[6];
}
NextThread = CurrentPrcb->NextThread;
CurrentPrcb->NextThread = 0i64;
_disable();
KiEndThreadCycleAccumulation((INT64)CurrentPrcb, (INT64)CurrentThread, 0i64, v10, v15, v16, v17);
_enable();
CurrentPrcb->CurrentThread = NextThread;
if( NextThread->Tcb.WaitBlockFill6[68] == 1 )
NextThread->Tcb.ReadyTime = NextThread->Tcb.ReadyTime
- NextThread->Tcb.WaitBlock[2].SpareLong
+ KUSER_SHARED_DATA.TickCount.LowPart;
NextThread->Tcb.WaitBlockFill6[68] = 2;
CurrentThread->Tcb.WaitReason = 32;
CurrentThread->Tcb.WaitIrql = v4;
KiQueueReadyThread(CurrentPrcb, &CurrentThread->Tcb);
KiSwapContext();
if( !v13 )
goto LABEL_8;
}
else if( (CurrentThread->Tcb._bf_0 & 0x40) == 0 )
{
LABEL_8:
__writecr8(v4);
return;
}
__writecr8(1ui64);
CurrentThread->Tcb._bf_0 &= ~0x40u;
KiDeliverApc(0, 0i64, 0i64);
goto LABEL_8;
}
if( CurrentPrcb->NextThread && !CurrentPrcb->DpcRoutineActive )
KiRequestSoftwareInterrupt(CurrentPrcb, 2);
}Referenced by:
KiInSwapProcesses
KiOutSwapProcesses