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.