2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: ntoskrnl/ps/kill.c
5 * PURPOSE: Terminating a thread
6 * PROGRAMMER: David Welch (welch@cwcom.net)
11 /* INCLUDES *****************************************************************/
13 #include <ddk/ntddk.h>
14 #include <internal/ps.h>
15 #include <internal/ke.h>
16 #include <internal/mm.h>
17 #include <internal/ob.h>
20 #include <internal/debug.h>
22 /* GLOBALS *******************************************************************/
24 extern ULONG PiNrThreads
;
26 /* FUNCTIONS *****************************************************************/
28 VOID
PiDeleteProcess(PVOID ObjectBody
)
30 DPRINT("PiDeleteProcess(ObjectBody %x)\n",ObjectBody
);
31 (VOID
)MmReleaseMmInfo((PEPROCESS
)ObjectBody
);
34 VOID
PsTerminateCurrentThread(NTSTATUS ExitStatus
)
36 * FUNCTION: Terminates the current thread
40 PETHREAD CurrentThread
;
44 CurrentThread
= PsGetCurrentThread();
46 CurrentThread
->ExitStatus
= ExitStatus
;
48 DPRINT("terminating %x\n",CurrentThread
);
49 ObDereferenceObject(CurrentThread
->ThreadsProcess
);
50 CurrentThread
->ThreadsProcess
= NULL
;
51 KeRaiseIrql(DISPATCH_LEVEL
,&oldlvl
);
52 CurrentThread
->Tcb
.State
= THREAD_STATE_TERMINATED
;
57 VOID
PsTerminateOtherThread(PETHREAD Thread
, NTSTATUS ExitStatus
)
59 * FUNCTION: Terminate a thread when calling from that thread's context
66 NTSTATUS STDCALL
NtTerminateProcess(IN HANDLE ProcessHandle
,
67 IN NTSTATUS ExitStatus
)
69 return(ZwTerminateProcess(ProcessHandle
,ExitStatus
));
72 NTSTATUS STDCALL
ZwTerminateProcess(IN HANDLE ProcessHandle
,
73 IN NTSTATUS ExitStatus
)
79 DPRINT("ZwTerminateProcess(ProcessHandle %x, ExitStatus %x)\n",
80 ProcessHandle
, ExitStatus
);
82 Status
= ObReferenceObjectByHandle(ProcessHandle
,
88 if (Status
!= STATUS_SUCCESS
)
93 PiTerminateProcessThreads(Process
, ExitStatus
);
94 KeRaiseIrql(DISPATCH_LEVEL
, &oldlvl
);
95 Process
->Pcb
.ProcessState
= PROCESS_STATE_TERMINATED
;
96 KeDispatcherObjectWake(&Process
->Pcb
.DispatcherHeader
);
97 if (PsGetCurrentThread()->ThreadsProcess
== Process
)
100 ObDereferenceObject(Process
);
101 PsTerminateCurrentThread(ExitStatus
);
104 ObDereferenceObject(Process
);
105 return(STATUS_SUCCESS
);
109 NTSTATUS STDCALL
NtTerminateThread(IN HANDLE ThreadHandle
,
110 IN NTSTATUS ExitStatus
)
112 return(ZwTerminateThread(ThreadHandle
,ExitStatus
));
115 NTSTATUS STDCALL
ZwTerminateThread(IN HANDLE ThreadHandle
,
116 IN NTSTATUS ExitStatus
)
121 Status
= ObReferenceObjectByHandle(ThreadHandle
,
127 if (Status
!= STATUS_SUCCESS
)
132 if (Thread
== PsGetCurrentThread())
134 PsTerminateCurrentThread(ExitStatus
);
138 PsTerminateOtherThread(Thread
, ExitStatus
);
140 return(STATUS_SUCCESS
);
143 VOID
PsReleaseThread(PETHREAD Thread
)
145 * FUNCTION: Called internally to release a thread's resources from another
148 * Thread = Thread to release
151 DPRINT("PsReleaseThread(Thread %x)\n",Thread
);
153 RemoveEntryList(&Thread
->Tcb
.Entry
);
154 HalReleaseTask(Thread
);
155 ObDereferenceObject(Thread
);
159 NTSTATUS
PsTerminateSystemThread(NTSTATUS ExitStatus
)
161 * FUNCTION: Terminates the current thread
163 * ExitStatus = Status to pass to the creater
167 PsTerminateCurrentThread(ExitStatus
);
168 return(STATUS_SUCCESS
);
171 NTSTATUS STDCALL
NtRegisterThreadTerminatePort(HANDLE TerminationPort
)
173 return(ZwRegisterThreadTerminatePort(TerminationPort
));
176 NTSTATUS STDCALL
ZwRegisterThreadTerminatePort(HANDLE TerminationPort
)