KeAccumulateTicks
VOID __stdcall KeAccumulateTicks(
_KPRCB *Prcb,
UINT64 LastTick,
UINT64 CurrentTick,
UINT8 PreviousIrql,
CHAR ProcessorMode){
int v6;
int v7;
char v9;
unsigned int v10;
__int64 v11;
unsigned int v12;
INT64 v13;
__int64 v14;
int v16;
int v17;
int v18;
int v19;
int v20;
UINT64 BugCheckParameter4;
ULONG_PTR v22;
unsigned int v23;
__int16 v24;
unsigned int v25;
unsigned int v26;
int v27;
unsigned int v28;
unsigned int v29;
unsigned int v30;
unsigned int v31;
__int64 v32;
_KSCB *v33;
int v34;
v6 = CurrentTick;
v7 = LastTick;
v9 = 0;
KiCheckForTimerExpiration(Prcb);
*((_DWORD *)Prcb + 3149) = v6;
v10 = v6 - v7;
if( !v10 )
{
if( KiForceIdleDisabled || (_DWORD)KiForceIdleState != 4 )
return;
goto LABEL_18;
}
v11 = *((_QWORD *)Prcb + 1);
v12 = 0;
if( *((_BYTE *)Prcb + 33) )
{
if( !--KiClockPollCycle )
{
KiClockPollCycle = KiClockKeepAliveCycle;
BugCheckParameter4 = (unsigned __int8)KiClockCheckSlot;
v22 = (ULONG_PTR)*(&KiProcessorBlock + (unsigned __int8)KiClockCheckSlot);
v23 = (unsigned __int8)KiClockCheckSlot + 1;
if( v23 >= (unsigned int)KeNumberProcessors_0 )
LOBYTE(v23) = 0;
KiClockCheckSlot = v23;
if( KiCheckKeepAlive(*(unsigned int *)(v22 + 36)) )
{
if( !*(_DWORD *)(v22 + 31712) && KeEnableWatchdogTimeout && (KiBugCheckActive & 3) == 0 )
{
HvlInvokeHypervisorDebugger(1ui64, BugCheckParameter4);
KeBugCheckEx(0x101u, (unsigned __int8)KiClockKeepAliveCycle, 0i64, v22, BugCheckParameter4);
}
*(_DWORD *)(v22 + 31712) = 0;
}
}
}
if( ProcessorMode )
{
*((_DWORD *)Prcb + 8098) += v10;
*(_DWORD *)(v11 + 732) += v10;
}
else
{
*((_DWORD *)Prcb + 8097) += v10;
if( *((_BYTE *)Prcb + 32) == 2 && *((_BYTE *)Prcb + 12586) )
{
v27 = *((_DWORD *)Prcb + 8103);
*((_DWORD *)Prcb + 8099) += v10;
v28 = v27 + 1;
v29 = *((_DWORD *)Prcb + 8104);
*((_DWORD *)Prcb + 8103) = v28;
if( v29 )
{
v30 = *((_DWORD *)Prcb + 8128);
v31 = v28;
if( v30 && v28 >= v30 )
{
KiDpcWatchdogCaptureStack((INT64)Prcb);
v31 = *((_DWORD *)Prcb + 8103);
v9 = 1;
v29 = *((_DWORD *)Prcb + 8104);
}
if( v31 > v29 )
{
if( KeEnableWatchdogTimeout )
{
__rdtsc();
HvlInvokeHypervisorDebugger(3ui64, 0i64);
if( !(_BYTE)KdDebuggerEnabled || (_BYTE)KdDebuggerNotPresent )
KeBugCheckEx(
0x133u,
0i64,
*((unsigned int *)Prcb + 8103),
*((unsigned int *)Prcb + 8104),
(ULONG_PTR)&KeDpcWatchdogProfileGlobalTriageBlock);
__int2c();
}
*((_DWORD *)Prcb + 8103) = 0;
KiResetGlobalDpcWatchdogProfiler((INT64)Prcb);
}
}
}
else if( *((_BYTE *)Prcb + 32) > 1u )
{
*((_DWORD *)Prcb + 8100) += v10;
}
else
{
*(_DWORD *)(v11 + 652) += v10;
}
if( PreviousIrql < 2u )
{
++*((_DWORD *)Prcb + 7947);
v13 = *((_QWORD *)Prcb + 4245);
*((_DWORD *)Prcb + 7931) = 0;
if( v13 && *((_QWORD *)Prcb + 4246) != v13 && *((int *)Prcb + 7933) > 0 )
{
*((_QWORD *)Prcb + 4246) = v13;
memset(v13, 0i64);
}
goto LABEL_12;
}
v16 = *((_DWORD *)Prcb + 7930);
v17 = *((_DWORD *)Prcb + 7931) + 1;
*((_DWORD *)Prcb + 7931) = v17;
if( !v16 )
goto LABEL_12;
v18 = *((_DWORD *)Prcb + 7933);
v19 = v17;
v20 = v16;
if( v18 && v17 >= v18 && !v9 )
{
KiDpcWatchdogCaptureStack((INT64)Prcb);
v19 = *((_DWORD *)Prcb + 7931);
v20 = *((_DWORD *)Prcb + 7930);
}
if( v19 < v20 )
goto LABEL_12;
if( KeEnableWatchdogTimeout )
{
__rdtsc();
HvlInvokeHypervisorDebugger(2ui64, 0i64);
if( !(_BYTE)KdDebuggerEnabled || (_BYTE)KdDebuggerNotPresent )
KeBugCheckEx(0x133u, 1ui64, *((int *)Prcb + 7930), (ULONG_PTR)&KeDpcWatchdogProfileGlobalTriageBlock, 0i64);
__int2c();
}
}
++*((_DWORD *)Prcb + 7947);
*((_DWORD *)Prcb + 7931) = 0;
KiResetGlobalDpcWatchdogProfiler((INT64)Prcb);
LABEL_12:
if( v11 != *((_QWORD *)Prcb + 3) && *((_BYTE *)Prcb + 32) <= 1u )
{
if( *(char *)(v11 + 195) < 16
&& *(_QWORD *)(v11 + 104)
&& (v32 = *(_QWORD *)(v11 + 104)) != 0
&& (v33 = (_KSCB *)(*((unsigned int *)Prcb + 54) + v32)) != 0i64
&& (KiGetThreadEffectiveRankNonZero((_ETHREAD *)v11, v33, 0i64, 0, 0i64), v34)
|| *(char *)(v11 + 195) < 8 )
{
*((_DWORD *)Prcb + 8107) += v10;
}
}
if( v10 < 8 )
{
*((_DWORD *)Prcb + 2921) += 15 * (*((_DWORD *)Prcb + 8096) - *((_DWORD *)Prcb + 2920));
v12 = *((_DWORD *)Prcb + 2921);
v14 = v10;
do
{
v12 >>= 4;
--v14;
}
while( v14 );
}
*((_DWORD *)Prcb + 2921) = v12;
*((_DWORD *)Prcb + 2920) = *((_DWORD *)Prcb + 8096);
*((_DWORD *)Prcb + 3143) = (unsigned int)(*((_DWORD *)Prcb + 3143)
+ *((_DWORD *)Prcb + 3127)
- *((_DWORD *)Prcb + 3145)) >> v10;
*((_DWORD *)Prcb + 3145) = *((_DWORD *)Prcb + 3127);
if( !*((_DWORD *)Prcb + 3126) || (v24 = *((_WORD *)Prcb + 6294), (v24 & 3) != 0) )
{
if( (*((_DWORD *)Prcb + 8101))-- == 1 )
{
*((_DWORD *)Prcb + 8101) = KiAdjustDpcThreshold;
v26 = *((_DWORD *)Prcb + 3142);
if( v26 < KiMaximumDpcQueueDepth )
*((_DWORD *)Prcb + 3142) = v26 + 1;
}
}
else
{
*((_DWORD *)Prcb + 8101) = KiAdjustDpcThreshold;
if( (v24 & 0x2F) == 0 )
KiRequestSoftwareInterrupt(Prcb, 2);
v25 = *((_DWORD *)Prcb + 3142);
if( *((_DWORD *)Prcb + 3143) < (unsigned int)KiIdealDpcRate && v25 > 1 )
*((_DWORD *)Prcb + 3142) = v25 - 1;
}
LABEL_18:
if( ((_BYTE)KdDebuggerEnabled || KdEventLoggingEnabled) && KiPollSlot == *((_DWORD *)Prcb + 9) )
KdCheckForDebugBreak();
}Referenced by:
KeClockInterruptNotify
PpmIdleExecuteTransition