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.