KeResumeClockTimerFromIdle
VOID __stdcall KeResumeClockTimerFromIdle(UINT64 *ClockTimerLatency){
struct _KPRCB *CurrentPrcb;
char v3;
signed __int32 v4;
__int64 v5;
char v6;
volatile signed __int32 *v7;
struct _KPRCB *v8;
_BYTE *v9;
char v10;
__int64 v11;
int v12;
__int32 v13;
_BOOL8 v14;
BYTE v15;
char v16[7];
UINT64 NewInterruptTime;
_QWORD a2[2];
UINT64 CurrentTick;
int v20;
a2[1] = 0i64;
NewInterruptTime = 0i64;
a2[0] = 0i64;
CurrentTick = 0i64;
v16[0] = 0;
v15 = 0;
if( (_BYTE)KiDynamicTickDisableReason )
return;
CurrentPrcb = KeGetCurrentPrcb();
v3 = 0;
if( ClockTimerLatency )
*(_DWORD *)ClockTimerLatency = -1;
while( 1 )
{
v4 = KiClockState;
if( KiClockState == 1 )
{
v4 = _InterlockedCompareExchange(&KiClockState, 3, 1);
if( v4 == 1 )
break;
}
if( v4 != 3 )
goto LABEL_6;
_mm_pause();
}
KiUpdateTimeAssist(0i64, &NewInterruptTime, &CurrentTick);
KiClockTimerOneShotEndTime = NewInterruptTime;
if( KeMinimumIncrement - 1 + (int)NewInterruptTime - (int)KiLastNonHrTimerExpiration >= (unsigned int)KeNonHrTimeIncrement )
KiLastNonHrTimerExpiration = (PVOID)NewInterruptTime;
v9 = (_BYTE *)NewInterruptTime;
if( (int)NewInterruptTime - (int)KiLastPseudoHrTimerExpiration + KeMinimumIncrement - 1 >= (unsigned int)KePseudoHrTimeIncrement )
KiLastPseudoHrTimerExpiration = NewInterruptTime;
v10 = off_140C00898[0]();
if( KiClockLatencyMeasurementEnabled )
{
if( ClockTimerLatency
&& (_DWORD)KiClockTimerOwner == *((_DWORD *)CurrentPrcb + 9)
&& (unsigned __int64)v9 >= KiClockTimerNextTickTime
&& v10 )
{
*(_DWORD *)ClockTimerLatency = (_DWORD)v9 - KiClockTimerNextTickTime;
}
KiClockLatencyMeasurementEnabled = 0;
}
if( ClockTimerLatency
&& (_DWORD)KiClockTimerOwner == *((_DWORD *)CurrentPrcb + 9)
&& (unsigned __int64)v9 >= KiClockTimerNextTickTime
&& (unsigned __int8)off_140C00898[0]() )
{
*(_DWORD *)ClockTimerLatency = (_DWORD)v9 - KiClockTimerNextTickTime;
}
KiClockLatencyMeasurementEnabled = 0;
if( (unsigned __int64)&v9[-KiClockTimerOneShotStartTime] < qword_140C31368 )
qword_140C31368 = (__int64)&v9[-KiClockTimerOneShotStartTime];
if( (unsigned __int64)&v9[-KiClockTimerOneShotStartTime] > qword_140C31360 )
qword_140C31360 = (__int64)&v9[-KiClockTimerOneShotStartTime];
if( KiConsiderTimerRebasing )
{
if( v10 && (unsigned int)KiGetPastDueIRTimerInfo((UINT64)v9, (BYTE *)v16, &v15) )
ExRecordOneTimerExpiry(v16[0], v15);
KiAdjustTimersAfterDripsExit(CurrentPrcb, v9);
KiConsiderTimerRebasing = 0;
}
if( KiClockTimerPerCpu )
{
KeQuerySystemAllowedCpuSetAffinity(&KiClockOwnerAllowedCpuSet, &KiClockOwnerAllowedCpuSetVersion);
v11 = *((unsigned int *)CurrentPrcb + 9);
if( ((KiClockOwnerAllowedCpuSet.Bitmap[(unsigned int)KiProcessorIndexToNumberMappingTable[v11] >> 6] >> (KiProcessorIndexToNumberMappingTable[v11] & 0x3F)) & 1) == 0 )
{
LODWORD(v11) = KeFindFirstSetRightAffinityEx(&KiIntSteerMask);
if( (_DWORD)v11 == -1 )
LODWORD(v11) = *((_DWORD *)CurrentPrcb + 9);
}
v12 = *((_DWORD *)CurrentPrcb + 9);
}
else
{
LODWORD(v11) = *((_DWORD *)CurrentPrcb + 9);
v12 = v11;
}
if( v12 == (_DWORD)v11 )
{
if( (unsigned __int64)&v9[(unsigned int)KiLastRequestedTimeIncrement] <= KiClockTimerNextTickTime )
{
if( KiClockTimerPerCpu )
{
*((_BYTE *)CurrentPrcb + 33) = 1;
LODWORD(KiClockTimerOwner) = v12;
if( !KiGetPendingTick() )
off_140C00880[0]();
}
v13 = 0;
KiRestoreClockTickRate((INT64)v9, a2);
KiClockTimerNextTickTime = (__int64)&v9[KeTimeIncrement];
KiEventClockStateChange();
goto LABEL_42;
}
}
else
{
v3 = 1;
}
++qword_140C31358;
v13 = 2;
KiEventClockStateChange();
if( v3 )
{
LODWORD(KiClockTimerOwner) = v11;
KiSendClockInterruptToClockOwner();
}
LABEL_42:
if( KiForceIdleReset )
{
KiForceIdleReset = 0;
v14 = (unsigned __int8)off_140C00898[0]() == 0;
KiResetForceIdle(v14, 0);
}
v20 = 0;
_InterlockedExchange(&KiClockState, v13);
LABEL_6:
v5 = *((unsigned int *)CurrentPrcb + 9);
if( (_DWORD)KiClockTimerOwner == (_DWORD)v5 && !*((_BYTE *)CurrentPrcb + 33) )
*((_BYTE *)CurrentPrcb + 33) = 1;
v6 = *((_BYTE *)CurrentPrcb + 33);
if( !v6 )
{
v7 = (volatile signed __int32 *)*((_QWORD *)*(&KiProcessorBlock + v5) + 4247);
v6 = 0;
if( v7 )
{
if( (KiVelocityFlags & 0x40) != 0 )
{
_InterlockedAnd(v7, 0xFFF7FFFF);
v6 = *((_BYTE *)CurrentPrcb + 33);
}
}
}
if( v6 )
{
v8 = KiClockTimerPerCpu ? KeGetCurrentPrcb() : *(&KiProcessorBlock + (unsigned int)KiClockTimerOwner);
if( (*((_BYTE *)v8 + 34) & 1) == 0 )
{
off_140C00880[0]();
v6 = *((_BYTE *)CurrentPrcb + 33);
}
}
if( !v6 && (*((_BYTE *)CurrentPrcb + 34) & 1) != 0 )
{
off_140C00888[0]();
KiSetPendingTick(0);
}
}Referenced by:
PpmIdleExecuteTransition