From 4e027af35c2af00a93dceb61410b7e0a13dd6937 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Mon, 20 Feb 2012 06:35:05 +0000 Subject: [PATCH] [NTOSKRNL]: NtQuerySystemInformation(SystemProcessInformation) should skip zombie processes, and it should use the KTHREAD ThreadListEntry, not the ETHREAD ThreadListEntry. Fixes winetest since Idle Threads are int he former, not the latter (verified and Windows does this too). svn path=/trunk/; revision=55731 --- reactos/ntoskrnl/ex/sysinfo.c | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/reactos/ntoskrnl/ex/sysinfo.c b/reactos/ntoskrnl/ex/sysinfo.c index ac1dc5d141e..cacf233f8f4 100644 --- a/reactos/ntoskrnl/ex/sysinfo.c +++ b/reactos/ntoskrnl/ex/sysinfo.c @@ -711,7 +711,9 @@ QSI_DEF(SystemProcessInformation) /* Check for overflow */ if (Size < sizeof(SYSTEM_PROCESS_INFORMATION)) + { Overflow = TRUE; + } /* Zero user's buffer */ if (!Overflow) RtlZeroMemory(Spi, Size); @@ -719,14 +721,25 @@ QSI_DEF(SystemProcessInformation) SystemProcess = PsIdleProcess; Process = SystemProcess; Current = (PUCHAR) Spi; + CurrentSize = 0; + ImageNameMaximumLength = 0; do { SpiCurrent = (PSYSTEM_PROCESS_INFORMATION) Current; + + if ((Process->ProcessExiting) && + (Process->Pcb.Header.SignalState) && + !(Process->ActiveThreads) && + (IsListEmpty(&Process->Pcb.ThreadListHead))) + { + DPRINT1("Skipping zombie\n"); + goto Skip; + } ThreadsCount = 0; - CurrentEntry = Process->ThreadListHead.Flink; - while (CurrentEntry != &Process->ThreadListHead) + CurrentEntry = Process->Pcb.ThreadListHead.Flink; + while (CurrentEntry != &Process->Pcb.ThreadListHead) { ThreadsCount++; CurrentEntry = CurrentEntry->Flink; @@ -770,7 +783,9 @@ QSI_DEF(SystemProcessInformation) /* Check for overflow */ if (TotalSize > Size) + { Overflow = TRUE; + } /* Fill system information */ if (!Overflow) @@ -821,10 +836,10 @@ QSI_DEF(SystemProcessInformation) SpiCurrent->PrivatePageCount = Process->CommitCharge; ThreadInfo = (PSYSTEM_THREAD_INFORMATION)(SpiCurrent + 1); - CurrentEntry = Process->ThreadListHead.Flink; - while (CurrentEntry != &Process->ThreadListHead) + CurrentEntry = Process->Pcb.ThreadListHead.Flink; + while (CurrentEntry != &Process->Pcb.ThreadListHead) { - CurrentThread = CONTAINING_RECORD(CurrentEntry, ETHREAD, + CurrentThread = (PETHREAD)CONTAINING_RECORD(CurrentEntry, KTHREAD, ThreadListEntry); ThreadInfo->KernelTime.QuadPart = UInt32x32To64(CurrentThread->Tcb.KernelTime, KeMaximumIncrement); @@ -850,6 +865,7 @@ QSI_DEF(SystemProcessInformation) } /* Handle idle process entry */ +Skip: if (Process == PsIdleProcess) Process = NULL; Process = PsGetNextProcess(Process);