Add information letting us know creation deletion of services has worked.
[reactos.git] / reactos / subsys / csrss / csrss.c
index 4fc3868..b5d7303 100644 (file)
@@ -1,9 +1,9 @@
 /* $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 */