HalpTimerMeasureProcessorsWorker
VOID __stdcall HalpTimerMeasureProcessorsWorker(_EPROCESS *SourceProcess){
int v2;
__int16 v3;
int v4;
int ActiveProcessorCount;
KPCR *Pcr;
int v7;
_KDPC *Timer;
unsigned int Latency;
UINT64 v10;
UINT64 v11;
unsigned __int64 v12;
_LARGE_INTEGER PerformanceFrequency;
int v14;
UINT64 v15;
UINT64 v16;
UINT64 v17;
UINT64 v18;
v15 = 0i64;
v17 = 0i64;
PerformanceFrequency.QuadPart = 0i64;
v16 = 0i64;
v18 = 0i64;
v2 = *(_DWORD *)&SourceProcess->Pcb.gap0[16];
v3 = v14;
_disable();
v4 = v3 & 0x200;
ActiveProcessorCount = KeQueryActiveProcessorCountEx(0xFFFFu);
Pcr = KeGetPcr();
v7 = ActiveProcessorCount;
Timer = (_KDPC *)HalpFindTimer(v2, 0, 0, 0, 1);
HalpProcessorFence();
if( _InterlockedExchangeAdd((volatile signed __int32 *)SourceProcess, 0xFFFFFFFF) != 1 )
{
do
_mm_pause();
while( *(_DWORD *)SourceProcess->Pcb.gap0 );
}
if( KeGetCurrentPrcb()->Number )
{
while( *(_DWORD *)&SourceProcess->Pcb.gap0[4] != KeGetCurrentPrcb()->Number )
_mm_pause();
KeQueryPerformanceCounter(&PerformanceFrequency);
Latency = HalpTimerDetermineValidTimerPairReadLatency(Timer, (_KDPC *)HalpPerformanceCounter);
HalpTimerReadTimerPairWithLatencyLimit(Latency, (__int64)Timer, HalpPerformanceCounter, &v16, &v18);
_InterlockedIncrement((volatile signed __int32 *)&SourceProcess->Pcb.gap0[4]);
while( *(_DWORD *)&SourceProcess->Pcb.gap0[8] != KeGetCurrentPrcb()->Number )
_mm_pause();
HalpTimerReadTimerPairWithLatencyLimit(Latency, (__int64)Timer, HalpPerformanceCounter, &v15, &v17);
_InterlockedIncrement((volatile signed __int32 *)&SourceProcess->Pcb.gap0[8]);
do
_mm_pause();
while( !*(_DWORD *)&SourceProcess->Pcb.gap0[12] );
v10 = v15 - v16;
v11 = 1000000 * v10 / HalpTimerScaleCounter(v17 - v18, PerformanceFrequency.QuadPart, 0xF4240ui64);
*(_QWORD *)Pcr->HalReserved = 10000 * ((v11 + 5000) / 0x2710);
v12 = 1000000 * ((v11 + 500000) / 0xF4240);
Pcr->StallScaleFactor = v12 / 0xF4240;
KeGetCurrentPrcb()->MHz = v12 / 0xF4240;
}
else
{
_InterlockedIncrement((volatile signed __int32 *)&SourceProcess->Pcb.gap0[4]);
do
_mm_pause();
while( *(_DWORD *)&SourceProcess->Pcb.gap0[4] != v7 );
KeStallExecutionProcessor(0x1E848u);
_InterlockedIncrement((volatile signed __int32 *)&SourceProcess->Pcb.gap0[8]);
do
_mm_pause();
while( *(_DWORD *)&SourceProcess->Pcb.gap0[8] != v7 );
_InterlockedIncrement((volatile signed __int32 *)&SourceProcess->Pcb.gap0[12]);
}
if( v4 )
_enable();
}Referenced by:
No references.