X-Git-Url: http://git.jankratochvil.net/?p=reactos.git;a=blobdiff_plain;f=ntoskrnl%2Fps%2Fkill.c;fp=ntoskrnl%2Fps%2Fkill.c;h=03ec2557ec7f3679936cd4fe4f01e3181e89a735;hp=7d9fa12140377f0f0312842d15217211ae1a18d5;hb=e3ed2d773259cc445c7ff8181ebd934931365328;hpb=d378c68f5a9bb25c9e671dacd482d2e25d211df3 diff --git a/ntoskrnl/ps/kill.c b/ntoskrnl/ps/kill.c index 7d9fa12..03ec255 100644 --- a/ntoskrnl/ps/kill.c +++ b/ntoskrnl/ps/kill.c @@ -96,17 +96,48 @@ PsReapThreads(VOID) { PEPROCESS Process = current->ThreadsProcess; NTSTATUS Status = current->ExitStatus; + BOOLEAN Last; PiNrThreadsAwaitingReaping--; current->Tcb.State = THREAD_STATE_TERMINATED_2; RemoveEntryList(¤t->Tcb.ProcessThreadListEntry); - if (IsListEmpty(&Process->ThreadListHead)) - { - KeReleaseSpinLock( &PiThreadListLock, oldIrql ); - PiTerminateProcess(Process, Status); - KeAcquireSpinLock( &PiThreadListLock, &oldIrql ); - } + Last = IsListEmpty(&Process->ThreadListHead); KeReleaseSpinLock(&PiThreadListLock, oldIrql); + + if (Last) + { + PiTerminateProcess(Process, Status); + } + else + { + if (current->Tcb.Teb) + { + /* If this is not the last thread for the process than free the memory + from user stack and teb. */ + NTSTATUS Status; + ULONG Length; + ULONG Offset; + PVOID DeallocationStack; + HANDLE ProcessHandle; + Status = ObCreateHandle(PsGetCurrentProcess(), Process, PROCESS_ALL_ACCESS, FALSE, &ProcessHandle); + if (!NT_SUCCESS(Status)) + { + DPRINT1("ObCreateHandle failed, status = %x\n", Status); + KeBugCheck(0); + } + Offset = FIELD_OFFSET(TEB, DeallocationStack); + Length = 0; + NtReadVirtualMemory(ProcessHandle, (PVOID)current->Tcb.Teb + Offset, + (PVOID)&DeallocationStack, sizeof(PVOID), &Length); + if (DeallocationStack && Length == sizeof(PVOID)) + { + NtFreeVirtualMemory(ProcessHandle, &DeallocationStack, &Length, MEM_RELEASE); + } + Length = PAGE_SIZE; + NtFreeVirtualMemory(ProcessHandle, (PVOID*)¤t->Tcb.Teb, &Length, MEM_RELEASE); + NtClose(ProcessHandle); + } + } ObDereferenceObject(current); KeAcquireSpinLock(&PiThreadListLock, &oldIrql); current_entry = PiThreadListHead.Flink;