Fixed creation of environment variable SystemDrive.
[reactos.git] / reactos / subsys / smss / init.c
index e9cac3e..929b9aa 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: init.c,v 1.26 2001/07/15 13:46:16 ekohl Exp $
+/* $Id: init.c,v 1.32 2002/03/18 22:44:42 hbirr Exp $
  *
  * init.c - Session Manager initialization
  * 
@@ -62,89 +62,27 @@ static VOID
 SmCreatePagingFiles (VOID)
 {
   UNICODE_STRING FileName;
-  ULONG ulCurrentSize;
-  ULONG i, j;
-  CHAR FileNameBufA[255];
-  ANSI_STRING FileNameA;
+  LARGE_INTEGER InitialSize;
+  LARGE_INTEGER MaximumSize;
   NTSTATUS Status;
-  HANDLE FileHandle;
-  OBJECT_ATTRIBUTES ObjectAttributes;
-  IO_STATUS_BLOCK Iosb;
-  LARGE_INTEGER Offset;
-  static CHAR Buffer[4096];
-  BOOL Found = FALSE;
-
-  for (i = 0; i < 4; i++)
-    {
-      for (j = 0; j < 4; j++)
-       {
-         sprintf(FileNameBufA, "\\Device\\Harddisk%d\\Partition%d", i, j);
-         RtlInitAnsiString(&FileNameA, FileNameBufA);
-         RtlAnsiStringToUnicodeString(&FileName, &FileNameA, TRUE);
-         InitializeObjectAttributes(&ObjectAttributes,
-                                    &FileName,
-                                    0,
-                                    NULL,
-                                    NULL);
-
-         Status = ZwOpenFile(&FileHandle,
-                             FILE_ALL_ACCESS,
-                             &ObjectAttributes,
-                             &Iosb,
-                             0,
-                             0);
-         if (!NT_SUCCESS(Status))
-           {
-             continue;
-           }
-
-         Offset.QuadPart = 0;
-         Status = ZwReadFile(FileHandle,
-                             NULL,
-                             NULL,
-                             NULL,
-                             &Iosb,
-                             Buffer,
-                             4096,
-                             &Offset,
-                             NULL);
-         if (!NT_SUCCESS(Status))
-           {
-             DbgPrint("SM: Failed to read first page of partition\n");
-             continue;
-           }
-
-         if (memcmp(&Buffer[4096 - 10], "SWAP-SPACE", 10) == 0 ||
-             memcmp(&Buffer[4096 - 10], "SWAPSPACE2", 10) == 0)
-           {
-             DbgPrint("SM: Found swap space at %s\n", FileNameA);
-             Found = TRUE;
-             break;
-           }
-
-         ZwClose(FileHandle);
-       }
-    }
-}
-
-#if 0
-static VOID
-SmCreatePagingFiles (VOID)
-{
-       UNICODE_STRING FileName;
-       ULONG ulCurrentSize;
 
-       /* FIXME: Read file names from registry */
+  /* FIXME: Read file names from registry */
+  
+  RtlInitUnicodeString (&FileName,
+                       L"\\SystemRoot\\pagefile.sys");
 
-       RtlInitUnicodeString (&FileName,
-                             L"\\SystemRoot\\pagefile.sys");
+  InitialSize.QuadPart = 50 * 4096;
+  MaximumSize.QuadPart = 80 * 4096;
 
-       NtCreatePagingFile (&FileName,
-                           50,
-                           80,
-                           &ulCurrentSize);
+  Status = NtCreatePagingFile(&FileName,
+                             &InitialSize,
+                             &MaximumSize,
+                             0);
+  if (!NT_SUCCESS(Status))
+    {
+      PrintString("SM: Failed to create paging file (Status was 0x%.8X)\n", Status);
+    }
 }
-#endif
 
 
 static VOID
@@ -183,9 +121,6 @@ SmInitDosDevices(VOID)
        RtlInitUnicodeString(&DeviceName,
                             LinkPtr->DeviceName);
    
