HalpTimerClockInterrupt

MDL *__stdcall HalpTimerClockInterrupt(
        LARGE_INTEGER LowAddress,
        LARGE_INTEGER HighAddress,
        LARGE_INTEGER SkipBytes,
        UINT64 TotalBytes,
        MEMORY_CACHING_TYPE CacheType,
        UINT64 Flags){
  _KTRAP_FRAME *v6; 
  UINT8 PreviousIrql; 
  __int64 v8; 
  __int64 v9; 
  __int64 *v10; 
  __int64 v11; 
  MDL *result; 
  INT64 v13; 
  __int16 v14; 
  INT64 CurrentPrcb; 
  __int64 v16; 
  _QWORD *v17; 
  INT64 CurrentQpc; 
  v6 = *(_KTRAP_FRAME **)(LowAddress.QuadPart + 136);
  PreviousIrql = v6->PreviousIrql;
  HalpTimerGetInternalData((KDPC *)HalpClockTimer, (PVOID)HalpClockTimer, (PVOID)SkipBytes.QuadPart, (PVOID)TotalBytes);
  (*(void(__fastcall **)(__int64))(v8 + 120))(v9);
  v10 = &HalpClockTickLog[3 * (((unsigned __int8)_InterlockedExchangeAdd(&HalpClockTickLogIndex, 1u) + 1) & 0xF)];
  LODWORD(v11) = RtlGetInterruptTimePrecise(&CurrentQpc);
  *v10 = v11;
  *((_DWORD *)v10 + 2) = *((_DWORD *)KeGetPcr() + 105);
  *((_BYTE *)v10 + 12) = *((_BYTE *)KeGetCurrentPrcb() + 34) & 1;
  *((_BYTE *)v10 + 13) = *((_BYTE *)KeGetPcr() + 214);
  LODWORD(v11) = KiClockTimerOwner;
  *((_BYTE *)v10 + 14) = *((_BYTE *)KeGetCurrentPrcb() + 33);
  *((_DWORD *)v10 + 4) = v11;
  if( *((_BYTE *)KeGetPcr() + 214) )
  {
    result = (MDL *)KeGetPcr();
    BYTE6(result[4].Process) = 0;
  }
  else
  {
    result = (MDL *)KeGetCurrentPrcb();
    if( (BYTE2(result->StartVa) & 1) != 0 )
    {
      KeClockInterruptNotify(v6, PreviousIrql);
      result = (MDL *)KeGetCurrentPrcb();
      if( BYTE1(result->StartVa) )
      {
        v13 = *(_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;
        }
        v14 = HalpClockWorkUnion;
        if( HalpClockWorkUnion && (_WORD)HalpClockWorkUnion )
        {
          LOWORD(HalpClockWorkUnion) = 0;
          HalpMcaQueueDpc(v14, SHIBYTE(v14));
        }
        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, v13);
        }
        LODWORD(CurrentPrcb) = *((_DWORD *)KeGetPcr() + 105);
        v16 = 3 * CurrentPrcb;
        result = (MDL *)HalpCounterSetInfo;
        v17 = (_QWORD *)(HalpCounterSetInfo + 8 * v16);
        if( (_QWORD *)*v17 != v17 )
        {
          result = (MDL *)(*(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart - v17[2]);
          if( (unsigned __int64)result >= 0x4C4B40 )
          {
            ((void(__fastcall *)(_QWORD, _QWORD))off_140C007D8[0])(0i64, 0i64);
            result = *(MDL **)&KUSER_SHARED_DATA.InterruptTime.LowPart;
            v17[2] = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
          }
        }
      }
    }
  }
  LOBYTE(result) = 1;
  return result;
}

Referenced by:

No references.