From b2f73e07c896f4ea3ba039f19dab48687b77e212 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Fri, 23 Jul 2004 07:44:26 +0000 Subject: [PATCH] Added thread counting with PsEnumThreadsByProcess and thread support in SystemProcessInformation. svn path=/trunk/; revision=10257 --- reactos/ntoskrnl/ex/sysinfo.c | 33 +++++++++++++++++++++----- reactos/ntoskrnl/include/internal/ps.h | 3 ++- reactos/ntoskrnl/ps/thread.c | 22 ++++++++++++++++- 3 files changed, 50 insertions(+), 8 deletions(-) diff --git a/reactos/ntoskrnl/ex/sysinfo.c b/reactos/ntoskrnl/ex/sysinfo.c index a58ef2aa60e..b8eefb02859 100644 --- a/reactos/ntoskrnl/ex/sysinfo.c +++ b/reactos/ntoskrnl/ex/sysinfo.c @@ -1,4 +1,4 @@ -/* $Id: sysinfo.c,v 1.39 2004/07/22 17:22:36 jimtabor Exp $ +/* $Id: sysinfo.c,v 1.40 2004/07/23 07:44:25 jimtabor Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -531,12 +531,11 @@ QSI_DEF(SystemPathInformation) /* Class 5 - Process Information */ QSI_DEF(SystemProcessInformation) { - ULONG ovlSize=0, nThreads=1; + ULONG ovlSize=0, nThreads; PEPROCESS pr, syspr; unsigned char *pCur; /* scan the process list */ - // TODO: Add thread information PSYSTEM_PROCESSES Spi = (PSYSTEM_PROCESSES) Buffer; @@ -555,14 +554,15 @@ QSI_DEF(SystemProcessInformation) do { PSYSTEM_PROCESSES SpiCur; - int curSize; + int curSize, i = 0; ANSI_STRING imgName; int inLen=32; // image name len in bytes - + PLIST_ENTRY current_entry; + PETHREAD current; SpiCur = (PSYSTEM_PROCESSES)pCur; - nThreads = 1; // FIXME + nThreads = PsEnumThreadsByProcess(pr); // size of the structure for every process curSize = sizeof(SYSTEM_PROCESSES)-sizeof(SYSTEM_THREADS)+sizeof(SYSTEM_THREADS)*nThreads; @@ -613,6 +613,27 @@ QSI_DEF(SystemProcessInformation) // doesn't seem to contain any equivalent field //SpiCur->TotalPrivateBytes = pr->NumberOfPrivatePages; //FIXME: bytes != pages + current_entry = pr->ThreadListHead.Flink; + while (current_entry != &pr->ThreadListHead) + { + current = CONTAINING_RECORD(current_entry, ETHREAD, + Tcb.ProcessThreadListEntry); + + SpiCur->Threads[i].KernelTime.QuadPart = current->Tcb.KernelTime * 100000LL; + SpiCur->Threads[i].UserTime.QuadPart = current->Tcb.UserTime * 100000LL; +// SpiCur->Threads[i].CreateTime = current->CreateTime; + SpiCur->Threads[i].WaitTime = current->Tcb.WaitTime; + SpiCur->Threads[i].StartAddress = (PVOID) current->StartAddress; + SpiCur->Threads[i].ClientId = current->Cid; + SpiCur->Threads[i].Priority = current->Tcb.Priority; + SpiCur->Threads[i].BasePriority = current->Tcb.BasePriority; + SpiCur->Threads[i].ContextSwitchCount = 0; //FIXME! + SpiCur->Threads[i].State = current->Tcb.State; + SpiCur->Threads[i].WaitReason = current->Tcb.WaitReason; + i++; + current_entry = current_entry->Flink; + } + pr = PsGetNextProcess(pr); if ((pr == syspr) || (pr == NULL)) diff --git a/reactos/ntoskrnl/include/internal/ps.h b/reactos/ntoskrnl/include/internal/ps.h index ce3c24b2a58..70fe4839c15 100644 --- a/reactos/ntoskrnl/include/internal/ps.h +++ b/reactos/ntoskrnl/include/internal/ps.h @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: ps.h,v 1.61 2004/07/20 23:58:35 ion Exp $ +/* $Id: ps.h,v 1.62 2004/07/23 07:44:26 jimtabor Exp $ * * FILE: ntoskrnl/ke/kthread.c * PURPOSE: Process manager definitions @@ -529,6 +529,7 @@ VOID PsUnfreezeOtherThread(PETHREAD Thread); VOID PsFreezeOtherThread(PETHREAD Thread); VOID PsFreezeProcessThreads(PEPROCESS Process); VOID PsUnfreezeProcessThreads(PEPROCESS Process); +ULONG PsEnumThreadsByProcess(PEPROCESS Process); PEPROCESS PsGetNextProcess(PEPROCESS OldProcess); VOID PsBlockThread(PNTSTATUS Status, UCHAR Alertable, ULONG WaitMode, diff --git a/reactos/ntoskrnl/ps/thread.c b/reactos/ntoskrnl/ps/thread.c index 4d9a6f37ba2..7899567c304 100644 --- a/reactos/ntoskrnl/ps/thread.c +++ b/reactos/ntoskrnl/ps/thread.c @@ -1,4 +1,4 @@ -/* $Id: thread.c,v 1.129 2004/07/21 01:05:26 ion Exp $ +/* $Id: thread.c,v 1.130 2004/07/23 07:44:26 jimtabor Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -578,6 +578,26 @@ PsFreezeAllThreads(PEPROCESS Process) KeReleaseSpinLock(&PiThreadListLock, oldIrql); } +ULONG +PsEnumThreadsByProcess(PEPROCESS Process) +{ + KIRQL oldIrql; + PLIST_ENTRY current_entry; + ULONG Count = 0; + + KeAcquireSpinLock(&PiThreadListLock, &oldIrql); + + current_entry = Process->ThreadListHead.Flink; + while (current_entry != &Process->ThreadListHead) + { + Count++; + current_entry = current_entry->Flink; + } + + KeReleaseSpinLock(&PiThreadListLock, oldIrql); + return Count; +} + /* * @unimplemented */