HalpTimerDpcRoutine
VOID __stdcall HalpTimerDpcRoutine(KDPC *Dpc, PVOID Context, PVOID SystemArgument1, PVOID SystemArgument2){
void *v4;
void *v5;
void *v6;
ULONG_PTR v7;
unsigned __int64 v8;
_KDPC *v9;
__int64 v10;
__int64 v11;
__int64 v12;
signed __int64 v13;
__int64 v14;
__int64 v15;
unsigned __int64 v16;
signed __int64 v17;
int v18;
__int64 v19;
__int64 v20;
unsigned __int64 v21;
__int64 v22;
int v23[8];
KeQueryPerformanceCounter(0i64);
v7 = HalpAlwaysOnCounter;
if( HalpAlwaysOnCounter )
{
if( *(_DWORD *)(HalpAlwaysOnCounter + 220) == 64 )
{
HalpTimerGetInternalData((KDPC *)HalpAlwaysOnCounter, v4, v5, v6);
v11 = (*(__int64(__fastcall **)(__int64))(v7 + 112))(v10);
v12 = *(_QWORD *)(v7 + 208);
v13 = v11;
}
else
{
do
{
v12 = *(_QWORD *)(v7 + 208);
do
{
v14 = *(_QWORD *)(v7 + 200);
HalpTimerGetInternalData((KDPC *)v7, v4, v5, v6);
v16 = (*(__int64(__fastcall **)(__int64))(v7 + 112))(v15);
_InterlockedOr(v23, 0);
v17 = *(_QWORD *)(v7 + 200);
}
while( v14 != v17 );
}
while( v12 != *(_QWORD *)(v7 + 208) );
v18 = *(_DWORD *)(v7 + 220);
if( ((v14 ^ v16) & (1i64 << ((unsigned __int8)v18 - 1))) != 0 )
{
v19 = 1i64 << v18;
if( v18 == 64 )
v20 = -1i64;
else
v20 = v19 - 1;
v21 = v14 & v20;
v13 = v16 | v14 ^ v21;
if( v16 < v21 )
v13 += v19;
_InterlockedCompareExchange64((volatile signed __int64 *)(v7 + 200), v13, v17);
}
else
{
if( v18 == 64 )
v22 = -1i64;
else
v22 = (1i64 << v18) - 1;
v13 = v16 | v14 & ~v22;
}
}
if( v12 + v13 < HalpTimerLastAlwaysOnCounterValue )
KeBugCheckEx(0x5Cu, 0x113ui64, 0x27ui64, v12 + v13, HalpTimerLastAlwaysOnCounterValue);
HalpTimerLastAlwaysOnCounterValue = v12 + v13;
}
v8 = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
if( (unsigned __int64)(*(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart - HalpTimerLastDpc) >= 0x47868C00 )
{
v9 = (_KDPC *)_InterlockedExchange64((volatile __int64 *)KiProcessorBlock + 28, 0i64);
if( v9 )
KiInsertQueueDpc(v9, (PVOID)(unsigned int)v8, (PVOID)HIDWORD(v8), 0i64, 0);
HalpTimerLastDpc = v8;
}
}Referenced by:
No references.