KiBeginThreadAccountingPeriod
VOID __stdcall KiBeginThreadAccountingPeriod(_KPRCB *Prcb, _ETHREAD *Thread, UINT64 NetCycles){
_ETHREAD *CurrentThread;
char v6;
char v7;
__int64 v8;
__int64 v9;
unsigned int v10;
unsigned int v11;
_QWORD *v12;
int v13;
__int64 v14;
__int64 v15;
__int64 v16;
CurrentThread = Thread;
if( Thread )
{
v6 = 1;
}
else
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v6 = 0;
}
v7 = *((_BYTE *)CurrentThread + 2);
if( (v7 & 0x10) != 0 )
*((_QWORD *)Prcb + 4057) = *((_QWORD *)Prcb + 4056);
if( (v7 & 0x20) != 0 )
{
v8 = *((_QWORD *)Prcb + 4141);
v9 = *((_QWORD *)Prcb + 4142);
if( v8 && v9 )
{
if( *(_BYTE *)(v9 + 100) )
{
v10 = *(_DWORD *)(v9 + 116);
}
else
{
v10 = *(_DWORD *)(v9 + 72);
if( v10 >= *(_DWORD *)(v8 + 368) )
v10 = *(_DWORD *)(v8 + 368);
}
}
else
{
v10 = 100;
}
if( v10 < 0x4B )
v11 = v10 / 0x19;
else
v11 = 3;
v12 = (_QWORD *)((char *)Prcb + 16 * v11 + 8 * *((unsigned __int8 *)Prcb + 33208) + 32576);
*v12 += NetCycles;
}
if( (v7 & 0x40) != 0 )
{
v16 = *((_QWORD *)CurrentThread + 121);
if( v16 )
*(_BYTE *)(v16 + 64) = 1;
}
*((_BYTE *)Prcb + 32) = 0;
if( v6 )
{
if( (v7 & 0x36) == 0 )
{
_enable();
return;
}
if( *((_QWORD *)CurrentThread + 45) )
KiBeginCounterAccumulation((_KTHREAD *)CurrentThread, 1u);
_enable();
if( (*((_BYTE *)CurrentThread + 2) & 4) != 0 )
{
v13 = *((_DWORD *)CurrentThread + 30);
if( (v13 & 0x800) == 0 )
{
if( (v13 & 0x600) != 0 )
return;
v14 = *((_QWORD *)CurrentThread + 13);
if( !v14 )
return;
v15 = *((unsigned int *)Prcb + 54) + v14;
if( !v15 )
return;
while( (*(_BYTE *)(v15 + 112) & 2) == 0 )
{
v15 = *(_QWORD *)(v15 + 408);
if( !v15 )
return;
}
}
KiInsertDeferredPreemptionApc(Prcb, (_KTHREAD *)CurrentThread, 1u);
}
}
else if( (v7 & 2) != 0 )
{
KiBeginCounterAccumulation((_KTHREAD *)CurrentThread, 0);
}
}Referenced by:
KiIpiInterrupt
KiSpuriousDispatchNoEOI
KiSwInterrupt
KxIsrLinkage
SwapContext