CSR pre-init cleanup
Modified: trunk/reactos/subsys/csrss/api/wapi.c
Modified: trunk/reactos/subsys/csrss/csrss.c
Modified: trunk/reactos/subsys/csrss/include/api.h
Modified: trunk/reactos/subsys/csrss/init.c

Modified: trunk/reactos/subsys/csrss/api/wapi.c
--- trunk/reactos/subsys/csrss/api/wapi.c	2005-02-25 21:22:05 UTC (rev 13747)
+++ trunk/reactos/subsys/csrss/api/wapi.c	2005-02-26 15:06:19 UTC (rev 13748)
@@ -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 @@
 
 /**********************************************************************
  * 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 @@
    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 */

Modified: trunk/reactos/subsys/csrss/csrss.c
--- trunk/reactos/subsys/csrss/csrss.c	2005-02-25 21:22:05 UTC (rev 13747)
+++ trunk/reactos/subsys/csrss/csrss.c	2005-02-26 15:06:19 UTC (rev 13748)
@@ -38,42 +38,75 @@
 
 #include "api.h"
 
-/* Native process' entry point */
+#define NDEBUG
+#include <debug.h>
 
-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 @@
 	  }
      }
 
-   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" );
+	DisplayString (L"CSR: CsrServerInitialization failed.\n");
 
-	RtlFreeHeap (Peb->ProcessHeap,
-	             0, argv);
-	RtlFreeHeap (Peb->ProcessHeap,
-	             0,
-	             ArgBuffer);
-
+	CsrpFreeCommandLine (Peb->ProcessHeap, & CmdLineArg);	
 	/*
-	 * Tell SM we failed.
+	 * Tell the SM we failed.
 	 */
-	NtTerminateProcess( NtCurrentProcess(), 0 );
+	NtTerminateProcess (NtCurrentProcess(), 0);
      }
 }
 

Modified: trunk/reactos/subsys/csrss/include/api.h
--- trunk/reactos/subsys/csrss/include/api.h	2005-02-25 21:22:05 UTC (rev 13747)
+++ trunk/reactos/subsys/csrss/include/api.h	2005-02-26 15:06:19 UTC (rev 13748)
@@ -96,7 +96,8 @@
 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;

Modified: trunk/reactos/subsys/csrss/init.c
--- trunk/reactos/subsys/csrss/init.c	2005-02-25 21:22:05 UTC (rev 13747)
+++ trunk/reactos/subsys/csrss/init.c	2005-02-26 15:06:19 UTC (rev 13748)
@@ -335,7 +335,7 @@
                                0,
                                NULL,
                                NULL,
-                               (PTHREAD_START_ROUTINE)ServerApiPortThead,
+                               (PTHREAD_START_ROUTINE)ServerApiPortThread,
                                ApiPortHandle,
                                NULL,
                                NULL);