- Advance the CurrentEntry pointer before terminating thread in
PspTerminateProcessThreads.
- Lock the process in NtTerminateProcess to prevent race conditions.
Modified: trunk/reactos/ntoskrnl/ps/kill.c
_____
Modified: trunk/reactos/ntoskrnl/ps/kill.c
--- trunk/reactos/ntoskrnl/ps/kill.c 2005-03-21 17:13:55 UTC (rev
14255)
+++ trunk/reactos/ntoskrnl/ps/kill.c 2005-03-21 20:11:52 UTC (rev
14256)
@@ -93,6 +93,9 @@
/* Get the Current Thread */
Thread = CONTAINING_RECORD(CurrentEntry, ETHREAD,
ThreadListEntry);
+ /* Move to the Next Thread */
+ CurrentEntry = CurrentEntry->Flink;
+
/* Make sure it's not the one we're in */
if (Thread != CurrentThread) {
@@ -107,9 +110,6 @@
KeForceResumeThread(&Thread->Tcb);
}
}
-
- /* Move to the Next Thread */
- CurrentEntry = CurrentEntry->Flink;
}
}
@@ -419,6 +419,8 @@
return(Status);
}
+ PsLockProcess(Process, FALSE);
+
if(Process->ExitTime.QuadPart) {
DPRINT1("Process has an exit time!\n");
@@ -431,6 +433,8 @@
/* Save the Exit Time */
KeQuerySystemTime(&Process->ExitTime);
+
+ PsUnlockProcess(Process);
/* Only master thread remains... kill it off */
if (PsGetCurrentThread()->ThreadsProcess == Process) {
Show replies by date