KiEndThreadAccountingPeriod
VOID __stdcall KiEndThreadAccountingPeriod(_KPRCB *Prcb, _ETHREAD *Thread, UINT64 NetCycles){
char v3;
__int64 v6;
__int64 v7;
__int64 v8;
unsigned int v9;
unsigned int v10;
__int64 v11;
__int64 v12;
__int64 v13;
__int64 v14;
_QWORD *v15;
unsigned int v16;
unsigned int v17;
unsigned int v18;
__int64 v19;
_QWORD *i;
int v21;
__int64 v22;
__int64 v23;
v3 = *((_BYTE *)Thread + 2);
if( (v3 & 0x10) != 0 )
{
*((_QWORD *)Prcb + *((unsigned __int8 *)Thread + 124) + 4058) += *((_QWORD *)Prcb + 4056) - *((_QWORD *)Prcb + 4057);
v3 &= ~0x10u;
*((_QWORD *)Prcb + 4057) = 0i64;
}
if( (v3 & 0x20) != 0 )
{
v6 = *((_QWORD *)Thread + 191);
if( v6 )
{
v7 = *((_QWORD *)Prcb + 4141);
v8 = *((_QWORD *)Prcb + 4142);
if( v7 && v8 )
{
if( *(_BYTE *)(v8 + 100) )
{
v9 = *(_DWORD *)(v8 + 116);
}
else
{
v9 = *(_DWORD *)(v8 + 72);
if( v9 >= *(_DWORD *)(v7 + 368) )
v9 = *(_DWORD *)(v7 + 368);
}
}
else
{
v9 = 100;
}
if( v9 < 0x4B )
v10 = v9 / 0x19;
else
v10 = 3;
v11 = *((unsigned __int8 *)Prcb + 33208);
v12 = v10;
v13 = v11 + 2i64 * v10;
v14 = *(_QWORD *)(v6 + 8 * v13);
v15 = (_QWORD *)(v6 + 8 * v13);
v16 = KiTimelineBitmapTime;
*v15 = NetCycles + v14;
v17 = *(_DWORD *)(v6 + 192);
if( v16 > v17 )
{
LODWORD(v23) = v16;
if( v16 - v17 >= 0x20 )
v21 = 1;
else
v21 = (*(_DWORD *)(v6 + 196) << (v16 - v17)) | 1;
HIDWORD(v23) = v21;
*(_QWORD *)(v6 + 192) = v23;
}
else
{
v18 = v17 - v16;
if( v18 < 0x20 )
*(_DWORD *)(v6 + 196) |= 1 << v18;
}
if( !KiEfficiencyClassSystem && (unsigned __int8)*((_DWORD *)Thread + 128) == 2 )
*(_QWORD *)(v6 + 16 * v12 + 8) += NetCycles;
if( *((_QWORD *)Thread + 184) )
{
*(_QWORD *)(v6 + 8 * (v11 + 16 + 2 * v12)) += NetCycles;
_InterlockedExchangeAdd64(
(volatile signed __int64 *)(*(_QWORD *)(*((_QWORD *)Thread + 184) + 1528i64) + 8 * (v11 + 8 + 2 * v12)),
NetCycles);
}
}
v3 &= ~0x20u;
}
if( (v3 & 0x40) != 0 )
{
v22 = *((_QWORD *)Thread + 121);
if( v22 )
*(_BYTE *)(v22 + 64) = 0;
v3 &= ~0x40u;
}
if( (v3 & 0x3E) != 0 )
{
v19 = *((_QWORD *)Thread + 13);
if( v19 )
{
for( i = (_QWORD *)(*((unsigned int *)Prcb + 54) + v19); i; i = (_QWORD *)i[51] )
*i += NetCycles;
}
if( (*((_BYTE *)Thread + 2) & 8) != 0
&& (*((_QWORD *)Thread + 72) & *(_QWORD *)(*((_QWORD *)Prcb + 24) + 136i64)) != *(_QWORD *)(*((_QWORD *)Prcb + 24)
+ 136i64) )
{
*((_QWORD *)Prcb + 4061) += NetCycles;
}
if( *((_BYTE *)Thread + 125) )
{
if( (unsigned __int8)*((_DWORD *)Thread + 128) == 2 )
*((_QWORD *)Prcb + 4063) += NetCycles;
else
*((_QWORD *)Prcb + 4062) += NetCycles;
}
if( *((_QWORD *)Thread + 45) )
KiEndCounterAccumulation((__int64)Thread);
}
}Referenced by:
KeQueryTotalCycleTimeThread
KiEndThreadCycleAccumulation
KiHvInterruptSubDispatch
KiInterruptSubDispatch
KiInterruptSubDispatchNoLock
KiInterruptSubDispatchNoLockNoEtw
KiIpiInterruptSubDispatch
KiScanInterruptObjectList
KiSpuriousDispatchNoEOI
KiSwInterrupt
KiUpdateTotalCyclesCurrentThread
KiVmbusInterruptSubDispatch
KxDispatchInterrupt
KxIsrLinkage