2008-09-23 10:47:10 +00:00
|
|
|
/*
|
|
|
|
* PROJECT: ReactOS Session Manager
|
|
|
|
* LICENSE: GPL v2 or later - See COPYING in the top level directory
|
|
|
|
* FILE: base/system/smss/initss.c
|
|
|
|
* PURPOSE: Load the subsystems.
|
|
|
|
* PROGRAMMERS: ReactOS Development Team
|
2005-05-22 16:10:10 +00:00
|
|
|
*/
|
2008-09-23 10:47:10 +00:00
|
|
|
|
|
|
|
/* INCLUDES ******************************************************************/
|
2005-05-22 16:10:10 +00:00
|
|
|
#include "smss.h"
|
|
|
|
|
|
|
|
#define NDEBUG
|
|
|
|
#include <debug.h>
|
|
|
|
|
|
|
|
/* SM handle for its own \SmApiPort */
|
|
|
|
HANDLE hSmApiPort = (HANDLE) 0;
|
|
|
|
|
|
|
|
|
|
|
|
/* TODO:
|
|
|
|
*
|
|
|
|
* a) look if a special option is set for smss.exe in
|
|
|
|
* HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**********************************************************************
|
2005-08-27 09:55:27 +00:00
|
|
|
* SmRegisterInternalSubsystem/3
|
2007-10-19 23:21:45 +00:00
|
|
|
*
|
2005-05-22 16:10:10 +00:00
|
|
|
* DESCRIPTION
|
2005-08-27 09:55:27 +00:00
|
|
|
* Register with itself for ImageSubsystemId
|
|
|
|
* (programmatically).
|
2005-05-22 16:10:10 +00:00
|
|
|
*/
|
2008-11-30 11:16:55 +00:00
|
|
|
NTSTATUS NTAPI SmRegisterInternalSubsystem (LPWSTR PgmName,
|
2005-08-27 09:55:27 +00:00
|
|
|
USHORT ImageSubsystemId,
|
|
|
|
PHANDLE ApiPort)
|
2005-05-22 16:10:10 +00:00
|
|
|
{
|
2005-08-27 09:55:27 +00:00
|
|
|
NTSTATUS Status = STATUS_SUCCESS;
|
|
|
|
RTL_USER_PROCESS_INFORMATION ProcessInfo;
|
2005-05-22 16:10:10 +00:00
|
|
|
|
2007-10-19 23:21:45 +00:00
|
|
|
|
2005-08-27 09:55:27 +00:00
|
|
|
DPRINT("SM: %s(%S,%d) called\n",__FUNCTION__, PgmName, ImageSubsystemId);
|
|
|
|
|
2005-05-22 16:10:10 +00:00
|
|
|
RtlZeroMemory (& ProcessInfo, sizeof ProcessInfo);
|
|
|
|
ProcessInfo.Size = sizeof ProcessInfo;
|
Merge 34758, 34771, 34786, 34787, 34906, 35826, 36174, 36274, 36444, 36445, 36446, 36447, 36448, 36477, 36511, 36898, 36903 from amd64 branch
svn path=/trunk/; revision=37910
2008-12-07 12:11:46 +00:00
|
|
|
ProcessInfo.ProcessHandle = (HANDLE) UlongToPtr(SmSsProcessId);
|
|
|
|
ProcessInfo.ClientId.UniqueProcess = (HANDLE) UlongToPtr(SmSsProcessId);
|
2007-11-21 21:25:26 +00:00
|
|
|
DPRINT("SM: %s: ProcessInfo.ProcessHandle=%p\n",
|
2005-05-22 16:10:10 +00:00
|
|
|
__FUNCTION__,ProcessInfo.ProcessHandle);
|
2005-08-27 09:55:27 +00:00
|
|
|
Status = SmCreateClient (& ProcessInfo, PgmName);
|
2005-05-22 16:10:10 +00:00
|
|
|
if (NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
UNICODE_STRING SbApiPortName = {0,0,NULL};
|
2007-10-19 23:21:45 +00:00
|
|
|
|
|
|
|
RtlInitUnicodeString (& SbApiPortName, L"");
|
2005-05-22 16:10:10 +00:00
|
|
|
Status = SmConnectApiPort(& SbApiPortName,
|
2005-08-27 09:55:27 +00:00
|
|
|
(HANDLE) -1, /* internal SS have no SB port */
|
|
|
|
ImageSubsystemId,
|
|
|
|
ApiPort);
|
2005-05-22 16:10:10 +00:00
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
DPRINT("SM: %s: SMLIB!SmConnectApiPort failed (Status=0x%08lx)\n",
|
|
|
|
__FUNCTION__,Status);
|
|
|
|
return Status;
|
|
|
|
}
|
2005-08-27 09:55:27 +00:00
|
|
|
DPRINT("SM:%s: %S self registered\n", __FUNCTION__, PgmName);
|
2005-05-22 16:10:10 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2005-08-27 09:55:27 +00:00
|
|
|
DPRINT1("SM: %s: SmCreateClient(%S) failed (Status=0x%08lx)\n",
|
|
|
|
__FUNCTION__, PgmName, Status);
|
2005-05-22 16:10:10 +00:00
|
|
|
}
|
|
|
|
/*
|
|
|
|
* Note that you don't need to call complete session
|
2005-08-27 09:55:27 +00:00
|
|
|
* here because connection handling code autocompletes
|
|
|
|
* the client structure for IMAGE_SUBSYSTEM_NATIVE and
|
|
|
|
* -1.
|
2005-05-22 16:10:10 +00:00
|
|
|
*/
|
|
|
|
return Status;
|
|
|
|
}
|
|
|
|
/**********************************************************************
|
|
|
|
* SmpLoadRequiredSubsystems/0
|
|
|
|
*/
|
|
|
|
static NTSTATUS
|
|
|
|
SmpLoadRequiredSubsystems (VOID)
|
|
|
|
{
|
|
|
|
NTSTATUS Status = STATUS_SUCCESS;
|
|
|
|
WCHAR Data [MAX_PATH + 1];
|
|
|
|
ULONG DataLength = sizeof Data;
|
|
|
|
ULONG DataType = 0;
|
|
|
|
|
2007-10-19 23:21:45 +00:00
|
|
|
|
2005-05-22 16:10:10 +00:00
|
|
|
DPRINT("SM: %s called\n", __FUNCTION__);
|
|
|
|
|
|
|
|
RtlZeroMemory (Data, DataLength);
|
|
|
|
Status = SmLookupSubsystem (L"Required",
|
|
|
|
Data,
|
|
|
|
& DataLength,
|
|
|
|
& DataType,
|
2005-06-02 13:17:37 +00:00
|
|
|
NULL);
|
2005-05-22 16:10:10 +00:00
|
|
|
if((STATUS_SUCCESS == Status) && (DataLength > sizeof Data[0]))
|
|
|
|
{
|
|
|
|
PWCHAR Name = NULL;
|
|
|
|
ULONG Offset = 0;
|
2007-10-19 23:21:45 +00:00
|
|
|
|
2005-05-22 16:10:10 +00:00
|
|
|
for (Name = Data; (Offset < DataLength); )
|
|
|
|
{
|
|
|
|
if(L'\0' != *Name)
|
|
|
|
{
|
|
|
|
UNICODE_STRING Program;
|
|
|
|
|
|
|
|
/* Run the current program */
|
|
|
|
RtlInitUnicodeString (& Program, Name);
|
|
|
|
Status = SmExecuteProgram (hSmApiPort, & Program);
|
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
DPRINT1("SM: %s failed to run '%S' program (Status=0x%08lx)\n",
|
|
|
|
__FUNCTION__, Name, Status);
|
|
|
|
}
|
|
|
|
/* Look for the next program */
|
|
|
|
while ((L'\0' != *Name) && (Offset < DataLength))
|
|
|
|
{
|
|
|
|
++ Name;
|
|
|
|
++ Offset;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
++ Name;
|
|
|
|
++ Offset;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return Status;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**********************************************************************
|
|
|
|
* SmLoadSubsystems/0
|
|
|
|
*/
|
|
|
|
NTSTATUS
|
|
|
|
SmLoadSubsystems(VOID)
|
|
|
|
{
|
|
|
|
NTSTATUS Status = STATUS_SUCCESS;
|
|
|
|
|
2007-10-19 23:21:45 +00:00
|
|
|
|
2005-08-27 09:55:27 +00:00
|
|
|
DPRINT("SM: loading subsystems...\n");
|
2005-05-22 16:10:10 +00:00
|
|
|
|
2005-08-27 09:55:27 +00:00
|
|
|
/*
|
|
|
|
* SM self registers: this also opens hSmApiPort to be used
|
|
|
|
* in loading required subsystems.
|
|
|
|
*/
|
|
|
|
Status = SmRegisterInternalSubsystem (L"Session Manager", IMAGE_SUBSYSTEM_NATIVE, & hSmApiPort);
|
2007-10-19 23:21:45 +00:00
|
|
|
if(!NT_SUCCESS(Status))
|
2005-08-27 09:55:27 +00:00
|
|
|
{
|
2007-11-21 21:25:26 +00:00
|
|
|
DPRINT1("SM: %s SmRegisterInternalSubsystem failed Status=%08lx\n", __FUNCTION__, Status);
|
2005-08-27 09:55:27 +00:00
|
|
|
return Status;
|
|
|
|
}
|
2005-05-22 16:10:10 +00:00
|
|
|
/* Load Required subsystems (Debug Windows) */
|
|
|
|
Status = SmpLoadRequiredSubsystems();
|
2005-08-27 09:55:27 +00:00
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
2007-11-21 21:25:26 +00:00
|
|
|
DPRINT1("SM: %s SmpLoadRequiredSubsystems failed Status=%08lx\n", __FUNCTION__, Status);
|
2005-08-27 09:55:27 +00:00
|
|
|
return Status;
|
|
|
|
}
|
2005-05-22 16:10:10 +00:00
|
|
|
/* done */
|
2005-08-27 09:55:27 +00:00
|
|
|
DPRINT("SM: done loading subsystems\n");
|
2005-05-22 16:10:10 +00:00
|
|
|
return Status;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* EOF */
|