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); } }