Definition at line 1110 of file kill.c.
Referenced by _main(), ClientConnectionThread(), CreateProcessInternalW(), CsrApiRequestThread(), CsrUnhandledExceptionFilter(), ExitProcess(), NtProcessStartup(), RunUSetup(), SmpExecuteImage(), SmpExecuteInitialCommand(), SmpLoadSubSystem(), SmpTerminate(), and TerminateProcess().
{
NTSTATUS Status;
PEPROCESS Process, CurrentProcess = PsGetCurrentProcess();
PETHREAD Thread, CurrentThread = PsGetCurrentThread();
BOOLEAN KillByHandle;
PAGED_CODE();
PSTRACE(PS_KILL_DEBUG,
"ProcessHandle: %p ExitStatus: %p\n", ProcessHandle, ExitStatus);
if (ProcessHandle)
{
KillByHandle = TRUE;
}
else
{
KillByHandle = FALSE;
ProcessHandle = NtCurrentProcess();
}
Status = ObReferenceObjectByHandle(ProcessHandle,
PROCESS_TERMINATE,
PsProcessType,
KeGetPreviousMode(),
(PVOID*)&Process,
NULL);
if (!NT_SUCCESS(Status)) return(Status);
if (Process->BreakOnTermination)
{
PspCatchCriticalBreak("Terminating critical process 0x%p (%s)\n",
Process,
Process->ImageFileName);
}
if (!ExAcquireRundownProtection(&Process->RundownProtect))
{
ObDereferenceObject (Process);
return STATUS_PROCESS_IS_TERMINATING;
}
if (KillByHandle) PspSetProcessFlag(Process, PSF_PROCESS_DELETE_BIT);
Status = STATUS_NOTHING_TO_TERMINATE;
Thread = PsGetNextProcessThread(Process, NULL);
if (Thread)
{
Status = STATUS_SUCCESS;
do
{
if (Thread != CurrentThread)
{
PspTerminateThreadByPointer(Thread, ExitStatus, FALSE);
}
Thread = PsGetNextProcessThread(Process, Thread);
} while (Thread);
}
ExReleaseRundownProtection(&Process->RundownProtect);
if (Process == CurrentProcess)
{
if (KillByHandle)
{
ObDereferenceObject(Process);
PspTerminateThreadByPointer(CurrentThread, ExitStatus, TRUE);
}
}
else if (ExitStatus == DBG_TERMINATE_PROCESS)
{
DbgkClearProcessDebugObject(Process, NULL);
}
if ((Status == STATUS_NOTHING_TO_TERMINATE) ||
((Process->DebugPort) && (KillByHandle)))
{
ObClearProcessHandleTable(Process);
Status = STATUS_SUCCESS;
}
ObDereferenceObject(Process);
return Status;
}