A raw attempt to fix the startup code for native processes. (note: it seems NTOSKRNL passes nothing to smss.exe) Modified: trunk/reactos/lib/nt/entry_point.c _____
Modified: trunk/reactos/lib/nt/entry_point.c --- trunk/reactos/lib/nt/entry_point.c 2005-10-03 20:28:29 UTC (rev 18250) +++ trunk/reactos/lib/nt/entry_point.c 2005-10-03 21:35:12 UTC (rev 18251) @@ -23,11 +23,36 @@
ULONG DebugFlag );
-#define NDEBUG +//#define NDEBUG #include <debug.h>
-/* FUNCTIONSS ****************************************************************/ +/* FUNCTIONS ****************************************************************/
+ULONG FASTCALL WideCharStringToUnicodeString (PWCHAR wsIn, PUNICODE_STRING usOut) +{ + ULONG Length = 0; + PWCHAR CurrentChar = wsIn; + + DPRINT("%s(%08lx,%08lx) called\n", __FUNCTION__, wsIn, usOut); + + if (NULL != CurrentChar) + { + usOut->Buffer = CurrentChar; + while (*CurrentChar ++) + { + ++ Length; + while (*CurrentChar ++) + { + ++ Length; + } + } + ++ Length; + } + usOut->Length = Length; + usOut->MaximumLength = Length; + return Length; +} + VOID STDCALL NtProcessStartup(PPEB Peb) @@ -36,6 +61,8 @@ PRTL_USER_PROCESS_PARAMETERS ProcessParameters; PUNICODE_STRING CmdLineString; ANSI_STRING AnsiCmdLine; + UNICODE_STRING UnicodeEnvironment; + ANSI_STRING AnsiEnvironment; PCHAR NullPointer = NULL; INT argc = 0; PCHAR *argv; @@ -45,6 +72,8 @@ ULONG Length; ASSERT(Peb);
+ DPRINT("%s(%08lx) called\n", __FUNCTION__, Peb); + /* Normalize and get the Process Parameters */ ProcessParameters = RtlNormalizeProcessParams(Peb->ProcessParameters); ASSERT(ProcessParameters); @@ -93,6 +122,7 @@ { /* Save one token pointer */ *ArgumentList++ = Destination; + DPRINT("NT: argv[%d]=[%d]\n", argc, Destination);
/* Increase one token count */ argc++; @@ -112,25 +142,30 @@ /* Now handle the enviornment, point the envp at our current list location. */ envp = ArgumentList;
- /* Change our source to the enviroment pointer */ - Source = (PCHAR)ProcessParameters->Environment; - - /* Simply do a direct copy */ - if (Source) + if (0 < WideCharStringToUnicodeString (ProcessParameters->Environment, & UnicodeEnvironment)) { - while (*Source) - { - /* Save a pointer to this token */ - *ArgumentList++ = Source; + RtlUnicodeStringToAnsiString (& AnsiEnvironment, & UnicodeEnvironment, TRUE);
- /* Keep looking for another variable */ - while (*Source++); - } - } + /* Change our source to the enviroment pointer */ + Source = AnsiEnvironment.Buffer;
- /* Null terminate the list again */ - *ArgumentList++ = NULL; + /* Simply do a direct copy */ + if (Source) + { + while (*Source) + { + /* Save a pointer to this token */ + *ArgumentList++ = Source; + DPRINT("NT: envp[%08x]=[%s]\n",Source,Source);
+ /* Keep looking for another variable */ + while (*Source++); + } + } + + /* Null terminate the list again */ + *ArgumentList++ = NULL; + } /* Breakpoint if we were requested to do so */ if (ProcessParameters->DebugFlags) DbgBreakPoint();