Author: ion
Date: Mon Jan 23 16:49:52 2012
New Revision: 55123
URL:
http://svn.reactos.org/svn/reactos?rev=55123&view=rev
Log:
[SMSS]: Add a new SMSS2 with the goal of having a Windows-compatible LPC API that will
work with the new CSRSS that's already in the tree. So far, it launches the old SMSS
and quits.
Added:
trunk/reactos/base/system/smss2/
trunk/reactos/base/system/smss2/CMakeLists.txt (with props)
trunk/reactos/base/system/smss2/smss.c (with props)
trunk/reactos/base/system/smss2/smss.h (with props)
trunk/reactos/base/system/smss2/smss.rc (with props)
trunk/reactos/base/system/smss2/smss2.rbuild (with props)
Modified:
trunk/reactos/base/system/CMakeLists.txt
trunk/reactos/base/system/system.rbuild
trunk/reactos/boot/bootdata/packages/reactos.dff
trunk/reactos/boot/bootdata/txtsetup.sif
trunk/reactos/ntoskrnl/ex/init.c
Modified: trunk/reactos/base/system/CMakeLists.txt
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/CMakeLists.txt…
==============================================================================
--- trunk/reactos/base/system/CMakeLists.txt [iso-8859-1] (original)
+++ trunk/reactos/base/system/CMakeLists.txt [iso-8859-1] Mon Jan 23 16:49:52 2012
@@ -13,6 +13,7 @@
add_subdirectory(runonce)
add_subdirectory(services)
add_subdirectory(smss)
+add_subdirectory(smss2)
add_subdirectory(subst)
add_subdirectory(userinit)
add_subdirectory(winlogon)
Added: trunk/reactos/base/system/smss2/CMakeLists.txt
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/smss2/CMakeLis…
==============================================================================
--- trunk/reactos/base/system/smss2/CMakeLists.txt (added)
+++ trunk/reactos/base/system/smss2/CMakeLists.txt [iso-8859-1] Mon Jan 23 16:49:52 2012
@@ -1,0 +1,16 @@
+
+include_directories(${REACTOS_SOURCE_DIR}/include/reactos/subsys)
+
+list(APPEND SOURCE
+ smss.c
+ smss.rc)
+
+add_executable(smss2 WIN32 ${SOURCE})
+
+target_link_libraries(smss2 nt)
+
+add_pch(smss2 smss.h)
+
+set_module_type(smss2 nativecui)
+add_importlibs(smss2 ntdll)
+add_cd_file(TARGET smss2 DESTINATION reactos/system32 NO_CAB FOR all)
Propchange: trunk/reactos/base/system/smss2/CMakeLists.txt
------------------------------------------------------------------------------
svn:eol-style = native
Added: trunk/reactos/base/system/smss2/smss.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/smss2/smss.c?r…
==============================================================================
--- trunk/reactos/base/system/smss2/smss.c (added)
+++ trunk/reactos/base/system/smss2/smss.c [iso-8859-1] Mon Jan 23 16:49:52 2012
@@ -1,0 +1,327 @@
+/*
+ * PROJECT: ReactOS Windows-Compatible Session Manager
+ * LICENSE: BSD 2-Clause License
+ * FILE: base/system/smss/smss.c
+ * PURPOSE: Main SMSS Code
+ * PROGRAMMERS: Alex Ionescu
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include "smss.h"
+#define NDEBUG
+#include "debug.h"
+
+/* GLOBALS ********************************************************************/
+
+typedef struct _INIT_BUFFER
+{
+ WCHAR DebugBuffer[256];
+ RTL_USER_PROCESS_INFORMATION ProcessInfo;
+} INIT_BUFFER, *PINIT_BUFFER;
+
+/* NT Initial User Application */
+WCHAR NtInitialUserProcessBuffer[128] = L"\\SystemRoot\\System32\\smss.exe";
+ULONG NtInitialUserProcessBufferLength = sizeof(NtInitialUserProcessBuffer) -
+ sizeof(WCHAR);
+ULONG NtInitialUserProcessBufferType = REG_SZ;
+
+UNICODE_STRING NtSystemRoot;
+
+/* FUNCTIONS ******************************************************************/
+
+NTSTATUS
+NTAPI
+ExpLoadInitialProcess(IN PINIT_BUFFER InitBuffer,
+ OUT PRTL_USER_PROCESS_PARAMETERS *ProcessParameters,
+ OUT PCHAR *ProcessEnvironment)
+{
+ NTSTATUS Status;
+ SIZE_T Size;
+ PWSTR p;
+ UNICODE_STRING NullString = RTL_CONSTANT_STRING(L"");
+ UNICODE_STRING SmssName, Environment, SystemDriveString, DebugString;
+ PVOID EnvironmentPtr = NULL;
+ PRTL_USER_PROCESS_INFORMATION ProcessInformation;
+ PRTL_USER_PROCESS_PARAMETERS ProcessParams = NULL;
+
+ NullString.Length = sizeof(WCHAR);
+
+ /* Use the initial buffer, after the strings */
+ ProcessInformation = &InitBuffer->ProcessInfo;
+
+ /* Allocate memory for the process parameters */
+ Size = sizeof(*ProcessParams) + ((MAX_PATH * 6) * sizeof(WCHAR));
+ Status = ZwAllocateVirtualMemory(NtCurrentProcess(),
+ (PVOID*)&ProcessParams,
+ 0,
+ &Size,
+ MEM_COMMIT,
+ PAGE_READWRITE);
+ if (!NT_SUCCESS(Status))
+ {
+ /* Failed, display error */
+ p = InitBuffer->DebugBuffer;
+ _snwprintf(p,
+ 256 * sizeof(WCHAR),
+ L"INIT: Unable to allocate Process Parameters. 0x%lx",
+ Status);
+ RtlInitUnicodeString(&DebugString, p);
+ ZwDisplayString(&DebugString);
+
+ /* Bugcheck the system */
+ return Status;
+ }
+
+ /* Setup the basic header, and give the process the low 1MB to itself */
+ ProcessParams->Length = (ULONG)Size;
+ ProcessParams->MaximumLength = (ULONG)Size;
+ ProcessParams->Flags = RTL_USER_PROCESS_PARAMETERS_NORMALIZED |
+ RTL_USER_PROCESS_PARAMETERS_RESERVE_1MB;
+
+ /* Allocate a page for the environment */
+ Size = PAGE_SIZE;
+ Status = ZwAllocateVirtualMemory(NtCurrentProcess(),
+ &EnvironmentPtr,
+ 0,
+ &Size,
+ MEM_COMMIT,
+ PAGE_READWRITE);
+ if (!NT_SUCCESS(Status))
+ {
+ /* Failed, display error */
+ p = InitBuffer->DebugBuffer;
+ _snwprintf(p,
+ 256 * sizeof(WCHAR),
+ L"INIT: Unable to allocate Process Environment. 0x%lx",
+ Status);
+ RtlInitUnicodeString(&DebugString, p);
+ ZwDisplayString(&DebugString);
+
+ /* Bugcheck the system */
+ return Status;
+ }
+
+ /* Write the pointer */
+ ProcessParams->Environment = EnvironmentPtr;
+
+ /* Make a buffer for the DOS path */
+ p = (PWSTR)(ProcessParams + 1);
+ ProcessParams->CurrentDirectory.DosPath.Buffer = p;
+ ProcessParams->CurrentDirectory.DosPath.MaximumLength = MAX_PATH *
+ sizeof(WCHAR);
+
+ /* Copy the DOS path */
+ RtlCopyUnicodeString(&ProcessParams->CurrentDirectory.DosPath,
+ &NtSystemRoot);
+
+ /* Make a buffer for the DLL Path */
+ p = (PWSTR)((PCHAR)ProcessParams->CurrentDirectory.DosPath.Buffer +
+ ProcessParams->CurrentDirectory.DosPath.MaximumLength);
+ ProcessParams->DllPath.Buffer = p;
+ ProcessParams->DllPath.MaximumLength = MAX_PATH * sizeof(WCHAR);
+
+ /* Copy the DLL path and append the system32 directory */
+ RtlCopyUnicodeString(&ProcessParams->DllPath,
+ &ProcessParams->CurrentDirectory.DosPath);
+ RtlAppendUnicodeToString(&ProcessParams->DllPath, L"\\System32");
+
+ /* Make a buffer for the image name */
+ p = (PWSTR)((PCHAR)ProcessParams->DllPath.Buffer +
+ ProcessParams->DllPath.MaximumLength);
+ ProcessParams->ImagePathName.Buffer = p;
+ ProcessParams->ImagePathName.MaximumLength = MAX_PATH * sizeof(WCHAR);
+
+ /* Make sure the buffer is a valid string which within the given length */
+ if ((NtInitialUserProcessBufferType != REG_SZ) ||
+ ((NtInitialUserProcessBufferLength != MAXULONG) &&
+ ((NtInitialUserProcessBufferLength < sizeof(WCHAR)) ||
+ (NtInitialUserProcessBufferLength >
+ sizeof(NtInitialUserProcessBuffer) - sizeof(WCHAR)))))
+ {
+ /* Invalid initial process string, bugcheck */
+ return STATUS_INVALID_PARAMETER;
+ }
+
+ /* Cut out anything after a space */
+ p = NtInitialUserProcessBuffer;
+ while ((*p) && (*p != L' ')) p++;
+
+ /* Set the image path length */
+ ProcessParams->ImagePathName.Length =
+ (USHORT)((PCHAR)p - (PCHAR)NtInitialUserProcessBuffer);
+
+ /* Copy the actual buffer */
+ RtlCopyMemory(ProcessParams->ImagePathName.Buffer,
+ NtInitialUserProcessBuffer,
+ ProcessParams->ImagePathName.Length);
+
+ /* Null-terminate it */
+ ProcessParams->ImagePathName.Buffer[ProcessParams->ImagePathName.Length /
+ sizeof(WCHAR)] = UNICODE_NULL;
+
+ /* Make a buffer for the command line */
+ p = (PWSTR)((PCHAR)ProcessParams->ImagePathName.Buffer +
+ ProcessParams->ImagePathName.MaximumLength);
+ ProcessParams->CommandLine.Buffer = p;
+ ProcessParams->CommandLine.MaximumLength = MAX_PATH * sizeof(WCHAR);
+
+ /* Add the image name to the command line */
+ RtlAppendUnicodeToString(&ProcessParams->CommandLine,
+ NtInitialUserProcessBuffer);
+
+ /* Create the environment string */
+ RtlInitEmptyUnicodeString(&Environment,
+ ProcessParams->Environment,
+ (USHORT)Size);
+
+ /* Append the DLL path to it */
+ RtlAppendUnicodeToString(&Environment, L"Path=" );
+ RtlAppendUnicodeStringToString(&Environment, &ProcessParams->DllPath);
+ RtlAppendUnicodeStringToString(&Environment, &NullString);
+
+ /* Create the system drive string */
+ SystemDriveString = NtSystemRoot;
+ SystemDriveString.Length = 2 * sizeof(WCHAR);
+
+ /* Append it to the environment */
+ RtlAppendUnicodeToString(&Environment, L"SystemDrive=");
+ RtlAppendUnicodeStringToString(&Environment, &SystemDriveString);
+ RtlAppendUnicodeStringToString(&Environment, &NullString);
+
+ /* Append the system root to the environment */
+ RtlAppendUnicodeToString(&Environment, L"SystemRoot=");
+ RtlAppendUnicodeStringToString(&Environment, &NtSystemRoot);
+ RtlAppendUnicodeStringToString(&Environment, &NullString);
+
+ /* Create SMSS process */
+ SmssName = ProcessParams->ImagePathName;
+ Status = RtlCreateUserProcess(&SmssName,
+ OBJ_CASE_INSENSITIVE,
+ RtlDeNormalizeProcessParams(ProcessParams),
+ NULL,
+ NULL,
+ NULL,
+ FALSE,
+ NULL,
+ NULL,
+ ProcessInformation);
+ if (!NT_SUCCESS(Status))
+ {
+ /* Failed, display error */
+ p = InitBuffer->DebugBuffer;
+ _snwprintf(p,
+ 256 * sizeof(WCHAR),
+ L"INIT: Unable to create Session Manager. 0x%lx",
+ Status);
+ RtlInitUnicodeString(&DebugString, p);
+ ZwDisplayString(&DebugString);
+
+ /* Bugcheck the system */
+ return Status;
+ }
+
+ /* Resume the thread */
+ Status = ZwResumeThread(ProcessInformation->ThreadHandle, NULL);
+ if (!NT_SUCCESS(Status))
+ {
+ /* Failed, display error */
+ p = InitBuffer->DebugBuffer;
+ _snwprintf(p,
+ 256 * sizeof(WCHAR),
+ L"INIT: Unable to resume Session Manager. 0x%lx",
+ Status);
+ RtlInitUnicodeString(&DebugString, p);
+ ZwDisplayString(&DebugString);
+
+ /* Bugcheck the system */
+ return Status;
+ }
+
+ /* Return success */
+ *ProcessParameters = ProcessParams;
+ *ProcessEnvironment = EnvironmentPtr;
+ return STATUS_SUCCESS;
+}
+
+NTSTATUS
+NTAPI
+LaunchOldSmss(VOID)
+{
+ PINIT_BUFFER InitBuffer;
+ PRTL_USER_PROCESS_PARAMETERS ProcessParameters = NULL;
+ PRTL_USER_PROCESS_INFORMATION ProcessInfo;
+ LARGE_INTEGER Timeout;
+ NTSTATUS Status;
+ PCHAR Environment;
+ SIZE_T Size;
+
+ /* Setup system root */
+ RtlInitUnicodeString(&NtSystemRoot, SharedUserData->NtSystemRoot);
+
+ /* Allocate the initialization buffer */
+ InitBuffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(INIT_BUFFER));
+ if (!InitBuffer)
+ {
+ /* Bugcheck */
+ return STATUS_NO_MEMORY;
+ }
+
+ /* Launch initial process */
+ ProcessInfo = &InitBuffer->ProcessInfo;
+ Status = ExpLoadInitialProcess(InitBuffer, &ProcessParameters,
&Environment);
+ if (!NT_SUCCESS(Status))
+ {
+ /* Failed, display error */
+ DPRINT1("INIT: Session Manager failed to load.\n");
+ return Status;
+ }
+
+ /* Wait 5 seconds for initial process to initialize */
+ Timeout.QuadPart = Int32x32To64(5, -10000000);
+ Status = ZwWaitForSingleObject(ProcessInfo->ProcessHandle, FALSE, &Timeout);
+ if (Status == STATUS_SUCCESS)
+ {
+ /* Failed, display error */
+ DPRINT1("INIT: Session Manager terminated.\n");
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ /* Close process handles */
+ ZwClose(ProcessInfo->ThreadHandle);
+ ZwClose(ProcessInfo->ProcessHandle);
+
+ /* Free the initial process environment */
+ Size = 0;
+ ZwFreeVirtualMemory(NtCurrentProcess(),
+ (PVOID*)&Environment,
+ &Size,
+ MEM_RELEASE);
+
+ /* Free the initial process parameters */
+ Size = 0;
+ ZwFreeVirtualMemory(NtCurrentProcess(),
+ (PVOID*)&ProcessParameters,
+ &Size,
+ MEM_RELEASE);
+ return STATUS_SUCCESS;
+}
+
+NTSTATUS
+__cdecl
+_main(IN INT argc,
+ IN PCHAR argv[],
+ IN PCHAR envp[],
+ IN ULONG DebugFlag)
+{
+ NTSTATUS Status;
+
+ /* Launch the original SMSS */
+ DPRINT1("SMSS-2 Loaded... Launching original SMSS\n");
+ Status = LaunchOldSmss();
+
+ /* Terminate this SMSS for now, later we'll have an LPC thread running */
+ return NtTerminateThread(NtCurrentThread(), Status);
+}
+
+/* EOF */
Propchange: trunk/reactos/base/system/smss2/smss.c
------------------------------------------------------------------------------
svn:eol-style = native
Added: trunk/reactos/base/system/smss2/smss.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/smss2/smss.h?r…
==============================================================================
--- trunk/reactos/base/system/smss2/smss.h (added)
+++ trunk/reactos/base/system/smss2/smss.h [iso-8859-1] Mon Jan 23 16:49:52 2012
@@ -1,0 +1,7 @@
+#pragma once
+
+#define WIN32_NO_STATUS
+#include <windows.h>
+#define NTOS_MODE_USER
+#include <ndk/ntndk.h>
+
Propchange: trunk/reactos/base/system/smss2/smss.h
------------------------------------------------------------------------------
svn:eol-style = native
Added: trunk/reactos/base/system/smss2/smss.rc
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/smss2/smss.rc?…
==============================================================================
--- trunk/reactos/base/system/smss2/smss.rc (added)
+++ trunk/reactos/base/system/smss2/smss.rc [iso-8859-1] Mon Jan 23 16:49:52 2012
@@ -1,0 +1,4 @@
+#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Session Manager\0"
+#define REACTOS_STR_INTERNAL_NAME "smss\0"
+#define REACTOS_STR_ORIGINAL_FILENAME "smss.exe\0"
+#include <reactos/version.rc>
Propchange: trunk/reactos/base/system/smss2/smss.rc
------------------------------------------------------------------------------
svn:eol-style = native
Added: trunk/reactos/base/system/smss2/smss2.rbuild
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/smss2/smss2.rb…
==============================================================================
--- trunk/reactos/base/system/smss2/smss2.rbuild (added)
+++ trunk/reactos/base/system/smss2/smss2.rbuild [iso-8859-1] Mon Jan 23 16:49:52 2012
@@ -1,0 +1,14 @@
+<?xml version="1.0"?>
+<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
+<module name="smss2" type="nativecui"
installbase="system32" installname="smss2.exe">
+ <bootstrap installbase="$(CDOUTPUT)/system32" />
+ <include base="smss2">.</include>
+ <include base="ReactOS">include/reactos/subsys</include>
+ <library>nt</library>
+ <library>ntdll</library>
+ <pch>smss.h</pch>
+ <compilationunit name="unit.c">
+ <file>smss.c</file>
+ </compilationunit>
+ <file>smss.rc</file>
+</module>
Propchange: trunk/reactos/base/system/smss2/smss2.rbuild
------------------------------------------------------------------------------
svn:eol-style = native
Modified: trunk/reactos/base/system/system.rbuild
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/system.rbuild?…
==============================================================================
--- trunk/reactos/base/system/system.rbuild [iso-8859-1] (original)
+++ trunk/reactos/base/system/system.rbuild [iso-8859-1] Mon Jan 23 16:49:52 2012
@@ -40,6 +40,9 @@
<directory name="smss">
<xi:include href="smss/smss.rbuild" />
</directory>
+ <directory name="smss2">
+ <xi:include href="smss2/smss2.rbuild" />
+ </directory>
<directory name="userinit">
<xi:include href="userinit/userinit.rbuild" />
</directory>
Modified: trunk/reactos/boot/bootdata/packages/reactos.dff
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/bootdata/packages/rea…
==============================================================================
--- trunk/reactos/boot/bootdata/packages/reactos.dff [iso-8859-1] (original)
+++ trunk/reactos/boot/bootdata/packages/reactos.dff [iso-8859-1] Mon Jan 23 16:49:52
2012
@@ -128,6 +128,7 @@
base\system\runonce\runonce.exe 1
base\system\services\services.exe 1
base\system\smss\smss.exe 1
+base\system\smss2\smss2.exe 1
base\system\userinit\userinit.exe 1
base\system\winlogon\winlogon.exe 1
Modified: trunk/reactos/boot/bootdata/txtsetup.sif
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/bootdata/txtsetup.sif…
==============================================================================
--- trunk/reactos/boot/bootdata/txtsetup.sif [iso-8859-1] (original)
+++ trunk/reactos/boot/bootdata/txtsetup.sif [iso-8859-1] Mon Jan 23 16:49:52 2012
@@ -48,6 +48,7 @@
pcmcia.sys=,,,,,,,,,,,,4
swenum.sys=,,,,,,,,,,,,4
ntdll.dll=,,,,,,,,,,,,2
+smss2.exe=,,,,,,,,,,,,2
[HardwareIdsDatabase]
;*PNP0A00 = isapnp
Modified: trunk/reactos/ntoskrnl/ex/init.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ex/init.c?rev=551…
==============================================================================
--- trunk/reactos/ntoskrnl/ex/init.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/ex/init.c [iso-8859-1] Mon Jan 23 16:49:52 2012
@@ -66,7 +66,7 @@
UNICODE_STRING NtSystemRoot;
/* NT Initial User Application */
-WCHAR NtInitialUserProcessBuffer[128] = L"\\SystemRoot\\System32\\smss.exe";
+WCHAR NtInitialUserProcessBuffer[128] = L"\\SystemRoot\\System32\\smss2.exe";
ULONG NtInitialUserProcessBufferLength = sizeof(NtInitialUserProcessBuffer) -
sizeof(WCHAR);
ULONG NtInitialUserProcessBufferType = REG_SZ;