-/*
+/* $Id: kill.c,v 1.51 2002/03/05 11:33:12 ekohl Exp $
+ *
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: ntoskrnl/ps/kill.c
/* FUNCTIONS *****************************************************************/
-VOID
-PiTerminateProcessThreads(PEPROCESS Process, NTSTATUS ExitStatus)
+VOID
+PiTerminateProcessThreads(PEPROCESS Process,
+ NTSTATUS ExitStatus)
{
KIRQL oldlvl;
PLIST_ENTRY current_entry;
DPRINT("Finished PiTerminateProcessThreads()\n");
}
-VOID
+VOID
PsReapThreads(VOID)
{
PLIST_ENTRY current_entry;
DPRINT("PsProcessType %x\n", PsProcessType);
DPRINT("Reaping thread %x\n", current);
- DPRINT("Ref count %d\n", ObGetReferenceCount(Process));
+ DPRINT("Pointer count %d\n", ObGetObjectPointerCount(Process));
current->Tcb.State = THREAD_STATE_TERMINATED_2;
RemoveEntryList(¤t->Tcb.ProcessThreadListEntry);
if (IsListEmpty(&Process->ThreadListHead))
PiTerminateProcess(Process, Status);
KeAcquireSpinLock( &PiThreadListLock, &oldIrql );
}
- DPRINT("Ref count %d\n", ObGetReferenceCount(Process));
+ DPRINT("Pointer count %d\n", ObGetObjectPointerCount(Process));
KeReleaseSpinLock(&PiThreadListLock, oldIrql);
ObDereferenceObject(current);
KeAcquireSpinLock(&PiThreadListLock, &oldIrql);
KeReleaseSpinLock(&PiThreadListLock, oldIrql);
}
-VOID PsTerminateCurrentThread(NTSTATUS ExitStatus)
+VOID
+PsTerminateCurrentThread(NTSTATUS ExitStatus)
/*
* FUNCTION: Terminates the current thread
*/
{
KIRQL oldIrql;
PETHREAD CurrentThread;
+ PKTHREAD Thread;
+ PLIST_ENTRY current_entry;
+ PKMUTANT Mutant;
CurrentThread = PsGetCurrentThread();
KeAcquireSpinLock(&PiThreadListLock, &oldIrql);
CurrentThread->ExitStatus = ExitStatus;
- KeCancelTimer(&KeGetCurrentThread()->Timer);
+ Thread = KeGetCurrentThread();
+ KeCancelTimer(&Thread->Timer);
+ KeReleaseSpinLock(&PiThreadListLock, oldIrql);
+
+ /* abandon all owned mutants */
+ current_entry = Thread->MutantListHead.Flink;
+ while (current_entry != &Thread->MutantListHead)
+ {
+ Mutant = CONTAINING_RECORD(current_entry, KMUTANT,
+ MutantListEntry);
+ KeReleaseMutant(Mutant,
+ MUTANT_INCREMENT,
+ TRUE,
+ FALSE);
+ current_entry = Thread->MutantListHead.Flink;
+ }
+
KeAcquireDispatcherDatabaseLock(FALSE);
CurrentThread->Tcb.DispatcherHeader.SignalState = TRUE;
KeDispatcherObjectWake(&CurrentThread->Tcb.DispatcherHeader);
KeReleaseDispatcherDatabaseLock(FALSE);
-
+
+ KeAcquireSpinLock(&PiThreadListLock, &oldIrql);
PsDispatchThreadNoLock(THREAD_STATE_TERMINATED_1);
KeBugCheck(0);
}
-VOID
+VOID STDCALL
PiTerminateThreadRundownRoutine(PKAPC Apc)
{
ExFreePool(Apc);
}
-VOID
+VOID STDCALL
PiTerminateThreadKernelRoutine(PKAPC Apc,
PKNORMAL_ROUTINE* NormalRoutine,
PVOID* NormalContext,
ExFreePool(Apc);
}
-VOID
+VOID STDCALL
PiTerminateThreadNormalRoutine(PVOID NormalContext,
PVOID SystemArgument1,
PVOID SystemArgument2)
PsTerminateCurrentThread(PsGetCurrentThread()->ExitStatus);
}
-VOID
-PsTerminateOtherThread(PETHREAD Thread, NTSTATUS ExitStatus)
+VOID
+PsTerminateOtherThread(PETHREAD Thread,
+ NTSTATUS ExitStatus)
/*
* FUNCTION: Terminate a thread when calling from another thread's context
* NOTES: This function must be called with PiThreadListLock held
KernelMode);
}
-NTSTATUS STDCALL
-PiTerminateProcess(PEPROCESS Process, NTSTATUS ExitStatus)
+NTSTATUS STDCALL
+PiTerminateProcess(PEPROCESS Process,
+ NTSTATUS ExitStatus)
{
- DPRINT("PiTerminateProcess(Process %x, ExitStatus %x) RC %d HC %d\n",
- Process, ExitStatus, ObGetReferenceCount(Process),
- ObGetHandleCount(Process));
+ DPRINT("PiTerminateProcess(Process %x, ExitStatus %x) PC %d HC %d\n",
+ Process, ExitStatus, ObGetObjectPointerCount(Process),
+ ObGetObjectHandleCount(Process));
if (InterlockedExchange((PLONG)&Process->Pcb.State,
PROCESS_STATE_TERMINATED) ==
return(STATUS_SUCCESS);
}
-NTSTATUS STDCALL NtTerminateProcess(IN HANDLE ProcessHandle,
- IN NTSTATUS ExitStatus)
+NTSTATUS STDCALL
+NtTerminateProcess(IN HANDLE ProcessHandle,
+ IN NTSTATUS ExitStatus)
{
NTSTATUS Status;
PEPROCESS Process;
}
-NTSTATUS STDCALL NtTerminateThread(IN HANDLE ThreadHandle,
- IN NTSTATUS ExitStatus)
+NTSTATUS STDCALL
+NtTerminateThread(IN HANDLE ThreadHandle,
+ IN NTSTATUS ExitStatus)
{
PETHREAD Thread;
NTSTATUS Status;
}
-NTSTATUS STDCALL PsTerminateSystemThread(NTSTATUS ExitStatus)
+NTSTATUS STDCALL
+PsTerminateSystemThread(NTSTATUS ExitStatus)
/*
* FUNCTION: Terminates the current thread
* ARGUMENTS:
return(STATUS_SUCCESS);
}
-NTSTATUS STDCALL
+NTSTATUS STDCALL
NtCallTerminatePorts(PETHREAD Thread)
{
KIRQL oldIrql;
return(STATUS_SUCCESS);
}
-NTSTATUS STDCALL
+NTSTATUS STDCALL
NtRegisterThreadTerminatePort(HANDLE TerminationPortHandle)
{
NTSTATUS Status;