2002-10-01 06:41:57 +00:00
|
|
|
/* $Id: process.c,v 1.20 2002/10/01 06:41:56 ei Exp $
|
1999-06-08 22:50:59 +00:00
|
|
|
*
|
|
|
|
* reactos/subsys/csrss/api/process.c
|
|
|
|
*
|
|
|
|
* "\windows\ApiPort" port process management functions
|
|
|
|
*
|
|
|
|
* ReactOS Operating System
|
|
|
|
*/
|
1999-12-22 14:48:30 +00:00
|
|
|
|
|
|
|
/* INCLUDES ******************************************************************/
|
|
|
|
|
2002-09-08 10:23:54 +00:00
|
|
|
#include <ddk/ntddk.h>
|
|
|
|
|
1999-12-22 14:48:30 +00:00
|
|
|
#include <csrss/csrss.h>
|
2002-09-08 10:23:54 +00:00
|
|
|
#include <ntdll/rtl.h>
|
1999-12-22 14:48:30 +00:00
|
|
|
#include "api.h"
|
1999-07-17 23:10:31 +00:00
|
|
|
|
2002-10-01 06:41:57 +00:00
|
|
|
BOOL STDCALL W32kCleanupForProcess( INT Process );
|
|
|
|
|
2001-08-14 12:57:16 +00:00
|
|
|
#define LOCK RtlEnterCriticalSection(&ProcessDataLock)
|
|
|
|
#define UNLOCK RtlLeaveCriticalSection(&ProcessDataLock)
|
|
|
|
|
1999-12-30 01:51:42 +00:00
|
|
|
/* GLOBALS *******************************************************************/
|
|
|
|
|
|
|
|
static ULONG NrProcess;
|
|
|
|
static PCSRSS_PROCESS_DATA ProcessData[256];
|
2002-09-08 10:23:54 +00:00
|
|
|
extern CRITICAL_SECTION ActiveConsoleLock;
|
|
|
|
CRITICAL_SECTION ProcessDataLock;
|
1999-12-30 01:51:42 +00:00
|
|
|
|
1999-12-22 14:48:30 +00:00
|
|
|
/* FUNCTIONS *****************************************************************/
|
|
|
|
|
2001-08-14 12:57:16 +00:00
|
|
|
VOID STDCALL CsrInitProcessData(VOID)
|
2000-02-27 02:12:07 +00:00
|
|
|
{
|
2001-08-14 12:57:16 +00:00
|
|
|
/* ULONG i;
|
2000-02-27 02:12:07 +00:00
|
|
|
|
|
|
|
for (i=0; i<256; i++)
|
|
|
|
{
|
|
|
|
ProcessData[i] = NULL;
|
|
|
|
}
|
2001-08-14 12:57:16 +00:00
|
|
|
*/
|
|
|
|
RtlZeroMemory (ProcessData, sizeof ProcessData);
|
|
|
|
NrProcess = sizeof ProcessData / sizeof ProcessData[0];
|
2000-05-26 05:43:33 +00:00
|
|
|
RtlInitializeCriticalSection( &ProcessDataLock );
|
2000-02-27 02:12:07 +00:00
|
|
|
}
|
|
|
|
|
2001-08-14 12:57:16 +00:00
|
|
|
PCSRSS_PROCESS_DATA STDCALL CsrGetProcessData(ULONG ProcessId)
|
1999-12-30 01:51:42 +00:00
|
|
|
{
|
|
|
|
ULONG i;
|
2000-05-26 05:43:33 +00:00
|
|
|
|
2001-08-14 12:57:16 +00:00
|
|
|
LOCK;
|
2000-03-22 18:36:00 +00:00
|
|
|
for (i=0; i<NrProcess; i++)
|
1999-12-30 01:51:42 +00:00
|
|
|
{
|
2000-02-27 02:12:07 +00:00
|
|
|
if (ProcessData[i] &&
|
|
|
|
ProcessData[i]->ProcessId == ProcessId)
|
1999-12-30 01:51:42 +00:00
|
|
|
{
|
2001-08-14 12:57:16 +00:00
|
|
|
UNLOCK;
|
1999-12-30 01:51:42 +00:00
|
|
|
return(ProcessData[i]);
|
|
|
|
}
|
|
|
|
}
|
2000-03-22 18:36:00 +00:00
|
|
|
for (i=0; i<NrProcess; i++)
|
1999-12-30 01:51:42 +00:00
|
|
|
{
|
2000-03-22 18:36:00 +00:00
|
|
|
if (ProcessData[i] == NULL)
|
2002-10-01 06:41:57 +00:00
|
|
|
{
|
2000-03-22 18:36:00 +00:00
|
|
|
ProcessData[i] = RtlAllocateHeap(CsrssApiHeap,
|
|
|
|
HEAP_ZERO_MEMORY,
|
|
|
|
sizeof(CSRSS_PROCESS_DATA));
|
|
|
|
if (ProcessData[i] == NULL)
|
|
|
|
{
|
2001-08-14 12:57:16 +00:00
|
|
|
UNLOCK;
|
2000-03-22 18:36:00 +00:00
|
|
|
return(NULL);
|
|
|
|
}
|
|
|
|
ProcessData[i]->ProcessId = ProcessId;
|
2001-08-14 12:57:16 +00:00
|
|
|
UNLOCK;
|
2000-03-22 18:36:00 +00:00
|
|
|
return(ProcessData[i]);
|
|
|
|
}
|
1999-12-30 01:51:42 +00:00
|
|
|
}
|
2000-04-03 21:54:42 +00:00
|
|
|
// DbgPrint("CSR: CsrGetProcessData() failed\n");
|
2001-08-14 12:57:16 +00:00
|
|
|
UNLOCK;
|
2000-03-22 18:36:00 +00:00
|
|
|
return(NULL);
|
1999-12-30 01:51:42 +00:00
|
|
|
}
|
|
|
|
|
2001-08-14 12:57:16 +00:00
|
|
|
NTSTATUS STDCALL CsrFreeProcessData(ULONG Pid)
|
2000-04-23 17:44:53 +00:00
|
|
|
{
|
|
|
|
int i;
|
2001-08-14 12:57:16 +00:00
|
|
|
LOCK;
|
2000-04-23 17:44:53 +00:00
|
|
|
for( i = 0; i < NrProcess; i++ )
|
|
|
|
{
|
|
|
|
if( ProcessData[i] && ProcessData[i]->ProcessId == Pid )
|
|
|
|
{
|
2002-10-01 06:41:57 +00:00
|
|
|
//DbgPrint("CsrFreeProcessData pid: %d\n", Pid);
|
|
|
|
W32kCleanupForProcess( Pid ); //should check if win32k process
|
2000-04-23 17:44:53 +00:00
|
|
|
if( ProcessData[i]->HandleTable )
|
|
|
|
{
|
|
|
|
int c;
|
|
|
|
for( c = 0; c < ProcessData[i]->HandleTableSize; c++ )
|
|
|
|
if( ProcessData[i]->HandleTable[c] )
|
|
|
|
CsrReleaseObject( ProcessData[i], (HANDLE)((c + 1) << 2) );
|
|
|
|
RtlFreeHeap( CsrssApiHeap, 0, ProcessData[i]->HandleTable );
|
|
|
|
}
|
|
|
|
if( ProcessData[i]->Console )
|
|
|
|
{
|
2001-01-21 00:11:54 +00:00
|
|
|
if( InterlockedDecrement( &(ProcessData[i]->Console->Header.ReferenceCount) ) == 0 )
|
|
|
|
CsrDeleteConsole( ProcessData[i]->Console );
|
2000-04-23 17:44:53 +00:00
|
|
|
}
|
|
|
|
RtlFreeHeap( CsrssApiHeap, 0, ProcessData[i] );
|
|
|
|
ProcessData[i] = 0;
|
2001-08-14 12:57:16 +00:00
|
|
|
UNLOCK;
|
2000-04-23 17:44:53 +00:00
|
|
|
return STATUS_SUCCESS;
|
|
|
|
}
|
|
|
|
}
|
2001-08-14 12:57:16 +00:00
|
|
|
UNLOCK;
|
2000-04-23 17:44:53 +00:00
|
|
|
return STATUS_INVALID_PARAMETER;
|
|
|
|
}
|
|
|
|
|
1999-12-30 01:51:42 +00:00
|
|
|
|
2001-08-14 12:57:16 +00:00
|
|
|
/**********************************************************************
|
|
|
|
* CSRSS API
|
|
|
|
*********************************************************************/
|
|
|
|
|
|
|
|
CSR_API(CsrCreateProcess)
|
1999-06-08 22:50:59 +00:00
|
|
|
{
|
1999-12-30 01:51:42 +00:00
|
|
|
PCSRSS_PROCESS_DATA NewProcessData;
|
2000-04-23 17:44:53 +00:00
|
|
|
NTSTATUS Status;
|
|
|
|
HANDLE Process;
|
|
|
|
|
2002-10-01 06:41:57 +00:00
|
|
|
Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) -
|
2002-09-08 10:23:54 +00:00
|
|
|
sizeof(LPC_MESSAGE_HEADER);
|
2000-04-03 21:54:42 +00:00
|
|
|
Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
|
2002-10-01 06:41:57 +00:00
|
|
|
|
2000-05-26 05:43:33 +00:00
|
|
|
NewProcessData = CsrGetProcessData(Request->Data.CreateProcessRequest.NewProcessId);
|
1999-12-30 01:51:42 +00:00
|
|
|
if (NewProcessData == NULL)
|
|
|
|
{
|
2000-03-22 18:36:00 +00:00
|
|
|
Reply->Status = STATUS_NO_MEMORY;
|
1999-12-30 01:51:42 +00:00
|
|
|
return(STATUS_NO_MEMORY);
|
|
|
|
}
|
2002-10-01 06:41:57 +00:00
|
|
|
|
2000-05-26 05:43:33 +00:00
|
|
|
if (Request->Data.CreateProcessRequest.Flags & DETACHED_PROCESS)
|
1999-12-30 01:51:42 +00:00
|
|
|
{
|
2000-02-27 02:12:07 +00:00
|
|
|
NewProcessData->Console = NULL;
|
1999-12-30 01:51:42 +00:00
|
|
|
}
|
2000-05-26 05:43:33 +00:00
|
|
|
else if (Request->Data.CreateProcessRequest.Flags & CREATE_NEW_CONSOLE)
|
1999-12-30 01:51:42 +00:00
|
|
|
{
|
|
|
|
PCSRSS_CONSOLE Console;
|
|
|
|
|
|
|
|
Console = RtlAllocateHeap(CsrssApiHeap,
|
|
|
|
HEAP_ZERO_MEMORY,
|
|
|
|
sizeof(CSRSS_CONSOLE));
|
2001-01-21 00:11:54 +00:00
|
|
|
Status = CsrInitConsole(Console);
|
|
|
|
if( !NT_SUCCESS( Status ) )
|
|
|
|
{
|
|
|
|
CsrFreeProcessData( NewProcessData->ProcessId );
|
|
|
|
Reply->Status = Status;
|
|
|
|
return Status;
|
|
|
|
}
|
1999-12-30 01:51:42 +00:00
|
|
|
NewProcessData->Console = Console;
|
2001-01-21 00:11:54 +00:00
|
|
|
Console->Header.ReferenceCount++;
|
1999-12-30 01:51:42 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
NewProcessData->Console = ProcessData->Console;
|
2001-01-21 00:11:54 +00:00
|
|
|
InterlockedIncrement( &(ProcessData->Console->Header.ReferenceCount) );
|
1999-12-30 01:51:42 +00:00
|
|
|
}
|
2001-09-02 12:19:34 +00:00
|
|
|
|
2000-04-23 17:44:53 +00:00
|
|
|
if( NewProcessData->Console )
|
|
|
|
{
|
|
|
|
CLIENT_ID ClientId;
|
|
|
|
CsrInsertObject(NewProcessData,
|
2001-01-21 00:11:54 +00:00
|
|
|
&Reply->Data.CreateProcessReply.InputHandle,
|
2000-04-23 17:44:53 +00:00
|
|
|
(Object_t *)NewProcessData->Console);
|
2001-01-21 00:11:54 +00:00
|
|
|
RtlEnterCriticalSection( &ActiveConsoleLock );
|
2001-09-01 15:36:45 +00:00
|
|
|
CsrInsertObject( NewProcessData,
|
|
|
|
&Reply->Data.CreateProcessReply.OutputHandle,
|
|
|
|
&(NewProcessData->Console->ActiveBuffer->Header) );
|
|
|
|
|
2001-01-21 00:11:54 +00:00
|
|
|
RtlLeaveCriticalSection( &ActiveConsoleLock );
|
2000-04-23 17:44:53 +00:00
|
|
|
ClientId.UniqueProcess = (HANDLE)NewProcessData->ProcessId;
|
|
|
|
Status = NtOpenProcess( &Process, PROCESS_DUP_HANDLE, 0, &ClientId );
|
|
|
|
if( !NT_SUCCESS( Status ) )
|
|
|
|
{
|
|
|
|
DbgPrint( "CSR: NtOpenProcess() failed for handle duplication\n" );
|
2001-01-21 00:11:54 +00:00
|
|
|
InterlockedDecrement( &(NewProcessData->Console->Header.ReferenceCount) );
|
2000-04-23 17:44:53 +00:00
|
|
|
CsrFreeProcessData( NewProcessData->ProcessId );
|
|
|
|
Reply->Status = Status;
|
|
|
|
return Status;
|
|
|
|
}
|
2001-11-20 02:29:45 +00:00
|
|
|
Status = NtDuplicateObject( NtCurrentProcess(), NewProcessData->Console->ActiveEvent, Process, &NewProcessData->ConsoleEvent, SYNCHRONIZE, FALSE, 0 );
|
2000-04-23 17:44:53 +00:00
|
|
|
if( !NT_SUCCESS( Status ) )
|
|
|
|
{
|
2000-05-26 05:43:33 +00:00
|
|
|
DbgPrint( "CSR: NtDuplicateObject() failed: %x\n", Status );
|
2000-04-23 17:44:53 +00:00
|
|
|
NtClose( Process );
|
2001-01-21 00:11:54 +00:00
|
|
|
InterlockedDecrement( &(NewProcessData->Console->Header.ReferenceCount) );
|
2000-04-23 17:44:53 +00:00
|
|
|
CsrFreeProcessData( NewProcessData->ProcessId );
|
|
|
|
Reply->Status = Status;
|
|
|
|
return Status;
|
|
|
|
}
|
|
|
|
NtClose( Process );
|
|
|
|
}
|
2001-01-21 00:11:54 +00:00
|
|
|
else Reply->Data.CreateProcessReply.OutputHandle = Reply->Data.CreateProcessReply.InputHandle = INVALID_HANDLE_VALUE;
|
2002-10-01 06:41:57 +00:00
|
|
|
|
2000-03-22 18:36:00 +00:00
|
|
|
return(STATUS_SUCCESS);
|
1999-06-08 22:50:59 +00:00
|
|
|
}
|
|
|
|
|
2001-08-14 12:57:16 +00:00
|
|
|
CSR_API(CsrTerminateProcess)
|
1999-12-22 14:48:30 +00:00
|
|
|
{
|
2002-05-07 22:46:23 +00:00
|
|
|
NTSTATUS Status;
|
|
|
|
|
2002-10-01 06:41:57 +00:00
|
|
|
Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY)
|
2002-09-08 10:23:54 +00:00
|
|
|
- sizeof(LPC_MESSAGE_HEADER);
|
2000-04-03 21:54:42 +00:00
|
|
|
Reply->Header.DataSize = sizeof(CSRSS_API_REPLY);
|
2001-08-14 12:57:16 +00:00
|
|
|
|
2002-05-07 22:46:23 +00:00
|
|
|
Status = CsrFreeProcessData(ProcessData->ProcessId);
|
|
|
|
|
|
|
|
Reply->Status = Status;
|
|
|
|
return Status;
|
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
|
|
|
{
|
2000-04-03 21:54:42 +00:00
|
|
|
Reply->Header.MessageSize = sizeof(CSRSS_API_REPLY);
|
2002-10-01 06:41:57 +00:00
|
|
|
Reply->Header.DataSize = sizeof(CSRSS_API_REPLY) -
|
2002-09-08 10:23:54 +00:00
|
|
|
sizeof(LPC_MESSAGE_HEADER);
|
2002-10-01 06:41:57 +00:00
|
|
|
|
2000-03-22 18:36:00 +00:00
|
|
|
Reply->Status = STATUS_SUCCESS;
|
2002-10-01 06:41:57 +00:00
|
|
|
|
1999-12-22 14:48:30 +00:00
|
|
|
return(STATUS_SUCCESS);
|
1999-06-08 22:50:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* EOF */
|