Fix so reactos can boot to gui again Thx W3seek for his small patch
[reactos.git] / reactos / subsys / csrss / init.c
index e8c0076..cdffec5 100644 (file)
@@ -1,5 +1,5 @@
 /* $Id$
- * 
+ *
  * reactos/subsys/csrss/init.c
  *
  * Initialize the CSRSS subsystem server process.
 
 /* INCLUDES ******************************************************************/
 
-#include <csrss/csrss.h>
-#include <ddk/ntddk.h>
-#include <ntdll/csr.h>
-#include <ntdll/rtl.h>
-#include <ntdll/ldr.h>
-#include <win32k/win32k.h>
-#include <rosrtl/string.h>
-#include <sm/helper.h>
-
-#include "api.h"
-#include "csrplugin.h"
+#include <csrss.h>
 
 #define NDEBUG
 #include <debug.h>
@@ -104,13 +94,10 @@ ULONG
 InitializeVideoAddressSpace(VOID);
 
 /**********************************************************************
- * CsrpParseCommandLine/2
+ * CsrpCreateObjectDirectory/3
  */
 static NTSTATUS
-CsrpParseCommandLine (
-       ULONG ArgumentCount,
-       PWSTR *ArgumentArray
-       )
+CsrpCreateObjectDirectory (int argc, char ** argv, char ** envp)
 {
    NTSTATUS Status;
    OBJECT_ATTRIBUTES Attributes;
@@ -118,41 +105,33 @@ CsrpParseCommandLine (
   DPRINT("CSR: %s called\n", __FUNCTION__);
 
 
-   /*   DbgPrint ("Arguments: %ld\n", ArgumentCount);
-   for (i = 0; i < ArgumentCount; i++)
-     {
-       DbgPrint ("Argument %ld: %S\n", i, ArgumentArray[i]);
-       }*/
-
-
        /* create object directory ('\Windows') */
        RtlCreateUnicodeString (&CsrDirectoryName,
                                L"\\Windows");
 
        InitializeObjectAttributes (&Attributes,
                                    &CsrDirectoryName,
-                                   0,
+                                   OBJ_OPENIF,
                                    NULL,
                                    NULL);
 
-       Status = NtCreateDirectoryObject(&CsrObjectDirectory,
-                                        0xF000F, /* ea:??? */
-                                        &Attributes);
-
+       Status = NtOpenDirectoryObject(&CsrObjectDirectory,
+                                      0xF000F, /* ea:??? */
+                                      &Attributes);
        return Status;
 }
 
 /**********************************************************************
- * CsrpInitVideo/0
+ * CsrpInitVideo/3
  *
  * TODO: we need a virtual device for sessions other than
  * TODO: the console one
  */
 static NTSTATUS
-CsrpInitVideo (ULONG argc, PWSTR* argv)
+CsrpInitVideo (int argc, char ** argv, char ** envp)
 {
   OBJECT_ATTRIBUTES ObjectAttributes;
-  UNICODE_STRING DeviceName;
+  UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\\??\\DISPLAY1");
   IO_STATUS_BLOCK Iosb;
   HANDLE VideoHandle = (HANDLE) 0;
   NTSTATUS Status = STATUS_SUCCESS;
@@ -161,7 +140,6 @@ CsrpInitVideo (ULONG argc, PWSTR* argv)
 
   InitializeVideoAddressSpace();
 
-  RtlRosInitUnicodeStringFromLiteral(&DeviceName, L"\\??\\DISPLAY1");
   InitializeObjectAttributes(&ObjectAttributes,
                             &DeviceName,
                             0,
@@ -181,7 +159,7 @@ CsrpInitVideo (ULONG argc, PWSTR* argv)
 }
 
 /**********************************************************************
- * CsrpInitWin32Csr/0
+ * CsrpInitWin32Csr/3
  *
  * TODO: this function should be turned more general to load an
  * TODO: hosted server DLL as received from the command line;
@@ -193,7 +171,7 @@ CsrpInitVideo (ULONG argc, PWSTR* argv)
  * TODO:                    DWORD  ServerId)
  */
 static NTSTATUS
-CsrpInitWin32Csr (ULONG argc, PWSTR* argv)
+CsrpInitWin32Csr (int argc, char ** argv, char ** envp)
 {
   NTSTATUS Status;
   UNICODE_STRING DllName;
@@ -248,19 +226,19 @@ CsrpInitWin32Csr (ULONG argc, PWSTR* argv)
 
 CSRSS_API_DEFINITION NativeDefinitions[] =
   {
-    CSRSS_DEFINE_API(CSRSS_CREATE_PROCESS,               CsrCreateProcess),
-    CSRSS_DEFINE_API(CSRSS_TERMINATE_PROCESS,            CsrTerminateProcess),
-    CSRSS_DEFINE_API(CSRSS_CONNECT_PROCESS,              CsrConnectProcess),
-    CSRSS_DEFINE_API(CSRSS_REGISTER_SERVICES_PROCESS,    CsrRegisterServicesProcess),
-    CSRSS_DEFINE_API(CSRSS_GET_SHUTDOWN_PARAMETERS,      CsrGetShutdownParameters),
-    CSRSS_DEFINE_API(CSRSS_SET_SHUTDOWN_PARAMETERS,      CsrSetShutdownParameters),
-    CSRSS_DEFINE_API(CSRSS_GET_INPUT_HANDLE,             CsrGetInputHandle),
-    CSRSS_DEFINE_API(CSRSS_GET_OUTPUT_HANDLE,            CsrGetOutputHandle),
-    CSRSS_DEFINE_API(CSRSS_CLOSE_HANDLE,                 CsrCloseHandle),
-    CSRSS_DEFINE_API(CSRSS_VERIFY_HANDLE,                CsrVerifyHandle),
-    CSRSS_DEFINE_API(CSRSS_DUPLICATE_HANDLE,             CsrDuplicateHandle),
-    CSRSS_DEFINE_API(CSRSS_GET_INPUT_WAIT_HANDLE,        CsrGetInputWaitHandle),
-    { 0, 0, 0, NULL }
+    CSRSS_DEFINE_API(CREATE_PROCESS,               CsrCreateProcess),
+    CSRSS_DEFINE_API(TERMINATE_PROCESS,            CsrTerminateProcess),
+    CSRSS_DEFINE_API(CONNECT_PROCESS,              CsrConnectProcess),
+    CSRSS_DEFINE_API(REGISTER_SERVICES_PROCESS,    CsrRegisterServicesProcess),
+    CSRSS_DEFINE_API(GET_SHUTDOWN_PARAMETERS,      CsrGetShutdownParameters),
+    CSRSS_DEFINE_API(SET_SHUTDOWN_PARAMETERS,      CsrSetShutdownParameters),
+    CSRSS_DEFINE_API(GET_INPUT_HANDLE,             CsrGetInputHandle),
+    CSRSS_DEFINE_API(GET_OUTPUT_HANDLE,            CsrGetOutputHandle),
+    CSRSS_DEFINE_API(CLOSE_HANDLE,                 CsrCloseHandle),
+    CSRSS_DEFINE_API(VERIFY_HANDLE,                CsrVerifyHandle),
+    CSRSS_DEFINE_API(DUPLICATE_HANDLE,             CsrDuplicateHandle),
+    CSRSS_DEFINE_API(GET_INPUT_WAIT_HANDLE,        CsrGetInputWaitHandle),
+    { 0, 0, NULL }
   };
 
 static NTSTATUS STDCALL
@@ -282,8 +260,8 @@ CsrpCreateListenPort (IN     LPWSTR  Name,
                                    NULL);
        Status = NtCreatePort ( Port,
                                & PortAttributes,
-                               260, /* TODO: make caller set it*/
-                               328, /* TODO: make caller set it*/
+                               LPC_MAX_DATA_LENGTH, /* TODO: make caller set it*/
+                               LPC_MAX_MESSAGE_LENGTH, /* TODO: make caller set it*/
                                0); /* TODO: make caller set it*/
        if(!NT_SUCCESS(Status))
        {
@@ -295,8 +273,8 @@ CsrpCreateListenPort (IN     LPWSTR  Name,
                                NULL,
                                FALSE,
                                0,
-                               NULL,
-                               NULL,
+                               0,
+                               0,
                                (PTHREAD_START_ROUTINE) ListenThread,
                                Port,
                                NULL,
@@ -307,10 +285,10 @@ CsrpCreateListenPort (IN     LPWSTR  Name,
 /* === INIT ROUTINES === */
 
 /**********************************************************************
- * CsrpCreateCallbackPort/0
+ * CsrpCreateHeap/3
  */
 static NTSTATUS
-CsrpCreateHeap (ULONG argc, PWSTR* argv)
+CsrpCreateHeap (int argc, char ** argv, char ** envp)
 {
        DPRINT("CSR: %s called\n", __FUNCTION__);
 
@@ -328,10 +306,10 @@ CsrpCreateHeap (ULONG argc, PWSTR* argv)
 }
 
 /**********************************************************************
- * CsrpCreateCallbackPort/0
+ * CsrpCreateCallbackPort/3
  */
 static NTSTATUS
-CsrpCreateCallbackPort (ULONG argc, PWSTR* argv)
+CsrpCreateCallbackPort (int argc, char ** argv, char ** envp)
 {
        DPRINT("CSR: %s called\n", __FUNCTION__);
 
@@ -341,10 +319,10 @@ CsrpCreateCallbackPort (ULONG argc, PWSTR* argv)
 }
 
 /**********************************************************************
- * CsrpRegisterSubsystem/2
+ * CsrpRegisterSubsystem/3
  */
 static NTSTATUS
-CsrpRegisterSubsystem (ULONG argc, PWSTR* argv)
+CsrpRegisterSubsystem (int argc, char ** argv, char ** envp)
 {
        NTSTATUS           Status = STATUS_SUCCESS;
        OBJECT_ATTRIBUTES  BootstrapOkAttributes;
@@ -398,14 +376,100 @@ CsrpRegisterSubsystem (ULONG argc, PWSTR* argv)
                                        FALSE,
                                        NULL);
        NtClose (hBootstrapOk);
-       return Status;  
+       return Status;
+}
+
+/**********************************************************************
+ *     EnvpToUnicodeString/2
+ */
+static ULONG FASTCALL
+EnvpToUnicodeString (char ** envp, PUNICODE_STRING UnicodeEnv)
+{
+       ULONG        CharCount = 0;
+       ULONG        Index = 0;
+       ANSI_STRING  AnsiEnv;
+
+       UnicodeEnv->Buffer = NULL;
+       
+       for (Index=0; NULL != envp[Index]; Index++)
+       {
+               CharCount += strlen (envp[Index]);
+               ++ CharCount;
+       }
+       ++ CharCount;
+       
+       AnsiEnv.Buffer = RtlAllocateHeap (RtlGetProcessHeap(), 0, CharCount);
+       if (NULL != AnsiEnv.Buffer)
+       {
+
+               PCHAR WritePos = AnsiEnv.Buffer;
+               
+               for (Index=0; NULL != envp[Index]; Index++)
+               {
+                       strcpy (WritePos, envp[Index]);
+                       WritePos += strlen (envp[Index]) + 1;
+               }
+
+      /* FIXME: the last (double) nullterm should perhaps not be included in Length
+       * but only in MaximumLength. -Gunnar */
+               AnsiEnv.Buffer [CharCount-1] = '\0';
+               AnsiEnv.Length             = CharCount;
+               AnsiEnv.MaximumLength      = CharCount;
+      
+               RtlAnsiStringToUnicodeString (UnicodeEnv, & AnsiEnv, TRUE);
+               RtlFreeHeap (RtlGetProcessHeap(), 0, AnsiEnv.Buffer);
+       }
+       return CharCount;
+}
+/**********************************************************************
+ *     CsrpLoadKernelModeDriver/3
+ */
+static NTSTATUS
+CsrpLoadKernelModeDriver (int argc, char ** argv, char ** envp)
+{
+       NTSTATUS        Status = STATUS_SUCCESS;
+       WCHAR           Data [MAX_PATH + 1];
+       ULONG           DataLength = sizeof Data;
+       ULONG           DataType = 0;
+       UNICODE_STRING  Environment;
+
+
+       DPRINT("SM: %s called\n", __FUNCTION__);
+
+
+       EnvpToUnicodeString (envp, & Environment);      
+       Status = SmLookupSubsystem (L"Kmode",
+                                   Data,
+                                   & DataLength,
+                                   & DataType,
+                                   Environment.Buffer);
+       RtlFreeUnicodeString (& Environment);
+       if((STATUS_SUCCESS == Status) && (DataLength > sizeof Data[0]))
+       {
+               WCHAR                      ImagePath [MAX_PATH + 1] = {0};
+               UNICODE_STRING             ModuleName;
+
+               wcscpy (ImagePath, L"\\??\\");
+               wcscat (ImagePath, Data);
+               RtlInitUnicodeString (& ModuleName, ImagePath);
+               Status = NtSetSystemInformation(/* FIXME: SystemLoadAndCallImage */
+                                               SystemExtendServiceTableInformation,
+                                               & ModuleName,
+                                               sizeof ModuleName);
+               if(!NT_SUCCESS(Status))
+               {
+                       DPRINT("WIN: %s: loading Kmode failed (Status=0x%08lx)\n",
+                               __FUNCTION__, Status);
+               }
+       }
+       return Status;
 }
 
 /**********************************************************************
- * CsrpCreateApiPort/0
+ * CsrpCreateApiPort/2
  */
 static NTSTATUS
-CsrpCreateApiPort (ULONG argc, PWSTR* argv)
+CsrpCreateApiPort (int argc, char ** argv, char ** envp)
 {
        DPRINT("CSR: %s called\n", __FUNCTION__);
 
@@ -418,7 +482,7 @@ CsrpCreateApiPort (ULONG argc, PWSTR* argv)
  * CsrpApiRegisterDef/0
  */
 static NTSTATUS
-CsrpApiRegisterDef (ULONG argc, PWSTR* argv)
+CsrpApiRegisterDef (int argc, char ** argv, char ** envp)
 {
        return CsrApiRegisterDefinitions(NativeDefinitions);
 }
@@ -427,9 +491,12 @@ CsrpApiRegisterDef (ULONG argc, PWSTR* argv)
  * CsrpCCTS/2
  */
 static NTSTATUS
-CsrpCCTS (ULONG argc, PWSTR* argv)
+CsrpCCTS (int argc, char ** argv, char ** envp)
 {
-       return CsrClientConnectToServer();
+    ULONG Dummy;
+    ULONG DummyLength = sizeof(Dummy);
+       return CsrClientConnectToServer(L"\\Windows",
+                       0, &Dummy, &DummyLength, NULL);
 }
 
 /**********************************************************************
@@ -441,13 +508,13 @@ CsrpCCTS (ULONG argc, PWSTR* argv)
  * TODO: in its own desktop (one logon desktop per winstation).
  */
 static NTSTATUS
-CsrpRunWinlogon (ULONG argc, PWSTR* argv)
+CsrpRunWinlogon (int argc, char ** argv, char ** envp)
 {
        NTSTATUS                      Status = STATUS_SUCCESS;
        UNICODE_STRING                ImagePath;
        UNICODE_STRING                CommandLine;
        PRTL_USER_PROCESS_PARAMETERS  ProcessParameters = NULL;
-       RTL_PROCESS_INFO              ProcessInfo;
+       RTL_USER_PROCESS_INFORMATION  ProcessInfo;
 
 
        DPRINT("CSR: %s called\n", __FUNCTION__);
@@ -489,23 +556,24 @@ CsrpRunWinlogon (ULONG argc, PWSTR* argv)
 
 
 
-typedef NTSTATUS (* CSR_INIT_ROUTINE)(ULONG, PWSTR*);
+typedef NTSTATUS (* CSR_INIT_ROUTINE)(int,char**,char**);
 
 struct {
        BOOL Required;
        CSR_INIT_ROUTINE EntryPoint;
        PCHAR ErrorMessage;
 } InitRoutine [] = {
-       {TRUE, CsrpCreateCallbackPort, "create the callback port \\Windows\\SbApiPort"},
-       {TRUE, CsrpRegisterSubsystem,  "register with SM"},
-       {TRUE, CsrpCreateHeap,         "create the CSR heap"},
-       {TRUE, CsrpCreateApiPort,      "create the api port \\Windows\\ApiPort"},
-       {TRUE, CsrpParseCommandLine,   "parse the command line"},
-       {TRUE, CsrpInitVideo,          "initialize video"},
-       {TRUE, CsrpApiRegisterDef,     "initialize api definitions"},
-       {TRUE, CsrpCCTS,               "connect client to server"},
-       {TRUE, CsrpInitWin32Csr,       "load usermode dll"},
-       {TRUE, CsrpRunWinlogon,        "run WinLogon"},
+       {TRUE, CsrpCreateCallbackPort,   "create the callback port \\Windows\\SbApiPort"},
+       {TRUE, CsrpRegisterSubsystem,    "register with SM"},
+       {TRUE, CsrpCreateHeap,           "create the CSR heap"},
+       {TRUE, CsrpCreateApiPort,        "create the api port \\Windows\\ApiPort"},
+       {TRUE, CsrpCreateObjectDirectory,"create the object directory \\Windows"},
+       {TRUE, CsrpLoadKernelModeDriver, "load Kmode driver"},
+       {TRUE, CsrpInitVideo,            "initialize video"},
+       {TRUE, CsrpApiRegisterDef,       "initialize api definitions"},
+       {TRUE, CsrpCCTS,                 "connect client to server"},
+       {TRUE, CsrpInitWin32Csr,         "load usermode dll"},
+       {TRUE, CsrpRunWinlogon,          "run WinLogon"},
 };
 
 /**********************************************************************
@@ -520,21 +588,22 @@ struct {
  */
 BOOL STDCALL
 CsrServerInitialization (
-       ULONG ArgumentCount,
-       PWSTR *ArgumentArray
+       int argc,
+       char ** argv,
+       char ** envp
        )
 {
-       INT       i = 0;
+       UINT       i = 0;
        NTSTATUS  Status = STATUS_SUCCESS;
 
        DPRINT("CSR: %s called\n", __FUNCTION__);
 
        for (i=0; i < (sizeof InitRoutine / sizeof InitRoutine[0]); i++)
        {
-               Status = InitRoutine[i].EntryPoint(ArgumentCount,ArgumentArray);
+               Status = InitRoutine[i].EntryPoint(argc,argv,envp);
                if(!NT_SUCCESS(Status))
                {
-                       DPRINT1("CSR: %s: failed to %s (Status=%08lx)\n", 
+                       DPRINT1("CSR: %s: failed to %s (Status=%08lx)\n",
                                __FUNCTION__,
                                InitRoutine[i].ErrorMessage,
                                Status);