/* $Id$
*
* csrss.c - Client/Server Runtime subsystem
- *
+ *
* ReactOS Operating System
- *
+ *
* --------------------------------------------------------------------
*
* This software is free software; you can redistribute it and/or
* You should have received a copy of the GNU General Public License
* along with this software; see the file COPYING.LIB. If not, write
* to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
- * MA 02139, USA.
+ * MA 02139, USA.
*
* --------------------------------------------------------------------
- *
- * 19990417 (Emanuele Aliberti)
- * Do nothing native application skeleton
- * 19990528 (Emanuele Aliberti)
- * Compiled successfully with egcs 1.1.2
- * 19990605 (Emanuele Aliberti)
- * First standalone run under ReactOS (it
- * actually does nothing but running).
*/
-#include <ddk/ntddk.h>
-#include <ntdll/rtl.h>
-#include <csrss/csrss.h>
-#include <rosrtl/string.h>
-#include "api.h"
+#include <csrss.h>
#define NDEBUG
#include <debug.h>
-#define CSRP_MAX_ARGUMENT_COUNT 512
-
-typedef struct _COMMAND_LINE_ARGUMENT
+int _cdecl _main(int argc,
+ char *argv[],
+ char *envp[],
+ int DebugFlag)
{
- ULONG Count;
- UNICODE_STRING Buffer;
- PWSTR * Vector;
-
-} COMMAND_LINE_ARGUMENT, *PCOMMAND_LINE_ARGUMENT;
-
-/**********************************************************************
- * 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;
-
+ NTSTATUS Status = STATUS_SUCCESS;
- 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 (Argument->Buffer.Buffer[i] == L' ')
- {
- Argument->Count ++;
- Argument->Buffer.Buffer [i] = L'\0';
- Argument->Vector [Argument->Count - 1] = & (Argument->Buffer.Buffer [afterlastspace]);
- i++;
- while (Argument->Buffer.Buffer [i] == L' ')
- {
- i++;
- }
- afterlastspace = i;
- }
- else
- {
- i++;
- }
- }
-
- if (Argument->Buffer.Buffer [afterlastspace] != L'\0')
- {
- Argument->Count ++;
- Argument->Buffer.Buffer [i] = L'\0';
- Argument->Vector [Argument->Count - 1] = & (Argument->Buffer.Buffer [afterlastspace]);
- }
-
- 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,
- & EventName,
- EVENT_ALL_ACCESS,
- 0,
- NULL);
- return NtOpenEvent (CsrssInitEvent,
- EVENT_ALL_ACCESS,
- & ObjectAttributes);
-}
-
-/* Native process' entry point */
+ PrintString("ReactOS Client/Server Run-Time (Build %s)\n",
+ KERNEL_VERSION_BUILD_STR);
-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: CsrpOpenKeInitDoneEvent failed (Status=0x%08lx)\n",
- Status);
- }
/*==================================================================
* Initialize the Win32 environment subsystem server.
*================================================================*/
- if (CsrServerInitialization (CmdLineArg.Count, CmdLineArg.Vector) == TRUE)
+ if (CsrServerInitialization (argc, argv, envp) == 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);
-
- CsrpFreeCommandLine (Peb->ProcessHeap, & CmdLineArg);
/*
* Terminate the current thread only.
*/
- NtTerminateThread (NtCurrentThread(), 0);
+ Status = NtTerminateThread (NtCurrentThread(), 0);
}
else
{
DisplayString (L"CSR: CsrServerInitialization failed.\n");
-
- CsrpFreeCommandLine (Peb->ProcessHeap, & CmdLineArg);
/*
* Tell the SM we failed.
*/
- NtTerminateProcess (NtCurrentProcess(), 0);
+ Status = NtTerminateProcess (NtCurrentProcess(), 0);
}
+ return (int) Status;
}
/* EOF */