-       PrintString("SM: Linking %wZ --> %wZ\n",
-                   &LinkName,
-                   &DeviceName);
 #if 0
        /* check if target device exists (can be opened) */
        InitializeObjectAttributes(&ObjectAttributes,
@@ -274,6 +209,8 @@ SmSetEnvironmentVariables (VOID)
        /* Set "SystemDrive = C:" */
        RtlInitUnicodeString (&EnvVariable,
                              L"SystemDrive");
+       RtlInitUnicodeString (&EnvValue,
+                             ValueBuffer);
        RtlSetEnvironmentVariable (&SmSystemEnvironment,
                                   &EnvVariable,
                                   &EnvValue);
@@ -327,83 +264,79 @@ SmSetEnvironmentVariables (VOID)
 
 BOOL InitSessionManager (HANDLE        Children[])
 {
-   NTSTATUS Status;
-   UNICODE_STRING UnicodeString;
-   OBJECT_ATTRIBUTES ObjectAttributes;
-   UNICODE_STRING CmdLineW;
-   PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
-   RTL_PROCESS_INFO ProcessInfo;
-   HANDLE CsrssInitEvent;
-   HANDLE      WindowsDirectory;
-   WCHAR UnicodeBuffer[MAX_PATH];
-   PKUSER_SHARED_DATA SharedUserData = 
-       (PKUSER_SHARED_DATA)USER_SHARED_DATA_BASE;
-
-   /*
-    * FIXME: The '\Windows' directory is created by csrss.exe but
-    *        win32k.sys needs it at intialization and it is loaded
-    *        before csrss.exe
-    */
-
-   /*
-         * Create the '\Windows' directory
-         */
-   RtlInitUnicodeString(
-      &UnicodeString,
-      L"\\Windows");
-
-        InitializeObjectAttributes(
-                 &ObjectAttributes,
-                 &UnicodeString,
-                 0,
-                 NULL,
-                 NULL);
-
-   Status = ZwCreateDirectoryObject(
-                 &WindowsDirectory,
-                 0,
-                 &ObjectAttributes);
-   if (!NT_SUCCESS(Status))
-     {
-   DisplayString (L"SM: Could not create \\Windows directory!\n");
-   return FALSE;
-     }
+  NTSTATUS Status;
+  UNICODE_STRING UnicodeString;
+  OBJECT_ATTRIBUTES ObjectAttributes;
+  UNICODE_STRING CmdLineW;
+  PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
+  RTL_PROCESS_INFO ProcessInfo;
+  HANDLE CsrssInitEvent;
+  HANDLE WindowsDirectory;
+  WCHAR UnicodeBuffer[MAX_PATH];
+  PKUSER_SHARED_DATA SharedUserData = 
+    (PKUSER_SHARED_DATA)USER_SHARED_DATA_BASE;
+
+  /*
+   * FIXME: The '\Windows' directory is created by csrss.exe but
+   *        win32k.sys needs it at intialization and it is loaded
+   *        before csrss.exe
+   */
+
+  /*
+   * Create the '\Windows' directory
+   */
+  RtlInitUnicodeString(&UnicodeString,
+                      L"\\Windows");
+
+  InitializeObjectAttributes(&ObjectAttributes,
+                            &UnicodeString,
+                            0,
+                            NULL,
+                            NULL);
+
+  Status = ZwCreateDirectoryObject(&WindowsDirectory,
+                                  0,
+                                  &ObjectAttributes);
+  if (!NT_SUCCESS(Status))
+    {
+      DisplayString(L"SM: Could not create \\Windows directory!\n");
+      return FALSE;
+    }
 
-   /* Create the "\SmApiPort" object (LPC) */
-   RtlInitUnicodeString (&UnicodeString,
-                        L"\\SmApiPort");
-   InitializeObjectAttributes (&ObjectAttributes,
-                              &UnicodeString,
-                              PORT_ALL_ACCESS,
-                              NULL,
-                              NULL);
-   
-   Status = NtCreatePort (&SmApiPort,
-                         &ObjectAttributes,
-                         0,
-                         0,
-                         0);
+  /* Create the "\SmApiPort" object (LPC) */
+  RtlInitUnicodeString(&UnicodeString,
+                      L"\\SmApiPort");
+  InitializeObjectAttributes(&ObjectAttributes,
+                            &UnicodeString,
+                            PORT_ALL_ACCESS,
+                            NULL,
+                            NULL);
+
+  Status = NtCreatePort(&SmApiPort,
+                       &ObjectAttributes,
+                       0,
+                       0,
+                       0);
+  if (!NT_SUCCESS(Status))
+    {
+      return FALSE;
+    }
 
-   if (!NT_SUCCESS(Status))
-     {
-       return FALSE;
-     }
-   
 #ifndef NDEBUG
-   DisplayString (L"SM: \\SmApiPort created...\n");
+  DisplayString (L"SM: \\SmApiPort created...\n");
 #endif
-   
-   /* Create two threads for "\SmApiPort" */
-   RtlCreateUserThread (NtCurrentProcess (),
-                       NULL,
-                       FALSE,
-                       0,
-                       NULL,
-                       NULL,
-                       (PTHREAD_START_ROUTINE)SmApiThread,
-                       (PVOID)SmApiPort,
-                       NULL,
-                       NULL);
+
+  /* Create two threads for "\SmApiPort" */
+  RtlCreateUserThread(NtCurrentProcess(),
+                     NULL,
+                     FALSE,
+                     0,
+                     NULL,
+                     NULL,
+                     (PTHREAD_START_ROUTINE)SmApiThread,
+                     (PVOID)SmApiPort,
+                     NULL,
+                     NULL);
 
    RtlCreateUserThread (NtCurrentProcess (),
                        NULL,
@@ -415,207 +348,205 @@ BOOL InitSessionManager (HANDLE Children[])
                        (PVOID)SmApiPort,
                        NULL,
                        NULL);
-   
-   /* Create the system environment */
-   Status = RtlCreateEnvironment (FALSE,
-                                 &SmSystemEnvironment);
-   if (!NT_SUCCESS(Status))
-     {
-       return FALSE;
-     }
+
+  /* Create the system environment */
+  Status = RtlCreateEnvironment(FALSE,
+                               &SmSystemEnvironment);
+  if (!NT_SUCCESS(Status))
+    {
+      return FALSE;
+    }
 #ifndef NDEBUG
-   DisplayString (L"SM: System Environment created\n");
+  DisplayString (L"SM: System Environment created\n");
 #endif
 
-   /* Define symbolic links to kernel devices (MS-DOS names) */
-   SmInitDosDevices();
-   
-   /* FIXME: Run all programs in the boot execution list */
-   
-   /* FIXME: Process the file rename list */
-   
-   /* FIXME: Load the well known DLLs */
-   
-   /* Create paging files */
-   //   SmCreatePagingFiles ();
-   
-   /* Load remaining registry hives */
-   NtInitializeRegistry (FALSE);
-   
-   /* Set environment variables from registry */
-   SmSetEnvironmentVariables ();
+  /* Define symbolic links to kernel devices (MS-DOS names) */
+  SmInitDosDevices();
 
-   /* Load the kernel mode driver win32k.sys */
-   RtlInitUnicodeString (&CmdLineW,
-                        L"\\SystemRoot\\system32\\drivers\\win32k.sys");
-   Status = NtLoadDriver (&CmdLineW);
-   
+  /* FIXME: Run all programs in the boot execution list */
+//  SmRunBootApps();
+
+  /* FIXME: Process the file rename list */
+//  SmProcessFileRenameList();
+
+  /* FIXME: Load the well known DLLs */
+//  SmPreloadDlls();
+
+  /* Create paging files */
+  SmCreatePagingFiles();
+
+  /* Load remaining registry hives */
+  NtInitializeRegistry(FALSE);
+
+  /* Set environment variables from registry */
+  SmSetEnvironmentVariables();
+
+  /* Load the kernel mode driver win32k.sys */
+  RtlInitUnicodeString(&CmdLineW,
+                      L"\\SystemRoot\\system32\\drivers\\win32k.sys");
+  Status = NtLoadDriver(&CmdLineW);
 #if 0
-   if (!NT_SUCCESS(Status))
-     {
-       return FALSE;
-     }
+  if (!NT_SUCCESS(Status))
+    {
+      return FALSE;
+    }
 #endif
-   /* Run csrss.exe */
-   RtlInitUnicodeString(&UnicodeString,
-                       L"\\CsrssInitDone");
-   InitializeObjectAttributes(&ObjectAttributes,
-                             &UnicodeString,
-                             EVENT_ALL_ACCESS,
-                             0,
-                             NULL);
-   Status = NtCreateEvent(&CsrssInitEvent,
-                         EVENT_ALL_ACCESS,
-                         &ObjectAttributes,
-                         TRUE,
-                         FALSE);
-   if (!NT_SUCCESS(Status))
-     {
-       DbgPrint("Failed to create csrss notification event\n");
-     }
-   
-   /*
-    * Start the Win32 subsystem (csrss.exe)
-    */
-   DisplayString (L"SM: Running csrss.exe\n");
-   
-   /* initialize executable path */
-   wcscpy(UnicodeBuffer, L"\\??\\");
-   wcscat(UnicodeBuffer, SharedUserData->NtSystemRoot);
-   wcscat(UnicodeBuffer, L"\\system32\\csrss.exe");
-   RtlInitUnicodeString (&UnicodeString,
-                        UnicodeBuffer);
-   
-   RtlCreateProcessParameters (&ProcessParameters,
-                              &UnicodeString,
-                              NULL,
-                              NULL,
-                              NULL,
-                              SmSystemEnvironment,
-                              NULL,
-                              NULL,
-                              NULL,
-                              NULL);
-
-   Status = RtlCreateUserProcess (&UnicodeString,
-                                 OBJ_CASE_INSENSITIVE,
-                                 ProcessParameters,
-                                 NULL,
-                                 NULL,
-                                 NULL,
-                                 FALSE,
-                                 NULL,
-                                 NULL,
-                                 &ProcessInfo);
-   
-   RtlDestroyProcessParameters (ProcessParameters);
-   
-   if (!NT_SUCCESS(Status))
-     {
-       DisplayString (L"SM: Loading csrss.exe failed!\n");
-       return FALSE;
-     }
-   
-   DbgPrint("SM: Waiting for csrss\n");
-   NtWaitForSingleObject(CsrssInitEvent,
-                        FALSE,
-                        NULL);
-   DbgPrint("SM: Finished waiting for csrss\n");
-   
-   Children[CHILD_CSRSS] = ProcessInfo.ProcessHandle;
-   
-   /*
-    * Start the logon process (winlogon.exe)
-    */
-   DisplayString(L"SM: Running winlogon.exe\n");
-   
-   /* initialize executable path */
-   wcscpy(UnicodeBuffer, L"\\??\\");
-   wcscat(UnicodeBuffer, SharedUserData->NtSystemRoot);
-   wcscat(UnicodeBuffer, L"\\system32\\winlogon.exe");
-   RtlInitUnicodeString (&UnicodeString,
-                        UnicodeBuffer);
-   
-   RtlCreateProcessParameters(&ProcessParameters,
-                             &UnicodeString,
-                             NULL,
-                             NULL,
-                             NULL,
-                             SmSystemEnvironment,
-                             NULL,
-                             NULL,
-                             NULL,
-                             NULL);
-   
-   Status = RtlCreateUserProcess(&UnicodeString,
-                                OBJ_CASE_INSENSITIVE,
-                                ProcessParameters,
-                                NULL,
-                                NULL,
-                                NULL,
-                                FALSE,
-                                NULL,
-                                NULL,
-                                &ProcessInfo);
-   
-   RtlDestroyProcessParameters(ProcessParameters);
-   
-   if (!NT_SUCCESS(Status))
-     {
-       DisplayString(L"SM: Loading winlogon.exe failed!\n");
-       NtTerminateProcess(Children[CHILD_CSRSS],
-                          0);
-       return FALSE;
-     }
-   Children[CHILD_WINLOGON] = ProcessInfo.ProcessHandle;
-   
-       /* Create the \DbgSsApiPort object (LPC) */
-       RtlInitUnicodeString (&UnicodeString,
-                             L"\\DbgSsApiPort");
-       InitializeObjectAttributes (&ObjectAttributes,
-                                   &UnicodeString,
-                                   PORT_ALL_ACCESS,
-                                   NULL,
-                                   NULL);
-
-       Status = NtCreatePort (&DbgSsApiPort,
-                              &ObjectAttributes,
-                              0,
-                              0,
-                              0);
-
-       if (!NT_SUCCESS(Status))
-       {
-               return FALSE;
-       }
+
+  /* Run csrss.exe */
+  RtlInitUnicodeString(&UnicodeString,
+                      L"\\CsrssInitDone");
+  InitializeObjectAttributes(&ObjectAttributes,
+                            &UnicodeString,
+                            EVENT_ALL_ACCESS,
+                            0,
+                            NULL);
+  Status = NtCreateEvent(&CsrssInitEvent,
+                        EVENT_ALL_ACCESS,
+                        &ObjectAttributes,
+                        TRUE,
+                        FALSE);
+  if (!NT_SUCCESS(Status))
+    {
+      DbgPrint("Failed to create csrss notification event\n");
+    }
+
+  /*
+   * Start the Win32 subsystem (csrss.exe)
+   */
+
+  /* initialize executable path */
+  wcscpy(UnicodeBuffer, L"\\??\\");
+  wcscat(UnicodeBuffer, SharedUserData->NtSystemRoot);
+  wcscat(UnicodeBuffer, L"\\system32\\csrss.exe");
+  RtlInitUnicodeString(&UnicodeString,
+                      UnicodeBuffer);
+
+  RtlCreateProcessParameters(&ProcessParameters,
+                            &UnicodeString,
+                            NULL,
+                            NULL,
+                            NULL,
+                            SmSystemEnvironment,
+                            NULL,
+                            NULL,
+                            NULL,
+                            NULL);
+
+  Status = RtlCreateUserProcess(&UnicodeString,
+                               OBJ_CASE_INSENSITIVE,
+                               ProcessParameters,
+                               NULL,
+                               NULL,
+                               NULL,
+                               FALSE,
+                               NULL,
+                               NULL,
+                               &ProcessInfo);
+
+  RtlDestroyProcessParameters (ProcessParameters);
+
+  if (!NT_SUCCESS(Status))
+    {
+      DisplayString(L"SM: Loading csrss.exe failed!\n");
+      return FALSE;
+    }
+
+  NtWaitForSingleObject(CsrssInitEvent,
+                       FALSE,
+                       NULL);
+
+  Children[CHILD_CSRSS] = ProcessInfo.ProcessHandle;
+
+  /*
+   * Start the logon process (winlogon.exe)
+   */
+
+  /* initialize executable path */
+  wcscpy(UnicodeBuffer, L"\\??\\");
+  wcscat(UnicodeBuffer, SharedUserData->NtSystemRoot);
+  wcscat(UnicodeBuffer, L"\\system32\\winlogon.exe");
+  RtlInitUnicodeString(&UnicodeString,
+                      UnicodeBuffer);
+
+  RtlCreateProcessParameters(&ProcessParameters,
+                            &UnicodeString,
+                            NULL,
+                            NULL,
+                            NULL,
+                            SmSystemEnvironment,
+                            NULL,
+                            NULL,
+                            NULL,
+                            NULL);
+
+  Status = RtlCreateUserProcess(&UnicodeString,
+                               OBJ_CASE_INSENSITIVE,
+                               ProcessParameters,
+                               NULL,
+                               NULL,
+                               NULL,
+                               FALSE,
+                               NULL,
+                               NULL,
+                               &ProcessInfo);
+
+  RtlDestroyProcessParameters(ProcessParameters);
+
+  if (!NT_SUCCESS(Status))
+    {
+      DisplayString(L"SM: Loading winlogon.exe failed!\n");
+      NtTerminateProcess(Children[CHILD_CSRSS],
+                        0);
+      return FALSE;
+    }
+  Children[CHILD_WINLOGON] = ProcessInfo.ProcessHandle;
+
+  /* Create the \DbgSsApiPort object (LPC) */
+  RtlInitUnicodeString(&UnicodeString,
+                      L"\\DbgSsApiPort");
+  InitializeObjectAttributes(&ObjectAttributes,
+                            &UnicodeString,
+                            PORT_ALL_ACCESS,
+                            NULL,
+                            NULL);
+
+  Status = NtCreatePort(&DbgSsApiPort,
+                       &ObjectAttributes,
+                       0,
+                       0,
+                       0);
+
+  if (!NT_SUCCESS(Status))
+    {
+      return FALSE;
+    }
 #ifndef NDEBUG
-       DisplayString (L"SM: DbgSsApiPort created...\n");
+  DisplayString(L"SM: DbgSsApiPort created...\n");
 #endif
 
-       /* Create the \DbgUiApiPort object (LPC) */
-       RtlInitUnicodeString (&UnicodeString,
-                             L"\\DbgUiApiPort");
-       InitializeObjectAttributes (&ObjectAttributes,
-                                   &UnicodeString,
-                                   PORT_ALL_ACCESS,
-                                   NULL,
-                                   NULL);
-
-       Status = NtCreatePort (&DbgUiApiPort,
-                              &ObjectAttributes,
-                              0,
-                              0,
-                              0);
-
-       if (!NT_SUCCESS(Status))
-       {
-               return FALSE;
-       }
+  /* Create the \DbgUiApiPort object (LPC) */
+  RtlInitUnicodeString(&UnicodeString,
+                      L"\\DbgUiApiPort");
+  InitializeObjectAttributes(&ObjectAttributes,
+                            &UnicodeString,
+                            PORT_ALL_ACCESS,
+                            NULL,
+                            NULL);
+
+  Status = NtCreatePort(&DbgUiApiPort,
+                       &ObjectAttributes,
+                       0,
+                       0,
+                       0);
+  if (!NT_SUCCESS(Status))
+    {
+      return FALSE;
+    }
 #ifndef NDEBUG
-       DisplayString (L"SM: DbgUiApiPort created...\n");
+  DisplayString (L"SM: DbgUiApiPort created...\n");
 #endif
 
-       return TRUE;
+  return TRUE;
 }
 
 /* EOF */