2005-12-01 22:38:03 +00:00
|
|
|
/*
|
2011-07-25 05:54:37 +00:00
|
|
|
* subsystems/win32/csrss/csrsrv/api/process.c
|
1999-06-08 22:50:59 +00:00
|
|
|
*
|
|
|
|
* "\windows\ApiPort" port process management functions
|
|
|
|
*
|
|
|
|
* ReactOS Operating System
|
|
|
|
*/
|
1999-12-22 14:48:30 +00:00
|
|
|
|
|
|
|
/* INCLUDES ******************************************************************/
|
|
|
|
|
2010-03-10 04:59:39 +00:00
|
|
|
#include <srv.h>
|
1999-07-17 23:10:31 +00:00
|
|
|
|
2003-03-09 21:41:35 +00:00
|
|
|
#define NDEBUG
|
|
|
|
#include <debug.h>
|
2012-02-16 03:41:18 +00:00
|
|
|
|
2012-02-17 05:15:13 +00:00
|
|
|
extern NTSTATUS CallProcessCreated(PCSR_PROCESS, PCSR_PROCESS);
|
2010-05-22 23:47:54 +00:00
|
|
|
|
1999-12-30 01:51:42 +00:00
|
|
|
/* GLOBALS *******************************************************************/
|
|
|
|
|
1999-12-22 14:48:30 +00:00
|
|
|
/* FUNCTIONS *****************************************************************/
|
|
|
|
|
2001-08-14 12:57:16 +00:00
|
|
|
/**********************************************************************
|
|
|
|
* CSRSS API
|
|
|
|
*********************************************************************/
|
|
|
|
|
2012-02-19 11:39:07 +00:00
|
|
|
CSR_API(CsrSrvCreateProcess)
|
1999-06-08 22:50:59 +00:00
|
|
|
{
|
2012-02-19 11:39:07 +00:00
|
|
|
NTSTATUS Status;
|
|
|
|
HANDLE ProcessHandle, ThreadHandle;
|
|
|
|
PCSR_THREAD CsrThread;
|
2012-10-17 23:10:40 +00:00
|
|
|
PCSR_PROCESS Process, NewProcess;
|
2012-02-19 11:39:07 +00:00
|
|
|
ULONG Flags, VdmPower = 0, DebugFlags = 0;
|
|
|
|
|
|
|
|
/* Get the current client thread */
|
2012-10-17 23:10:40 +00:00
|
|
|
CsrThread = CsrGetClientThread();
|
2012-02-19 11:39:07 +00:00
|
|
|
ASSERT(CsrThread != NULL);
|
|
|
|
|
2012-10-17 23:10:40 +00:00
|
|
|
Process = CsrThread->Process;
|
|
|
|
|
2012-02-19 11:39:07 +00:00
|
|
|
/* Extract the flags out of the process handle */
|
2012-10-17 23:10:40 +00:00
|
|
|
Flags = (ULONG_PTR)ApiMessage->Data.CreateProcessRequest.ProcessHandle & 3;
|
|
|
|
ApiMessage->Data.CreateProcessRequest.ProcessHandle = (HANDLE)((ULONG_PTR)ApiMessage->Data.CreateProcessRequest.ProcessHandle & ~3);
|
2012-02-19 11:39:07 +00:00
|
|
|
|
|
|
|
/* Duplicate the process handle */
|
2012-10-17 23:10:40 +00:00
|
|
|
Status = NtDuplicateObject(Process->ProcessHandle,
|
|
|
|
ApiMessage->Data.CreateProcessRequest.ProcessHandle,
|
2012-02-19 11:39:07 +00:00
|
|
|
NtCurrentProcess(),
|
|
|
|
&ProcessHandle,
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
DUPLICATE_SAME_ACCESS);
|
|
|
|
if (!NT_SUCCESS(Status))
|
1999-12-30 01:51:42 +00:00
|
|
|
{
|
2012-02-19 11:39:07 +00:00
|
|
|
DPRINT1("Failed to duplicate process handle\n");
|
|
|
|
return Status;
|
1999-12-30 01:51:42 +00:00
|
|
|
}
|
2002-10-01 06:41:57 +00:00
|
|
|
|
2012-02-19 11:39:07 +00:00
|
|
|
/* Duplicate the thread handle */
|
2012-10-17 23:10:40 +00:00
|
|
|
Status = NtDuplicateObject(Process->ProcessHandle,
|
|
|
|
ApiMessage->Data.CreateProcessRequest.ThreadHandle,
|
2012-02-19 11:39:07 +00:00
|
|
|
NtCurrentProcess(),
|
|
|
|
&ThreadHandle,
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
DUPLICATE_SAME_ACCESS);
|
|
|
|
if (!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
DPRINT1("Failed to duplicate process handle\n");
|
|
|
|
NtClose(ProcessHandle);
|
|
|
|
return Status;
|
|
|
|
}
|
2007-06-14 16:47:24 +00:00
|
|
|
|
2012-02-19 11:39:07 +00:00
|
|
|
/* See if this is a VDM process */
|
|
|
|
if (VdmPower)
|
|
|
|
{
|
|
|
|
/* Request VDM powers */
|
|
|
|
Status = NtSetInformationProcess(ProcessHandle,
|
|
|
|
ProcessWx86Information,
|
|
|
|
&VdmPower,
|
|
|
|
sizeof(VdmPower));
|
|
|
|
if (!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
DPRINT1("Failed to get VDM powers\n");
|
|
|
|
NtClose(ProcessHandle);
|
|
|
|
NtClose(ThreadHandle);
|
|
|
|
return Status;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Convert some flags. FIXME: More need conversion */
|
2012-10-17 23:10:40 +00:00
|
|
|
if (ApiMessage->Data.CreateProcessRequest.CreationFlags & CREATE_NEW_PROCESS_GROUP)
|
2012-02-19 11:39:07 +00:00
|
|
|
{
|
|
|
|
DebugFlags |= CsrProcessCreateNewGroup;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* FIXME: SxS Stuff */
|
|
|
|
|
|
|
|
/* Call CSRSRV to create the CSR_PROCESS structure and the first CSR_THREAD */
|
|
|
|
Status = CsrCreateProcess(ProcessHandle,
|
|
|
|
ThreadHandle,
|
2012-10-17 23:10:40 +00:00
|
|
|
&ApiMessage->Data.CreateProcessRequest.ClientId,
|
|
|
|
Process->NtSession,
|
2012-02-19 11:39:07 +00:00
|
|
|
DebugFlags,
|
|
|
|
NULL);
|
|
|
|
if (Status == STATUS_THREAD_IS_TERMINATING)
|
|
|
|
{
|
|
|
|
DPRINT1("Thread already dead\n");
|
|
|
|
return Status;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Check for other failures */
|
|
|
|
if (!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
DPRINT1("Failed to create process/thread structures: %lx\n", Status);
|
|
|
|
return Status;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* FIXME: Should notify user32 */
|
|
|
|
|
|
|
|
/* FIXME: VDM vodoo */
|
|
|
|
|
|
|
|
/* ReactOS Compatibility */
|
2012-10-17 23:10:40 +00:00
|
|
|
Status = CsrLockProcessByClientId(ApiMessage->Data.CreateProcessRequest.ClientId.UniqueProcess, &NewProcess);
|
2012-02-19 11:39:07 +00:00
|
|
|
ASSERT(Status == STATUS_SUCCESS);
|
2012-10-17 23:10:40 +00:00
|
|
|
if (!(ApiMessage->Data.CreateProcessRequest.CreationFlags & (CREATE_NEW_CONSOLE | DETACHED_PROCESS)))
|
2012-02-19 11:39:07 +00:00
|
|
|
{
|
2012-10-17 23:10:40 +00:00
|
|
|
NewProcess->ParentConsole = Process->Console;
|
|
|
|
NewProcess->bInheritHandles = ApiMessage->Data.CreateProcessRequest.bInheritHandles;
|
2012-02-19 11:39:07 +00:00
|
|
|
}
|
2012-10-17 23:10:40 +00:00
|
|
|
RtlInitializeCriticalSection(&NewProcess->HandleTableLock);
|
|
|
|
CallProcessCreated(Process, NewProcess);
|
|
|
|
CsrUnlockProcess(NewProcess);
|
2008-08-02 17:01:22 +00:00
|
|
|
|
2012-02-19 11:39:07 +00:00
|
|
|
/* Return the result of this operation */
|
|
|
|
return Status;
|
1999-06-08 22:50:59 +00:00
|
|
|
}
|
|
|
|
|
2010-03-10 06:49:53 +00:00
|
|
|
CSR_API(CsrSrvCreateThread)
|
2010-03-09 20:23:22 +00:00
|
|
|
{
|
|
|
|
PCSR_THREAD CurrentThread;
|
|
|
|
HANDLE ThreadHandle;
|
|
|
|
NTSTATUS Status;
|
2012-02-15 20:29:08 +00:00
|
|
|
PCSR_PROCESS CsrProcess;
|
2010-03-09 20:23:22 +00:00
|
|
|
|
2012-02-19 10:12:14 +00:00
|
|
|
/* Get the current CSR thread */
|
2012-10-17 23:10:40 +00:00
|
|
|
CurrentThread = CsrGetClientThread();
|
2012-02-19 19:40:28 +00:00
|
|
|
if (!CurrentThread)
|
|
|
|
{
|
|
|
|
DPRINT1("Server Thread TID: [%lx.%lx]\n",
|
2012-10-17 23:10:40 +00:00
|
|
|
ApiMessage->Data.CreateThreadRequest.ClientId.UniqueProcess,
|
|
|
|
ApiMessage->Data.CreateThreadRequest.ClientId.UniqueThread);
|
2012-02-19 19:40:28 +00:00
|
|
|
return STATUS_SUCCESS; // server-to-server
|
|
|
|
}
|
|
|
|
|
2012-02-19 10:12:14 +00:00
|
|
|
/* Get the CSR Process for this request */
|
2010-03-09 20:23:22 +00:00
|
|
|
CsrProcess = CurrentThread->Process;
|
2012-02-19 10:12:14 +00:00
|
|
|
if (CsrProcess->ClientId.UniqueProcess !=
|
2012-10-17 23:10:40 +00:00
|
|
|
ApiMessage->Data.CreateThreadRequest.ClientId.UniqueProcess)
|
2010-03-09 20:23:22 +00:00
|
|
|
{
|
2012-02-19 10:12:14 +00:00
|
|
|
/* This is a remote thread request -- is it within the server itself? */
|
2012-10-17 23:10:40 +00:00
|
|
|
if (ApiMessage->Data.CreateThreadRequest.ClientId.UniqueProcess == NtCurrentTeb()->ClientId.UniqueProcess)
|
2010-03-09 20:23:22 +00:00
|
|
|
{
|
2012-02-19 10:12:14 +00:00
|
|
|
/* Accept this without any further work */
|
2010-03-09 20:23:22 +00:00
|
|
|
return STATUS_SUCCESS;
|
|
|
|
}
|
2012-02-19 19:40:28 +00:00
|
|
|
|
2012-02-19 10:12:14 +00:00
|
|
|
/* Get the real CSR Process for the remote thread's process */
|
2012-10-17 23:10:40 +00:00
|
|
|
Status = CsrLockProcessByClientId(ApiMessage->Data.CreateThreadRequest.ClientId.UniqueProcess,
|
2010-03-09 20:23:22 +00:00
|
|
|
&CsrProcess);
|
|
|
|
if (!NT_SUCCESS(Status)) return Status;
|
|
|
|
}
|
2012-02-19 10:12:14 +00:00
|
|
|
|
|
|
|
/* Duplicate the thread handle so we can own it */
|
|
|
|
Status = NtDuplicateObject(CurrentThread->Process->ProcessHandle,
|
2012-10-17 23:10:40 +00:00
|
|
|
ApiMessage->Data.CreateThreadRequest.ThreadHandle,
|
2010-03-09 20:23:22 +00:00
|
|
|
NtCurrentProcess(),
|
|
|
|
&ThreadHandle,
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
DUPLICATE_SAME_ACCESS);
|
|
|
|
if (NT_SUCCESS(Status))
|
|
|
|
{
|
2012-02-19 10:12:14 +00:00
|
|
|
/* Call CSRSRV to tell it about the new thread */
|
2010-03-10 06:49:53 +00:00
|
|
|
Status = CsrCreateThread(CsrProcess,
|
2012-02-19 10:12:14 +00:00
|
|
|
ThreadHandle,
|
2012-10-17 23:10:40 +00:00
|
|
|
&ApiMessage->Data.CreateThreadRequest.ClientId);
|
2010-03-09 20:23:22 +00:00
|
|
|
}
|
|
|
|
|
2012-02-19 10:12:14 +00:00
|
|
|
/* Unlock the process and return */
|
|
|
|
if (CsrProcess != CurrentThread->Process) CsrUnlockProcess(CsrProcess);
|
2010-03-09 20:23:22 +00:00
|
|
|
return Status;
|
|
|
|
}
|
|
|
|
|
2001-08-14 12:57:16 +00:00
|
|
|
CSR_API(CsrTerminateProcess)
|
1999-12-22 14:48:30 +00:00
|
|
|
{
|
2012-10-17 23:10:40 +00:00
|
|
|
PCSR_THREAD CsrThread = CsrGetClientThread();
|
2012-02-19 18:46:05 +00:00
|
|
|
ASSERT(CsrThread != NULL);
|
2012-02-19 19:40:28 +00:00
|
|
|
|
|
|
|
/* Set magic flag so we don't reply this message back */
|
2012-10-17 23:10:40 +00:00
|
|
|
ApiMessage->ApiNumber = 0xBABE;
|
2012-02-19 19:40:28 +00:00
|
|
|
|
2012-02-19 18:46:05 +00:00
|
|
|
/* Remove the CSR_THREADs and CSR_PROCESS */
|
|
|
|
return CsrDestroyProcess(&CsrThread->ClientId,
|
2012-10-17 23:10:40 +00:00
|
|
|
(NTSTATUS)ApiMessage->Data.TerminateProcessRequest.uExitCode);
|
1999-12-22 14:48:30 +00:00
|
|
|
}
|
1999-06-08 22:50:59 +00:00
|
|
|
|
2001-08-14 12:57:16 +00:00
|
|
|
CSR_API(CsrConnectProcess)
|
1999-06-08 22:50:59 +00:00
|
|
|
{
|
2012-10-17 23:10:40 +00:00
|
|
|
return STATUS_SUCCESS;
|
1999-06-08 22:50:59 +00:00
|
|
|
}
|
|
|
|
|
2002-10-20 16:40:12 +00:00
|
|
|
CSR_API(CsrGetShutdownParameters)
|
|
|
|
{
|
2012-10-17 23:10:40 +00:00
|
|
|
PCSR_THREAD CsrThread = CsrGetClientThread();
|
|
|
|
ASSERT(CsrThread);
|
2002-10-20 16:40:12 +00:00
|
|
|
|
2012-10-17 23:10:40 +00:00
|
|
|
ApiMessage->Data.GetShutdownParametersRequest.Level = CsrThread->Process->ShutdownLevel;
|
|
|
|
ApiMessage->Data.GetShutdownParametersRequest.Flags = CsrThread->Process->ShutdownFlags;
|
2002-10-20 16:40:12 +00:00
|
|
|
|
2012-10-17 23:10:40 +00:00
|
|
|
return STATUS_SUCCESS;
|
2002-10-20 16:40:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
CSR_API(CsrSetShutdownParameters)
|
|
|
|
{
|
2012-10-17 23:10:40 +00:00
|
|
|
PCSR_THREAD CsrThread = CsrGetClientThread();
|
|
|
|
ASSERT(CsrThread);
|
2002-10-20 16:40:12 +00:00
|
|
|
|
2012-10-17 23:10:40 +00:00
|
|
|
CsrThread->Process->ShutdownLevel = ApiMessage->Data.SetShutdownParametersRequest.Level;
|
|
|
|
CsrThread->Process->ShutdownFlags = ApiMessage->Data.SetShutdownParametersRequest.Flags;
|
2002-10-20 16:40:12 +00:00
|
|
|
|
2012-10-17 23:10:40 +00:00
|
|
|
return STATUS_SUCCESS;
|
2002-10-20 16:40:12 +00:00
|
|
|
}
|
|
|
|
|
1999-06-08 22:50:59 +00:00
|
|
|
/* EOF */
|