SM: subsystem registration (partial)
- merged duplicate code in process creation
- experimental implementation of env subsystem registration
Modified: trunk/reactos/subsys/smss/client.c
Modified: trunk/reactos/subsys/smss/initdosdev.c
Modified: trunk/reactos/subsys/smss/initreg.c
Modified: trunk/reactos/subsys/smss/initrun.c
Modified: trunk/reactos/subsys/smss/initss.c
Modified: trunk/reactos/subsys/smss/makefile
Added: trunk/reactos/subsys/smss/print.c
Modified: trunk/reactos/subsys/smss/smapi.c
Added: trunk/reactos/subsys/smss/smapicomp.c
Added: trunk/reactos/subsys/smss/smapiexec.c
Modified: trunk/reactos/subsys/smss/smss.c
Modified: trunk/reactos/subsys/smss/smss.h
_____
Modified: trunk/reactos/subsys/smss/client.c
--- trunk/reactos/subsys/smss/client.c 2005-02-19 22:56:59 UTC (rev
13653)
+++ trunk/reactos/subsys/smss/client.c 2005-02-19 22:58:18 UTC (rev
13654)
@@ -26,6 +26,7 @@
#define NTOS_MODE_USER
#include <ntos.h>
#include "smss.h"
+#include <sm/helper.h>
#define NDEBUG
#include <debug.h>
@@ -41,7 +42,40 @@
} SmpClientDirectory;
+#if 0
/**********************************************************************
+ * SmpRegisterSmss/0
+ */
+static NTSTATUS
+SmpRegisterSmss(VOID)
+{
+ NTSTATUS Status = STATUS_SUCCESS;
+ UNICODE_STRING SbApiPortName = {0,0,NULL};
+ HANDLE hSmApiPort = (HANDLE) 0;
+
+ DPRINT("SM: %s called\n",__FUNCTION__);
+
+ Status = SmConnectApiPort(& SbApiPortName,
+ (HANDLE) -1,
+ IMAGE_SUBSYSTEM_NATIVE,
+ & hSmApiPort);
+ if(!NT_SUCCESS(Status))
+ {
+ DPRINT("SM: %s: SMDLL!SmConnectApiPort failed
(Status=0x%08lx)\n",__FUNCTION__,Status);
+ return Status;
+ }
+ Status = SmCompleteSession (hSmApiPort, (HANDLE)0, hSmApiPort);
+ if(!NT_SUCCESS(Status))
+ {
+ DPRINT("SM: %s: SMDLL!SmCompleteSession failed
(Status=0x%08lx)\n",__FUNCTION__,Status);
+ return Status;
+ }
+ NtClose(hSmApiPort);
+ return Status;
+}
+#endif
+
+/**********************************************************************
* SmInitializeClientManagement/0
*/
NTSTATUS
@@ -51,11 +85,22 @@
RtlInitializeCriticalSection(& SmpClientDirectory.Lock);
SmpClientDirectory.Count = 0;
SmpClientDirectory.Client = NULL;
+#if 0
+ /* Register IMAGE_SUBSYSTE_NATIVE to be managed by SM */
+ return SmpRegisterSmss();
+#endif
return STATUS_SUCCESS;
+
}
/**********************************************************************
* SmpLookupClient/1
+ *
+ * DESCRIPTION
+ * Lookup the subsystem server descriptor given its image ID.
+ *
+ * SIDE EFFECTS
+ * SmpClientDirectory.Lock is released only on success.
*/
static PSM_CLIENT_DATA STDCALL
SmpLookupClient (USHORT SubsystemId)
@@ -70,22 +115,31 @@
Client = SmpClientDirectory.Client;
while (NULL != Client)
{
- if (SubsystemId == Client->SubsystemId) break;
+ if (SubsystemId == Client->SubsystemId)
+ {
+ RtlLeaveCriticalSection (&
SmpClientDirectory.Lock);
+ return Client;
+ }
Client = Client->Next;
}
}
- RtlLeaveCriticalSection (& SmpClientDirectory.Lock);
+ /*
+ * Note that we do *not* release SmpClientDirectory.Lock here
+ * because SmpLookupClient is called to FAIL when SubsystemId
+ * is not registered yet.
+ */
return Client;
}
/**********************************************************************
- * SmpCreateClient/1
+ * SmpCreateClient/2
*/
NTSTATUS STDCALL
SmCreateClient(PSM_PORT_MESSAGE Request, PSM_CLIENT_DATA * ClientData)
{
PSM_CLIENT_DATA pClient = NULL;
PSM_CONNECT_DATA ConnectData = (PSM_CONNECT_DATA) ((PBYTE)
Request) + sizeof (LPC_REQUEST);
+ ULONG SbApiPortNameSize = SM_CONNECT_DATA_SIZE(*Request);
DPRINT("SM: %s called\n", __FUNCTION__);
@@ -94,9 +148,12 @@
*/
if (SmpLookupClient(ConnectData->Subsystem))
{
- DbgPrint("SMSS: %s: attempt to register again subsystem
%d.\n",__FUNCTION__,0);
+ DPRINT("SMSS: %s: attempt to register again subsystem
%d.\n",
+ __FUNCTION__,
+ ConnectData->Subsystem);
return STATUS_UNSUCCESSFUL;
}
+ DPRINT("SM: %s: registering subsystem %d \n", __FUNCTION__,
ConnectData->Subsystem);
/*
* Allocate the storage for client data
*/
@@ -112,13 +169,17 @@
* Initialize the client data
*/
pClient->SubsystemId = ConnectData->Subsystem;
- pClient->Initialized = FALSE;
- // TODO
+ pClient->Initialized = (IMAGE_SUBSYSTEM_NATIVE ==
pClient->SubsystemId);
+ if (SbApiPortNameSize > 0)
+ {
+ RtlCopyMemory (pClient->SbApiPortName,
+ ConnectData->SbName,
+ SbApiPortNameSize);
+ }
/*
* Insert the new descriptor in the
* client directory.
*/
- RtlEnterCriticalSection (& SmpClientDirectory.Lock);
if (NULL == SmpClientDirectory.Client)
{
SmpClientDirectory.Client = pClient;
@@ -132,8 +193,15 @@
}
pClient->Next = NULL;
++ SmpClientDirectory.Count;
+ /*
+ * Note we unlock the client directory here, because
+ * it was locked by SmpLookupClient on failure.
+ */
RtlLeaveCriticalSection (& SmpClientDirectory.Lock);
- if (ClientData) *ClientData = pClient;
+ if (ClientData)
+ {
+ *ClientData = pClient;
+ }
return STATUS_SUCCESS;
}
_____
Modified: trunk/reactos/subsys/smss/initdosdev.c
--- trunk/reactos/subsys/smss/initdosdev.c 2005-02-19 22:56:59 UTC
(rev 13653)
+++ trunk/reactos/subsys/smss/initdosdev.c 2005-02-19 22:58:18 UTC
(rev 13654)
@@ -1,6 +1,6 @@
/* $Id: init.c 13449 2005-02-06 21:55:07Z ea $
*
- * initdosdev.c - Define symbolic links to kernel devices (MS-DOS
names)
+ * initdosdev.c - Define symbolic links to kernel devices (MS-DOS
names).
*
* ReactOS Operating System
*
_____
Modified: trunk/reactos/subsys/smss/initreg.c
--- trunk/reactos/subsys/smss/initreg.c 2005-02-19 22:56:59 UTC (rev
13653)
+++ trunk/reactos/subsys/smss/initreg.c 2005-02-19 22:58:18 UTC (rev
13654)
@@ -1,6 +1,6 @@
/* $Id: init.c 13449 2005-02-06 21:55:07Z ea $
*
- * initenv.c - Environment initialization
+ * initenv.c - Hive loading
*
* ReactOS Operating System
*
_____
Modified: trunk/reactos/subsys/smss/initrun.c
--- trunk/reactos/subsys/smss/initrun.c 2005-02-19 22:56:59 UTC (rev
13653)
+++ trunk/reactos/subsys/smss/initrun.c 2005-02-19 22:58:18 UTC (rev
13654)
@@ -32,6 +32,9 @@
HANDLE Children[2] = {0, 0}; /* csrss, winlogon */
+/**********************************************************************
+ * SmpRunBootAppsQueryRoutine/6
+ */
static NTSTATUS STDCALL
SmpRunBootAppsQueryRoutine(PWSTR ValueName,
ULONG ValueType,
@@ -40,14 +43,10 @@
PVOID Context,
PVOID EntryContext)
{
- PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
- RTL_PROCESS_INFO ProcessInfo;
- UNICODE_STRING ImagePathString;
- UNICODE_STRING CommandLineString;
- WCHAR Description[256];
- WCHAR ImageName[256];
- WCHAR ImagePath[256];
- WCHAR CommandLine[256];
+ WCHAR Description [MAX_PATH];
+ WCHAR ImageName [MAX_PATH];
+ WCHAR ImagePath [MAX_PATH];
+ WCHAR CommandLine [MAX_PATH];
PWSTR p1, p2;
ULONG len;
NTSTATUS Status;
@@ -96,54 +95,23 @@
wcscat(ImagePath, ImageName);
wcscat(ImagePath, L".exe");
- RtlInitUnicodeString(&ImagePathString,
- ImagePath);
-
- RtlInitUnicodeString(&CommandLineString,
- CommandLine);
-
- RtlCreateProcessParameters(&ProcessParameters,
- &ImagePathString,
- NULL,
- NULL,
- &CommandLineString,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL);
-
- Status = RtlCreateUserProcess(&ImagePathString,
- OBJ_CASE_INSENSITIVE,
- ProcessParameters,
+ /* Create NT process */
+ Status = SmCreateUserProcess (ImagePath,
+ CommandLine,
+ TRUE, /* wait */
NULL,
- NULL,
- NULL,
- FALSE,
- NULL,
- NULL,
- &ProcessInfo);
- if (!NT_SUCCESS(Status))
- {
- DPRINT1("Running %s failed (Status %lx)\n", Description, Status);
- return(STATUS_SUCCESS);
- }
+ TRUE, /* terminate */
+ NULL);
- RtlDestroyProcessParameters(ProcessParameters);
-
- /* Wait for process termination */
- NtWaitForSingleObject(ProcessInfo.ProcessHandle,
- FALSE,
- NULL);
-
- NtClose(ProcessInfo.ThreadHandle);
- NtClose(ProcessInfo.ProcessHandle);
-
return(STATUS_SUCCESS);
}
-/*
+/**********************************************************************
+ * SmRunBootApplications/0
+ *
+ * DESCRIPTION
+ *
* Run native applications listed in the registry.
*
* Key:
_____
Modified: trunk/reactos/subsys/smss/initss.c
--- trunk/reactos/subsys/smss/initss.c 2005-02-19 22:56:59 UTC (rev
13653)
+++ trunk/reactos/subsys/smss/initss.c 2005-02-19 22:58:18 UTC (rev
13654)
@@ -26,6 +26,7 @@
#include "smss.h"
+
#include <rosrtl/string.h>
#define NDEBUG
@@ -49,6 +50,9 @@
* e) make optional subsystems loadable (again: they must be described
in the registry
* key Optional="Posix Os2" to be allowed to run)
*/
+
+/**********************************************************************
+ */
NTSTATUS
SmLoadSubsystems(VOID)
{
@@ -56,7 +60,7 @@
NTSTATUS Status;
DPRINT("SM: loading subsystems\n");
-
+
/* Load kernel mode subsystem (aka win32k.sys) */
RtlRosInitUnicodeStringFromLiteral(&ImageInfo.ModuleName,
L"\\SystemRoot\\system32\\win32k.sys");
@@ -84,10 +88,9 @@
NTSTATUS Status;
UNICODE_STRING UnicodeString;
OBJECT_ATTRIBUTES ObjectAttributes;
- PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
RTL_PROCESS_INFO ProcessInfo;
HANDLE CsrssInitEvent;
- WCHAR UnicodeBuffer[MAX_PATH];
+ WCHAR ImagePath [MAX_PATH];
DPRINT("SM: initializing csrss\n");
@@ -114,36 +117,17 @@
*/
/* initialize executable path */
- wcscpy(UnicodeBuffer, L"\\??\\");
- wcscat(UnicodeBuffer, SharedUserData->NtSystemRoot);
- wcscat(UnicodeBuffer, L"\\system32\\csrss.exe");
- RtlInitUnicodeString(&UnicodeString,
- UnicodeBuffer);
+ wcscpy(ImagePath, L"\\??\\");
+ wcscat(ImagePath, SharedUserData->NtSystemRoot);
+ wcscat(ImagePath, L"\\system32\\csrss.exe");
- RtlCreateProcessParameters(&ProcessParameters,
- &UnicodeString,
- NULL,
- NULL,
- NULL,
- SmSystemEnvironment,
- NULL,
- NULL,
- NULL,
- NULL);
-
- Status = RtlCreateUserProcess(&UnicodeString,
- OBJ_CASE_INSENSITIVE,
- ProcessParameters,
+ Status = SmCreateUserProcess(ImagePath,
+ L"",
+ FALSE, /* wait */
NULL,
- NULL,
- NULL,
- FALSE,
- NULL,
- NULL,
- &ProcessInfo);
-
- RtlDestroyProcessParameters (ProcessParameters);
-
+ FALSE, /* terminate */
+ & ProcessInfo);
+
if (!NT_SUCCESS(Status))
{
DPRINT("SM: %s: Loading csrss.exe failed!\n", __FUNCTION__);
@@ -162,11 +146,9 @@
NTSTATUS
SmRunWinlogon(VOID)
{
- NTSTATUS Status;
- UNICODE_STRING UnicodeString;
- PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
+ NTSTATUS Status = STATUS_SUCCESS;
RTL_PROCESS_INFO ProcessInfo;
- WCHAR UnicodeBuffer[MAX_PATH];
+ WCHAR ImagePath [MAX_PATH];
/*
* Start the logon process (winlogon.exe)
@@ -175,43 +157,23 @@
DPRINT("SM: starting winlogon\n");
/* initialize executable path */
- wcscpy(UnicodeBuffer, L"\\??\\");
- wcscat(UnicodeBuffer, SharedUserData->NtSystemRoot);
- wcscat(UnicodeBuffer, L"\\system32\\winlogon.exe");
- RtlInitUnicodeString(&UnicodeString,
- UnicodeBuffer);
+ wcscpy(ImagePath, L"\\??\\");
+ wcscat(ImagePath, SharedUserData->NtSystemRoot);
+ wcscat(ImagePath, L"\\system32\\winlogon.exe");
- RtlCreateProcessParameters(&ProcessParameters,
- &UnicodeString,
- NULL,
- NULL,
- NULL,
- SmSystemEnvironment,
- NULL,
- NULL,
- NULL,
- NULL);
-
- Status = RtlCreateUserProcess(&UnicodeString,
- OBJ_CASE_INSENSITIVE,
- ProcessParameters,
+ Status = SmCreateUserProcess(ImagePath,
+ L"",
+ FALSE, /* wait */
NULL,
- NULL,
- NULL,
- FALSE,
- NULL,
- NULL,
- &ProcessInfo);
-
- RtlDestroyProcessParameters(ProcessParameters);
-
+ FALSE, /* terminate */
+ & ProcessInfo);
if (!NT_SUCCESS(Status))
{
DPRINT("SM: %s: Loading winlogon.exe failed!\n", __FUNCTION__);
- NtTerminateProcess(Children[CHILD_CSRSS],
- 0);
+ NtTerminateProcess(Children[CHILD_CSRSS], 0);
return(Status);
}
+
Children[CHILD_WINLOGON] = ProcessInfo.ProcessHandle;
return Status;
_____
Modified: trunk/reactos/subsys/smss/makefile
--- trunk/reactos/subsys/smss/makefile 2005-02-19 22:56:59 UTC (rev
13653)
+++ trunk/reactos/subsys/smss/makefile 2005-02-19 22:58:18 UTC (rev
13654)
@@ -6,6 +6,8 @@
TARGET_APPTYPE = native
+TARGET_SDKLIBS = ntdll.a smdll.a
+
TARGET_NAME = smss
TARGET_INSTALLDIR = system32
@@ -19,8 +21,8 @@
init.o initheap.o initenv.o initobdir.o initdosdev.o \
initrun.o initmv.o initwkdll.o initpage.o initss.o \
initreg.o \
- smapi.o \
- client.o debug.o
+ smapi.o smapicomp.o smapiexec.o \
+ client.o debug.o print.o
include $(PATH_TO_TOP)/rules.mak
_____
Added: trunk/reactos/subsys/smss/print.c
--- trunk/reactos/subsys/smss/print.c 2005-02-19 22:56:59 UTC (rev
13653)
+++ trunk/reactos/subsys/smss/print.c 2005-02-19 22:58:18 UTC (rev
13654)
@@ -0,0 +1,56 @@
+/* $Id: print.c 12852 2005-01-06 13:58:04Z mf $
+ *
+ * print.c - Print on the blue screen
+ *
+ * ReactOS Operating System
+ *
+ * --------------------------------------------------------------------
+ *
+ * This software is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * 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.
+ *
+ * --------------------------------------------------------------------
+ */
+#define NTOS_MODE_USER
+#include <ntos.h>
+
+VOID STDCALL DisplayString(LPCWSTR lpwString)
+{
+ UNICODE_STRING us;
+
+ RtlInitUnicodeString (&us, lpwString);
+ ZwDisplayString (&us);
+}
+
+VOID STDCALL 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);
+}
+
+/* EOF */
_____
Modified: trunk/reactos/subsys/smss/smapi.c
--- trunk/reactos/subsys/smss/smapi.c 2005-02-19 22:56:59 UTC (rev
13653)
+++ trunk/reactos/subsys/smss/smapi.c 2005-02-19 22:58:18 UTC (rev
13654)
@@ -9,7 +9,7 @@
#include "smss.h"
#include <rosrtl/string.h>
-#define NDEBUG
+//#define NDEBUG
#include <debug.h>
/* GLOBAL VARIABLES
*********************************************************/
@@ -18,9 +18,6 @@
/* SM API
*******************************************************************/
-#define SMAPI(n) \
-NTSTATUS FASTCALL n (PSM_PORT_MESSAGE Request)
-
SMAPI(SmInvalid)
{
DPRINT("SM: %s called\n",__FUNCTION__);
@@ -28,89 +25,193 @@
return STATUS_SUCCESS;
}
-SMAPI(SmCompSes)
-{
- DPRINT("SM: %s called\n",__FUNCTION__);
- Request->Status = STATUS_NOT_IMPLEMENTED;
- return STATUS_SUCCESS;
-}
-SMAPI(SmExecPgm)
-{
- DPRINT("SM: %s called\n",__FUNCTION__);
- Request->Status = STATUS_NOT_IMPLEMENTED;
- return STATUS_SUCCESS;
-}
-
/* SM API Table */
typedef NTSTATUS (FASTCALL * SM_PORT_API)(PSM_PORT_MESSAGE);
SM_PORT_API SmApi [] =
{
SmInvalid, /* unused */
- SmCompSes,
+ SmCompSes, /* smapicomp.c */
SmInvalid, /* obsolete */
SmInvalid, /* unknown */
- SmExecPgm
+ SmExecPgm /* smapiexec.c */
};
+#if !defined(__USE_NT_LPC__)
+NTSTATUS STDCALL
+SmpHandleConnectionRequest (PSM_PORT_MESSAGE Request);
+#endif
+
/**********************************************************************
* NAME
- * SmpHandleConnectionRequest/2
+ * SmpApiConnectedThread/1
*
+ * DESCRIPTION
+ * Entry point for the listener thread of LPC port "\SmApiPort".
+ */
+VOID STDCALL
+SmpApiConnectedThread(PVOID dummy)
+{
+ NTSTATUS Status = STATUS_SUCCESS;
+ PVOID Unknown = NULL;
+ PLPC_MESSAGE Reply = NULL;
+ SM_PORT_MESSAGE Request = {{0}};
+
+ DPRINT("SM: %s running\n",__FUNCTION__);
+
+ while (TRUE)
+ {
+ DPRINT("SM: %s: waiting for message\n",__FUNCTION__);
+
+ Status = NtReplyWaitReceivePort(SmApiPort,
+ (PULONG) & Unknown,
+ Reply,
+ (PLPC_MESSAGE) &
Request);
+ if (NT_SUCCESS(Status))
+ {
+ DPRINT("SM: %s: message received (type=%d)\n",
+ __FUNCTION__,
+ PORT_MESSAGE_TYPE(Request));
+
+ switch (Request.Header.MessageType)
+ {
+ case LPC_CONNECTION_REQUEST:
+ SmpHandleConnectionRequest (&Request);
+ Reply = NULL;
+ break;
+ case LPC_DEBUG_EVENT:
+// DbgSsHandleKmApiMsg (&Request, 0);
+ Reply = NULL;
+ break;
+ case LPC_PORT_CLOSED:
+ Reply = NULL;
+ break;
+ default:
+ if ((Request.ApiIndex) &&
+ (Request.ApiIndex < (sizeof
SmApi / sizeof SmApi[0])))
+ {
+ Status =
SmApi[Request.ApiIndex](&Request);
+ Reply = (PLPC_MESSAGE) &
Request;
+ } else {
+ Request.Status =
STATUS_NOT_IMPLEMENTED;
+ Reply = (PLPC_MESSAGE) &
Request;
+ }
+ }
+ }
+ }
+}
+
+/**********************************************************************
+ * NAME
+ * SmpHandleConnectionRequest/1
+ *
+ * ARGUMENTS
+ * Request: LPC connection request message
+ *
* REMARKS
* Quoted in
http://support.microsoft.com/kb/258060/EN-US/
*/
NTSTATUS STDCALL
-SmpHandleConnectionRequest (HANDLE Port, PSM_PORT_MESSAGE Request)
+SmpHandleConnectionRequest (PSM_PORT_MESSAGE Request)
{
+#if defined(__USE_NT_LPC__)
NTSTATUS Status = STATUS_SUCCESS;
PSM_CLIENT_DATA ClientData = NULL;
PVOID Context = NULL;
DPRINT("SM: %s called\n",__FUNCTION__);
+ /*
+ * SmCreateClient/2 is called here explicitly to *fail*.
+ * If it succeeds, there is something wrong in the
+ * connection request. An environment subsystem *never*
+ * registers twice. (Security issue: maybe we will
+ * write this event into the security log).
+ */
Status = SmCreateClient (Request, & ClientData);
if(STATUS_SUCCESS == Status)
{
-#ifdef __USE_NT_LPC__
+ /* OK: the client is an environment subsystem
+ * willing to manage a free image type.
+ * Accept it.
+ */
Status = NtAcceptConnectPort (& ClientData->ApiPort,
Context,
- SmApiPort,
+ (PLPC_MESSAGE) Request,
TRUE, //accept
NULL,
NULL);
-#else
+ if(NT_SUCCESS(Status))
+ {
+ Status =
NtCompleteConnectPort(ClientData->ApiPort);
+ }
+ return STATUS_SUCCESS;
+ } else {
+ /* Reject the subsystem */
Status = NtAcceptConnectPort (& ClientData->ApiPort,
Context,
(PLPC_MESSAGE) Request,
+ FALSE, //reject
+ NULL,
+ NULL);
+ }
+#else /* ReactOS LPC */
+ NTSTATUS Status = STATUS_SUCCESS;
+ PSM_CLIENT_DATA ClientData = NULL;
+
+ DPRINT("SM: %s called\n",__FUNCTION__);
+
+ Status = SmCreateClient (Request, & ClientData);
+ if(STATUS_SUCCESS == Status)
+ {
+ Status = NtAcceptConnectPort (& ClientData->ApiPort,
+ SmApiPort,
+ NULL,
TRUE, //accept
NULL,
NULL);
-#endif
- if(NT_SUCCESS(Status))
+ if (!NT_SUCCESS(Status))
{
+ DPRINT1("SM: %s: NtAcceptConnectPort() failed
(Status=0x%08lx)\n",
+ __FUNCTION__, Status);
+ return Status;
+ } else {
Status =
NtCompleteConnectPort(ClientData->ApiPort);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("SM: %s: NtCompleteConnectPort()
failed (Status=0x%08lx)\n",
+ __FUNCTION__, Status);
+ return Status;
+ }
+ Status = RtlCreateUserThread(NtCurrentProcess(),
+ NULL,
+ FALSE,
+ 0,
+ NULL,
+ NULL,
+ (PTHREAD_START_ROUTINE)
SmpApiConnectedThread,
+ ClientData->ApiPort,
+ &
ClientData->ApiPortThread,
+ NULL);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("SM: %s: Unable to create server
thread (Status=0x%08lx)\n",
+ __FUNCTION__, Status);
+ return Status;
+ }
}
return STATUS_SUCCESS;
} else {
/* Reject the subsystem */
-#ifdef __USE_NT_LPC__
Status = NtAcceptConnectPort (& ClientData->ApiPort,
- Context,
SmApiPort,
- FALSE, //reject
NULL,
- NULL);
-#else
- Status = NtAcceptConnectPort (& ClientData->ApiPort,
- Context,
- (PLPC_MESSAGE) Request,
FALSE, //reject
NULL,
NULL);
-#endif
}
+#endif /* defined __USE_NT_LPC__ */
return Status;
}
@@ -118,59 +219,39 @@
* NAME
* SmpApiThread/1
*
- * DESCRIPTION
- * Entry point for the listener thread of LPC port "\SmApiPort".
+ * DECRIPTION
+ * Due to differences in LPC implementation between NT and ROS,
+ * we need a thread to listen for connection request that
+ * creates a new thread for each connected port. This is not
+ * necessary in NT LPC, because server side connected ports are
+ * never used to receive requests.
*/
VOID STDCALL
-SmpApiThread(HANDLE Port)
+SmpApiThread (HANDLE ListeningPort)
{
NTSTATUS Status = STATUS_SUCCESS;
- PVOID Unknown = NULL;
- PLPC_MESSAGE Reply = NULL;
- SM_PORT_MESSAGE Request = {{0}};
-
- DPRINT("SM: %s running\n",__FUNCTION__);
-
+ LPC_MAX_MESSAGE Request = {{0}};
+
while (TRUE)
{
- DPRINT("SM: %s: waiting for message\n",__FUNCTION__);
-
- Status = NtReplyWaitReceivePort(Port,
- (PULONG) & Unknown,
- Reply,
- (PLPC_MESSAGE) &
Request);
- if (NT_SUCCESS(Status))
+ Status = NtListenPort (ListeningPort, & Request.Header);
+ if (!NT_SUCCESS(Status))
{
- DPRINT("SM: %s: message received (type=%d)\n",
- __FUNCTION__,
- PORT_MESSAGE_TYPE(Request));
-
- switch (Request.Header.MessageType)
- {
- case LPC_CONNECTION_REQUEST:
- SmpHandleConnectionRequest (Port,
&Request);
- Reply = NULL;
- break;
- case LPC_DEBUG_EVENT:
-// DbgSsHandleKmApiMsg (&Request, 0);
- Reply = NULL;
- break;
- case LPC_PORT_CLOSED:
- Reply = NULL;
- break;
- default:
- if ((Request.ApiIndex) &&
- (Request.ApiIndex < (sizeof
SmApi / sizeof SmApi[0])))
- {
- Status =
SmApi[Request.ApiIndex](&Request);
- Reply = (PLPC_MESSAGE) &
Request;
- } else {
- Request.Status =
STATUS_NOT_IMPLEMENTED;
- Reply = (PLPC_MESSAGE) &
Request;
- }
- }
+ DPRINT1("SM: %s: NtListenPort() failed!
(Status==x%08lx)\n", __FUNCTION__, Status);
+ break;
}
+ Status = SmpHandleConnectionRequest ((PSM_PORT_MESSAGE)
& Request);
+ if(!NT_SUCCESS(Status))
+ {
+ DPRINT1("SM: %s: SmpHandleConnectionRequest
failed (Status=0x%08lx)\n",
+ __FUNCTION__, Status);
+ break;
+ }
}
+ /* Cleanup */
+ NtClose(ListeningPort);
+ /* DIE */
+ NtTerminateThread(NtCurrentThread(), Status);
}
@@ -186,9 +267,9 @@
NTSTATUS
SmCreateApiPort(VOID)
{
- OBJECT_ATTRIBUTES ObjectAttributes;
- UNICODE_STRING UnicodeString;
- NTSTATUS Status;
+ OBJECT_ATTRIBUTES ObjectAttributes = {0};
+ UNICODE_STRING UnicodeString = {0};
+ NTSTATUS Status = STATUS_SUCCESS;
RtlRosInitUnicodeStringFromLiteral(&UnicodeString,
L"\\SmApiPort");
@@ -207,8 +288,10 @@
{
return(Status);
}
-
- /* Create two threads for "\SmApiPort" */
+ /*
+ * Create one thread for the named LPC
+ * port \SmApiPort
+ */
RtlCreateUserThread(NtCurrentProcess(),
NULL,
FALSE,
@@ -220,17 +303,6 @@
NULL,
NULL);
- RtlCreateUserThread(NtCurrentProcess(),
- NULL,
- FALSE,
- 0,
- NULL,
- NULL,
- (PTHREAD_START_ROUTINE)SmpApiThread,
- (PVOID)SmApiPort,
- NULL,
- NULL);
-
return(Status);
}
_____
Added: trunk/reactos/subsys/smss/smapicomp.c
--- trunk/reactos/subsys/smss/smapicomp.c 2005-02-19 22:56:59 UTC
(rev 13653)
+++ trunk/reactos/subsys/smss/smapicomp.c 2005-02-19 22:58:18 UTC
(rev 13654)
@@ -0,0 +1,27 @@
+/* $Id: $
+ *
+ * smapicomp.c - SM_API_COMPLETE_SESSION
+ *
+ * Reactos Session Manager
+ *
+ */
+
+#include "smss.h"
+#include <rosrtl/string.h>
+
+#define NDEBUG
+#include <debug.h>
+
+
+/**********************************************************************
+ * SmCompSes/1 API
+ */
+SMAPI(SmCompSes)
+{
+ DPRINT("SM: %s called\n",__FUNCTION__);
+ Request->Status = STATUS_NOT_IMPLEMENTED;
+ return STATUS_SUCCESS;
+}
+
+
+/* EOF */
_____
Added: trunk/reactos/subsys/smss/smapiexec.c
--- trunk/reactos/subsys/smss/smapiexec.c 2005-02-19 22:56:59 UTC
(rev 13653)
+++ trunk/reactos/subsys/smss/smapiexec.c 2005-02-19 22:58:18 UTC
(rev 13654)
@@ -0,0 +1,113 @@
+/* $Id: $
+ *
+ * smapiexec.c - SM_API_EXECUTE_PROGRAM
+ *
+ * Reactos Session Manager
+ *
+ */
+
+#include "smss.h"
+#include <rosrtl/string.h>
+
+#define NDEBUG
+#include <debug.h>
+
+/**********************************************************************
+ * SmCreateUserProcess/5
+ *
+ */
+NTSTATUS STDCALL
+SmCreateUserProcess (LPWSTR ImagePath,
+ LPWSTR CommandLine,
+ BOOLEAN WaitForIt,
+ PLARGE_INTEGER Timeout OPTIONAL,
+ BOOLEAN TerminateIt,
+ PRTL_PROCESS_INFO UserProcessInfo OPTIONAL
+ )
+{
+ UNICODE_STRING ImagePathString = {0};
+ UNICODE_STRING CommandLineString = {0};
+ PRTL_USER_PROCESS_PARAMETERS ProcessParameters = NULL;
+ RTL_PROCESS_INFO ProcessInfo = {0};
+ PRTL_PROCESS_INFO pProcessInfo = & ProcessInfo;
+ NTSTATUS Status = STATUS_SUCCESS;
+
+
+ DPRINT("SM: %s called\n",__FUNCTION__);
+
+ RtlInitUnicodeString (& ImagePathString, ImagePath);
+ RtlInitUnicodeString (& CommandLineString, CommandLine);
+
+ RtlCreateProcessParameters(& ProcessParameters,
+ & ImagePathString,
+ NULL,
+ NULL,
+ & CommandLineString,
+ SmSystemEnvironment,
+ NULL,
+ NULL,
+ NULL,
+ NULL);
+
+ if(NULL != UserProcessInfo)
+ {
+ /* Use caller provided storage */
+ pProcessInfo = UserProcessInfo;
+ }
+
+ Status = RtlCreateUserProcess (& ImagePathString,
+ OBJ_CASE_INSENSITIVE,
[truncated at 1000 lines; 141 more skipped]