EtwpCovSampProfileInterrupt
CHAR __fastcall EtwpCovSampProfileInterrupt(INT64 a1, INT64 a2){
struct _KPRCB *CurrentPrcb;
_ETHREAD *CurrentThread;
unsigned __int64 v5;
unsigned int v6;
unsigned int v7;
__int64 v8;
__int64 v9;
unsigned int LowPart;
int v11;
int v12;
int v13;
unsigned int v14;
unsigned int v15;
unsigned int v16;
int v17;
int v18;
void *v19;
CurrentPrcb = KeGetCurrentPrcb();
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
if( CurrentThread != *((_ETHREAD **)CurrentPrcb + 3) || *((_BYTE *)CurrentPrcb + 32) > 1u )
{
v5 = *(_QWORD *)(a2 + 8);
v6 = ((unsigned int)v5 >> 13) & 0x3FFFF;
_BitScanReverse(&v7, v6);
v8 = (v5 >> 4) & 0x1FF;
v9 = *(_QWORD *)(*(_QWORD *)(*((_QWORD *)KeGetCurrentPrcb() + 4198) + 8i64 * (v7 - 2)) + 8i64 * (v6 ^ (1 << v7)) + 8);
if( !*(_DWORD *)(v9 + 8 * v8 + 144) )
{
LABEL_13:
v19 = *(void **)(a1 + 360);
_InterlockedIncrement((volatile signed __int32 *)(v9 + 8 * v8 + 320));
LOBYTE(CurrentThread) = EtwpCovSampCaptureSample(v19, 0x50000002ui64);
return(char)CurrentThread;
}
LowPart = KUSER_SHARED_DATA.TickCount.LowPart;
LODWORD(CurrentThread) = KUSER_SHARED_DATA.TickCount.LowPart - *(_DWORD *)(v9 + 8 * v8 + 148);
if( (unsigned int)CurrentThread > *(_DWORD *)(v9 + 8 * v8 + 152) )
{
v11 = *(_DWORD *)(v9 + 8 * v8 + 144);
*(_DWORD *)(v9 + 8 * v8 + 164) += v11;
v12 = *(_DWORD *)(v9 + 8 * v8 + 164);
v13 = *(_DWORD *)(v9 + 8 * v8 + 160);
LODWORD(CurrentThread) = 2 * v11;
if( v12 > *(_DWORD *)(v9 + 8 * v8 + 156) )
v12 = *(_DWORD *)(v9 + 8 * v8 + 156);
*(_DWORD *)(v9 + 8 * v8 + 148) = LowPart;
v14 = *(_DWORD *)(v9 + 8 * v8 + 172) + v13;
*(_DWORD *)(v9 + 8 * v8 + 160) = 0;
v15 = v14 >> 1;
*(_DWORD *)(v9 + 8 * v8 + 164) = v12;
*(_DWORD *)(v9 + 8 * v8 + 172) = v15;
if( v15 >= (unsigned int)CurrentThread )
{
v16 = v15 / (v11 + 1);
v17 = 16777619 * (*(_DWORD *)(v9 + 8 * v8 + 180) ^ LowPart);
*(_DWORD *)(v9 + 8 * v8 + 176) = v16;
LODWORD(CurrentThread) = v17 & (2 * v16);
*(_DWORD *)(v9 + 8 * v8 + 180) = v17;
*(_DWORD *)(v9 + 8 * v8 + 168) = (_DWORD)CurrentThread;
}
else
{
*(_DWORD *)(v9 + 8 * v8 + 176) = 1;
*(_DWORD *)(v9 + 8 * v8 + 168) = 1;
}
}
++*(_DWORD *)(v9 + 8 * v8 + 160);
v18 = *(_DWORD *)(v9 + 8 * v8 + 164);
if( v18 > 0 )
{
LODWORD(CurrentThread) = --*(_DWORD *)(v9 + 8 * v8 + 168);
if( (int)CurrentThread <= 0 )
{
*(_DWORD *)(v9 + 8 * v8 + 164) = v18 - 1;
*(_DWORD *)(v9 + 8 * v8 + 168) = *(_DWORD *)(v9 + 8 * v8 + 176);
goto LABEL_13;
}
}
}
return(char)CurrentThread;
}Referenced by:
No references.