HalpTimerClockInterrupt

NTSTATUS __fastcall HalpTimerClockInterrupt(_KINTERRUPT *Interrupt, VOID *ServiceContext){
  void *v2; 
  void *v3; 
  _KTRAP_FRAME *TrapFrame; 
  UINT8 PreviousIrql; 
  __int64 v6; 
  __int64 v7; 
  char *v8; 
  __int64 v9; 
  unsigned __int64 Pcr; 
  INT64 v11; 
  __int16 v12; 
  __int64 v13; 
  _QWORD *v14; 
  INT64 CurrentQpc; 

  TrapFrame = Interrupt->TrapFrame;
  PreviousIrql = TrapFrame->PreviousIrql;
  HalpTimerGetInternalData((_KDPC *)HalpClockTimer, HalpClockTimer, v2, v3);
  (*(void(__fastcall **)(__int64))(v6 + 120))(v7);
  v8 = (char *)&CmpDummyThreadEvent
     + 24 * (((unsigned __int8)_InterlockedExchangeAdd(&HalpClockTickLogIndex, 1u) + 1) & 0xF)
     + 4480;
  LODWORD(v9) = RtlGetInterruptTimePrecise(&CurrentQpc);
  *(_QWORD *)v8 = v9;
  *((_DWORD *)v8 + 2) = KeGetPcr()->Prcb.Number;
  v8[12] = KeGetCurrentPrcb()->PendingTickFlags & 1;
  v8[13] = BYTE2(KeGetPcr()->HalReserved[5]);
  LODWORD(v9) = KiClockTimerOwner;
  v8[14] = KeGetCurrentPrcb()->ClockOwner;
  *((_DWORD *)v8 + 4) = v9;
  if( BYTE2(KeGetPcr()->HalReserved[5]) )
  {
    Pcr = (unsigned __int64)KeGetPcr();
    *(_BYTE *)(Pcr + 214) = 0;
  }
  else
  {
    Pcr = (unsigned __int64)KeGetCurrentPrcb();
    if( (*(_BYTE *)(Pcr + 34) & 1) != 0 )
    {
      KeClockInterruptNotify(TrapFrame, PreviousIrql);
      Pcr = (unsigned __int64)KeGetCurrentPrcb();
      if( *(_BYTE *)(Pcr + 33) )
      {
        v11 = *(_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;
        }
        v12 = dword_140C4A4A8;
        if( dword_140C4A4A8 && (_WORD)dword_140C4A4A8 )
        {
          LOWORD(dword_140C4A4A8) = 0;
          HalpMcaQueueDpc(v12, SHIBYTE(v12));
        }
        Pcr = (unsigned __int64)KeGetCurrentPrcb();
        if( *(_BYTE *)(Pcr + 33) && HalpWatchdogTimer )
        {
          Pcr = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart - qword_140C4A350;
          if( *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart - qword_140C4A350 > (unsigned __int64)qword_140C4A340 )
            Pcr = off_140C008C0[0]();
          if( qword_140C4A340 == -1 )
            HalpTimerWatchdogTriggerSystemReset(0, v11);
        }
        LODWORD(Pcr) = KeGetPcr()->Prcb.Number;
        v13 = 3 * Pcr;
        LODWORD(Pcr) = qword_140C4AD08;
        v14 = (_QWORD *)(qword_140C4AD08 + 8 * v13);
        if( (_QWORD *)*v14 != v14 )
        {
          Pcr = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart - v14[2];
          if( Pcr >= 0x4C4B40 )
          {
            ((void(__fastcall *)(_QWORD, _QWORD))off_140C007D8[0])(0i64, 0i64);
            LODWORD(Pcr) = KUSER_SHARED_DATA.InterruptTime.LowPart;
            v14[2] = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
          }
        }
      }
    }
  }
  LOBYTE(Pcr) = 1;
  return Pcr;
}

Referenced by:

No references.