-/* $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
*
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
RtlInitUnicodeString(&DeviceName,
LinkPtr->DeviceName);
- PrintString("SM: Linking %wZ --> %wZ\n",
- &LinkName,
- &DeviceName);
#if 0
/* check if target device exists (can be opened) */
InitializeObjectAttributes(&ObjectAttributes,
/* Set "SystemDrive = C:" */
RtlInitUnicodeString (&EnvVariable,
L"SystemDrive");
+ RtlInitUnicodeString (&EnvValue,
+ ValueBuffer);
RtlSetEnvironmentVariable (&SmSystemEnvironment,
&EnvVariable,
&EnvValue);
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,
(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 */