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