-/* $Id: smss.c,v 1.8 2000/10/09 00:18:00 ekohl Exp $
+/* $Id$
*
* smss.c - Session Manager
- *
+ *
* ReactOS Operating System
- *
+ *
* --------------------------------------------------------------------
*
* This software is free software; you can redistribute it and/or
* You should have received a copy of the GNU General Public License
* along with this software; see the file COPYING.LIB. If not, write
* to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
- * MA 02139, USA.
+ * MA 02139, USA.
*
* --------------------------------------------------------------------
- *
- * 19990529 (Emanuele Aliberti)
- * Compiled successfully with egcs 1.1.2
*/
-#include <ddk/ntddk.h>
-
#include "smss.h"
+#include <reactos/buildno.h>
+#define NDEBUG
+#include <debug.h>
-void
-DisplayString( LPCWSTR lpwString )
-{
- UNICODE_STRING us;
-
- RtlInitUnicodeString (&us, lpwString);
- NtDisplayString (&us);
-}
-
-
-void
-PrintString (char* fmt,...)
-{
- char buffer[512];
- va_list ap;
- UNICODE_STRING UnicodeString;
- ANSI_STRING AnsiString;
-
- va_start(ap, fmt);
- vsprintf(buffer, fmt, ap);
- va_end(ap);
-
- RtlInitAnsiString (&AnsiString, buffer);
- RtlAnsiStringToUnicodeString (
- &UnicodeString,
- &AnsiString,
- TRUE);
- NtDisplayString(&UnicodeString);
- RtlFreeUnicodeString (&UnicodeString);
-}
-
+ULONG SmSsProcessId = 0;
/* Native image's entry point */
-void NtProcessStartup (PPEB Peb)
+NTSTATUS __cdecl _main(int argc,
+ char *argv[],
+ char *envp[],
+ ULONG DebugFlag)
{
- HANDLE Children[2]; /* csrss, winlogon */
-
- DisplayString( L"Session Manager\n" );
-
- if (TRUE == InitSessionManager(Children))
- {
- NTSTATUS wws;
-
- DisplayString( L"SM: Waiting for process termination...\n" );
-
+ NTSTATUS Status = STATUS_SUCCESS;
+ PROCESS_BASIC_INFORMATION PBI = {0};
+
+ /* Lookup yourself */
+ Status = NtQueryInformationProcess (NtCurrentProcess(),
+ ProcessBasicInformation,
+ & PBI,
+ sizeof PBI,
+ NULL);
+ if(NT_SUCCESS(Status))
+ {
+ SmSsProcessId = (ULONG) PBI.UniqueProcessId;
+ }
+ /* Initialize the system */
+ Status = InitSessionManager();
+ /* Watch required subsystems TODO */
#if 0
- wws = NtWaitForMultipleObjects (
- ((LONG) sizeof Children / sizeof (HANDLE)),
- Children,
- WaitAny,
- TRUE, /* alertable */
- NULL /* NULL for infinite */
- );
-#endif
- wws = NtWaitForSingleObject (
- Children[CHILD_WINLOGON],
- TRUE, /* alertable */
- NULL
- );
-
-// if (!NT_SUCCESS(wws))
- if (wws > 1)
- {
- DisplayString( L"SM: NtWaitForMultipleObjects failed!\n" );
- }
- else
- {
- DisplayString( L"SM: Process terminated!\n" );
- }
- }
- else
- {
- DisplayString( L"SM: Initialization failed!\n" );
- }
-
- /* Raise a hard error (crash the system/BSOD) */
- NtRaiseHardError (STATUS_SYSTEM_PROCESS_TERMINATED,
- 0,0,0,0,0);
+ if (!NT_SUCCESS(Status))
+ {
+ int i;
+ for (i=0; i < (sizeof Children / sizeof Children[0]); i++)
+ {
+ if (Children[i])
+ {
+ NtTerminateProcess(Children[i],0);
+ }
+ }
+ DPRINT1("SM: Initialization failed!\n");
+ goto ByeBye;
+ }
+
+ Status = NtWaitForMultipleObjects(((LONG) sizeof(Children) / sizeof(HANDLE)),
+ Children,
+ WaitAny,
+ TRUE, /* alertable */
+ NULL); /* NULL for infinite */
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("SM: NtWaitForMultipleObjects failed! (Status=0x%08lx)\n", Status);
+ }
+ else
+ {
+ DPRINT1("SM: Process terminated!\n");
+ }
+
+ByeBye:
+ /* Raise a hard error (crash the system/BSOD) */
+ NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED,
+ 0,0,0,0,0);
// NtTerminateProcess(NtCurrentProcess(), 0);
+#endif
+ return NtTerminateThread(NtCurrentThread(), Status);
}
/* EOF */