update for HEAD-2003091401
[reactos.git] / ntoskrnl / ps / kill.c
index 03ec255..f415829 100644 (file)
@@ -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)
 /*