2 * subsystems/win32/csrss/csrsrv/api/process.c
4 * "\windows\ApiPort" port process management functions
6 * ReactOS Operating System
9 /* INCLUDES ******************************************************************/
16 extern NTSTATUS
CallProcessCreated(PCSR_PROCESS
, PCSR_PROCESS
);
18 /* GLOBALS *******************************************************************/
20 /* FUNCTIONS *****************************************************************/
22 /**********************************************************************
24 *********************************************************************/
26 CSR_API(CsrSrvCreateProcess
)
29 HANDLE ProcessHandle
, ThreadHandle
;
30 PCSR_THREAD CsrThread
;
31 PCSR_PROCESS NewProcessData
;
32 ULONG Flags
, VdmPower
= 0, DebugFlags
= 0;
34 /* Get the current client thread */
35 CsrThread
= NtCurrentTeb()->CsrClientThread
;
36 ASSERT(CsrThread
!= NULL
);
38 /* Extract the flags out of the process handle */
39 Flags
= (ULONG_PTR
)Request
->Data
.CreateProcessRequest
.ProcessHandle
& 3;
40 Request
->Data
.CreateProcessRequest
.ProcessHandle
= (HANDLE
)((ULONG_PTR
)Request
->Data
.CreateProcessRequest
.ProcessHandle
& ~3);
42 /* Duplicate the process handle */
43 Status
= NtDuplicateObject(CsrThread
->Process
->ProcessHandle
,
44 Request
->Data
.CreateProcessRequest
.ProcessHandle
,
49 DUPLICATE_SAME_ACCESS
);
50 if (!NT_SUCCESS(Status
))
52 DPRINT1("Failed to duplicate process handle\n");
56 /* Duplicate the thread handle */
57 Status
= NtDuplicateObject(CsrThread
->Process
->ProcessHandle
,
58 Request
->Data
.CreateProcessRequest
.ThreadHandle
,
63 DUPLICATE_SAME_ACCESS
);
64 if (!NT_SUCCESS(Status
))
66 DPRINT1("Failed to duplicate process handle\n");
67 NtClose(ProcessHandle
);
71 /* See if this is a VDM process */
74 /* Request VDM powers */
75 Status
= NtSetInformationProcess(ProcessHandle
,
76 ProcessWx86Information
,
79 if (!NT_SUCCESS(Status
))
81 DPRINT1("Failed to get VDM powers\n");
82 NtClose(ProcessHandle
);
83 NtClose(ThreadHandle
);
88 /* Convert some flags. FIXME: More need conversion */
89 if (Request
->Data
.CreateProcessRequest
.CreationFlags
& CREATE_NEW_PROCESS_GROUP
)
91 DebugFlags
|= CsrProcessCreateNewGroup
;
94 /* FIXME: SxS Stuff */
96 /* Call CSRSRV to create the CSR_PROCESS structure and the first CSR_THREAD */
97 Status
= CsrCreateProcess(ProcessHandle
,
99 &Request
->Data
.CreateProcessRequest
.ClientId
,
100 CsrThread
->Process
->NtSession
,
103 if (Status
== STATUS_THREAD_IS_TERMINATING
)
105 DPRINT1("Thread already dead\n");
109 /* Check for other failures */
110 if (!NT_SUCCESS(Status
))
112 DPRINT1("Failed to create process/thread structures: %lx\n", Status
);
116 /* FIXME: Should notify user32 */
118 /* FIXME: VDM vodoo */
120 /* ReactOS Compatibility */
121 Status
= CsrLockProcessByClientId(Request
->Data
.CreateProcessRequest
.ClientId
.UniqueProcess
, &NewProcessData
);
122 ASSERT(Status
== STATUS_SUCCESS
);
123 if (!(Request
->Data
.CreateProcessRequest
.CreationFlags
& (CREATE_NEW_CONSOLE
| DETACHED_PROCESS
)))
125 NewProcessData
->ParentConsole
= ProcessData
->Console
;
126 NewProcessData
->bInheritHandles
= Request
->Data
.CreateProcessRequest
.bInheritHandles
;
128 RtlInitializeCriticalSection(&NewProcessData
->HandleTableLock
);
129 CallProcessCreated(ProcessData
, NewProcessData
);
130 CsrUnlockProcess(NewProcessData
);
132 /* Return the result of this operation */
136 CSR_API(CsrSrvCreateThread
)
138 PCSR_THREAD CurrentThread
;
141 PCSR_PROCESS CsrProcess
;
143 /* Get the current CSR thread */
144 CurrentThread
= NtCurrentTeb()->CsrClientThread
;
147 DPRINT1("Server Thread TID: [%lx.%lx]\n",
148 Request
->Data
.CreateThreadRequest
.ClientId
.UniqueProcess
,
149 Request
->Data
.CreateThreadRequest
.ClientId
.UniqueThread
);
150 return STATUS_SUCCESS
; // server-to-server
153 /* Get the CSR Process for this request */
154 CsrProcess
= CurrentThread
->Process
;
155 if (CsrProcess
->ClientId
.UniqueProcess
!=
156 Request
->Data
.CreateThreadRequest
.ClientId
.UniqueProcess
)
158 /* This is a remote thread request -- is it within the server itself? */
159 if (Request
->Data
.CreateThreadRequest
.ClientId
.UniqueProcess
== NtCurrentTeb()->ClientId
.UniqueProcess
)
161 /* Accept this without any further work */
162 return STATUS_SUCCESS
;
165 /* Get the real CSR Process for the remote thread's process */
166 Status
= CsrLockProcessByClientId(Request
->Data
.CreateThreadRequest
.ClientId
.UniqueProcess
,
168 if (!NT_SUCCESS(Status
)) return Status
;
171 /* Duplicate the thread handle so we can own it */
172 Status
= NtDuplicateObject(CurrentThread
->Process
->ProcessHandle
,
173 Request
->Data
.CreateThreadRequest
.ThreadHandle
,
178 DUPLICATE_SAME_ACCESS
);
179 if (NT_SUCCESS(Status
))
181 /* Call CSRSRV to tell it about the new thread */
182 Status
= CsrCreateThread(CsrProcess
,
184 &Request
->Data
.CreateThreadRequest
.ClientId
);
187 /* Unlock the process and return */
188 if (CsrProcess
!= CurrentThread
->Process
) CsrUnlockProcess(CsrProcess
);
192 CSR_API(CsrTerminateProcess
)
194 PCSR_THREAD CsrThread
= NtCurrentTeb()->CsrClientThread
;
195 ASSERT(CsrThread
!= NULL
);
197 /* Set magic flag so we don't reply this message back */
198 Request
->Type
= 0xBABE;
200 /* Remove the CSR_THREADs and CSR_PROCESS */
201 return CsrDestroyProcess(&CsrThread
->ClientId
,
202 (NTSTATUS
)Request
->Data
.TerminateProcessRequest
.uExitCode
);
205 CSR_API(CsrConnectProcess
)
208 return(STATUS_SUCCESS
);
211 CSR_API(CsrGetShutdownParameters
)
214 Request
->Data
.GetShutdownParametersRequest
.Level
= ProcessData
->ShutdownLevel
;
215 Request
->Data
.GetShutdownParametersRequest
.Flags
= ProcessData
->ShutdownFlags
;
217 return(STATUS_SUCCESS
);
220 CSR_API(CsrSetShutdownParameters
)
223 ProcessData
->ShutdownLevel
= Request
->Data
.SetShutdownParametersRequest
.Level
;
224 ProcessData
->ShutdownFlags
= Request
->Data
.SetShutdownParametersRequest
.Flags
;
226 return(STATUS_SUCCESS
);