X-Git-Url: http://git.jankratochvil.net/?p=reactos.git;a=blobdiff_plain;f=ntoskrnl%2Fps%2Fkill.c;fp=ntoskrnl%2Fps%2Fkill.c;h=f415829cd62d8a35fbee66f2936b04a3388a0b7e;hp=03ec2557ec7f3679936cd4fe4f01e3181e89a735;hb=a3df8bf1429570e0bd6c6428f6ed80073578cf4b;hpb=7c0db166f81fbe8c8b913d7f26048e337d383605 diff --git a/ntoskrnl/ps/kill.c b/ntoskrnl/ps/kill.c index 03ec255..f415829 100644 --- a/ntoskrnl/ps/kill.c +++ b/ntoskrnl/ps/kill.c @@ -123,7 +123,7 @@ PsReapThreads(VOID) if (!NT_SUCCESS(Status)) { DPRINT1("ObCreateHandle failed, status = %x\n", Status); - KeBugCheck(0); + KEBUGCHECK(0); } Offset = FIELD_OFFSET(TEB, DeallocationStack); Length = 0; @@ -158,10 +158,11 @@ PsTerminateCurrentThread(NTSTATUS ExitStatus) PLIST_ENTRY current_entry; PKMUTANT Mutant; - CurrentThread = PsGetCurrentThread(); - + DPRINT("terminating %x\n",CurrentThread); KeAcquireSpinLock(&PiThreadListLock, &oldIrql); + + CurrentThread = PsGetCurrentThread(); CurrentThread->ExitStatus = ExitStatus; Thread = KeGetCurrentThread(); @@ -180,15 +181,19 @@ PsTerminateCurrentThread(NTSTATUS ExitStatus) 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 @@ -224,6 +229,7 @@ PsTerminateOtherThread(PETHREAD Thread, */ { PKAPC Apc; + NTSTATUS Status; DPRINT("PsTerminateOtherThread(Thread %x, ExitStatus %x)\n", Thread, ExitStatus); @@ -233,7 +239,7 @@ PsTerminateOtherThread(PETHREAD Thread, Apc = ExAllocatePoolWithTag(NonPagedPool, sizeof(KAPC), TAG_TERMINATE_APC); KeInitializeApc(Apc, &Thread->Tcb, - 0, + OriginalApcEnvironment, PiTerminateThreadKernelRoutine, PiTerminateThreadRundownRoutine, PiTerminateThreadNormalRoutine, @@ -242,7 +248,13 @@ PsTerminateOtherThread(PETHREAD Thread, 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 @@ -336,6 +348,9 @@ NtTerminateThread(IN HANDLE ThreadHandle, } +/* + * @implemented + */ NTSTATUS STDCALL PsTerminateSystemThread(NTSTATUS ExitStatus) /*