HalpTimerAlwaysOnClockInterrupt

char __fastcall HalpTimerAlwaysOnClockInterrupt(__int64 a1, void *a2, __int64 a3, void *a4){
  _KTRAP_FRAME *v4; 
  UINT8 PreviousIrql; 
  __int64 v6; 
  __int64 v7; 
  INT64 v8; 
  INT64 v9; 
  __int16 v10; 
  INT64 CurrentPrcb; 
  _QWORD *v12; 
  v4 = *(_KTRAP_FRAME **)(a1 + 136);
  PreviousIrql = v4->PreviousIrql;
  HalpTimerGetInternalData((KDPC *)HalpAlwaysOnTimer, a2, (PVOID)HalpAlwaysOnTimer, a4);
  (*(void(__fastcall **)(__int64))(v6 + 120))(v7);
  if( (*((_BYTE *)KeGetCurrentPrcb() + 34) & 2) != 0 )
  {
    LOBYTE(v8) = 1;
    HalpTimerSwitchToNormalClock(v8);
    KeClockInterruptNotify(v4, PreviousIrql);
    if( *((_BYTE *)KeGetCurrentPrcb() + 33) )
    {
      v9 = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
      if( *(_DWORD *)(HalpClockTimer + 60) - KUSER_SHARED_DATA.InterruptTime.LowPart > 0x47868C00 )
      {
        BYTE1(HalpClockWorkUnion) = 1;
        *(_DWORD *)(HalpClockTimer + 60) = KUSER_SHARED_DATA.InterruptTime.LowPart + 1200000000;
      }
      v10 = HalpClockWorkUnion;
      if( HalpClockWorkUnion && (_WORD)HalpClockWorkUnion )
      {
        LOWORD(HalpClockWorkUnion) = 0;
        HalpMcaQueueDpc(v10, SHIBYTE(v10));
      }
      CurrentPrcb = (INT64)KeGetCurrentPrcb();
      if( *(_BYTE *)(CurrentPrcb + 33) && HalpWatchdogTimer )
      {
        CurrentPrcb = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart - HalpTimerWatchdogLastReset;
        if( *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart - HalpTimerWatchdogLastReset > (unsigned __int64)HalpTimerWatchdogResetCount )
          CurrentPrcb = off_140C008C0[0]();
        if( HalpTimerWatchdogResetCount == -1 )
          CurrentPrcb = HalpTimerWatchdogTriggerSystemReset(0, v9);
      }
      LODWORD(CurrentPrcb) = *((_DWORD *)KeGetPcr() + 105);
      v12 = (_QWORD *)(HalpCounterSetInfo + 24 * CurrentPrcb);
      if( (_QWORD *)*v12 != v12 && *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart - v12[2] >= 0x4C4B40ui64 )
      {
        ((void(__fastcall *)(_QWORD, _QWORD))off_140C007D8[0])(0i64, 0i64);
        v12[2] = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
      }
    }
  }
  return 1;
}

Referenced by:

No references.