Use MmDeleteKernelStack and remove KeReleaseThread

svn path=/trunk/; revision=14695
This commit is contained in:
Alex Ionescu 2005-04-19 06:22:36 +00:00
parent cf1a2b10ac
commit c683236f8a
2 changed files with 4 additions and 43 deletions

View file

@ -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
*/

View file

@ -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);