Since a process id is only unique if the associated process is not deleted, 
we must prevent the deleting of the process. An opened handle does this.
Modified: trunk/reactos/subsys/csrss/api/process.c
Modified: trunk/reactos/subsys/csrss/include/api.h
Modified: trunk/reactos/subsys/csrss/win32csr/conio.c

Modified: trunk/reactos/subsys/csrss/api/process.c
--- trunk/reactos/subsys/csrss/api/process.c	2005-04-03 12:49:25 UTC (rev 14474)
+++ trunk/reactos/subsys/csrss/api/process.c	2005-04-03 13:04:10 UTC (rev 14475)
@@ -59,6 +59,9 @@
 {
    ULONG hash;
    PCSRSS_PROCESS_DATA pProcessData;
+   OBJECT_ATTRIBUTES ObjectAttributes;
+   CLIENT_ID ClientId;
+   NTSTATUS Status;
 
    hash = (ULONG_PTR)ProcessId % (sizeof(ProcessData) / sizeof(*ProcessData));
    
@@ -80,6 +83,27 @@
 	 pProcessData->ProcessId = ProcessId;
 	 pProcessData->next = ProcessData[hash];
 	 ProcessData[hash] = pProcessData;
+
+         ClientId.UniqueThread = NULL;
+         ClientId.UniqueProcess = pProcessData->ProcessId;
+         InitializeObjectAttributes(&ObjectAttributes,
+                                    NULL,
+                                    0,
+                                    NULL,
+                                    NULL);
+
+         /* using OpenProcess is not optimal due to HANDLE vs. DWORD PIDs... */
+         Status = NtOpenProcess(&pProcessData->Process,
+                                PROCESS_DUP_HANDLE | PROCESS_VM_OPERATION |
+                                PROCESS_VM_WRITE | PROCESS_CREATE_THREAD,
+                                &ObjectAttributes,
+                                &ClientId);
+         if (!NT_SUCCESS(Status))
+         {
+            ProcessData[hash] = pProcessData->next;
+	    RtlFreeHeap(CsrssApiHeap, 0, pProcessData);
+	    pProcessData = NULL;
+        }
       }
    }
    else
@@ -115,6 +139,10 @@
   if (pProcessData)
     {
       DPRINT("CsrFreeProcessData pid: %d\n", Pid);
+      if (pProcessData->Process)
+      {
+         NtClose(pProcessData->Process);
+      }
       if (pProcessData->Console)
         {
           RtlEnterCriticalSection(&ProcessDataLock);

Modified: trunk/reactos/subsys/csrss/include/api.h
--- trunk/reactos/subsys/csrss/include/api.h	2005-04-03 12:49:25 UTC (rev 14474)
+++ trunk/reactos/subsys/csrss/include/api.h	2005-04-03 13:04:10 UTC (rev 14475)
@@ -37,6 +37,7 @@
   ULONG HandleTableSize;
   Object_t ** HandleTable;
   HANDLE ProcessId;
+  HANDLE Process;
   ULONG ShutdownLevel;
   ULONG ShutdownFlags;
   HANDLE ConsoleEvent;

Modified: trunk/reactos/subsys/csrss/win32csr/conio.c
--- trunk/reactos/subsys/csrss/win32csr/conio.c	2005-04-03 12:49:25 UTC (rev 14474)
+++ trunk/reactos/subsys/csrss/win32csr/conio.c	2005-04-03 13:04:10 UTC (rev 14475)
@@ -74,49 +74,22 @@
 VOID FASTCALL
 ConioConsoleCtrlEvent(DWORD Event, PCSRSS_PROCESS_DATA ProcessData)
 {
-  HANDLE Process, Thread;
+  HANDLE Thread;
 	
   DPRINT("ConioConsoleCtrlEvent Parent ProcessId = %x\n",	ProcessData->ProcessId);
 
   if (ProcessData->CtrlDispatcher)
     {
-      OBJECT_ATTRIBUTES ObjectAttributes;
-      CLIENT_ID ClientId;
-      NTSTATUS Status;
-      
-      ClientId.UniqueThread = NULL;
-      ClientId.UniqueProcess = ProcessData->ProcessId;
-      InitializeObjectAttributes(&ObjectAttributes,
-                                 NULL,
-                                 0,
-                                 NULL,
-                                 NULL);
 
-      /* using OpenProcess is not optimal due to HANDLE vs. DWORD PIDs... */
-      Status = NtOpenProcess(&Process,
-                             PROCESS_DUP_HANDLE | PROCESS_VM_OPERATION |
-                             PROCESS_VM_WRITE | PROCESS_CREATE_THREAD,
-                             &ObjectAttributes,
-                             &ClientId);
-      if (!NT_SUCCESS(Status))
-        {
-          DPRINT1("Failed for handle duplication, Status: 0x%x\n", Status);
-          return;
-        }
-
-      DPRINT("ConioConsoleCtrlEvent Process Handle = %x\n", Process);
-
-      Thread = CreateRemoteThread(Process, NULL, 0,
+      Thread = CreateRemoteThread(ProcessData->Process, NULL, 0,
                                   (LPTHREAD_START_ROUTINE) ProcessData->CtrlDispatcher,
                                   (PVOID) Event, 0, NULL);
       if (NULL == Thread)
         {
           DPRINT1("Failed thread creation (Error: 0x%x)\n", GetLastError());
-          CloseHandle(Process);
           return;
         }
       CloseHandle(Thread);
-      CloseHandle(Process);
     }
 }