KiUpdateRunTime
VOID __stdcall KiUpdateRunTime(INT64 ProcessorMode, INT64 PreviousIrql){
struct _KPRCB *CurrentPrcb;
__int16 v3;
unsigned int LowPart;
_KPRCB *v5;
__int64 CurrentThread;
__int64 v7;
INT64 v8;
struct _KPRCB *v9;
_KPRCBFLAG v10;
unsigned int PrcbFlags;
unsigned int v12;
char v13;
__int16 v14;
CurrentPrcb = KeGetCurrentPrcb();
v3 = v14;
++CurrentPrcb->ClockInterrupts;
++CurrentPrcb->InterruptLastCount;
_disable();
LowPart = KUSER_SHARED_DATA.TickCount.LowPart;
if( (v3 & 0x200) != 0 )
_enable();
KeAccumulateTicks(
CurrentPrcb,
CurrentPrcb->LastTick,
KUSER_SHARED_DATA.TickCount.LowPart,
PreviousIrql,
ProcessorMode);
CurrentThread = (__int64)CurrentPrcb->CurrentThread;
CurrentPrcb->ClockKeepAlive = 1;
if( (_ETHREAD *)CurrentThread != CurrentPrcb->IdleThread )
{
if( *(_QWORD *)(CurrentThread + 72) >= *(_QWORD *)(CurrentThread + 32)
|| (unsigned int)KiCheckPreferredHeteroProcessor((_KTHREAD *)CurrentThread, CurrentPrcb) )
{
goto LABEL_7;
}
v9 = KeGetCurrentPrcb();
v10.PrcbFlags = (volatile int)v9->PrcbFlags;
if( (v10.PrcbFlags & 0x300) == 0 )
{
if( *(_BYTE *)(CurrentThread + 512) != LOBYTE(v10.PrcbFlags) )
KeCheckAndApplyBamQos((INT64)v9, CurrentThread, v7, v8);
goto LABEL_4;
}
_disable();
PrcbFlags = v9->PrcbFlags._bf_0 & 0xFFFFFCFF;
if( (unsigned __int8)*(_DWORD *)(CurrentThread + 512) != LOBYTE(v9->PrcbFlags.PrcbFlags) )
{
v12 = PrcbFlags | ((*(_DWORD *)(CurrentThread + 512) & 3) << 8);
v9->PrcbFlags._bf_0 = v12;
v13 = PoSetProcessorQoS((INT64)v9, (v12 >> 8) & 3, v7, v8);
PrcbFlags = v9->PrcbFlags.PrcbFlags;
if( !v13 )
{
LABEL_23:
if( (PrcbFlags & 0x300) == 0 )
KeUpdatePendingQosRequest((INT64)v9);
if( (v14 & 0x200) != 0 )
_enable();
goto LABEL_4;
}
PrcbFlags &= 0xFFFFFCFF;
}
v9->PrcbFlags._bf_0 = PrcbFlags;
goto LABEL_23;
}
LABEL_4:
if( KiCheckGroupSchedulingQuantumEnd(CurrentPrcb, (_KTHREAD *)CurrentThread) )
{
LABEL_7:
CurrentPrcb->QuantumEnd = 1;
if( CurrentPrcb->NestingLevel )
{
CurrentPrcb->InterruptRequest = 1;
}
else
{
LOBYTE(v5) = 2;
HalRequestSoftwareInterrupt((UINT64)v5);
}
return;
}
if( (int)(CurrentPrcb->ReadyScanTick - LowPart) < 0
&& (!(unsigned int)KiShouldScanSharedReadyQueue(v5) || (CurrentPrcb->SharedReadyQueue->ReadySummary & 0x7FFE) == 0)
&& (CurrentPrcb->ReadySummary & 0x7FFE) == 0 )
{
CurrentPrcb->ReadyScanTick = LowPart + 75;
}
}Referenced by:
KiUpdateTime