From 6f4149e361f4e2e6667c5feb30e905c1b4568270 Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Sun, 14 Sep 2003 10:52:33 +0000 Subject: [PATCH] - Reference all returned process objects (in PsGetNextProcess). - Do not fail if a process is deleted (in PsGetNextProcess). - Change the direction of the returned process (in PsGetNextProcess). - Check if a process is deleted in NtOpenProcess. svn path=/trunk/; revision=6077 --- reactos/ntoskrnl/ps/process.c | 98 +++++++++++++++++++++++------------ 1 file changed, 65 insertions(+), 33 deletions(-) diff --git a/reactos/ntoskrnl/ps/process.c b/reactos/ntoskrnl/ps/process.c index 0f05cfc084f..49e76b32269 100644 --- a/reactos/ntoskrnl/ps/process.c +++ b/reactos/ntoskrnl/ps/process.c @@ -1,4 +1,4 @@ -/* $Id: process.c,v 1.114 2003/08/19 23:59:08 dwelch Exp $ +/* $Id: process.c,v 1.115 2003/09/14 10:52:33 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -75,32 +75,54 @@ PsGetNextProcess(PEPROCESS OldProcess) if (OldProcess == NULL) { - return(PsInitialSystemProcess); + Status = ObReferenceObjectByPointer(PsInitialSystemProcess, + PROCESS_ALL_ACCESS, + PsProcessType, + KernelMode); + if (!NT_SUCCESS(Status)) + { + CPRINT("PsGetNextProcess(): ObReferenceObjectByPointer failed for PsInitialSystemProcess\n"); + KEBUGCHECK(0); + } + return PsInitialSystemProcess; } KeAcquireSpinLock(&PsProcessListLock, &oldIrql); - if (OldProcess->ProcessListEntry.Flink == &PsProcessListHead) + NextProcess = OldProcess; + while (1) { - NextProcess = CONTAINING_RECORD(PsProcessListHead.Flink, - EPROCESS, - ProcessListEntry); + if (NextProcess->ProcessListEntry.Blink == &PsProcessListHead) + { + NextProcess = CONTAINING_RECORD(PsProcessListHead.Blink, + EPROCESS, + ProcessListEntry); + } + else + { + NextProcess = CONTAINING_RECORD(NextProcess->ProcessListEntry.Blink, + EPROCESS, + ProcessListEntry); + } + Status = ObReferenceObjectByPointer(NextProcess, + PROCESS_ALL_ACCESS, + PsProcessType, + KernelMode); + if (NT_SUCCESS(Status)) + { + break; + } + else if (Status == STATUS_PROCESS_IS_TERMINATING) + { + continue; + } + else if (!NT_SUCCESS(Status)) + { + CPRINT("PsGetNextProcess(): ObReferenceObjectByPointer failed\n"); + KEBUGCHECK(0); + } } - else - { - NextProcess = CONTAINING_RECORD(OldProcess->ProcessListEntry.Flink, - EPROCESS, - ProcessListEntry); - } - Status = ObReferenceObjectByPointer(NextProcess, - PROCESS_ALL_ACCESS, - PsProcessType, - KernelMode); + KeReleaseSpinLock(&PsProcessListLock, oldIrql); - if (!NT_SUCCESS(Status)) - { - CPRINT("PsGetNextProcess(): ObReferenceObjectByPointer failed\n"); - KEBUGCHECK(0); - } ObDereferenceObject(OldProcess); return(NextProcess); @@ -950,19 +972,29 @@ NtOpenProcess(OUT PHANDLE ProcessHandle, ProcessListEntry); if (current->UniqueProcessId == (ULONG)ClientId->UniqueProcess) { - ObReferenceObjectByPointer(current, - DesiredAccess, - PsProcessType, - UserMode); + if (current->Pcb.State == PROCESS_STATE_TERMINATED) + { + Status = STATUS_PROCESS_IS_TERMINATING; + } + else + { + Status = ObReferenceObjectByPointer(current, + DesiredAccess, + PsProcessType, + UserMode); + } KeReleaseSpinLock(&PsProcessListLock, oldIrql); - Status = ObCreateHandle(PsGetCurrentProcess(), - current, - DesiredAccess, - FALSE, - ProcessHandle); - ObDereferenceObject(current); - DPRINT("*ProcessHandle %x\n", ProcessHandle); - DPRINT("NtOpenProcess() = %x\n", Status); + if (NT_SUCCESS(Status)) + { + Status = ObCreateHandle(PsGetCurrentProcess(), + current, + DesiredAccess, + FALSE, + ProcessHandle); + ObDereferenceObject(current); + DPRINT("*ProcessHandle %x\n", ProcessHandle); + DPRINT("NtOpenProcess() = %x\n", Status); + } return(Status); } current_entry = current_entry->Flink;