Minor bug fixes
[reactos.git] / reactos / ntoskrnl / ps / kill.c
1 /*
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@mcmail.com)
7 * UPDATE HISTORY:
8 * Created 22/05/98
9 */
10
11 /* INCLUDES *****************************************************************/
12
13 #include <ddk/ntddk.h>
14 #include <internal/ps.h>
15
16 #define NDEBUG
17 #include <internal/debug.h>
18
19 /* FUNCTIONS *****************************************************************/
20
21 NTSTATUS STDCALL NtTerminateThread(IN HANDLE ThreadHandle,
22 IN NTSTATUS ExitStatus)
23 {
24 return(ZwTerminateThread(ThreadHandle,ExitStatus));
25 }
26
27 NTSTATUS STDCALL ZwTerminateThread(IN HANDLE ThreadHandle,
28 IN NTSTATUS ExitStatus)
29 {
30 PETHREAD Thread;
31 NTSTATUS Status;
32
33 Status = ObReferenceObjectByHandle(ThreadHandle,
34 THREAD_TERMINATE,
35 PsThreadType,
36 UserMode,
37 (PVOID*)&Thread,
38 NULL);
39 if (Status != STATUS_SUCCESS)
40 {
41 return(Status);
42 }
43
44 if (Thread == PsGetCurrentThread())
45 {
46 PsTerminateSystemThread(ExitStatus);
47 }
48 else
49 {
50 UNIMPLEMENTED;
51 }
52 }
53
54
55 NTSTATUS PsTerminateSystemThread(NTSTATUS ExitStatus)
56 /*
57 * FUNCTION: Terminates the current thread
58 * ARGUMENTS:
59 * ExitStatus = Status to pass to the creater
60 * RETURNS: Doesn't
61 */
62 {
63 KIRQL oldlvl;
64 PETHREAD CurrentThread;
65
66 CurrentThread = PsGetCurrentThread();
67
68 CurrentThread->ExitStatus = ExitStatus;
69
70 DPRINT("terminating %x\n",CurrentThread);
71 KeRaiseIrql(DISPATCH_LEVEL,&oldlvl);
72 CurrentThread->Tcb.ThreadState = THREAD_STATE_TERMINATED;
73 RemoveEntryList(&CurrentThread->Tcb.Entry);
74 ZwYieldExecution();
75 for(;;);
76 }
77
78 NTSTATUS STDCALL NtRegisterThreadTerminatePort(HANDLE TerminationPort)
79 {
80 return(ZwRegisterThreadTerminatePort(TerminationPort));
81 }
82
83 NTSTATUS STDCALL ZwRegisterThreadTerminatePort(HANDLE TerminationPort)
84 {
85 UNIMPLEMENTED;
86 }