PsQueryStatisticsProcess

VOID __fastcall PsQueryStatisticsProcess(_EPROCESS *Process, _EPROCESS_VALUES *Values){
  unsigned int v4; 
  unsigned int v5; 
  unsigned int v6; 
  __int64 v7; 
  __int64 v8; 
  _EPROCESS *i; 
  __int64 v10; 
  __int128 v11; 
  __int128 v12; 
  INT64 *Lock; 
  _ETHREAD *CurrentThread; 
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v11 = 0i64;
  --*((_WORD *)CurrentThread + 242);
  v12 = 0i64;
  Lock = (INT64 *)((char *)Process + 2144);
  ExAcquirePushLockSharedEx((UINT64)Process + 2144, 0i64);
  v4 = *((_DWORD *)Process + 223);
  v5 = *((_DWORD *)Process + 224);
  v6 = *((_DWORD *)Process + 225);
  v7 = *((_QWORD *)Process + 125);
  v8 = *((_QWORD *)Process + 126);
  Values->CycleTime = *((_QWORD *)Process + 108);
  Values->ContextSwitches = *((_QWORD *)Process + 109);
  Values->ReadOperationCount = *((_QWORD *)Process + 194);
  Values->WriteOperationCount = *((_QWORD *)Process + 195);
  Values->OtherOperationCount = *((_QWORD *)Process + 196);
  Values->ReadTransferCount = *((_QWORD *)Process + 197);
  Values->WriteTransferCount = *((_QWORD *)Process + 198);
  Values->OtherTransferCount = *((_QWORD *)Process + 199);
  for( i = (_EPROCESS *)*((_QWORD *)Process + 188); i != (_EPROCESS *)((char *)Process + 1504); v8 += *((_QWORD *)&v12 + 1) )
  {
    v4 += *((_DWORD *)i - 151);
    v5 += *((_DWORD *)i - 131);
    KeQueryValuesThread((__int64)i - 1256, (__int64)&v11);
    Values->CycleTime += *((_QWORD *)i - 148);
    Values->ContextSwitches += *((unsigned int *)i - 229);
    Values->ReadOperationCount += *((_QWORD *)i - 45);
    Values->WriteOperationCount += *((_QWORD *)i - 44);
    Values->OtherOperationCount += *((_QWORD *)i - 43);
    Values->ReadTransferCount += *((_QWORD *)i - 42);
    Values->WriteTransferCount += *((_QWORD *)i - 41);
    Values->OtherTransferCount += *((_QWORD *)i - 40);
    i = *(_EPROCESS **)i;
    v6 += DWORD1(v11);
    v7 += v12;
  }
  if( _InterlockedCompareExchange64(Lock, 0i64, 17i64) != 17 )
    ExfReleasePushLockShared(Lock);
  KeAbPostRelease(Lock);
  KeLeaveCriticalRegionThread((__int64)CurrentThread);
  v10 = KeMaximumIncrement;
  Values->KernelTime = KeMaximumIncrement * (unsigned __int64)v4;
  Values->UserTime = v10 * v5;
  Values->ReadyTime = v10 * v6;
  Values->KernelWaitTime = v7 * (unsigned int)v10;
  Values->UserWaitTime = v8 * v10;
}

Referenced by:

EtwTraceAppStateChange
EtwpPsProvTraceProcess
ExpCopyProcessInfo
NtQueryInformationProcess
PspEnforceLimitsProcessCallback
PspQueryProcessAccountingInformationCallback
PspRemoveProcessFromJobChain