KiInsertDeferredPreemptionApc
VOID __stdcall KiInsertDeferredPreemptionApc(_KPRCB *Prcb, _ETHREAD *Thread, UINT8 CalledFromContextSwap){
_KAPC *v5;
UINT64 SpinCount;
if( CalledFromContextSwap )
{
_interlockedbittestandreset((volatile signed __int32 *)Thread + 30, 0xBu);
}
else if( (*((_DWORD *)Thread + 30) & 0x400) != 0 )
{
return;
}
_interlockedbittestandset((volatile signed __int32 *)Thread + 30, 0xAu);
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)Thread + 16, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((_QWORD *)Thread + 8) );
}
if( !*((_BYTE *)Thread + 730) && (*((_DWORD *)Thread + 29) & 0x4000) != 0 )
{
*((_BYTE *)Thread + 730) = 1;
KiInsertQueueApc((_KAPC *)((char *)Thread + 648));
KiSignalThreadForApc(Prcb, v5, 2u);
}
KiReleaseThreadLockSafe((INT64)Thread);
}Referenced by:
KiBeginThreadAccountingPeriod
KiDeferGroupSchedulingPreemption
KiGroupSchedulingQuantumEnd
KiSwapThread