1 /* $Id: process.c,v 1.16 2001/11/20 02:29:45 dwelch Exp $
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 #define LOCK RtlEnterCriticalSection(&ProcessDataLock)
19 #define UNLOCK RtlLeaveCriticalSection(&ProcessDataLock)
21 /* GLOBALS *******************************************************************/
23 static ULONG NrProcess
;
24 static PCSRSS_PROCESS_DATA ProcessData
[256];
25 extern CRITICAL_SECTION ActiveConsoleLock
;
26 CRITICAL_SECTION ProcessDataLock
;
28 /* FUNCTIONS *****************************************************************/
30 VOID STDCALL
CsrInitProcessData(VOID
)
36 ProcessData[i] = NULL;
39 RtlZeroMemory (ProcessData
, sizeof ProcessData
);
40 NrProcess
= sizeof ProcessData
/ sizeof ProcessData
[0];
41 RtlInitializeCriticalSection( &ProcessDataLock
);
44 PCSRSS_PROCESS_DATA STDCALL
CsrGetProcessData(ULONG ProcessId
)
49 for (i
=0; i
<NrProcess
; i
++)
52 ProcessData
[i
]->ProcessId
== ProcessId
)
55 return(ProcessData
[i
]);
58 for (i
=0; i
<NrProcess
; i
++)
60 if (ProcessData
[i
] == NULL
)
62 ProcessData
[i
] = RtlAllocateHeap(CsrssApiHeap
,
64 sizeof(CSRSS_PROCESS_DATA
));
65 if (ProcessData
[i
] == NULL
)
70 ProcessData
[i
]->ProcessId
= ProcessId
;
72 return(ProcessData
[i
]);
75 // DbgPrint("CSR: CsrGetProcessData() failed\n");
80 NTSTATUS STDCALL
CsrFreeProcessData(ULONG Pid
)
84 for( i
= 0; i
< NrProcess
; i
++ )
86 if( ProcessData
[i
] && ProcessData
[i
]->ProcessId
== Pid
)
88 if( ProcessData
[i
]->HandleTable
)
91 for( c
= 0; c
< ProcessData
[i
]->HandleTableSize
; c
++ )
92 if( ProcessData
[i
]->HandleTable
[c
] )
93 CsrReleaseObject( ProcessData
[i
], (HANDLE
)((c
+ 1) << 2) );
94 RtlFreeHeap( CsrssApiHeap
, 0, ProcessData
[i
]->HandleTable
);
96 if( ProcessData
[i
]->Console
)
98 if( InterlockedDecrement( &(ProcessData
[i
]->Console
->Header
.ReferenceCount
) ) == 0 )
99 CsrDeleteConsole( ProcessData
[i
]->Console
);
101 RtlFreeHeap( CsrssApiHeap
, 0, ProcessData
[i
] );
104 return STATUS_SUCCESS
;
108 return STATUS_INVALID_PARAMETER
;
112 /**********************************************************************
114 *********************************************************************/
116 CSR_API(CsrCreateProcess
)
118 PCSRSS_PROCESS_DATA NewProcessData
;
122 Reply
->Header
.DataSize
= sizeof(CSRSS_API_REPLY
) -
123 sizeof(LPC_MESSAGE_HEADER
);
124 Reply
->Header
.MessageSize
= sizeof(CSRSS_API_REPLY
);
126 NewProcessData
= CsrGetProcessData(Request
->Data
.CreateProcessRequest
.NewProcessId
);
127 if (NewProcessData
== NULL
)
129 Reply
->Status
= STATUS_NO_MEMORY
;
130 return(STATUS_NO_MEMORY
);
133 if (Request
->Data
.CreateProcessRequest
.Flags
& DETACHED_PROCESS
)
135 NewProcessData
->Console
= NULL
;
137 else if (Request
->Data
.CreateProcessRequest
.Flags
& CREATE_NEW_CONSOLE
)
139 PCSRSS_CONSOLE Console
;
141 Console
= RtlAllocateHeap(CsrssApiHeap
,
143 sizeof(CSRSS_CONSOLE
));
144 Status
= CsrInitConsole(Console
);
145 if( !NT_SUCCESS( Status
) )
147 CsrFreeProcessData( NewProcessData
->ProcessId
);
148 Reply
->Status
= Status
;
151 NewProcessData
->Console
= Console
;
152 Console
->Header
.ReferenceCount
++;
156 NewProcessData
->Console
= ProcessData
->Console
;
157 InterlockedIncrement( &(ProcessData
->Console
->Header
.ReferenceCount
) );
160 if( NewProcessData
->Console
)
163 CsrInsertObject(NewProcessData
,
164 &Reply
->Data
.CreateProcessReply
.InputHandle
,
165 (Object_t
*)NewProcessData
->Console
);
166 RtlEnterCriticalSection( &ActiveConsoleLock
);
167 CsrInsertObject( NewProcessData
,
168 &Reply
->Data
.CreateProcessReply
.OutputHandle
,
169 &(NewProcessData
->Console
->ActiveBuffer
->Header
) );
171 RtlLeaveCriticalSection( &ActiveConsoleLock
);
172 ClientId
.UniqueProcess
= (HANDLE
)NewProcessData
->ProcessId
;
173 Status
= NtOpenProcess( &Process
, PROCESS_DUP_HANDLE
, 0, &ClientId
);
174 if( !NT_SUCCESS( Status
) )
176 DbgPrint( "CSR: NtOpenProcess() failed for handle duplication\n" );
177 InterlockedDecrement( &(NewProcessData
->Console
->Header
.ReferenceCount
) );
178 CsrFreeProcessData( NewProcessData
->ProcessId
);
179 Reply
->Status
= Status
;
182 Status
= NtDuplicateObject( NtCurrentProcess(), NewProcessData
->Console
->ActiveEvent
, Process
, &NewProcessData
->ConsoleEvent
, SYNCHRONIZE
, FALSE
, 0 );
183 if( !NT_SUCCESS( Status
) )
185 DbgPrint( "CSR: NtDuplicateObject() failed: %x\n", Status
);
187 InterlockedDecrement( &(NewProcessData
->Console
->Header
.ReferenceCount
) );
188 CsrFreeProcessData( NewProcessData
->ProcessId
);
189 Reply
->Status
= Status
;
194 else Reply
->Data
.CreateProcessReply
.OutputHandle
= Reply
->Data
.CreateProcessReply
.InputHandle
= INVALID_HANDLE_VALUE
;
196 return(STATUS_SUCCESS
);
199 CSR_API(CsrTerminateProcess
)
201 Reply
->Header
.MessageSize
= sizeof(CSRSS_API_REPLY
)
202 - sizeof(LPC_MESSAGE_HEADER
);
203 Reply
->Header
.DataSize
= sizeof(CSRSS_API_REPLY
);
205 DbgPrint("CSR: %s not implemented.\n", __FUNCTION__
);
207 Reply
->Status
= STATUS_NOT_IMPLEMENTED
;
209 return(STATUS_NOT_IMPLEMENTED
);
212 CSR_API(CsrConnectProcess
)
214 Reply
->Header
.MessageSize
= sizeof(CSRSS_API_REPLY
);
215 Reply
->Header
.DataSize
= sizeof(CSRSS_API_REPLY
) -
216 sizeof(LPC_MESSAGE_HEADER
);
218 Reply
->Status
= STATUS_SUCCESS
;
220 return(STATUS_SUCCESS
);