diff --git a/reactos/subsys/csrss/api/wapi.c b/reactos/subsys/csrss/api/wapi.c index 3d1c4e7af84..0852c0af2e4 100644 --- a/reactos/subsys/csrss/api/wapi.c +++ b/reactos/subsys/csrss/api/wapi.c @@ -2,7 +2,7 @@ * * reactos/subsys/csrss/api/wapi.c * - * Initialize the CSRSS subsystem server process. + * CSRSS port message processing * * ReactOS Operating System * @@ -147,14 +147,14 @@ ClientConnectionThread(HANDLE ServerPort) /********************************************************************** * NAME - * Thread_Api + * ServerApiPortThread/1 * * DESCRIPTION * Handle connection requests from clients to the port * "\Windows\ApiPort". */ void STDCALL -ServerApiPortThead(PVOID PortHandle) +ServerApiPortThread (PVOID PortHandle) { NTSTATUS Status; LPC_MAX_MESSAGE Request; @@ -232,4 +232,51 @@ ServerApiPortThead(PVOID PortHandle) NtTerminateThread(NtCurrentThread(), Status); } +/********************************************************************** + * NAME + * ServerSbApiPortThread/1 + * + * DESCRIPTION + * Handle connection requests from SM to the port + * "\Windows\SbApiPort". + */ +VOID STDCALL +ServerSbApiPortThread (PVOID PortHandle) +{ + HANDLE hSbApiPortListen = (HANDLE) PortHandle; + HANDLE hConnectedPort = (HANDLE) 0; + LPC_MAX_MESSAGE Request = {{0}}; + NTSTATUS Status = STATUS_SUCCESS; + + while (TRUE) + { + Status = NtListenPort (hSbApiPortListen, & Request.Header); + if (!NT_SUCCESS(Status)) + { + DPRINT1("CSR: %s: NtListenPort(SB) failed\n", __FUNCTION__); + break; + } + Status = NtAcceptConnectPort (& hConnectedPort, + hSbApiPortListen, + NULL, + TRUE, + NULL, + NULL); + if(!NT_SUCCESS(Status)) + { + DPRINT1("CSR: %s: NtAcceptConnectPort() failed\n", __FUNCTION__); + break; + } + Status = NtCompleteConnectPort (hConnectedPort); + if(!NT_SUCCESS(Status)) + { + DPRINT1("CSR: %s: NtCompleteConnectPort() failed\n", __FUNCTION__); + break; + } + /* TODO: create thread for the connected port */ + } + NtClose (hSbApiPortListen); + NtTerminateThread (NtCurrentThread(), Status); +} + /* EOF */ diff --git a/reactos/subsys/csrss/csrss.c b/reactos/subsys/csrss/csrss.c index 86400dcbfee..4fc3868dd10 100644 --- a/reactos/subsys/csrss/csrss.c +++ b/reactos/subsys/csrss/csrss.c @@ -38,42 +38,75 @@ #include "api.h" -/* Native process' entry point */ +#define NDEBUG +#include -VOID STDCALL NtProcessStartup(PPEB Peb) +#define CSRP_MAX_ARGUMENT_COUNT 512 + +typedef struct _COMMAND_LINE_ARGUMENT { - PRTL_USER_PROCESS_PARAMETERS ProcParams; - PWSTR ArgBuffer; - PWSTR *argv; - ULONG argc = 0; - int i = 0; - int afterlastspace = 0; - OBJECT_ATTRIBUTES ObjectAttributes; - HANDLE CsrssInitEvent; - UNICODE_STRING UnicodeString; - NTSTATUS Status; + ULONG Count; + UNICODE_STRING Buffer; + PWSTR * Vector; - ProcParams = RtlNormalizeProcessParams (Peb->ProcessParameters); +} COMMAND_LINE_ARGUMENT, *PCOMMAND_LINE_ARGUMENT; - argv = (PWSTR *)RtlAllocateHeap (Peb->ProcessHeap, - 0, 512 * sizeof(PWSTR)); - ArgBuffer = (PWSTR)RtlAllocateHeap (Peb->ProcessHeap, - 0, - ProcParams->CommandLine.Length + sizeof(WCHAR)); - memcpy (ArgBuffer, - ProcParams->CommandLine.Buffer, - ProcParams->CommandLine.Length + sizeof(WCHAR)); +/********************************************************************** + * NAME PRIVATE + * CsrpParseCommandLine/3 + */ +static NTSTATUS STDCALL +CsrpParseCommandLine (HANDLE ProcessHeap, + PRTL_USER_PROCESS_PARAMETERS RtlProcessParameters, + PCOMMAND_LINE_ARGUMENT Argument) +{ + INT i = 0; + INT afterlastspace = 0; - while (ArgBuffer[i]) + + DPRINT("CSR: %s called\n", __FUNCTION__); + + RtlZeroMemory (Argument, sizeof (COMMAND_LINE_ARGUMENT)); + + Argument->Vector = (PWSTR *) RtlAllocateHeap (ProcessHeap, + 0, + (CSRP_MAX_ARGUMENT_COUNT * sizeof Argument->Vector[0])); + if(NULL == Argument->Vector) + { + DPRINT("CSR: %s: no memory for Argument->Vector\n", __FUNCTION__); + return STATUS_NO_MEMORY; + } + + Argument->Buffer.Length = + Argument->Buffer.MaximumLength = + RtlProcessParameters->CommandLine.Length + + sizeof Argument->Buffer.Buffer [0]; /* zero terminated */ + Argument->Buffer.Buffer = + (PWSTR) RtlAllocateHeap (ProcessHeap, + 0, + Argument->Buffer.MaximumLength); + if(NULL == Argument->Buffer.Buffer) + { + DPRINT("CSR: %s: no memory for Argument->Buffer.Buffer\n", __FUNCTION__); + return STATUS_NO_MEMORY; + } + + RtlCopyMemory (Argument->Buffer.Buffer, + RtlProcessParameters->CommandLine.Buffer, + RtlProcessParameters->CommandLine.Length); + + while (Argument->Buffer.Buffer [i]) { - if (ArgBuffer[i] == L' ') + if (Argument->Buffer.Buffer[i] == L' ') { - argc++; - ArgBuffer[i] = L'\0'; - argv[argc-1] = &(ArgBuffer[afterlastspace]); + Argument->Count ++; + Argument->Buffer.Buffer [i] = L'\0'; + Argument->Vector [Argument->Count - 1] = & (Argument->Buffer.Buffer [afterlastspace]); i++; - while (ArgBuffer[i] == L' ') + while (Argument->Buffer.Buffer [i] == L' ') + { i++; + } afterlastspace = i; } else @@ -82,56 +115,122 @@ VOID STDCALL NtProcessStartup(PPEB Peb) } } - if (ArgBuffer[afterlastspace] != L'\0') + if (Argument->Buffer.Buffer [afterlastspace] != L'\0') { - argc++; - ArgBuffer[i] = L'\0'; - argv[argc-1] = &(ArgBuffer[afterlastspace]); + Argument->Count ++; + Argument->Buffer.Buffer [i] = L'\0'; + Argument->Vector [Argument->Count - 1] = & (Argument->Buffer.Buffer [afterlastspace]); } - - RtlRosInitUnicodeStringFromLiteral(&UnicodeString, + + return STATUS_SUCCESS; +} + +/********************************************************************** + * NAME PRIVATE + * CsrpFreeCommandLine/2 + */ + +static VOID STDCALL +CsrpFreeCommandLine (HANDLE ProcessHeap, + PCOMMAND_LINE_ARGUMENT Argument) +{ + DPRINT("CSR: %s called\n", __FUNCTION__); + + RtlFreeHeap (ProcessHeap, + 0, + Argument->Vector); + RtlFreeHeap (ProcessHeap, + 0, + Argument->Buffer.Buffer); +} + + +/********************************************************************** + * NAME PRIVATE + * CsrpOpenKeInitDoneEvent/0 + */ +static NTSTATUS STDCALL +CsrpOpenKeInitDoneEvent (PHANDLE CsrssInitEvent) +{ + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING EventName; + + DPRINT("CSR: %s called\n", __FUNCTION__); + + RtlInitUnicodeString(& EventName, L"\\CsrssInitDone"); - InitializeObjectAttributes(&ObjectAttributes, - &UnicodeString, - EVENT_ALL_ACCESS, - 0, - NULL); - Status = NtOpenEvent(&CsrssInitEvent, + InitializeObjectAttributes (& ObjectAttributes, + & EventName, + EVENT_ALL_ACCESS, + 0, + NULL); + return NtOpenEvent (CsrssInitEvent, EVENT_ALL_ACCESS, - &ObjectAttributes); + & ObjectAttributes); +} + +/* Native process' entry point */ + +VOID STDCALL NtProcessStartup(PPEB Peb) +{ + PRTL_USER_PROCESS_PARAMETERS RtlProcessParameters = NULL; + COMMAND_LINE_ARGUMENT CmdLineArg = {0}; + HANDLE CsrssInitEvent = (HANDLE) 0; + NTSTATUS Status = STATUS_SUCCESS; + + DPRINT("CSR: %s\n", __FUNCTION__); + + RtlProcessParameters = RtlNormalizeProcessParams (Peb->ProcessParameters); + + /*================================================================== + * Parse the command line. + *================================================================*/ + Status = CsrpParseCommandLine (Peb->ProcessHeap, + RtlProcessParameters, + & CmdLineArg); + if(STATUS_SUCCESS != Status) + { + DbgPrint("CSR: CsrpParseCommandLine failed (Status=0x%08lx)\n", + Status); + } + /* + * Open the Ke notification event to notify we are OK after + * subsystem server initialization. + */ + Status = CsrpOpenKeInitDoneEvent(& CsrssInitEvent); if (!NT_SUCCESS(Status)) { - DbgPrint("CSR: Failed to open csrss notification event\n"); + DbgPrint("CSR: CsrpOpenKeInitDoneEvent failed (Status=0x%08lx)\n", + Status); } - if (CsrServerInitialization (argc, argv) == TRUE) + /*================================================================== + * Initialize the Win32 environment subsystem server. + *================================================================*/ + if (CsrServerInitialization (CmdLineArg.Count, CmdLineArg.Vector) == TRUE) { + /*============================================================= + * Tell Ke we are up and safe. If we fail to notify Ke, it will + * bugcheck the system with SESSION5_INITIALIZATION_FAILED. + * TODO: choose a better way to check user mode initialization + * is OK. + *===========================================================*/ + NtSetEvent (CsrssInitEvent, NULL); - NtSetEvent(CsrssInitEvent, - NULL); - - RtlFreeHeap (Peb->ProcessHeap, - 0, argv); - RtlFreeHeap (Peb->ProcessHeap, - 0, - ArgBuffer); - - /* terminate the current thread only */ - NtTerminateThread( NtCurrentThread(), 0 ); + CsrpFreeCommandLine (Peb->ProcessHeap, & CmdLineArg); + /* + * Terminate the current thread only. + */ + NtTerminateThread (NtCurrentThread(), 0); } else { - DisplayString( L"CSR: Subsystem initialization failed.\n" ); - - RtlFreeHeap (Peb->ProcessHeap, - 0, argv); - RtlFreeHeap (Peb->ProcessHeap, - 0, - ArgBuffer); + DisplayString (L"CSR: CsrServerInitialization failed.\n"); + CsrpFreeCommandLine (Peb->ProcessHeap, & CmdLineArg); /* - * Tell SM we failed. + * Tell the SM we failed. */ - NtTerminateProcess( NtCurrentProcess(), 0 ); + NtTerminateProcess (NtCurrentProcess(), 0); } } diff --git a/reactos/subsys/csrss/include/api.h b/reactos/subsys/csrss/include/api.h index 46ccf091ff0..0f8610ef0a6 100644 --- a/reactos/subsys/csrss/include/api.h +++ b/reactos/subsys/csrss/include/api.h @@ -96,7 +96,8 @@ NTSTATUS FASTCALL CsrApiRegisterDefinitions(PCSRSS_API_DEFINITION NewDefinitions VOID FASTCALL CsrApiCallHandler(PCSRSS_PROCESS_DATA ProcessData, PCSRSS_API_REQUEST Request, PCSRSS_API_REPLY Reply); -VOID STDCALL ServerApiPortThead(PVOID PortHandle); +VOID STDCALL ServerApiPortThread (PVOID PortHandle); +VOID STDCALL ServerSbApiPortThread (PVOID PortHandle); VOID Console_Api( DWORD Ignored ); extern HANDLE CsrssApiHeap; diff --git a/reactos/subsys/csrss/init.c b/reactos/subsys/csrss/init.c index 3d5bf55a29d..106ad692f46 100644 --- a/reactos/subsys/csrss/init.c +++ b/reactos/subsys/csrss/init.c @@ -335,7 +335,7 @@ DisplayString(L"CSR: CsrServerInitialization\n"); 0, NULL, NULL, - (PTHREAD_START_ROUTINE)ServerApiPortThead, + (PTHREAD_START_ROUTINE)ServerApiPortThread, ApiPortHandle, NULL, NULL);