PsQueryStatisticsProcess

VOID __stdcall PsQueryStatisticsProcess(_EPROCESS *Process, _EPROCESS_VALUES *Values){
  unsigned int KernelTime; 
  unsigned int UserTime; 
  unsigned int ReadyTime; 
  unsigned __int64 KernelWaitTime; 
  unsigned __int64 UserWaitTime; 
  _EPROCESS *i; 
  __int64 v10; 
  _KTHREAD_VALUES Valuesa[2]; 
  __int128 v12; 
  _EX_PUSH_LOCK *Lock; 
  _KTHREAD *Thread; 

  Thread = (_ETHREAD *)KeGetCurrentThread();
  *(_OWORD *)&Valuesa[0].WaitTime = 0i64;
  --Thread->Tcb.KernelApcDisable;
  v12 = 0i64;
  Lock = &Process->ThreadListLock;
  ExAcquirePushLockSharedEx(&Process->ThreadListLock, 0i64);
  KernelTime = Process->Pcb.KernelTime;
  UserTime = Process->Pcb.UserTime;
  ReadyTime = Process->Pcb.ReadyTime;
  KernelWaitTime = Process->Pcb.KernelWaitTime;
  UserWaitTime = Process->Pcb.UserWaitTime;
  Values->CycleTime = Process->Pcb.CycleTime;
  Values->ContextSwitches = Process->Pcb.ContextSwitches;
  Values->ReadOperationCount = Process->ReadOperationCount.QuadPart;
  Values->WriteOperationCount = Process->WriteOperationCount.QuadPart;
  Values->OtherOperationCount = Process->OtherOperationCount.QuadPart;
  Values->ReadTransferCount = Process->ReadTransferCount.QuadPart;
  Values->WriteTransferCount = Process->WriteTransferCount.QuadPart;
  Values->OtherTransferCount = Process->OtherTransferCount.QuadPart;
  for( i = (_EPROCESS *)Process->ThreadListHead.Flink;
        i != (_EPROCESS *)&Process->ThreadListHead;
        UserWaitTime += *((_QWORD *)&v12 + 1) )
  {
    KernelTime += HIDWORD(i[-1].VadHint);
    UserTime += HIDWORD(i[-1].TimerResolutionStackRecord);
    KeQueryValuesThread((_KTHREAD *)&i[-1].Session, Valuesa);
    Values->CycleTime += (unsigned __int64)i[-1].ImageFilePointer;
    Values->ContextSwitches += HIDWORD(i[-1].Vm.Instance.AgeDistribution[0]);
    Values->ReadOperationCount += i[-1].EnclaveLock._bf_0;
    Values->WriteOperationCount += *(_QWORD *)&i[-1].HighPriorityFaultsAllowed;
    Values->OtherOperationCount += (__int64)i[-1].EnergyContext;
    Values->ReadTransferCount += (__int64)i[-1].VmContext;
    Values->WriteTransferCount += i[-1].SequenceNumber;
    Values->OtherTransferCount += i[-1].CreateInterruptTime;
    i = *(_EPROCESS **)i->Pcb.gap0;
    ReadyTime += *(_DWORD *)&Valuesa[0].State;
    KernelWaitTime += v12;
  }
  if( _InterlockedCompareExchange64(&Lock->_bf_0, 0i64, 17i64) != 17 )
    ExfReleasePushLockShared(Lock);
  KeAbPostRelease(Lock);
  KeLeaveCriticalRegionThread(&Thread->Tcb);
  v10 = (unsigned int)KeMaximumIncrement;
  Values->KernelTime = (unsigned int)KeMaximumIncrement * (unsigned __int64)KernelTime;
  Values->UserTime = v10 * UserTime;
  Values->ReadyTime = v10 * ReadyTime;
  Values->KernelWaitTime = KernelWaitTime * (unsigned int)v10;
  Values->UserWaitTime = UserWaitTime * v10;
}

Referenced by:

EtwTraceAppStateChange
EtwpPsProvTraceProcess
ExpCopyProcessInfo
NtQueryInformationProcess
PspEnforceLimitsProcessCallback
PspQueryProcessAccountingInformationCallback
PspRemoveProcessFromJobChain