Move removing process from active list to PspDeleteProcess instead of PspExitProcess. This way we don't have to do it manually after ObInsertObject failure in PspCreateProces. Also, set the Process Query Time at the end of Process Creation, since the process doesn't really exist before then. Thanks to Hartmut for finding the bus.
Modified: trunk/reactos/ntoskrnl/ps/process.c

Modified: trunk/reactos/ntoskrnl/ps/process.c
--- trunk/reactos/ntoskrnl/ps/process.c	2005-04-23 16:09:06 UTC (rev 14776)
+++ trunk/reactos/ntoskrnl/ps/process.c	2005-04-23 16:16:59 UTC (rev 14777)
@@ -287,8 +287,6 @@
     /* Clean up the Object */
     DPRINT("Cleaning Process Object\n");
     RtlZeroMemory(Process, sizeof(EPROCESS));
-
-    KeQuerySystemTime(&Process->CreateTime);
     
     /* Inherit stuff from the Parent since we now have the object created */
     if (pParentProcess) 
@@ -411,13 +409,13 @@
     if (!NT_SUCCESS(Status)) 
     {
        DPRINT1("Could not get a handle to the Process Object\n");
-       ExAcquireFastMutex(&PspActiveProcessMutex);
-       RemoveEntryList(&Process->ProcessListEntry);
-       ExReleaseFastMutex(&PspActiveProcessMutex);
        ObDereferenceObject(Process);
        goto exitdereferenceobjects;
     }
             
+    /* Set the Creation Time */
+    KeQuerySystemTime(&Process->CreateTime);
+    
     DPRINT("Done. Returning handle: %x\n", hProcess);
     _SEH_TRY 
     {