if (!NT_SUCCESS(Status))
{
DPRINT1("ObCreateHandle failed, status = %x\n", Status);
- KeBugCheck(0);
+ KEBUGCHECK(0);
}
Offset = FIELD_OFFSET(TEB, DeallocationStack);
Length = 0;
PLIST_ENTRY current_entry;
PKMUTANT Mutant;
- CurrentThread = PsGetCurrentThread();
-
+
DPRINT("terminating %x\n",CurrentThread);
KeAcquireSpinLock(&PiThreadListLock, &oldIrql);
+
+ CurrentThread = PsGetCurrentThread();
CurrentThread->ExitStatus = ExitStatus;
Thread = KeGetCurrentThread();
FALSE);
current_entry = Thread->MutantListHead.Flink;
}
+
+ KeAcquireSpinLock(&PiThreadListLock, &oldIrql);
KeAcquireDispatcherDatabaseLock(FALSE);
CurrentThread->Tcb.DispatcherHeader.SignalState = TRUE;
KeDispatcherObjectWake(&CurrentThread->Tcb.DispatcherHeader);
- KeReleaseDispatcherDatabaseLock(FALSE);
+ KeReleaseDispatcherDatabaseLockAtDpcLevel(FALSE);
+
+ KeRemoveAllWaitsThread (CurrentThread, STATUS_UNSUCCESSFUL, FALSE);
- KeAcquireSpinLock(&PiThreadListLock, &oldIrql);
PsDispatchThreadNoLock(THREAD_STATE_TERMINATED_1);
- KeBugCheck(0);
+ DPRINT1("Unexpected return, CurrentThread %x PsGetCurrentThread() %x\n", CurrentThread, PsGetCurrentThread());
+ KEBUGCHECK(0);
}
VOID STDCALL
*/
{
PKAPC Apc;
+ NTSTATUS Status;
DPRINT("PsTerminateOtherThread(Thread %x, ExitStatus %x)\n",
Thread, ExitStatus);
Apc = ExAllocatePoolWithTag(NonPagedPool, sizeof(KAPC), TAG_TERMINATE_APC);
KeInitializeApc(Apc,
&Thread->Tcb,
- 0,
+ OriginalApcEnvironment,
PiTerminateThreadKernelRoutine,
PiTerminateThreadRundownRoutine,
PiTerminateThreadNormalRoutine,
KeInsertQueueApc(Apc,
NULL,
NULL,
- KernelMode);
+ IO_NO_INCREMENT);
+ if (THREAD_STATE_BLOCKED == Thread->Tcb.State && UserMode == Thread->Tcb.WaitMode)
+ {
+ DPRINT("Unblocking thread\n");
+ Status = STATUS_THREAD_IS_TERMINATING;
+ PsUnblockThread(Thread, &Status);
+ }
}
NTSTATUS STDCALL
}
+/*
+ * @implemented
+ */
NTSTATUS STDCALL
PsTerminateSystemThread(NTSTATUS ExitStatus)
/*