/* $Id: os2ss.cpp,v 1.2 2003/01/07 16:23:12 robd Exp $
 *
 * reactos/subsys/csrss/api/process.c
 *
 * "\windows\ApiPort" port process management functions
 *
 * ReactOS Operating System
 */
 // TODO: Rewrite the whole file. This is just a copy

#include <ddk/ntddk.h>
#include <ntdll/rtl.h>
#include <ntos/synch.h>

extern "C" {
BOOL CsrServerInitialization(ULONG ArgumentCount, PWSTR *ArgumentArray);
VOID DisplayString(LPCWSTR lpwString);
//BOOL STDCALL CsrServerInitialization (ULONG ArgumentCount, PWSTR *ArgumentArray);
//VOID STDCALL DisplayString(LPCWSTR lpwString);
//VOID STDCALL PrintString (char* fmt, ...);
//NTSTATUS STDCALL NtDisplayString(IN PUNICODE_STRING DisplayString);

void
DisplayString(LPCWSTR lpwString)
{
  UNICODE_STRING us;

  RtlInitUnicodeString(&us, lpwString);
  NtDisplayString(&us);
}

/*
void
PrintString(char* fmt,...)
{
  char buffer[512];
  va_list ap;
  UNICODE_STRING UnicodeString;
  ANSI_STRING AnsiString;

  va_start(ap, fmt);
  vsprintf(buffer, fmt, ap);
  va_end(ap);

  RtlInitAnsiString(&AnsiString, buffer);
  RtlAnsiStringToUnicodeString(&UnicodeString,
			       &AnsiString,
			       TRUE);
  NtDisplayString(&UnicodeString);
  RtlFreeUnicodeString(&UnicodeString);
}
 */

}

/* server variables */

int NumProcesses;



/* Native image's entry point */

void NtProcessStartup (PPEB Peb)
{
   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;

   ProcParams = RtlNormalizeProcessParams (Peb->ProcessParameters);

   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));

   while (ArgBuffer[i])
     {
        if (ArgBuffer[i] == L' ')
          {
             argc++;
             ArgBuffer[i] = L'\0';
             argv[argc-1] = &(ArgBuffer[afterlastspace]);
             i++;
             while (ArgBuffer[i] == L' ')
                i++;
             afterlastspace = i;
          }
        else
          {
             i++;
          }
     }

   if (ArgBuffer[afterlastspace] != L'\0')
     {
        argc++;
        ArgBuffer[i] = L'\0';
        argv[argc-1] = &(ArgBuffer[afterlastspace]);
     }
   
   RtlInitUnicodeString(&UnicodeString,
                        L"\\CsrssInitDone");
   InitializeObjectAttributes(&ObjectAttributes,
                              &UnicodeString,
                              EVENT_ALL_ACCESS,
                              0,
                              NULL);
   Status = NtOpenEvent(&CsrssInitEvent,
                        EVENT_ALL_ACCESS,
                        &ObjectAttributes);
   if (!NT_SUCCESS(Status))
     {
        DbgPrint("CSR: Failed to open csrss notification event\n");
     }
   if (CsrServerInitialization (argc, argv) == TRUE)
     {

        NtSetEvent(CsrssInitEvent,
                   NULL);
        
        RtlFreeHeap (Peb->ProcessHeap,
                     0, argv);
        RtlFreeHeap (Peb->ProcessHeap,
                     0,
                     ArgBuffer);

        /* 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);

        /*
         * Tell SM we failed.
         */
        NtTerminateProcess( NtCurrentProcess(), 0 );
   }
}