KeResumeClockTimerFromIdle
VOID __stdcall KeResumeClockTimerFromIdle(UINT64 *ClockTimerLatency){
struct _KPRCB *CurrentPrcb;
char v3;
signed __int32 v4;
__int64 v5;
unsigned __int8 ClockOwner;
volatile signed __int32 *SchedulerAssist;
struct _KPRCB *v8;
unsigned __int64 v9;
char v10;
__int64 Number;
unsigned int v12;
__int32 v13;
_BOOL8 v14;
CHAR v15;
char v16[7];
UINT64 NewInterruptTime;
UINT64 RequestedIncrement;
UINT64 DeliveredIncrement;
UINT64 CurrentTick;
int v21;
DeliveredIncrement = 0i64;
NewInterruptTime = 0i64;
RequestedIncrement = 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 == ClockStateOneShot )
{
v4 = _InterlockedCompareExchange((volatile signed __int32 *)&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 = NewInterruptTime;
if( (int)NewInterruptTime - (int)KiLastPseudoHrTimerExpiration + KeMinimumIncrement - 1 >= (unsigned int)KePseudoHrTimeIncrement )
KiLastPseudoHrTimerExpiration = NewInterruptTime;
v10 = off_140C00898();
if( KiClockLatencyMeasurementEnabled )
{
if( ClockTimerLatency && (_DWORD)KiClockTimerOwner == CurrentPrcb->Number && v9 >= KiClockTimerNextTickTime && v10 )
*(_DWORD *)ClockTimerLatency = v9 - KiClockTimerNextTickTime;
KiClockLatencyMeasurementEnabled = 0;
}
if( ClockTimerLatency
&& (_DWORD)KiClockTimerOwner == CurrentPrcb->Number
&& v9 >= KiClockTimerNextTickTime
&& (unsigned __int8)off_140C00898() )
{
*(_DWORD *)ClockTimerLatency = v9 - KiClockTimerNextTickTime;
}
KiClockLatencyMeasurementEnabled = 0;
if( v9 - KiClockTimerOneShotStartTime < qword_140C31368 )
qword_140C31368 = v9 - KiClockTimerOneShotStartTime;
if( v9 - KiClockTimerOneShotStartTime > qword_140C31360 )
qword_140C31360 = v9 - KiClockTimerOneShotStartTime;
if( KiConsiderTimerRebasing )
{
if( v10 && KiGetPastDueIRTimerInfo(v9, v16, &v15) )
ExRecordOneTimerExpiry(v16[0], v15);
KiAdjustTimersAfterDripsExit(CurrentPrcb);
KiConsiderTimerRebasing = 0;
}
if( KiClockTimerPerCpu )
{
KeQuerySystemAllowedCpuSetAffinity(&KiClockOwnerAllowedCpuSet, &KiClockOwnerAllowedCpuSetVersion);
Number = CurrentPrcb->Number;
if( ((KiClockOwnerAllowedCpuSet.Bitmap[(unsigned int)KiProcessorIndexToNumberMappingTable[Number] >> 6] >> (KiProcessorIndexToNumberMappingTable[Number] & 0x3F)) & 1) == 0 )
{
LODWORD(Number) = KeFindFirstSetRightAffinityEx(&KiIntSteerMask.Count);
if( (_DWORD)Number == -1 )
LODWORD(Number) = CurrentPrcb->Number;
}
v12 = CurrentPrcb->Number;
}
else
{
LODWORD(Number) = CurrentPrcb->Number;
v12 = Number;
}
if( v12 == (_DWORD)Number )
{
if( v9 + (unsigned int)KiLastRequestedTimeIncrement <= KiClockTimerNextTickTime )
{
if( KiClockTimerPerCpu )
{
CurrentPrcb->ClockOwner = 1;
LODWORD(KiClockTimerOwner) = v12;
if( !KiGetPendingTick() )
off_140C00880[0]();
}
v13 = 0;
KiRestoreClockTickRate(v9, &RequestedIncrement);
KiClockTimerNextTickTime = v9 + (unsigned int)KeTimeIncrement;
KiEventClockStateChange(ClockStatePeriodic, ClockStateOneShot, &DeliveredIncrement, &RequestedIncrement);
goto LABEL_42;
}
}
else
{
v3 = 1;
}
++qword_140C31358;
v13 = 2;
KiEventClockStateChange(ClockStatePendingPeriodic, ClockStateOneShot, 0i64, 0i64);
if( v3 )
{
LODWORD(KiClockTimerOwner) = Number;
KiSendClockInterruptToClockOwner();
}
LABEL_42:
if( KiForceIdleReset )
{
KiForceIdleReset = 0;
v14 = (unsigned __int8)off_140C00898() == 0;
KiResetForceIdle(v14, 0);
}
v21 = 0;
_InterlockedExchange((volatile __int32 *)&KiClockState, v13);
LABEL_6:
v5 = CurrentPrcb->Number;
if( (_DWORD)KiClockTimerOwner == (_DWORD)v5 && !CurrentPrcb->ClockOwner )
CurrentPrcb->ClockOwner = 1;
ClockOwner = CurrentPrcb->ClockOwner;
if( !ClockOwner )
{
SchedulerAssist = (volatile signed __int32 *)(*(&KiProcessorBlock + v5))->SchedulerAssist;
ClockOwner = 0;
if( SchedulerAssist )
{
if( (KiVelocityFlags & 0x40) != 0 )
{
_InterlockedAnd(SchedulerAssist, 0xFFF7FFFF);
ClockOwner = CurrentPrcb->ClockOwner;
}
}
}
if( ClockOwner )
{
v8 = KiClockTimerPerCpu ? KeGetCurrentPrcb() : *(&KiProcessorBlock + (unsigned int)KiClockTimerOwner);
if( (v8->PendingTickFlags & 1) == 0 )
{
off_140C00880[0]();
ClockOwner = CurrentPrcb->ClockOwner;
}
}
if( !ClockOwner && (CurrentPrcb->PendingTickFlags & 1) != 0 )
{
off_140C00888[0]();
KiSetPendingTick(0);
}
}Referenced by:
PpmIdleExecuteTransition