3 * reactos/subsys/csrss/api/process.c
5 * "\windows\ApiPort" port process management functions
7 * ReactOS Operating System
10 /* INCLUDES ******************************************************************/
12 #include <ddk/ntddk.h>
14 #include <csrss/csrss.h>
15 #include <ntdll/rtl.h>
18 BOOL STDCALL W32kCleanupForProcess( INT Process );
20 #define LOCK RtlEnterCriticalSection(&ProcessDataLock)
21 #define UNLOCK RtlLeaveCriticalSection(&ProcessDataLock)
23 /* GLOBALS *******************************************************************/
25 static ULONG NrProcess;
26 static PCSRSS_PROCESS_DATA ProcessData[256];
27 extern CRITICAL_SECTION ActiveConsoleLock;
28 CRITICAL_SECTION ProcessDataLock;
30 /* FUNCTIONS *****************************************************************/
32 VOID STDCALL CsrInitProcessData(VOID)
34 RtlZeroMemory (ProcessData, sizeof ProcessData);
35 NrProcess = sizeof ProcessData / sizeof ProcessData[0];
36 RtlInitializeCriticalSection( &ProcessDataLock );
39 PCSRSS_PROCESS_DATA STDCALL CsrGetProcessData(ULONG ProcessId)
43 PCSRSS_PROCESS_DATA pProcessData;
45 hash = ProcessId % (sizeof(ProcessData) / sizeof(*ProcessData));
49 pProcessData = ProcessData[hash];
51 while (pProcessData && pProcessData->ProcessId != ProcessId)
53 pProcessData = pProcessData->next;
55 if (pProcessData == NULL)
57 pProcessData = RtlAllocateHeap(CsrssApiHeap,
59 sizeof(CSRSS_PROCESS_DATA));
62 pProcessData->ProcessId = ProcessId;
63 pProcessData->next = ProcessData[hash];
64 ProcessData[hash] = pProcessData;
68 if (pProcessData == NULL)
70 DbgPrint("CSR: CsrGetProcessData() failed\n");
75 NTSTATUS STDCALL CsrFreeProcessData(ULONG Pid)
79 PCSRSS_PROCESS_DATA pProcessData, pPrevProcessData = NULL;
81 hash = Pid % (sizeof(ProcessData) / sizeof(*ProcessData));
85 pProcessData = ProcessData[hash];
87 while (pProcessData && pProcessData->ProcessId != Pid)
89 pPrevProcessData = pProcessData;
90 pProcessData = pProcessData->next;
95 //DbgPrint("CsrFreeProcessData pid: %d\n", Pid);
96 W32kCleanupForProcess(Pid); //should check if win32k process
97 if (pProcessData->HandleTable)
99 for( c = 0; c < pProcessData->HandleTableSize; c++ )
101 if( pProcessData->HandleTable[c] )
103 CsrReleaseObject( pProcessData, (HANDLE)((c + 1) << 2) );
106 RtlFreeHeap( CsrssApiHeap, 0, pProcessData->HandleTable );
108 if( pProcessData->Console )
110 if( InterlockedDecrement( &(pProcessData->Console->Header.ReferenceCount) ) == 0 )
112 CsrDeleteConsole( pProcessData->Console );
115 if (pProcessData->CsrSectionViewBase)
117 NtUnmapViewOfSection(NtCurrentProcess(), pProcessData->CsrSectionViewBase);
119 if (pPrevProcessData)
121 pPrevProcessData->next = pProcessData->next;
125 ProcessData[hash] = pProcessData->next;
128 RtlFreeHeap( CsrssApiHeap, 0, pProcessData );
130 return STATUS_SUCCESS;
133 return STATUS_INVALID_PARAMETER;
137 /**********************************************************************
139 *********************************************************************/
141 CSR_API(CsrCreateProcess)
143 PCSRSS_PROCESS_DATA NewProcessData;
147 Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) -
149 Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
151 NewProcessData = CsrGetProcessData(Request->Data.CreateProcessRequest.NewProcessId);
152 if (NewProcessData == NULL)
154 Reply->Status = STATUS_NO_MEMORY;
155 return(STATUS_NO_MEMORY);
158 /* Set default shutdown parameters */
159 NewProcessData->ShutdownLevel = 0x280;
160 NewProcessData->ShutdownFlags = 0;
162 if (Request->Data.CreateProcessRequest.Flags & DETACHED_PROCESS)
164 NewProcessData->Console = NULL;
166 else if (Request->Data.CreateProcessRequest.Flags & CREATE_NEW_CONSOLE)
168 PCSRSS_CONSOLE Console;
170 Console = RtlAllocateHeap(CsrssApiHeap,
172 sizeof(CSRSS_CONSOLE));
173 Status = CsrInitConsole(Console);
174 if( !NT_SUCCESS( Status ) )
176 CsrFreeProcessData( NewProcessData->ProcessId );
177 Reply->Status = Status;
180 NewProcessData->Console = Console;
181 Console->Header.ReferenceCount++;
185 NewProcessData->Console = ProcessData->Console;
186 InterlockedIncrement( &(ProcessData->Console->Header.ReferenceCount) );
189 if( NewProcessData->Console )
192 CsrInsertObject(NewProcessData,
193 &Reply->Data.CreateProcessReply.InputHandle,
194 (Object_t *)NewProcessData->Console);
195 RtlEnterCriticalSection( &ActiveConsoleLock );
196 CsrInsertObject( NewProcessData,
197 &Reply->Data.CreateProcessReply.OutputHandle,
198 &(NewProcessData->Console->ActiveBuffer->Header) );
200 RtlLeaveCriticalSection( &ActiveConsoleLock );
201 ClientId.UniqueProcess = (HANDLE)NewProcessData->ProcessId;
202 Status = NtOpenProcess( &Process, PROCESS_DUP_HANDLE, 0, &ClientId );
203 if( !NT_SUCCESS( Status ) )
205 DbgPrint( "CSR: NtOpenProcess() failed for handle duplication\n" );
206 InterlockedDecrement( &(NewProcessData->Console->Header.ReferenceCount) );
207 CsrFreeProcessData( NewProcessData->ProcessId );
208 Reply->Status = Status;
211 Status = NtDuplicateObject( NtCurrentProcess(), NewProcessData->Console->ActiveEvent, Process, &NewProcessData->ConsoleEvent, SYNCHRONIZE, FALSE, 0 );
212 if( !NT_SUCCESS( Status ) )
214 DbgPrint( "CSR: NtDuplicateObject() failed: %x\n", Status );
216 InterlockedDecrement( &(NewProcessData->Console->Header.ReferenceCount) );
217 CsrFreeProcessData( NewProcessData->ProcessId );
218 Reply->Status = Status;
223 else Reply->Data.CreateProcessReply.OutputHandle = Reply->Data.CreateProcessReply.InputHandle = INVALID_HANDLE_VALUE;
225 Reply->Status = STATUS_SUCCESS;
226 return(STATUS_SUCCESS);
229 CSR_API(CsrTerminateProcess)
233 Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY)
234 - sizeof(LPC_MESSAGE);
235 Reply->Header.DataSize = sizeof(CSRSS_API_REPLY);
237 Status = CsrFreeProcessData(ProcessData->ProcessId);
239 Reply->Status = Status;
243 CSR_API(CsrConnectProcess)
245 Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
246 Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) -
249 Reply->Status = STATUS_SUCCESS;
251 return(STATUS_SUCCESS);
254 CSR_API(CsrGetShutdownParameters)
256 Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
257 Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) -
260 Reply->Data.GetShutdownParametersReply.Level = ProcessData->ShutdownLevel;
261 Reply->Data.GetShutdownParametersReply.Flags = ProcessData->ShutdownFlags;
263 Reply->Status = STATUS_SUCCESS;
265 return(STATUS_SUCCESS);
268 CSR_API(CsrSetShutdownParameters)
270 Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
271 Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) -
274 ProcessData->ShutdownLevel = Request->Data.SetShutdownParametersRequest.Level;
275 ProcessData->ShutdownFlags = Request->Data.SetShutdownParametersRequest.Flags;
277 Reply->Status = STATUS_SUCCESS;
279 return(STATUS_SUCCESS);