- Added a missing dereferencing in NtTerminateProcess.  
- Don't access already freed memory while sending messages to the termination port (in PspExitThread).
Modified: trunk/reactos/ntoskrnl/ps/kill.c

Modified: trunk/reactos/ntoskrnl/ps/kill.c
--- trunk/reactos/ntoskrnl/ps/kill.c	2005-05-31 14:56:55 UTC (rev 15699)
+++ trunk/reactos/ntoskrnl/ps/kill.c	2005-05-31 15:01:29 UTC (rev 15700)
@@ -266,19 +266,18 @@
     }
 
     /* Process the Termination Ports */
-    TerminationPort = CurrentThread->TerminationPort;
-    DPRINT("TerminationPort: %p\n", TerminationPort);
-    while (TerminationPort) {
+    while ((TerminationPort = CurrentThread->TerminationPort)) {
 
+        DPRINT("TerminationPort: %p\n", TerminationPort);
+
+        /* Get the next one */
+        CurrentThread->TerminationPort = TerminationPort->Next;
+
         /* Send the LPC Message */
         LpcSendTerminationPort(TerminationPort->Port, CurrentThread->CreateTime);
 
         /* Free the Port */
         ExFreePool(TerminationPort);
-
-        /* Get the next one */
-        TerminationPort = TerminationPort->Next;
-        DPRINT("TerminationPort: %p\n", TerminationPort);
     }
 
     /* Rundown Win32 Structures */
@@ -463,6 +462,7 @@
     if(Process->ExitTime.QuadPart != 0)
     {
       PsUnlockProcess(Process);
+      ObDereferenceObject(Process);
       return STATUS_PROCESS_IS_TERMINATING;
     }