diff --git a/reactos/ntoskrnl/ke/kthread.c b/reactos/ntoskrnl/ke/kthread.c index 366e39b59ad..fc6cf7137ec 100644 --- a/reactos/ntoskrnl/ke/kthread.c +++ b/reactos/ntoskrnl/ke/kthread.c @@ -917,47 +917,6 @@ KeQueryRuntimeThread(IN PKTHREAD Thread, return Thread->KernelTime; } -VOID -KeFreeStackPage(PVOID Context, - MEMORY_AREA* MemoryArea, - PVOID Address, - PFN_TYPE Page, - SWAPENTRY SwapEntry, - BOOLEAN Dirty) -{ - ASSERT(SwapEntry == 0); - if (Page) MmReleasePageMemoryConsumer(MC_NPPOOL, Page); -} - -NTSTATUS -KeReleaseThread(PKTHREAD Thread) -/* - * FUNCTION: Releases the resource allocated for a thread by - * KeInitializeThread - * NOTE: The thread had better not be running when this is called - */ -{ - extern unsigned int init_stack; - - /* FIXME - lock the process */ - RemoveEntryList(&Thread->ThreadListEntry); - - if (Thread->StackLimit != (ULONG_PTR)init_stack) - { - MmLockAddressSpace(MmGetKernelAddressSpace()); - MmFreeMemoryAreaByPtr(MmGetKernelAddressSpace(), - (PVOID)Thread->StackLimit, - KeFreeStackPage, - NULL); - MmUnlockAddressSpace(MmGetKernelAddressSpace()); - } - Thread->StackLimit = 0; - Thread->InitialStack = NULL; - Thread->StackBase = NULL; - Thread->KernelStack = NULL; - return(STATUS_SUCCESS); -} - /* * @implemented */ diff --git a/reactos/ntoskrnl/ps/kill.c b/reactos/ntoskrnl/ps/kill.c index 102600530ba..3a5a4479812 100644 --- a/reactos/ntoskrnl/ps/kill.c +++ b/reactos/ntoskrnl/ps/kill.c @@ -176,6 +176,7 @@ PspDeleteThread(PVOID ObjectBody) { PETHREAD Thread = (PETHREAD)ObjectBody; PEPROCESS Process = Thread->ThreadsProcess; + extern unsigned int init_stack; DPRINT("PiDeleteThread(ObjectBody 0x%x, process 0x%x)\n",ObjectBody, Thread->ThreadsProcess); @@ -191,8 +192,9 @@ PspDeleteThread(PVOID ObjectBody) /* Free the W32THREAD structure if present */ if(Thread->Tcb.Win32Thread != NULL) ExFreePool (Thread->Tcb.Win32Thread); - /* Release the Thread */ - KeReleaseThread(ETHREAD_TO_KTHREAD(Thread)); + /* Release the Kernel Stack */ + if (Thread->Tcb.StackLimit != (ULONG_PTR)init_stack) + MmDeleteKernelStack((PVOID)Thread->Tcb.StackLimit, FALSE); /* Dereference the Process */ ObDereferenceObject(Process);