PsQueryRuntimeProcess
UINT64 __stdcall PsQueryRuntimeProcess(_EPROCESS *Process, UINT64 *UserTime){
_ETHREAD *CurrentThread;
_EX_PUSH_LOCK *p_ThreadListLock;
unsigned int KernelTime;
unsigned int v7;
_LIST_ENTRY *p_ThreadListHead;
_LIST_ENTRY *i;
UINT64 result;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
p_ThreadListLock = &Process->ThreadListLock;
ExAcquirePushLockSharedEx(&Process->ThreadListLock, 0i64);
KernelTime = Process->Pcb.KernelTime;
v7 = Process->Pcb.UserTime;
p_ThreadListHead = &Process->ThreadListHead;
for( i = p_ThreadListHead->Flink; i != p_ThreadListHead; i = i->Flink )
{
KernelTime += HIDWORD(i[-38].Flink);
v7 += HIDWORD(i[-33].Flink);
}
if( _InterlockedCompareExchange64(&p_ThreadListLock->_bf_0, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(p_ThreadListLock);
KeAbPostRelease(p_ThreadListLock);
KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
result = KernelTime;
*(_DWORD *)UserTime = v7;
return result;
}Referenced by:
ExpQuerySystemPerformanceInformation
NtQueryInformationProcess
PspSetJobTimeLimitCallback