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.