HalpTimerAlwaysOnClockInterrupt

NTSTATUS __stdcall HalpTimerAlwaysOnClockInterrupt(_KINTERRUPT *Interrupt, VOID *ServiceContext){
  void *v2; 
  _KTRAP_FRAME *TrapFrame; 
  UINT8 PreviousIrql; 
  __int64 v5; 
  __int64 v6; 
  UINT64 v7; 
  INT64 v8; 
  UINT64 v9; 
  INT64 v10; 
  __int64 CurrentPrcb; 
  INT64 v12; 
  __int16 v13; 
  __int64 v14; 
  _QWORD *v15; 

  TrapFrame = Interrupt->TrapFrame;
  PreviousIrql = TrapFrame->PreviousIrql;
  HalpTimerGetInternalData((_KDPC *)HalpAlwaysOnTimer, ServiceContext, HalpAlwaysOnTimer, v2);
  (*(void(__fastcall **)(__int64))(v5 + 120))(v6);
  CurrentPrcb = (__int64)KeGetCurrentPrcb();
  if( (*(_BYTE *)(CurrentPrcb + 34) & 2) != 0 )
  {
    LOBYTE(v8) = 1;
    HalpTimerSwitchToNormalClock(v8, v7, v9, v10);
    KeClockInterruptNotify(TrapFrame, PreviousIrql);
    CurrentPrcb = (__int64)KeGetCurrentPrcb();
    if( *(_BYTE *)(CurrentPrcb + 33) )
    {
      v12 = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
      if( *((_DWORD *)HalpClockTimer + 15) - KUSER_SHARED_DATA.InterruptTime.LowPart > 0x47868C00 )
      {
        BYTE1(dword_140C4A4A8) = 1;
        *((_DWORD *)HalpClockTimer + 15) = KUSER_SHARED_DATA.InterruptTime.LowPart + 1200000000;
      }
      v13 = dword_140C4A4A8;
      if( dword_140C4A4A8 && (_WORD)dword_140C4A4A8 )
      {
        LOWORD(dword_140C4A4A8) = 0;
        HalpMcaQueueDpc(v13, SHIBYTE(v13));
      }
      CurrentPrcb = (__int64)KeGetCurrentPrcb();
      if( *(_BYTE *)(CurrentPrcb + 33) && HalpWatchdogTimer )
      {
        CurrentPrcb = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart - qword_140C4A350;
        if( *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart - qword_140C4A350 > (unsigned __int64)qword_140C4A340 )
          CurrentPrcb = off_140C008C0[0]();
        if( qword_140C4A340 == -1 )
          HalpTimerWatchdogTriggerSystemReset(0, v12);
      }
      LODWORD(CurrentPrcb) = KeGetPcr()->Prcb.Number;
      v14 = 3 * CurrentPrcb;
      LODWORD(CurrentPrcb) = qword_140C4AD08;
      v15 = (_QWORD *)(qword_140C4AD08 + 8 * v14);
      if( (_QWORD *)*v15 != v15 && *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart - v15[2] >= 0x4C4B40ui64 )
      {
        ((void(__fastcall *)(_QWORD, _QWORD))off_140C007D8[0])(0i64, 0i64);
        LODWORD(CurrentPrcb) = KUSER_SHARED_DATA.InterruptTime.LowPart;
        v15[2] = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
      }
    }
  }
  LOBYTE(CurrentPrcb) = 1;
  return CurrentPrcb;
}

Referenced by:

No references.