/* $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 #include #include 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 ); } }