From 09c7bc60a5a13bdb58217b359d724c3cba2b57c5 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Wed, 8 Feb 2012 23:49:19 +0000 Subject: [PATCH] [SMSS2]: Make not-implemented functions return a failure. Cleanup the SMSS hack in the _main function to be cleaner. Add a few more functions and flags to the header. Fix a function prototype. svn path=/trunk/; revision=55507 --- reactos/base/system/smss2/smloop.c | 14 ++++----- reactos/base/system/smss2/smss.c | 37 ++++++++-------------- reactos/base/system/smss2/smss.h | 46 +++++++++++++++++++++++++++- reactos/base/system/smss2/smsubsys.c | 3 +- 4 files changed, 67 insertions(+), 33 deletions(-) diff --git a/reactos/base/system/smss2/smloop.c b/reactos/base/system/smss2/smloop.c index ff05e7993f4..3762eae76b0 100644 --- a/reactos/base/system/smss2/smloop.c +++ b/reactos/base/system/smss2/smloop.c @@ -42,7 +42,7 @@ SmpCreateForeignSession(IN PSM_API_MSG SmApiMsg, IN HANDLE SmApiPort) { DPRINT1("%s is not yet implemented\n", __FUNCTION__); - return STATUS_SUCCESS; + return STATUS_NOT_IMPLEMENTED; } NTSTATUS @@ -52,7 +52,7 @@ SmpSessionComplete(IN PSM_API_MSG SmApiMsg, IN HANDLE SmApiPort) { DPRINT1("%s is not yet implemented\n", __FUNCTION__); - return STATUS_SUCCESS; + return STATUS_NOT_IMPLEMENTED; } NTSTATUS @@ -62,7 +62,7 @@ SmpTerminateForeignSession(IN PSM_API_MSG SmApiMsg, IN HANDLE SmApiPort) { DPRINT1("%s is not yet implemented\n", __FUNCTION__); - return STATUS_SUCCESS; + return STATUS_NOT_IMPLEMENTED; } NTSTATUS @@ -72,7 +72,7 @@ SmpExecPgm(IN PSM_API_MSG SmApiMsg, IN HANDLE SmApiPort) { DPRINT1("%s is not yet implemented\n", __FUNCTION__); - return STATUS_SUCCESS; + return STATUS_NOT_IMPLEMENTED; } NTSTATUS @@ -82,7 +82,7 @@ SmpLoadDeferedSubsystem(IN PSM_API_MSG SmApiMsg, IN HANDLE SmApiPort) { DPRINT1("%s is not yet implemented\n", __FUNCTION__); - return STATUS_SUCCESS; + return STATUS_NOT_IMPLEMENTED; } NTSTATUS @@ -92,7 +92,7 @@ SmpStartCsr(IN PSM_API_MSG SmApiMsg, IN HANDLE SmApiPort) { DPRINT1("%s is not yet implemented\n", __FUNCTION__); - return STATUS_SUCCESS; + return STATUS_NOT_IMPLEMENTED; } NTSTATUS @@ -102,7 +102,7 @@ SmpStopCsr(IN PSM_API_MSG SmApiMsg, IN HANDLE SmApiPort) { DPRINT1("%s is not yet implemented\n", __FUNCTION__); - return STATUS_SUCCESS; + return STATUS_NOT_IMPLEMENTED; } PSM_API_HANDLER SmpApiDispatch[SmMaxApiNumber] = diff --git a/reactos/base/system/smss2/smss.c b/reactos/base/system/smss2/smss.c index dd6688f9504..a3df5c666f6 100644 --- a/reactos/base/system/smss2/smss.c +++ b/reactos/base/system/smss2/smss.c @@ -265,7 +265,8 @@ SmpExecuteCommand(IN PUNICODE_STRING CommandLine, &Directory, CommandLine, MuSessionId, - ProcessId); + ProcessId, + Flags); } else if (Flags & SMP_INVALID_PATH) { @@ -590,7 +591,7 @@ ExpLoadInitialProcess(IN PINIT_BUFFER InitBuffer, NTSTATUS NTAPI -LaunchOldSmss(OUT PHANDLE Handles) +LaunchOldSmss(VOID) { PINIT_BUFFER InitBuffer; PRTL_USER_PROCESS_PARAMETERS ProcessParameters = NULL; @@ -598,9 +599,6 @@ LaunchOldSmss(OUT PHANDLE Handles) NTSTATUS Status; PCHAR Environment; - /* No handles at first */ - Handles[0] = Handles[1] = NULL; - /* Initialize the system root */ RtlInitUnicodeString(&SmpSystemRoot, SharedUserData->NtSystemRoot); @@ -623,8 +621,6 @@ LaunchOldSmss(OUT PHANDLE Handles) } /* Return the handle and status */ - Handles[0] = ProcessInfo->ProcessHandle; - Handles[1] = ProcessInfo->ProcessHandle; return Status; } @@ -723,6 +719,8 @@ _main(IN INT argc, /* Enter SEH so we can terminate correctly if anything goes wrong */ _SEH2_TRY { + LARGE_INTEGER Infinite = {{0x80000000, 0x7FFFFFFF}}; + /* Initialize SMSS */ Status = SmpInit(&InitialCommand, Handles); if (!NT_SUCCESS(Status)) @@ -731,9 +729,10 @@ _main(IN INT argc, RtlInitUnicodeString(&DbgString, L"Session Manager Initialization"); Parameters[1] = Status; DPRINT1("SMSS-2 Loaded... Launching original SMSS\n"); - Status = LaunchOldSmss(Handles); - goto SetupHack; //_SEH2_LEAVE; Hack so that setup can work. will go away later + Status = LaunchOldSmss(); + if (!NT_SUCCESS(Status)) return Status; + return NtDelayExecution(FALSE, &Infinite); } /* Get the global flags */ @@ -750,19 +749,6 @@ _main(IN INT argc, DPRINT1("Global Flags Set to SMSS Debugging: Not yet supported\n"); } - /* Launch the original SMSS */ - DPRINT1("SMSS-2 Loaded... Launching original SMSS\n"); - Status = LaunchOldSmss(Handles); - if (!NT_SUCCESS(Status)) - { - /* Fail and raise a hard error */ - DPRINT1("SMSS: Execute Old SMSS failed\n"); - RtlInitUnicodeString(&DbgString, - L"Session Manager LaunchOldSmss"); - Parameters[1] = Status; - _SEH2_LEAVE; - } - /* Execute the initial command (Winlogon.exe) */ Status = SmpExecuteInitialCommand(0, &InitialCommand, &Handles[1], NULL); if (!NT_SUCCESS(Status)) @@ -772,7 +758,11 @@ _main(IN INT argc, RtlInitUnicodeString(&DbgString, L"Session Manager ExecuteInitialCommand"); Parameters[1] = Status; - _SEH2_LEAVE; + //_SEH2_LEAVE; + DPRINT1("SMSS-2 Loaded... Launching original SMSS\n"); + Status = LaunchOldSmss(); + if (!NT_SUCCESS(Status)) return Status; + return NtDelayExecution(FALSE, &Infinite); } /* Check if we're already attached to a session */ @@ -789,7 +779,6 @@ _main(IN INT argc, SmpReleasePrivilege(State); /* Wait on either CSRSS or Winlogon to die */ -SetupHack: Status = NtWaitForMultipleObjects(RTL_NUMBER_OF(Handles), Handles, WaitAny, diff --git a/reactos/base/system/smss2/smss.h b/reactos/base/system/smss2/smss.h index 22b8af81d3b..dabd9dc68b4 100644 --- a/reactos/base/system/smss2/smss.h +++ b/reactos/base/system/smss2/smss.h @@ -38,6 +38,8 @@ #define SMP_SUBSYSTEM_FLAG 0x08 #define SMP_INVALID_PATH 0x10 #define SMP_DEFERRED_FLAG 0x20 +#define SMP_POSIX_FLAG 0x100 +#define SMP_OS2_FLAG 0x200 /* STRUCTURES *****************************************************************/ @@ -87,6 +89,7 @@ extern LIST_ENTRY SmpSubSystemsToLoad; extern LIST_ENTRY SmpExecuteList; extern LIST_ENTRY SmpSubSystemList; extern ULONG AttachedSessionId; +extern BOOLEAN SmpDebug; /* FUNCTIONS ******************************************************************/ @@ -182,7 +185,8 @@ SmpLoadSubSystem( IN PUNICODE_STRING Directory, IN PUNICODE_STRING CommandLine, IN ULONG MuSessionId, - OUT PHANDLE ProcessId + OUT PHANDLE ProcessId, + IN ULONG Flags ); NTSTATUS @@ -250,4 +254,44 @@ SmpDereferenceSubsystem( IN PSMP_SUBSYSTEM SubSystem ); +NTSTATUS +NTAPI +SmpSbCreateSession( + IN PVOID Reserved, + IN PSMP_SUBSYSTEM OtherSubsystem, + IN PRTL_USER_PROCESS_INFORMATION ProcessInformation, + IN ULONG MuSessionId, + IN PCLIENT_ID DbgClientId +); + +ULONG +NTAPI +SmpAllocateSessionId( + IN PSMP_SUBSYSTEM Subsystem, + IN PSMP_SUBSYSTEM OtherSubsystem +); + +VOID +NTAPI +SmpDeleteSession( + IN ULONG SessionId +); + +BOOLEAN +NTAPI +SmpCheckDuplicateMuSessionId( + IN ULONG MuSessionId +); + +NTSTATUS +NTAPI +SmpExecuteImage( + IN PUNICODE_STRING FileName, + IN PUNICODE_STRING Directory, + IN PUNICODE_STRING CommandLine, + IN ULONG MuSessionId, + IN ULONG Flags, + IN PRTL_USER_PROCESS_INFORMATION ProcessInformation +); + #endif diff --git a/reactos/base/system/smss2/smsubsys.c b/reactos/base/system/smss2/smsubsys.c index 459b2bf16b7..d38695c6bb6 100644 --- a/reactos/base/system/smss2/smsubsys.c +++ b/reactos/base/system/smss2/smsubsys.c @@ -120,7 +120,8 @@ SmpLoadSubSystem(IN PUNICODE_STRING FileName, IN PUNICODE_STRING Directory, IN PUNICODE_STRING CommandLine, IN ULONG MuSessionId, - OUT PHANDLE ProcessId) + OUT PHANDLE ProcessId, + IN ULONG Flags) { DPRINT1("Should start subsystem %wZ for Session: %lx\n", FileName, MuSessionId); return STATUS_SUCCESS;