1 /* $Id: process.c,v 1.12 2001/03/20 16:09:44 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 /* GLOBALS *******************************************************************/
20 static ULONG NrProcess
;
21 static PCSRSS_PROCESS_DATA ProcessData
[256];
22 extern CRITICAL_SECTION ActiveConsoleLock
;
23 CRITICAL_SECTION ProcessDataLock
;
25 /* FUNCTIONS *****************************************************************/
27 VOID
CsrInitProcessData(VOID
)
33 ProcessData
[i
] = NULL
;
36 RtlInitializeCriticalSection( &ProcessDataLock
);
39 PCSRSS_PROCESS_DATA
CsrGetProcessData(ULONG ProcessId
)
43 RtlEnterCriticalSection( &ProcessDataLock
);
44 for (i
=0; i
<NrProcess
; i
++)
47 ProcessData
[i
]->ProcessId
== ProcessId
)
49 RtlLeaveCriticalSection( &ProcessDataLock
);
50 return(ProcessData
[i
]);
53 for (i
=0; i
<NrProcess
; i
++)
55 if (ProcessData
[i
] == NULL
)
57 ProcessData
[i
] = RtlAllocateHeap(CsrssApiHeap
,
59 sizeof(CSRSS_PROCESS_DATA
));
60 if (ProcessData
[i
] == NULL
)
62 RtlLeaveCriticalSection( &ProcessDataLock
);
65 ProcessData
[i
]->ProcessId
= ProcessId
;
66 RtlLeaveCriticalSection( &ProcessDataLock
);
67 return(ProcessData
[i
]);
70 // DbgPrint("CSR: CsrGetProcessData() failed\n");
71 RtlLeaveCriticalSection(&ProcessDataLock
);
75 NTSTATUS
CsrFreeProcessData(ULONG Pid
)
78 RtlEnterCriticalSection( &ProcessDataLock
);
79 for( i
= 0; i
< NrProcess
; i
++ )
81 if( ProcessData
[i
] && ProcessData
[i
]->ProcessId
== Pid
)
83 if( ProcessData
[i
]->HandleTable
)
86 for( c
= 0; c
< ProcessData
[i
]->HandleTableSize
; c
++ )
87 if( ProcessData
[i
]->HandleTable
[c
] )
88 CsrReleaseObject( ProcessData
[i
], (HANDLE
)((c
+ 1) << 2) );
89 RtlFreeHeap( CsrssApiHeap
, 0, ProcessData
[i
]->HandleTable
);
91 if( ProcessData
[i
]->Console
)
93 if( InterlockedDecrement( &(ProcessData
[i
]->Console
->Header
.ReferenceCount
) ) == 0 )
94 CsrDeleteConsole( ProcessData
[i
]->Console
);
96 RtlFreeHeap( CsrssApiHeap
, 0, ProcessData
[i
] );
98 RtlLeaveCriticalSection( &ProcessDataLock
);
99 return STATUS_SUCCESS
;
102 RtlLeaveCriticalSection( &ProcessDataLock
);
103 return STATUS_INVALID_PARAMETER
;
107 NTSTATUS
CsrCreateProcess (PCSRSS_PROCESS_DATA ProcessData
,
108 PCSRSS_API_REQUEST Request
,
109 PCSRSS_API_REPLY Reply
)
111 PCSRSS_PROCESS_DATA NewProcessData
;
115 Reply
->Header
.DataSize
= sizeof(CSRSS_API_REPLY
) -
116 sizeof(LPC_MESSAGE_HEADER
);
117 Reply
->Header
.MessageSize
= sizeof(CSRSS_API_REPLY
);
119 NewProcessData
= CsrGetProcessData(Request
->Data
.CreateProcessRequest
.NewProcessId
);
120 if (NewProcessData
== NULL
)
122 Reply
->Status
= STATUS_NO_MEMORY
;
123 return(STATUS_NO_MEMORY
);
126 if (Request
->Data
.CreateProcessRequest
.Flags
& DETACHED_PROCESS
)
128 NewProcessData
->Console
= NULL
;
130 else if (Request
->Data
.CreateProcessRequest
.Flags
& CREATE_NEW_CONSOLE
)
132 PCSRSS_CONSOLE Console
;
134 Console
= RtlAllocateHeap(CsrssApiHeap
,
136 sizeof(CSRSS_CONSOLE
));
137 Status
= CsrInitConsole(Console
);
138 if( !NT_SUCCESS( Status
) )
140 CsrFreeProcessData( NewProcessData
->ProcessId
);
141 Reply
->Status
= Status
;
144 NewProcessData
->Console
= Console
;
145 Console
->Header
.ReferenceCount
++;
149 NewProcessData
->Console
= ProcessData
->Console
;
150 InterlockedIncrement( &(ProcessData
->Console
->Header
.ReferenceCount
) );
153 if( NewProcessData
->Console
)
156 CsrInsertObject(NewProcessData
,
157 &Reply
->Data
.CreateProcessReply
.InputHandle
,
158 (Object_t
*)NewProcessData
->Console
);
159 RtlEnterCriticalSection( &ActiveConsoleLock
);
160 CsrInsertObject( NewProcessData
, &Reply
->Data
.CreateProcessReply
.OutputHandle
, &(NewProcessData
->Console
->ActiveBuffer
->Header
) );
161 RtlLeaveCriticalSection( &ActiveConsoleLock
);
162 ClientId
.UniqueProcess
= (HANDLE
)NewProcessData
->ProcessId
;
163 Status
= NtOpenProcess( &Process
, PROCESS_DUP_HANDLE
, 0, &ClientId
);
164 if( !NT_SUCCESS( Status
) )
166 DbgPrint( "CSR: NtOpenProcess() failed for handle duplication\n" );
167 InterlockedDecrement( &(NewProcessData
->Console
->Header
.ReferenceCount
) );
168 CsrFreeProcessData( NewProcessData
->ProcessId
);
169 Reply
->Status
= Status
;
172 Status
= NtDuplicateObject( NtCurrentProcess(), &NewProcessData
->Console
->ActiveEvent
, Process
, &NewProcessData
->ConsoleEvent
, SYNCHRONIZE
, FALSE
, 0 );
173 if( !NT_SUCCESS( Status
) )
175 DbgPrint( "CSR: NtDuplicateObject() failed: %x\n", Status
);
177 InterlockedDecrement( &(NewProcessData
->Console
->Header
.ReferenceCount
) );
178 CsrFreeProcessData( NewProcessData
->ProcessId
);
179 Reply
->Status
= Status
;
184 else Reply
->Data
.CreateProcessReply
.OutputHandle
= Reply
->Data
.CreateProcessReply
.InputHandle
= INVALID_HANDLE_VALUE
;
186 return(STATUS_SUCCESS
);
189 NTSTATUS
CsrTerminateProcess(PCSRSS_PROCESS_DATA ProcessData
,
190 PCSRSS_API_REQUEST LpcMessage
,
191 PCSRSS_API_REPLY Reply
)
193 Reply
->Header
.MessageSize
= sizeof(CSRSS_API_REPLY
)
194 - sizeof(LPC_MESSAGE_HEADER
);
195 Reply
->Header
.DataSize
= sizeof(CSRSS_API_REPLY
);
197 Reply
->Status
= STATUS_NOT_IMPLEMENTED
;
199 return(STATUS_NOT_IMPLEMENTED
);
202 NTSTATUS
CsrConnectProcess(PCSRSS_PROCESS_DATA ProcessData
,
203 PCSRSS_API_REQUEST Request
,
204 PCSRSS_API_REPLY Reply
)
206 Reply
->Header
.MessageSize
= sizeof(CSRSS_API_REPLY
);
207 Reply
->Header
.DataSize
= sizeof(CSRSS_API_REPLY
) -
208 sizeof(LPC_MESSAGE_HEADER
);
210 Reply
->Status
= STATUS_SUCCESS
;
212 return(STATUS_SUCCESS
);